This shows you the differences between two versions of the page.
— |
file_formats:bbm [2007/03/12 00:49] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | //Big Blue Box Mesh Format // | ||
+ | =====Tagged Model Format===== | ||
+ | ====3DMF==== | ||
+ | 3D Mesh File | ||
+ | ====3DRT==== | ||
+ | (File Size of all Chunks) | ||
+ | ===MTLS=== | ||
+ | Material List (File Size of All MTRL Chunks) | ||
+ | ==MTRL== | ||
+ | Material Description | ||
+ | ==MTLE== | ||
+ | Extended Material Properties | ||
+ | ==MMAP== | ||
+ | Mapping Info | ||
+ | ====SUBM==== | ||
+ | Sub-Mesh | ||
+ | ===TRFM=== | ||
+ | Transformation Matrix | ||
+ | ===PRIM=== | ||
+ | Primitive | ||
+ | ==TRIS== | ||
+ | Triangle List | ||
+ | ==SMTH== | ||
+ | Smoothing Groups | ||
+ | ==VERT== | ||
+ | Vertex List | ||
+ | ==UNIV== | ||
+ | Unique Vertex Information | ||
+ | ==VGRP== | ||
+ | Vertex Group | ||
+ | ===BONE=== | ||
+ | Bone | ||
+ | ===CLTH=== | ||
+ | Cloth | ||
+ | ====HLPR==== | ||
+ | Helpers | ||
+ | ===HPNT=== | ||
+ | Helper Point | ||
+ | ===HDMY=== | ||
+ | Dummy Object | ||
+ | ===HCVL=== | ||
+ | Convex Volume | ||
+ | =====Compiled Model Format===== | ||
+ | |||
+ | ====Header==== | ||
+ | <code> | ||
+ | //char NullTerminatedString[x]; | ||
+ | byte SkeletonPresent; | ||
+ | float floats[10]; //Model Origin?? Listed in .big Sub-header... | ||
+ | word HPNT_Count; | ||
+ | word HDMY_Count; | ||
+ | dword HLPR_Index_Uncompressed; | ||
+ | word padding; | ||
+ | word HPNT_Compressed; | ||
+ | </code> | ||
+ | [[BBM#Helper Points|Helper Points]][HPNT_Count]; | ||
+ | <code> | ||
+ | word HDMY_Compressed; | ||
+ | </code> | ||
+ | [[BBM#Helper Dummies|Helper Dummies]][HDMY_Count]; | ||
+ | <code> | ||
+ | word HLPR_Index_Compressed; | ||
+ | word HPNT_IndexSize; | ||
+ | char HPNT_Index[HPNT_IndexSize-2]; //Subtract the size | ||
+ | char HDMY_Index[HLPR_Index_Uncompressed-HPNT_IndexSize]; //Rest of helper index deduced | ||
+ | dword NumberMaterials; | ||
+ | dword NumberSurfaces; | ||
+ | dword NumberBones; | ||
+ | dword SizeOfBoneIndex; | ||
+ | byte Unknown; | ||
+ | word Unknown; | ||
+ | word Unknown; | ||
+ | word Compressed; | ||
+ | word Bone_Index_Reference[NumberBones-1]; | ||
+ | word BoneIndexCompressed; | ||
+ | char BoneIndex[SizeOfBoneIndex]; | ||
+ | word CompressedSize; | ||
+ | </code> | ||
+ | [[BBM#SUB CHUNK 1|Bones SUB CHUNK 1]][NumberBones]; | ||
+ | <code> | ||
+ | word CompressedSize; | ||
+ | </code> | ||
+ | [[BBM#SUB CHUNK 2|Bones SUB CHUNK 2]][NumberBones]; | ||
+ | <code> | ||
+ | word CompressedSize; | ||
+ | </code> | ||
+ | [[BBM#SUB CHUNK 3|Bones SUB CHUNK 3]][NumberBones]; | ||
+ | <code> | ||
+ | float Matrix[12]; //Transform Matrix | ||
+ | </code> | ||
+ | |||
+ | ====Helper Points==== | ||
+ | <code> | ||
+ | float Matrix[4]; //No Rotation | ||
+ | long hierarchy; | ||
+ | </code> | ||
+ | |||
+ | ====Helper Dummies==== | ||
+ | <code> | ||
+ | float Matrix[13]; | ||
+ | long hierarchy; | ||
+ | </code> | ||
+ | |||
+ | ====Bones==== | ||
+ | ===SUB CHUNK 1=== | ||
+ | <code> | ||
+ | long Index; | ||
+ | long Parent; | ||
+ | long nChild; | ||
+ | float Matrix[12]; | ||
+ | </code> | ||
+ | ===SUB CHUNK 2=== | ||
+ | <code> | ||
+ | float Matrix[12]; | ||
+ | </code> | ||
+ | ===SUB CHUNK 3=== | ||
+ | <code> | ||
+ | float Matrix[16]; | ||
+ | </code> | ||
+ | |||
+ | ====Material List==== | ||
+ | <code> | ||
+ | dword Material_Index; | ||
+ | char NullTerminatedString[x]; | ||
+ | dword Padding; | ||
+ | dword BASE_Texture_ID; //From Texture.big | ||
+ | dword BUMPMAP_Texture_ID; //From Texture.big | ||
+ | dword REFLECT_Texture_ID; //From Texture.big | ||
+ | dword Unknown; | ||
+ | dword Max_Texture_Layers; | ||
+ | dword Glow_Strength; | ||
+ | byte Unknown; | ||
+ | byte Alpha_Enabled; | ||
+ | byte Unknown; | ||
+ | word Ignored; //For degenerate Tri's | ||
+ | </code> | ||
+ | |||
+ | ====Sub-Mesh==== | ||
+ | <code> | ||
+ | dword Hierarchy; | ||
+ | dword DestroyableMeshLevels; | ||
+ | float floats[5]; | ||
+ | dword nFaceVertexIndices; | ||
+ | dword nFaceVertexIndices_BoneIndice; | ||
+ | dword nVerts; | ||
+ | dword nFaces; | ||
+ | dword nSourceVerts; | ||
+ | dword Unknown; | ||
+ | dword Unknown; | ||
+ | dword Unknown; | ||
+ | struct structMTRLnFaceVertexIndices FaceIndices[nFaceVertexIndices]; | ||
+ | struct structMTRLnFaceVertexIndicesBoneIndice Face_BoneIndices[nFaceVertexIndices_BoneIndice]; | ||
+ | float floats[8]; | ||
+ | dword sVert; | ||
+ | dword padding; | ||
+ | //Start of Mesh | ||
+ | </code> | ||
+ | Quick notes on sVert "Size Vertice Blocks".... | ||
+ | |||
+ | 20 - 28byte float coords, bones, packed normals, s11e4 tu tv \\ | ||
+ | 6 - 28byte packed coords, bones, packed normals, s11e4 tu, tv, dword[2] \\ | ||
+ | 4 - 36byte float coords, float normals, float tu tv, dword meshlevel \\ | ||
+ | 22 - 36byte float coords, bones, packed normals, s11e4 tu,tv, dword[2] \\ | ||
+ | 4 - 12byte packed coords, packed normals, s11e4 tu tv \\ | ||
+ | 4 - 20byte packed coords, bones, packed normals, s11e4 tu tv \\ | ||
+ | 20 - 20byte float coords, packed normals, s11e4 tu tv \\ | ||
+ | |||
+ | |||
+ | |||
+ | ====Dynamic Clothing==== | ||
+ | <code> | ||
+ | struct CLTH | ||
+ | { | ||
+ | //DWORD SubMesh_ClothCount; | ||
+ | DWORD Cloth_ID; | ||
+ | DWORD ??_ID; //possibly material ID | ||
+ | DWORD sChunk; //Size of full clothing data | ||
+ | DWORD Unknown5; | ||
+ | DWORD sDistanceIndice; | ||
+ | CLTH_Distance* DistanceIndice;//[sDistanceIndice/28]; //Distance between two particles | ||
+ | float Unknown8; | ||
+ | float Unknown9; | ||
+ | float Unknown10; | ||
+ | DWORD sParticleIndice; | ||
+ | CLTH_Particle* ParticleIndice;//[sParticleIndice]; | ||
+ | float* ParticleAlphaIndice;//[sParticleIndice]; //How "free" they are. 0.0 = Static and gets a duped entry in verts | ||
+ | DWORD Unknown11; | ||
+ | float WindStrength; //strength | ||
+ | char EnableDragging; //enable | ||
+ | char RotationalDragging; //rotational | ||
+ | float StrengthDragging; //strength | ||
+ | char EnableAcceleration; //enable | ||
+ | float AccelerationDampening; //damping | ||
+ | DWORD nTriIndice; | ||
+ | CLTH_Tri* TriIndice;//[nTriIndice] Particles+"Unique" Verts | ||
+ | DWORD Unknown12; // looks like padding it | ||
+ | DWORD sTexIndice; | ||
+ | CLTH_Tex* TexIndice;//[sTexIndice]; //v1 = Particle/"unique" Vert, v2 = TexIndice | ||
+ | DWORD sVertexIndice; | ||
+ | CLTH_Vertex* VertexIndice;//[sVertexIndice]; | ||
+ | DWORD sTexCoordIndice; | ||
+ | CLTH_TexCoord* TexCoordIndice;//[sTexCoordIndice]; | ||
+ | DWORD sParticleMask; | ||
+ | CLTH_PartMask* ParticleMask;//[sParticleMask]; //Unique Particles in TriIndice | ||
+ | DWORD sVertMask; | ||
+ | CLTH_VertMask* Vertmask;//[sVertMask]; //Unique Verts in TriIndice | ||
+ | //9 bytes of padding | ||
+ | // 1 group for particles, 1 for verts | ||
+ | DWORD VGRPCount; // = Number of Bones | ||
+ | VGRP** VGRPs; | ||
+ | }; | ||
+ | </code> |