Skip to content
Shihan edited this page Dec 16, 2022 · 2 revisions

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.

Table of Contents

Genereller Aufbau

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

Abschnitte der Datei

Die folgenden Abschnitte umfassen die ganze Datei.

Datei-Header

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

String-Tabelle

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
Die Namen werden jeweils über einen speziellen String-Index referenziert. Dieser ist 1-basiert (im Gegensatz zu allen anderen Offsets) und setzt sich aus dem Index des Strings im Datenblock zusammen. So verweist das erste Material aus der MARKET01.3DM beispielsweise auf die Position 0x01. Die String-Tabelle startet bei 0x40. Also startet der String bei 0x40 + 0x01 - 1 = 0x40 und heißt N_MH_CEILING. Das zweite Material verweise auf die Position 0x0E, also: 0x40 + 0x0E - 1 = 0x4D => N_MH_WALL2. Diese Index-Berechnung wird für jeden String-Verweis durchgeführt.

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.

Objekt-Header

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
Die unbekannten Integer-Einträge in der Mitte des Blocks könnten vermutlich Platzierungsinformationen darstellen. So hätte jedes Objekt ein eigenes Koordinatensystem, unter dem es seine Vertices speichert, und einen Wert in Form von Weltkoordinaten in der Karte. Dies ist aber bisher nur eine Vermutung.

Unbekannter Datenblock

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.

Materialien-Einträge

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'

Objekt-Einträge

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
Kategorie:DSA3Kategorie:Geometrieformat
Clone this wiki locally