################################################################################ #### #### #### Mesh Processor #### #### #### ################################################################################ Mesh Processor - wersja 1.1 - 22 marca 2007 Autor: Adam Sawicki, http://regedit.gamedev.pl, regedit@regedit.gamedev.pl Wstęp ================================================================================ MeshProcessor to konsolowy program do przetwarzania siatek modeli 3D. Minimalne wymagania: - Komputer PC - System Windows - Biblioteka DirectX 9.0c Właściwości: - Intuicyjny i elastyczny język skryptowy ze zmiennymi i dynamicznymi typami - Obsługa siatek w formatach: X, OBJ - Proste przekształcenia siatki, m.in. skalowanie i zmiana układu współrzędnych - Funkcje przetwarzające siatkę z D3DX - Przeliczanie wektorów normalnych i stycznych dla tangent space z użyciem NVMeshMender - Generowanie mapy wysokości (terenu, ang. heightmap) na podstawie tekstury lub pliku RAW - Współpraca z zewnętrznymi programami Uruchamianie programu ================================================================================ Program można uruchomić: 1. W trybie interaktywnym, aby wydawać bezpośrednio polecenia na konsoli. Błąd podczas przetwarzania zostanie wyświetlony, ale program będzie działał dalej. MeshProcessor.exe /i [Parametry] 2. W trybie wsadowym, z użyciem pliku skryptu z zapisanymi w kolejnych wierszach poleceniami. Wówczas każdy błąd przerywa wykonywanie skryptu. MeshProcessor.exe [Parametry] Przykłady: MeshProcessor.exe MojSkrypt1.txt MeshProcessor.exe MojSkrypt2.txt 123 124 "ble ble ble" Składnia skryptów ================================================================================ Skrypty to pliki tekstowe w kodowaniu Windows-1250, z końcami wiersza CR+LF i z zalecanym rozszerzeniem "txt". Podstawy składni: - Komentarze jednowierszowe jak w C/C++ - od "//" do końca wiersza - Komentarze wielowierszowe jak w C/C++ - od "/*" do "*/" - Kontynuacja tej samej linii w nastęnej linii poprzez zakończenie poprzedniej znakiem '\' Poza komentarzami i liniami pustymi każda linia to osobne polecenie. Ogólna składnia polecenia: ... = = = ... Gdzie: z1, z2, ... - zmienne, do których zostaną przypisane wyniki wykonania funkcji f - nazwa funkcji pd - wartość parametru domyślnego p1, p2, ... - nazwy parametrów w1, s2, ... - wartości parametrów Elementy składni: - Nazwy zmiennych i funkcji: jak identyfikatory w C/C++, np.: Funkcja, abc2, x123 Wielkość liter w identyfikatorach nie jest rozróżniana. - Liczby całkowite (integer): 0, 12, -123 - Liczby rzeczywiste (float): 0, 12.5, -10.3-e3 - Wartość wyliczeniowa (enum) - tak jak identyfikator, np.: Text, Binary, Compressed - Łańcuchy znaków: "abc" "C:\\Temp\\Plik.txt" Sekwencje ucieczki są jak w C/C++ ('\\', '\"' itd.). W zależności od funkcji jest określona liczba wartości zwracanych, obowiązkowa lub opcjonalna obecność parametru domyślnego oraz innych parametrów. W miejscu każdego parametru można podać nazwę zmiennej lub, jeśli oczekiwany jest typ prosty, stałą dosłowną danego typu wg składni opisanej wyżej. Przykład: s1 = Set 123 Print s1 Print 123 Wartości zwracanych może nie być, wówczas polecenie przyjmuje postać: Funkcja ParametrDomyślny Parametr1=Wartość1 Parametr2=Wartość2 ... Między parametrami nie ma żadnych przecinków, nawiasów, nie ma też średnika na końcu polecenia! Typy zmiennych: - Typy proste (następuje automatyczna konwersja między nimi): - string - integer - float - enum - Typy złożone: - mesh (siatka) - texture (tekstura) Polecenia ================================================================================ Exit Koniec skryptu. Print Desc= Wypisuje treść lub informacje na temat podanego obiektu. Parametry: Coś : dowolny typ Stała dosłowna lub zmienna dowolnego typu do wypisania. Desc : string [opcjonalny] Opis umieszczany w tej samej linii przed informacją. Przykłady: Print "Hello World!" Print Arg0 Print Siatka1 = Read Question= Pyta użytkownika na konsoli o wprowadzenie tekstu. Parametry: tekst : string [opcjonalny] Tekst pytania. Zwracane: zmienna : string Wartość wczytana od użytkownika. Zadziała także jako liczba, wartość logiczna, enum i innego rodzaju wartości o ile ma poprawny format. = Set Ustawia wartość zmiennej na podaną stałą dosłowną. Parametry: wartość : dowolna stała dosłowna Stała dosłowna z wartością do przypisania Zwracane: zmienna : takiego typu jak wartość = Copy Wykonuje kopię zmiennej, jakiegokolwiek ona jest typu. Parametry: zmienna1 : dowolny typ Zmienna do skopiowania. Zwracane: zmienna2 : takiego typu jak zmienna1 = Format Formułuje łańcuch znaków na podstawie tzw. łańcucha formatującego (patrz niżej). Parametry: str1 : string [łańcuch formatujący] Łańcuch formatujący Zwracane: str2 : string Sformułowany łańcuch wyjściowy. = Question Pokazuje okno dialogowe MessageBox z pytaniem i opcjami: Tak, Nie, Anuluj Anuluj przerywa skrypt. Inna odpowiedź staje się wartością logiczną wpisywaną do zmiennej. Parametry: pytanie : string Treść pytania. Zwracane: zmienna : boolean Message Wyświetla okno dialogowe MessageBox z komunikatem i przyciskami OK i Anuluj. Anuluj przerywa skrypt. Parametry: komunikat : string Treść komunikatu. = OpenDialog Ext= Title= = SaveDialog Ext= Title= Pokazuje okno dialogowe wyboru pliku do otwarcia/zapisania. Parametry: rozszerzenie : string [opcjonalny] Akceptowane rozszerzenia dla plików wymienione po średniku. tytuł : string [opcjonalny] Tytuł okna. Zwracane: zmienna : string Przykład: SrcFileName = OpenDialog Ext="*.bmp;*.jpg" SrcFileName = OpenDialog DestFileName = SaveDialog Ext="*.x" Title="Zapis siatkę" = LoadMesh FileName= IndexFormat= Wczytuje siatkę. Obsługiwane formaty (format rozpoznawany jest po rozszerzeniu): - X - dowolny format wierzchołka Nie wspiera animacji szkieletowej - jeśli plik zawiera wiele siatek, ich przekształcenia zostaną wprowadzone i staną się jedną siatką. - OBJ - w obecnej wersji musi posiadać normalne i współrzędne tekstury. Siatka po wczytaniu z X jest bardzo nieoptymalna. Parametry: nazwa-pliku : string Nazwa pliku siatki. index-format : integer [opcjonalny] Format indeksów w bitach - 16 (domyślny) lub 32. Zwracane: zmienna : mesh Wczytana siatka SaveMesh FileName= Format= Zapisuje siatkę do pliku. Obsługiwane formaty (format jest rozpoznawany po rozszerzeniu): - X - pełne wsparcie dla dowolnego FVF, ale brak wsparcia dla animacji szkieletowej. - OBJ - w bieżącej wersji żeby zapisać do OBJ, wierzchołek musi być w formacie FVF "XN2", a indeksy w formacie 16-bitowym. Parametry: siatka : mesh Siatka do zapisania nazwa-pliku : string Nazwa dla pliku siatki X format : enum [opcjonalny] Format pliku X. Możliwości: text [domyślny] binary compressed Przykład: SaveMesh Mesh1 FileName="Siatka.x" Format=binary = ConvertFVF NewFVF= Swizzle= Konwertuje siatkę do innego formatu wierzchołka. Parametry: siatka1 : mesh Siatka do skonwertowania. FVF : string Łańcuch opisujący nowy format wierzchołka (opisany niżej) Swizzle : string [opcjonalny] Łańcuch opisujący mapowanie starych do nowych komponentów wierzchołka. Na przykład "01-22-", gdzie komponenty (niezależnie od rozmiaru i ilości składowych, np. DIFFUSE ma jedną liczbę a NORMAL trzy) wierzchołka źródłowego są numerowane od 0, a '-' oznacza wypełnienie komponentu docelowego zerami. Jeśli nie podany, program sam zamapuje odpowiadające sobie komponenty wypełniając pozostałe zerami. Zwracane: siatka2 : mesh Nowa siatka. Nowopowstała siatka nie będzie miała Adjacency. = ConvertIndexFormat NewFormat= Konwertuje indeksy siatki na podany format. Parametry: siatka1 : mesh Siatka do skonwertowania. format : integer Nowy format indeksów dla siatki w bitach - 16 lub 32. Zwracane: siatka2 : mesh Nowa siatka. Nowopowstała siatka będzie miała Adjacency. = NVMeshMender NewFVF= SrcMapping= DstMapping= MinCreaseAngle= WeightNormalsByArea= CalcNormals= RespectExistingSplits= FixCylindricalWrapping= Odpala NVMeshMender celem policzenia dla siatki wektorów tangent, binormal i opcjonalnie normal na podstawie jej geometrii i z podanymi ustawieniami. Parametry: NewFVF : string [opcjonalny] Definicja nowego formatu wierzchołka dla siatki wyjściowej. SrcMapping : string [opcjonalny] Mapowanie semantyki pól wierzchołków siatki wejściowej. Patrz niżej. DstMapping : string [opcjonalny] Mapowanie semantyki pól wierzchołków siatki wyjściowej. Patrz niżej. MinCreaseAngle : float [stopnie] Maksymalny kąt między normalnymi dla którego ma następować wygładzanie. (Pisze Min bo z niego jest liczony minimalny cosinus tego kąta.) WeightNormalsByArea : float [0..1] [opcjonalny] - 1 = normalne są ważone przez powierzchnie trójkątów - 0 = normalne są po prostu uśredniane - Dopuszczalne są też wartości pośrednie. - Ta opcja zdaje się nie działać - wyliczane normalne są błędne jeśli jest różna od 1. Domyślnie: 1 CalcNormals : boolean [opcjonaly] Czy obliczać normalne. Jeśli nie, przepisane zostaną normalne siatki wejściowej. Siatka wejściowa musi wówczas posiadać normalne i mieć zamapowaną dla nich semantykę w SrcMapping. Domyślnie: true RespectExistingSplits : boolean [opcjonalny] Czy respektować krawędzie reprezentowane przez dwa osobne wierzchołki w danym miejscu. Jeśli nie, krawędź będzie mogła być wygładzona nawet jeśli w siatce wejściowej była reprezentowana przez dwa osobne wierzchołki. Domyślnie: false FixCylindricalWrapping : boolean [opcjonalny] Czy naprawiać zniekształcenia. Włączać tylko kiedy naprawdę potrzebne. Domyślnie: false Zwracane: siatka2 : mesh Nowa przeliczona siatka. - Ma tyle samo trójkątów co stara. - Może mieć inną liczbę wierzchołków niż stara. - Ma taki sam format indeksów jak stara. - Może mieć i zazwyczaj ma inny format wierzchołka niż stara. - Nie ma Adjacency. SrcMapping, DstMapping: To łańcuch, który dla każdego komponentu formatu wierzchołka siatki wejściowej lub wyjściowej przyporządkowuje semantykę (znaczenie) dla NVMeshMender. Dopuszczalne wartości: x - pozycja (XYZ : float3) n - normalna (NORMAL : float3) c - współrzędne tekstury (TEXCOORDSIZE2 : float2) t - tangent (TEXCOORDSIZE3 : float3) [tylko dla DstMapping] b - binormal (TEXCOORDSIZE3 : float3) [tylko dla DstMapping] - - komponent bez semantyki 0..9 - przepisywanie składowej z wybranego komponentu siatki wejściowej [tylko dla DstMapping] Jeśli SrcMapping lub DstMapping jest niepodany, zostanie wygenerowany automatycznie. Przykłady: - m2 = NVMeshMender m1 NewFVF="XN2" MinCreaseAngle=30 - m2 = NVMeshMender m1 \ NewFVF="XNDS223334" \ MinCreaseAngle=30 \ CalcNormals=true \ RespectExistingSplits=false - m2 = NVMeshMender m1 \ NewFVF="XNDS223334" \ SrcMapping="xnc" \ DstMapping="xn--c-tb--" \ MinCreaseAngle=30 GenerateAdjacency Epsilon= Replace= Generuje informacje Adjacency wewnątrz danej siatki. Parametry: Mesh : mesh Siatka Epsilon : float Maksymalna odległość między wierzchołkami uznawanymi za jeden i ten sam. Replace : boolean [opcjonalny] Czy zastąpić istniejące informacje. - false - jeśli są, to nie generować nowych. - true - jeśli są, to porzucić je i wygenerować na nowo. Domyślnie: true. = Simplify NumVertices= NumFaces= Upraszcza siatkę do mniej więcej podanej liczby wierzchołków lub trójkątów. Parametry: Mesh1 : mesh Siatka wejściowa. Num : integer Liczba wierzchołków lub trójkątów, do jakich uprościć. Musi być tylko jeden z tych parametrów. Zwracane: Mesh2 : mesh Siatka wyjściowa. Uwaga: Chociaż funkcja D3DX jest wywoływana poprawnie to wygląda na to że nie działa. Generuje siatkę wyjściową zawsze taką samą jak wejściowa. Optimize What= Optymalizuje siatkę przestawiając wierzchołki, indeksy itd. Parametry: Mesh1 : mesh Siatka do optymalizacji w miejscu. What : enum Co zrobić: - StripReorder - Reorders faces to maximize length of adjacent triangles. - VertexCache - Reorders faces to increase the cache hit rate of vertex caches. - Compact - Reorders faces to remove unused vertices and faces. Translate x= y= z= Przesuwa współrzędne pozycji wszystkich wierzchołków o podane wartości. Parametry: Mesh1 : mesh Siatka do zmodyfikowania. x, y, z : float [opcjonalne] O ile przesunąć w danej osi. Domyślnie: 0 Scale x= y= z= Scale Factor= Mnoży współrzędne pozycji wszystkich wierzchołków przez podane wartości. Odpowiednio przekształca też normalne, natomiast nie dokonuje odwracania kierunku trójkątów - w przypadku odbijania trzeba samemu zrobić FlipFaces. Parametry: Mesh1 : mesh Siatka do zmodyfikowania. x, y, z : float [opcjonalne] Przez ile pomnożyć daną współrzędną. Domyślnie: 1 f : float Przez ile pomnożyć wszystkie współrzędne. CalcBoundingBox Oblicza i wypisuje na ekranie współrzędne prostopadłościanu otaczającego podaną siatkę. Rotate Axis= Angle= Obraca współrzędne siatki o podany kąt wzdłuż podanej osi. Parametry: Mesh1 : mesh Siatka do przekształcenia Axis : enum Oś, wokół której obracać wg kierunku jak w układzie lewoskrętnym. Dopuszczalne wartości: X, Y, Z Angle : float Kąt, o jaki obrócić w stopniach. FlipNormals Odwraca w podanej siatce wektory normalne na przeciwną stronę. FlipFaces Odwraca w podanej siatce trójkąty na przeciwną stronę, tak że przednia strona stanie się tylną, a tylna przednią. Nie zmienia normalnych. TransformCoord Swizzle= Przekształca układ współrzędnych podanej siatki - jej współrzędne, ale także normalne. Nie dokonuje odwracania kierunku trójkątów - w przypadku odbijania trzeba samemu zrobić FlipFaces. Parametry: Mesh1 : mesh Siatka do przekształcenia. Swizzle : string Łańcuch 6 znaków oznaczający sposób przekształcenia układu, w postaci na przykład "-y+x+z", co oznacza zamianę: (x,y,z) ma (x',y',z') w taki sposób: x' = -y y' = x z' = z = TempFile [Ext] Generuje i zwraca unikatową nazwę dla pliku tymczasowego. Można jej użyć jako nazwy dla pliku wykorzystywanego w skrypcie. Pliki tymczasowe są kasowane po zakończeniu skryptu. Parametry: Ext : string [opcjonalny] Żądane rozszerzenie dla nazwy pliku. Zwracane: Path : string Zwrócona nazwa dla pliku tymczasowego wraz z pełną ścieżką. Exec Parameters= Directory= Uruchamia zewnętrzny program, udostępnia mu swoją konsolę i czeka na jego zakończenie. Polecenie przydatne do uruchamiania zewnętrznych narzędzi konsolowych. Parametry: FileName : string Nazwa pliku wykonywalnego EXE do uruchomienia. Może być ze ścieżką bezwzględną, względną albo bez ścieżki. Parameters : string [łańcuch formatujący] [opcjonalny] Parametry do przekazania dla wiersza poleceń uruchamianego programu. Directory : string [opcjonalny] Katalog roboczy dla uruchamianego programu. Jeśli nie podany, użyty zostanie katalog bieżący MeshProcessor. ScaleTexCoords Mapping= x= y= z= w= ScaleTexCoords Mapping= Factor= Mnoży współrzędne tekstury wszystkich wierzchołków przez podane wartości. Parametry: Mesh1 : mesh Siatka do zmodyfikowania. Mapping : string Semantyka formatu wierzchołka wskazująca za pomocą liter 'c' (jednej lub więcej) współrzędne, które należy pomnożyć. Na przykład jeśli wierzchołki są w formacie "XN22", aby pomnożyć tylko drugą współrzędną wpisz jako Mapping "---c", a aby pomnożyć obie - "--cc". x, y, z : float [opcjonalne] Przez ile pomnożyć daną współrzędną. Domyślnie: 1 f : float Przez ile pomnożyć wszystkie współrzędne. Przykłady: ScaleTexCoords m1 Mapping="-c" Factor=2 ScaleTexCoords m1 Mapping="--c--" x=0.5 y=0.75 = LoadTexture FileName= Wczytuje teksturę z pliku. Format jest rozpoznawany po rozszerzeniu. Wspierane formaty: BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR, PDM. Parametry: FileName : string Nazwa pliku do wczytania. Może być ze ścieżką. Zwracane: t1 : texture Wczytana tekstura. SaveTexture FileName= Zapisuje teksturę do pliku. Format jest rozpoznawany po rozszerzeniu. Wspierane formaty: BMP, JPG, TGA, PNG, DDS, PPM, DIB, HDR, PDM. Parametry: t1 : texture Tekstura do zapisania. FileName : string Nazwa dla pliku. Może być ze ścieżką. = LoadRaw FileName= Width= Height= Bits= Header=
Stride= Wczytuje plik binarny jako teksturę. Powstała tekstura będzie w formacie X8R8G8B8 i w odcieniach szarości. Wczytywany jest tylko jeden kanał na piksel. Parametry: FileName : string Nazwa pliku do wczytania. Rozszerzenie jest obojętne. Width, Height : integer Szerokość i wysokość obrazka Bits : integer Rozmiar danych piksela w bajtach. Dopuszczalne wartości: 8, 16, 32. Header : integer [opcjonalny] Liczba bajtów do pominięcia na początku pliku. Domyślnie: 0 Stride : integer [opcjonalny] Rozmiar pisela w bajtach. Może być większy niż Bits - wówczas pozostałe bajty każdego piksela zostają pominięte. Domyślnie równy Bits. = GenHeightmap

