Brauche eure Idee für den Aufbau des eigenen Modelformates
-
Hallo!
Ist ja gerade nicht das erste Mal, dass ich euch mit diesem Thema belästige. Wie ihr evtl. wisst habe ich es bereit "geschafft" dass ich in der Modeldatei die Vertexdaten abspeicher + Indexdaten und sie auch wieder lade. Das ganze noch ohne Materialdaten und Texturangaben. Der Aufbau der Datei sieht bisher so aus:----------- | | | HEADER | : Anzahl der Vertizes und Indexdaten + Größe (Vertices/Indexdaten) | | |---------| | | | Vertizen| : Vertexdaten abgespeichert |_________| | | | Index | : Speichert die Daten des Indexbuffers | daten | |_________|
So weit, so gut. Nun lese ich die Materialdaten und die Textur aus. Doch wie speicher ich diese in der Datei am besten ab um sie auszulesen? Ich dachte mir noch ein Array in die Datei einzubauen, in dem alle benutzten texturen + ihre ID stehen (0,1,2,3.....) Die Vertexdaten bekommen dann noch als kleinen Zusatz eine TexturID. Jedoch ist die Frage wie ich das beim Rendern dann einbaue. Ich könnte jetzt für jede TexturID einen eigenen Indexbuffer und Vertexbuffer erstellen, doch das finde ich etwas umständlich. Vor allem würde sich bei mehreren Index/Vertexbuffern im Indexbuffer die IDs verändern, ich hoffe ihr versteht weshalb (weiß nicht wie ichs erklären soll - will euch nicht noch mehr verwirren).
Ich hoffe ihr seid bis hierhin dabeiDann dachte ich vielleicht dass ich für jede Textur mit einem bestimmten Material die Vertexdaten und Indexdaten direkt getrennt in die Datei schreibe, z.b.:
----------- | | | HEADER | : Anzahl der Vertizes und Indexdaten + Größe (Vertices/Indexdaten) | | |---------| | | | Vertizen| : Vertexdaten abgespeichert |___textur1 | | | Index | : Speichert die Daten des Indexbuffers | daten | |textur1__| | | | Vertizen| : Vertexdaten abgespeichert |___textur2 | | | Index | : Speichert die Daten des Indexbuffers | daten | |textur2__|
Hier bekommt dann jede Textur / Materialkombination ihren eigenen Vertexdaten und Indexdaten Block.
////edit////
Habe mir grad noch das hier gedacht, gefällt mir am besten. Im Header erstell ich mir noch ein DWORD nMaterialsCount und iSizeOfTextureNames. Und in der Datei habe ich dann ein chararray von der Größe iSizeOfTextureNames in der ich alle Texturnamen der Reihe nach speicher (nach ihrer MaterialsID) und sie mit einem \xd o.Ä. von einander trenne. Die Materials bekommen ein D3DMATERIAL8 array in der Datei, der Größe nMaterialsCount*sizeof(D3DMATERIAL8). Jeder Vektor bekommt dann eine TexturID und eine MaterialsID. Zusätzlich speicher ich noch das Ergebnis von GetAttributeID, damit ich weiß aus welchen Polygonen die Faces bestehen. Das ganze save ich dann in der Datei.
Zum Laden hol ich mir erstmal alle Texturnamen und alle Materials in ein Array, die ich dann leicht ansprechen kann. Um die Faces (definier ich jetzt mal als Polygongruppen mit unterschiedlichen Materials und Texturen) dann rendern zu können, muss ich die Daten ja noch aufteilen. Das mache ich, indem ich das Ergebnis von GetAttributeID nehme, und schaue, welche Vertizes ein Face bilden. Für jedes Face kürze ich dann den Indexbuffer. D.h. ich gehe alle "seine" IDs der Vertizen durch und schmeiß alles raus, welches nicht in der FaceRange liegt.Ich hoffe das war jetzt nicht zu verwirrend, aber was haltet ihr davon?
Welche Lösung würdet ihr verwenden (bitte detail(l)iert antworten ;))
Danke euch schonmal
Kevin