Zastanawiam się nad zrobieniem wyświetlacza tekstowego. Byłby on rozszerzeniem T3D, podobnym do
replacableskin i
lights. W pliku T3D należało by utworzyć specjalny submodel, zawierający co najmniej jeden trójkąt:
Parent: none //normalnie, co tam potrzebne
Type: Text //tu specjalny typ
Name: Table //wg potrzeby
Anim: false
Ambient: 150.0 150.0 150.0
Diffuse: 150.0 150.0 150.0
Specular: 229.5 229.5 229.5
SelfIllum: false
Wire: false
WireSize: 1.0
Opacity: 100.0
Map: Table.tga //nazwa tekstury dla pustego wyświetlacza
MaxDistance: 1000
MinDistance: 0
Transform:
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
NumVerts: 6
1
-0.5 -0.5 0.0 0.0 0.0
-0.5 0.5 0.0 0.0 1.0
0.5 0.5 0.0 1.0 1.0
1
0.5 0.5 0.0 1.0 1.0
0.5 -0.5 0.0 1.0 0.0
-0.5 -0.5 0.0 0.0 0.0
Dla zachowania zgodności wstecz można by użyć
Type: Mesh Name: TextArea, to jest jeszcze do uzgodnienia. Pozostałe parametry podajemy wg potrzeby. Nazwa tekstury, rozmiar pierwszego trójkąta i jego mapowanie tworzą wyświetlacz w stanie pustym (bez tekstu).
Pierwszy trójkąt (prostokąt) służy do zdefiniowania obszaru wyświetlania tekstu. Jeśli wyświetlimy jakikolwiek tekst, trójkąt ten nie będzie widoczny. Zamiast niego zostaną dynamicznie stworzone mniejsze prostokąty, teksturowane znakami, zaczynając od lewego górnego rogu (pierwszego podanego wierzchołka). Kolejne znaki zostaną ustawione w kierunku prawego górnego rogu (drugiego podanego wierzchołka). Pozostałe miejsce zostanie uzupełnione trójkątami z mapowaniem interpolowanym z podanego trójkąta (można zamapować całą teksturę, jej fragment, albo nawet jeden piksel, zależnie co chcemy uzyskać). Gdy będzie podany trzeci trójkąt, to w prostokącie przezeń określonym zostanie utworzona kopia napisu.
Znaki definiujemy jako submodele wyświetlacza. Każdy znak powinien zawierać przynajmniej jeden trójkąt (domyślnie określający prostokąt), mapowany na teksturę z alfabetem (ta sama tekstura może zawierać obraz pustego wyświetlacza). Przykładowa tekstura z programu Racer jest w załączniku. Prostokąty mogą mieć różną szerokość, ale zalecane jest, aby miały tę samą wysokość.
Parent: Table //nazwa wyświetlacza
Type: Mesh
Name: A //nazwą jest pojedynczy znak
Anim: false
Ambient: 150.0 150.0 150.0
Diffuse: 150.0 150.0 150.0
Specular: 229.5 229.5 229.5
SelfIllum: false
Wire: false
WireSize: 1.0
Opacity: 100.0
Map: Charset.tga //nazwa tekstury ze znakami
MaxDistance: 1000
MinDistance: 0
Transform:
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
NumVerts: 6
1
0.0 0.0 0.0 0.0 0.0
0.0 0.1 0.0 0.0 0.1 //szerokość znaku
0.1 0.1 0.0 0.1 0.1
1
0.1 0.1 0.0 0.1 0.1
0.1 0.0 0.0 0.1 0.0
0.0 0.0 0.0 0.0 0.0
W zasadzie cały submodel zostanie skopiowany, więc może mieć on dowolny kształt. Również może on mieć własną teksturę. Druga współrzędna w drugim podanym punkcie określi szerokość znaku (przesunięcie dla następnego).
Ze względu na specyfikę składni niemożliwe jest użycie pewnych znaków, jak spacja, przecinek i średnik. Zamiast nich należy używać innych znaków, zmieniając im wygląd. Można też tworzyć spacje o różnych szerokościach, o ile będą przypisane do różnych znaków (np. cyfr, jeśli te nie będą potrzebne).
Używać się będzie tego tak:
node -1 0 nazwa model 10 20 30 0 Display.t3d Text endmodel
|
gdzie:
-1 0 - ograniczenie widoczności
nazwa - nazwa obiektu
10 20 30 0 - współrzędne wstawienia i obrót
Display.t3d - model zawierający wyświetlacz
Text - tekst do wyświetlenia
Jak widać, nie będzie możliwe używanie
replacableskin dla modelu. W razie potrzeby zawsze można ustawić inny model w tym samym miejscu, a wyświetlaczem zrobić tylko napis. Oprócz typowego zastosowania do napisów (tabliczki na semaforach, słupki hektometrowe, etykiety na słupach, nazwy stacji, numery zwrotnic) zapewne znajdą się inne ciekawe zastosowania (np. zmiana konfiguracji okien w budynkach, budowanie ogrodzeń).
Tekstu na wyświetlaczu nie będzie można zmieniać dynamicznie - przynajmniej na razie nie przewiduję. Trójkąty dla napisów będą generowane z submodeli, gdy model znajdzie się w zasięgu wzroku i usuwane gdy nie będą potrzebne (podobnie się dzieje z podsypką i szynami).
W celu zwiększenia wydajności wskazane będzie używanie jednej tekstury dla wyświetlacza pustego i wszystkich znaków oraz tworzenia znaków o jednakowej wysokości, identycznej z pustym wyświetlaczem. W takim przypadku wyświetlacz i submodele znaków powinny zawierać po jednym trójkącie. Jeśli trójkąty nie będą prostokątne, napis będzie pochyły.