Generuje siatkę z mapą wysokości (terenu, ang. heightmap) na podstawie podanej tekstury. Parametry: t1 : texture Teksura wejściowa Zwracane: m1 : mesh Siatka wyjściowa Opis: - Tekstura wejściowa musi być w formacie X8R8G8B8 lub A8R8G8B8. - Jako wysokość pobierana jest wartość koloru czerwonego. - Siatka wyjściowa będzie miała indeksy w formacie 16-bitowym, a wierzchołki w formacie "XN2". - Współrzędne będą leżały w przedziale: X = 0 .. szerokość tekstury Z = 0 .. wysokość tekstury Y = 0 .. 1 - Współrzędne tekstury będą równe współrzędnym X i Z. Predefiniowane zmienne ================================================================================ Zmienne odpowiadające dodatkowym parametrom przekazanym do programu to kolejno: Arg0, Arg1, ... Format wierzchołka FVF ================================================================================ To łańcuch opisujący pola, z jakich składa się każdy wierzchołek siatki. Znaczenie poszczególnych znaków: X - XYZ W - XYZW R - XYZRHW a - XYZB1 b - XYZB2 c - XYZB3 d - XYZB4 e - XYZB5 N - NORMAL P - PSIZE D - DIFFUSE S - SPECULAR 1 - TEXCOORDSIZE1(n) 2 - TEXCOORDSIZE2(n) 3 - TEXCOORDSIZE3(n) 4 - TEXCOORDSIZE4(n) u - LASTBETA_UBYTE4 l - LASTBETA_D3DCOLOR Na przykład typowy format wygląda tak: "XN2". Format z wektorami tangent i binormal może wyglądać tak: "XN233". Łańcuch formatujący ================================================================================ To łańcuch do którego w wybrane miejsca wstawione zostają wartości zmiennych. Może występować tylko tam, gdzie oczekiwany jest łańcuch formatujący - nie działa w każdym łańcuchu! Przykładowy skrypt: v1 = Set "ala" v2 = Set False v3 = Set 12 v = Format "zmienna1={v1} zmienna2={v2} zmienna3={v3}" Print v Wypisze na wyjściu: zmienna1=ala zmienna2=false zmienna3=12 Jako łańcucha formatującego można używać dowolnego łańcucha znaków i tylko między nawiasami klamrowymi muszą się znajdować poprawne nazwy zmiennych. Podane zmienna muszą istnieć i być typu prostego (liczba, łańcuch itp.). Użyte zostały ================================================================================ - Microsoft Visual Studio 2005 - Microsoft DirectX SDK (August 2006) - nVidia NVMeshMender Ten program zawiera kod dostarczony przez firmę NVIDIA. This software contains source code provided by NVIDIA Corporation.