Hallo Leute,
Ich hab mir mal die Zeit genommen das komplette O3D Datei Format aufzuschreiben.
Vielleicht kann der eine oder andere was damit anfangen.
Alles anzeigen
Ich hab mir mal die Zeit genommen das komplette O3D Datei Format aufzuschreiben.
Vielleicht kann der eine oder andere was damit anfangen.
PHP-Quellcode
- O3D FILE FORMAT
- 1 byte - Name Length
- 4 bytes - Name
- 4 bytes - Version
- if Version < 20
- Error - Return FAIL
- 4 bytes - ID
- 12 bytes - D3DVECTOR3 Force1
- 12 bytes - D3DVECTOR3 Force2
- if Version >21
- 12 bytes - D3DVECTOR3 Force3
- 12 bytes - D3DVECTOR3 Force4
- 4 bytes - FLOAT ScrlU
- 4 bytes - FLOAT ScrlV
- 16 bytes - NULL, skip that ones
- 12 bytes - D3DVECTOR3 BoundingBox Minimum
- 12 bytes - D3DVECTOR3 BoundingBox Minimum
- 4 bytes - FLOAT PerSlerp
- 4 bytes - Frame Count
- 4 bytes - Event Count
- if Event Count > 0
- start loop1 - Repeat x times, where x is equal to Event Count
- 12 bytes - D3DVECTOR3 Event
- end loop1
- 4 bytes - Temp
- if Temp != 0 - Now the Geometry Part
- 12 bytes - D3DVECTOR3 BoundingBox Minimum
- 12 bytes - D3DVECTOR3 BoundingBox Minimum
- 4 bytes - INT used as BOOLEAN Opacity
- 4 bytes - INT used as BOOLEAN Bump
- 4 bytes - INT used as BOOLEAN Rigid Body
- 28 bytes - NULL, skip that ones
- 4 bytes - Number of Vertices
- 4 bytes - Number of Vertex Buffers
- 4 bytes - Number of Faces
- 4 bytes - Number of Index Buffers
- start loop2 - Repeat x times, where x is the Number of Vertices
- 12 bytes - D3DVECTOR3 Vertex List
- end loop2
- if MeshType == 1 -- if the Object is skinned
- start loop3 - Repeat x times, where x is the Number of Vertex Buffers
- //44 bytes - SKINVERTEX it is built as this:
- 12 Bytes - D3DVECTOR3 3D Position of Vertex
- 4 Bytes - FLOAT Vertex Weight 1
- 4 Bytes - FLOAT Vertex Weight 2
- 4 Bytes - DWORD Material ID
- 12 Bytes - D3DVECTOR3 Surface Normal for the Vertex
- 4 Bytes - FLOAT Texture Coordinate u
- 4 Bytes - FLOAT Texture Coordinate v
- end loop3
- else-- if the Object is not skinned
- start loop4 - Repeat x times, where x is the Number of Vertex Buffers
- //32 bytes - NORMALVERTEX it is built as this:
- 12 Bytes - D3DVECTOR3 3D Position of Vertex
- 12 Bytes - D3DVECTOR3 Surface Normal for the Vertex
- 4 Bytes - FLOAT Texture Coordinate u
- 4 Bytes - FLOAT Texture Coordinate v
- end loop4
- start loop5 - Repeat x times, where x is the Number of Index Buffers
- 2 bytes - WORD
- end loop 5
- start loop5 - Repeat x times, where x is the Number of Vertex Buffers
- 2 bytes - WORD
- end loop 5
- 4 bytes - Temp
- if Temp != 0 -- Physique
- start loop6 - Repeat x times, where x is the Number of Vertices
- 4 bytes - Physique Vertex
- end loop6
- 4 bytes - IsMaterial
- if IsMaterial != 0 -- IsMaterial = True
- 4 bytes - MaxMaterial
- start loop7 - Repeat x times, where x is the Number of Materials
- //68 bytes - D3D9MATERIAL it is built like this:
- 16 bytes - D3DCOLORVALUE Diffuse Color with r(ed), g(reen), b(blue), a(lpha)
- 16 bytes - D3DCOLORVALUE Ambient Color with r(ed), g(reen), b(blue), a(lpha)
- 16 bytes - D3DCOLORVALUE Specular Color with r(ed), g(reen), b(blue), a(lpha)
- 16 bytes - D3DCOLORVALUE Emissive Color with r(ed), g(reen), b(blue), a(lpha)
- 4 bytes - FLOAT Power of the Color
- 4 bytes - Bitmap Filename Length
- 4 bytes - Bitmap Filename
- end loop7
- 4 bytes - Vertex Buffer Material Block
- if Vertex Buffer Material Block > 31
- ERROR - Return FAIL
- if Vertex Buffer Material Block > 0
- start loop8 - Repeat x times, where x is the Number of Material Blocks
- //136 bytes - MATERiAL_BLOCK it is built like this:
- 4 bytes - Start Vertex
- 4 bytes - Primitive Count
- 4 bytes - Texture ID
- 4 bytes - DWORD Effect
- 4 bytes - Amount
- 4 bytes - Number of Bones
- 28*4 bytes - INT ARRAY Bone
- end loop8
- 4 bytes - INT used as BOOLEAN LOD
- 4 bytes - Bone Count
- if Bone Count > 0
- start loop9 - Repeat x times, where x is equal to Bone Count
- 64 bytes - D3DXMATRIX LocalTM (16 float values in a 4x4 Matrix)
- end loop9
- start loop10 - Repeat x times, where x is equal to Bone Count
- 64 bytes - D3DXMATRIX InversedTM (16 float values in a 4x4 Matrix)
- end loop10
- 4 bytes - INT used as BOOLEAN SendVS
- 4 bytes - PoolSize
- start loop11 - Repeat x times, where x is the amount of LoDPresent
- 4 bytes - Object Count
- start loop12 - Repeat x times, where x is equal to Object Count
- 4 bytes - Mesh Type
- 4 bytes - Number of Bones
- if Number of Bones > 0
- start loop13 - Repeat x times, where x is equal to Number of Bones
- 4x28 Bytes - INT ARRAY Bone
- end loop13
- 4 bytes - Object ID
- 4 bytes - Parent Index
- if Parent Index != -1
- 4 Bytes - Parent Type
- 64 bytes - D3DXMATRIX LocalTM (16 float values in a 4x4 Matrix)
- end loop12
- end loop11
- 12 bytes - D3DVECTOR3 BoundingBox Minimum
- 12 bytes - D3DVECTOR3 BoundingBox Minimum
- 4 bytes - INT used as BOOLEAN Opacity
- 4 bytes - INT used as BOOLEAN Bump
- 4 bytes - INT used as BOOLEAN Rigid Body
- 28 bytes - NULL, skip that ones
- 4 bytes - Number of Vertices
- 4 bytes - Number of Vertex Buffers
- 4 bytes - Number of Faces
- 4 bytes - Number of Index Buffers
- start loop14 - Repeat x times, where x is the Number of Vertices
- 12 bytes - D3DVECTOR3 Vertex List
- end loop14
- if MeshType == 1 -- if the Object is skinned
- start loop15 - Repeat x times, where x is the Number of Vertex Buffers
- //44 bytes - SKINVERTEX it is built as this:
- 12 Bytes - D3DVECTOR3 3D Position of Vertex
- 4 Bytes - FLOAT Vertex Weight 1
- 4 Bytes - FLOAT Vertex Weight 2
- 4 Bytes - DWORD Material ID
- 12 Bytes - D3DVECTOR3 Surface Normal for the Vertex
- 4 Bytes - FLOAT Texture Coordinate u
- 4 Bytes - FLOAT Texture Coordinate v
- end loop15
- else-- if the Object is not skinned
- start loop16 - Repeat x times, where x is the Number of Vertex Buffers
- //32 bytes - NORMALVERTEX it is built as this:
- 12 Bytes - D3DVECTOR3 3D Position of Vertex
- 12 Bytes - D3DVECTOR3 Surface Normal for the Vertex
- 4 Bytes - FLOAT Texture Coordinate u
- 4 Bytes - FLOAT Texture Coordinate v
- end loop16
- start loop17 - Repeat x times, where x is the Number of Index Buffers
- 2 bytes - WORD
- end loop17
- start loop18 - Repeat x times, where x is the Number of Vertex Buffers
- 2 bytes - WORD
- end loop18
- 4 bytes - Temp
- if Temp != 0 -- Physique
- start loop19 - Repeat x times, where x is the Number of Vertices
- 4 bytes - Physique Vertex
- end loop19
- 4 bytes - IsMaterial
- if IsMaterial != 0 -- IsMaterial = True
- 4 bytes - MaxMaterial
- start loop20 - Repeat x times, where x is the Number of Materials
- //68 bytes - D3D9MATERIAL it is built like this:
- 16 bytes - D3DCOLORVALUE Diffuse Color with r(ed), g(reen), b(blue), a(lpha)
- 16 bytes - D3DCOLORVALUE Ambient Color with r(ed), g(reen), b(blue), a(lpha)
- 16 bytes - D3DCOLORVALUE Specular Color with r(ed), g(reen), b(blue), a(lpha)
- 16 bytes - D3DCOLORVALUE Emissive Color with r(ed), g(reen), b(blue), a(lpha)
- 4 bytes - FLOAT Power of the Color
- 4 bytes - Bitmap Filename Length
- 4 bytes - Bitmap Filename
- end loop20
- 4 bytes - Vertex Buffer Material Block
- if Vertex Buffer Material Block > 31
- ERROR - Return FAIL
- if Vertex Buffer Material Block > 0
- start loop8 - Repeat x times, where x is the Number of Material Blocks
- //136 bytes - MATERiAL_BLOCK it is built like this:
- 4 bytes - Start Vertex
- 4 bytes - Primitive Count
- 4 bytes - Texture ID
- 4 bytes - DWORD Effect
- 4 bytes - Amount
- 4 bytes - Number of Bones
- 28*4 bytes - INT ARRAY Bone
- end loop8
- if Version > 20
- 4 bytes - Attribute
- if Attribute == Frame Count
- start loop21 - Repeat x times, while x is equal to Frame Count
- //12 bytes - MOTION_ATTR it is build like this:
- 4 bytes - DWORD Attribue
- 4 bytes - Sound ID
- 4 bytes - FLOAT Frame
- end loop21