-
Notifications
You must be signed in to change notification settings - Fork 0
3DM
Das 3DM-Format ist mit BoPa gepackt und wird dann entpackt (und im Ordner CTEMP abgelegt), wenn das Spiel die betreffende Karte geladen hat. Solange Schatten über Riva läuft, wird die Karte jedesmal aus CTEMP geladen, wenn sie dort bereits liegt und der Spieler sie wieder betritt. Das kann man ausnutzen, um die Karten während der Laufzeit zu beeinflussen.
Generell enthält die Karte sämtliche Geometrie-Daten, die von der 3D-Engine dargestellt werden sollen. Dazu gehören Objekte, die aus zusammengefassten Flächen (Faces) bestehen. Ein Objekt kann aus einem einfachen Quadrat bestehen, aber auch mehrere, komplexere Flächen beinhalten (z.B. die Marktstände in der Markthalle). Die Nutzung von Texturen wird ebenfalls aus dieser Datei heraus gesteuert.
Eine Karte im 3DM-Format besteht aus mehreren Teilen:
- Datei-Header
- Daten-Block
- String-Tabelle
- Objekt-Header
- ein noch unbekannter Datenblock
- Materialien-Einträge
- Objekt-Einträge
Die folgenden Abschnitte umfassen die ganze Datei.
Die Datei startet immer mit einem Header, der den Aufbau beschreibt. Dieser ist scheinbar immer 64 Bytes groß.
Größe | Inhalt |
---|---|
char[4] | Signatur: 0A 68 24 00 |
int | Größe der Datei |
int | Anzahl der Objekte |
int | Anzahl der Einträge im unbekannten Datenblock |
int | Anzahl der Materialien |
char[4] | ??? |
int | Anzahl der Faces (für alle Objekte zusammen) |
int | Anzahl der Vertices (für alle Objekte zusammen) |
int | Startoffset der String-Tabelle (entspricht auch der Größe des Headers; eigentlich immer 0x40 (64 Bytes) |
int | Startoffset der Objekt-Header |
int | Startoffset für unbekannten Datenblock |
int | Startoffset der Materialien |
int | Startoffset der Objekt-Daten |
short | Major-Version, sollte immer 0x0065 sein |
short | Minor-Version, sollte immer 0x0008 sein |
char[4] | Scheinbar immer 0x00 |
char[4] | Scheinbar immer 0x00 |
Die String-Tabelle enthält sämtliche Strings (0-terminierte C-Strings), die von einer Karte verwendet werden. Dazu gehören:
- Namen der Materialien
- Namen der platzierten Objekte
- Namen der verwendeten Texturen
Es kann durchaus sein, dass hier gelistete Strings nachher unbenutzt bleiben. So gibt es z.B. in der Datei BORON01.3DM (Boronsacker) Einträge wie Camera01 und Light01. Diese Einträge werden nachher nicht mehr verwendet. Eventuell sind es noch Überbleibsel, die bei einem Export aus einem Modellier-Programm entstanden sind.
Sämtliche Objekte, die in der Karte platziert wurden (alles, was sichtbar ist, und einiges unsichtbares) werden zunächst in einer Reihe von Objekt-Header-Einträgen spezifiziert. Diese Einträge sind immer 124 Bytes groß.
Der Header beinhaltet z.B. die Anzahl der Vertices und Faces, zwei Koordinaten-Triplets für zwei Punkte, die einen Bounding-Quader um das Objekt aufspannen, Verweise auf die Bereiche, in denen Vertex-, Face- und Texturdaten angegeben sind, etc...
Größe | Inhalt |
---|---|
int | Name als String-Verweis (siehe String-Tabelle) |
short | Anzahl der Vertices im Objekt |
short | Anzahl der Faces im Objekt |
short | ??? |
short | ??? |
short | ??? |
short | ??? |
int | Bounding-Box: X-Komponente des Mittelpunkts |
int | Bounding-Box: Y-Komponente des Mittelpunkts |
int | Bounding-Box: Z-Komponente des Mittelpunkts |
int | ??? |
int | Bounding-Box: X-Komponente des 1. Punktes |
int | Bounding-Box: Y-Komponente des 1. Punktes |
int | Bounding-Box: Z-Komponente des 1. Punktes |
int | Bounding-Box: X-Komponente des 2. Punktes |
int | Bounding-Box: Y-Komponente des 2. Punktes |
int | Bounding-Box: Z-Komponente des 2. Punktes |
int | Offset des Objekt-Eintrags im Objekt-Daten-Block |
int | Anzahl an Bytes für die Vertices (immer ein Vielfaches von 4) |
int | Offset für die Faces |
int | Offset für Materialien (pro Face) |
int | Offset für Materialien (Dummy-Einträge???) |
char[2] | immer 0 |
char[2] | immer 0x0001 |
char[14] | immer 0 |
char[2] | immer 0x0001 |
char[14] | immer 0 |
char[2] | immer 0x0001 |
char[12] | immer 0 |
Der Sinn dieses Blocks ist noch völlig unbekannt. Manchmal ist er leer bzw. voller 0x00 (MARKET01.3DM), manchmal beinhaltet er einige Zahlen (z.B. MINE01.3DM). Die Größe ist unterschiedlich, je nach Karte. Jeder Eintrag ist 88 Byte lang. Die ersten Einträge sind eigentlich immer leer.
Alle Materialien, die von Objekten in der Karte verwendet werden, müssen hier aufgeführt sein. Jeder Material-Eintrag ist 52 Bytes groß.
Größe | Inhalt |
---|---|
int | Name als String-Verweis (siehe String-Tabelle) |
char[2] | Unbekannt, aber fast immer '0x00' (prüfen!) |
short | Alphawert; 0x64 = 100% bei sichtbaren Objekten, 0x00 = 0% bei unsichtbaren |
char[4] | Unbekannt, aber fast immer '0x00' (prüfen!) |
short | Meistens 0x0000, aber manchmal 0x1000 (nur bei sichtbaren Objekten) |
char[30] | Unbekannt, aber fast immer '0x00' |
int | Name der zugehörigen Textur-Datei als String-Verweis (siehe String-Tabelle) und ohne die Dateiendung .PIX |
char[4] | Unbekannt, aber immer '0x00' |
Für jedes Objekt gibt es hier einen Eintrag. Dieser Eintrag ist von variabler Größe und enthält Vertex-, Face- und Textur-Daten.
Größe | Inhalt |
---|---|
int[x]* | Vertices des Objekts: Tripel (X,Y,Z) als 32bit Signed Integer |
char[y]** | ??? |
- x = Anzahl der Vertices; im Objekt-Header angegeben
- y = Genaue Größe variabel; z.Z. unbekannt