123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944 |
- /*
- Open Asset Import Library (assimp)
- ----------------------------------------------------------------------
- Copyright (c) 2006-2025, assimp team
- All rights reserved.
- Redistribution and use of this software in source and binary forms,
- with or without modification, are permitted provided that the
- following conditions are met:
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the
- following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other
- materials provided with the distribution.
- * Neither the name of the assimp team, nor the names of its
- contributors may be used to endorse or promote products
- derived from this software without specific prior
- written permission of the assimp team.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- ----------------------------------------------------------------------
- */
- /**
- * @file MDLFileData.h
- * @brief Definition of in-memory structures for the MDL file format.
- *
- * The specification has been taken from various sources on the internet.
- * - http://tfc.duke.free.fr/coding/mdl-specs-en.html
- * - Conitec's MED SDK
- * - Many quite long HEX-editor sessions
- */
- #ifndef AI_MDLFILEHELPER_H_INC
- #define AI_MDLFILEHELPER_H_INC
- #include <assimp/anim.h>
- #include <assimp/mesh.h>
- #include <assimp/Compiler/pushpack1.h>
- #include <assimp/ByteSwapper.h>
- #include <stdint.h>
- #include <vector>
- struct aiMaterial;
- namespace Assimp {
- namespace MDL {
- // -------------------------------------------------------------------------------------
- // to make it easier for us, we test the magic word against both "endiannesses"
- // magic bytes used in Quake 1 MDL meshes
- #define AI_MDL_MAGIC_NUMBER_BE AI_MAKE_MAGIC("IDPO")
- #define AI_MDL_MAGIC_NUMBER_LE AI_MAKE_MAGIC("OPDI")
- // magic bytes used in GameStudio A<very low> MDL meshes
- #define AI_MDL_MAGIC_NUMBER_BE_GS3 AI_MAKE_MAGIC("MDL2")
- #define AI_MDL_MAGIC_NUMBER_LE_GS3 AI_MAKE_MAGIC("2LDM")
- // magic bytes used in GameStudio A4 MDL meshes
- #define AI_MDL_MAGIC_NUMBER_BE_GS4 AI_MAKE_MAGIC("MDL3")
- #define AI_MDL_MAGIC_NUMBER_LE_GS4 AI_MAKE_MAGIC("3LDM")
- // magic bytes used in GameStudio A5+ MDL meshes
- #define AI_MDL_MAGIC_NUMBER_BE_GS5a AI_MAKE_MAGIC("MDL4")
- #define AI_MDL_MAGIC_NUMBER_LE_GS5a AI_MAKE_MAGIC("4LDM")
- #define AI_MDL_MAGIC_NUMBER_BE_GS5b AI_MAKE_MAGIC("MDL5")
- #define AI_MDL_MAGIC_NUMBER_LE_GS5b AI_MAKE_MAGIC("5LDM")
- // magic bytes used in GameStudio A7+ MDL meshes
- #define AI_MDL_MAGIC_NUMBER_BE_GS7 AI_MAKE_MAGIC("MDL7")
- #define AI_MDL_MAGIC_NUMBER_LE_GS7 AI_MAKE_MAGIC("7LDM")
- // common limitations for Quake1 meshes. The loader does not check them,
- // (however it warns) but models should not exceed these limits.
- #if (!defined AI_MDL_VERSION)
- # define AI_MDL_VERSION 6
- #endif
- #if (!defined AI_MDL_MAX_FRAMES)
- # define AI_MDL_MAX_FRAMES 256
- #endif
- #if (!defined AI_MDL_MAX_UVS)
- # define AI_MDL_MAX_UVS 1024
- #endif
- #if (!defined AI_MDL_MAX_VERTS)
- # define AI_MDL_MAX_VERTS 1024
- #endif
- #if (!defined AI_MDL_MAX_TRIANGLES)
- # define AI_MDL_MAX_TRIANGLES 2048
- #endif
- // material key that is set for dummy materials that are
- // just referencing another material
- #if (!defined AI_MDL7_REFERRER_MATERIAL)
- # define AI_MDL7_REFERRER_MATERIAL "&&&referrer&&&",0,0
- #endif
- // -------------------------------------------------------------------------------------
- /** \struct Header
- * \brief Data structure for the MDL main header
- */
- struct Header {
- //! magic number: "IDPO"
- uint32_t ident;
- //! version number: 6
- int32_t version;
- //! scale factors for each axis
- ai_real scale[3];
- //! translation factors for each axis
- ai_real translate[3];
- //! bounding radius of the mesh
- float boundingradius;
- //! Position of the viewer's exe. Ignored
- ai_real vEyePos[3];
- //! Number of textures
- int32_t num_skins;
- //! Texture width in pixels
- int32_t skinwidth;
- //! Texture height in pixels
- int32_t skinheight;
- //! Number of vertices contained in the file
- int32_t num_verts;
- //! Number of triangles contained in the file
- int32_t num_tris;
- //! Number of frames contained in the file
- int32_t num_frames;
- //! 0 = synchron, 1 = random . Ignored
- //! (MDLn formats: number of texture coordinates)
- int32_t synctype;
- //! State flag
- int32_t flags;
- //! Could be the total size of the file (and not a float)
- float size;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct Header_MDL7
- * \brief Data structure for the MDL 7 main header
- */
- struct Header_MDL7 {
- //! magic number: "MDL7"
- char ident[4];
- //! Version number. Ignored
- int32_t version;
- //! Number of bones in file
- uint32_t bones_num;
- //! Number of groups in file
- uint32_t groups_num;
- //! Size of data in the file
- uint32_t data_size;
- //! Ignored. Used to store entity specific information
- int32_t entlump_size;
- //! Ignored. Used to store MED related data
- int32_t medlump_size;
- //! Size of the Bone_MDL7 data structure used in the file
- uint16_t bone_stc_size;
- //! Size of the Skin_MDL 7 data structure used in the file
- uint16_t skin_stc_size;
- //! Size of a single color (e.g. in a material)
- uint16_t colorvalue_stc_size;
- //! Size of the Material_MDL7 data structure used in the file
- uint16_t material_stc_size;
- //! Size of a texture coordinate set in the file
- uint16_t skinpoint_stc_size;
- //! Size of a triangle in the file
- uint16_t triangle_stc_size;
- //! Size of a normal vertex in the file
- uint16_t mainvertex_stc_size;
- //! Size of a per-frame animated vertex in the file
- //! (this is not supported)
- uint16_t framevertex_stc_size;
- //! Size of a bone animation matrix
- uint16_t bonetrans_stc_size;
- //! Size of the Frame_MDL7 data structure used in the file
- uint16_t frame_stc_size;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct Bone_MDL7
- * \brief Data structure for a bone in a MDL7 file
- */
- struct Bone_MDL7 {
- //! Index of the parent bone of *this* bone. 0xffff means:
- //! "hey, I have no parent, I'm an orphan"
- uint16_t parent_index;
- uint8_t _unused_[2];
- //! Relative position of the bone (relative to the
- //! parent bone)
- float x,y,z;
- //! Optional name of the bone
- char name[1 /* DUMMY SIZE */];
- } PACK_STRUCT;
- #if (!defined AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_20_CHARS)
- # define AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_20_CHARS (16 + 20)
- #endif
- #if (!defined AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_32_CHARS)
- # define AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_32_CHARS (16 + 32)
- #endif
- #if (!defined AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_NOT_THERE)
- # define AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_NOT_THERE (16)
- #endif
- #if (!defined AI_MDL7_MAX_GROUPNAMESIZE)
- # define AI_MDL7_MAX_GROUPNAMESIZE 16
- #endif // ! AI_MDL7_MAX_GROUPNAMESIZE
- // -------------------------------------------------------------------------------------
- /** \struct Group_MDL7
- * \brief Group in a MDL7 file
- */
- struct Group_MDL7 {
- //! = '1' -> triangle based Mesh
- unsigned char typ;
- int8_t deformers;
- int8_t max_weights;
- int8_t _unused_;
- //! size of data for this group in bytes ( MD7_GROUP stc. included).
- int32_t groupdata_size;
- char name[AI_MDL7_MAX_GROUPNAMESIZE];
- //! Number of skins
- int32_t numskins;
- //! Number of texture coordinates
- int32_t num_stpts;
- //! Number of triangles
- int32_t numtris;
- //! Number of vertices
- int32_t numverts;
- //! Number of frames
- int32_t numframes;
- } PACK_STRUCT;
- #define AI_MDL7_SKINTYPE_MIPFLAG 0x08
- #define AI_MDL7_SKINTYPE_MATERIAL 0x10
- #define AI_MDL7_SKINTYPE_MATERIAL_ASCDEF 0x20
- #define AI_MDL7_SKINTYPE_RGBFLAG 0x80
- #if (!defined AI_MDL7_MAX_BONENAMESIZE)
- # define AI_MDL7_MAX_BONENAMESIZE 20
- #endif // !! AI_MDL7_MAX_BONENAMESIZE
- // -------------------------------------------------------------------------------------
- /** \struct Deformer_MDL7
- * \brief Deformer in a MDL7 file
- */
- struct Deformer_MDL7 {
- int8_t deformer_version; // 0
- int8_t deformer_typ; // 0 - bones
- int8_t _unused_[2];
- int32_t group_index;
- int32_t elements;
- int32_t deformerdata_size;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct DeformerElement_MDL7
- * \brief Deformer element in a MDL7 file
- */
- struct DeformerElement_MDL7 {
- //! bei deformer_typ==0 (==bones) element_index == bone index
- int32_t element_index;
- char element_name[AI_MDL7_MAX_BONENAMESIZE];
- int32_t weights;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct DeformerWeight_MDL7
- * \brief Deformer weight in a MDL7 file
- */
- struct DeformerWeight_MDL7 {
- //! for deformer_typ==0 (==bones) index == vertex index
- int32_t index;
- float weight;
- } PACK_STRUCT;
- // don't know why this was in the original headers ...
- typedef int32_t MD7_MATERIAL_ASCDEFSIZE;
- // -------------------------------------------------------------------------------------
- /** \struct ColorValue_MDL7
- * \brief Data structure for a color value in a MDL7 file
- */
- struct ColorValue_MDL7 {
- float r,g,b,a;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct Material_MDL7
- * \brief Data structure for a Material in a MDL7 file
- */
- struct Material_MDL7 {
- //! Diffuse base color of the material
- ColorValue_MDL7 Diffuse;
- //! Ambient base color of the material
- ColorValue_MDL7 Ambient;
- //! Specular base color of the material
- ColorValue_MDL7 Specular;
- //! Emissive base color of the material
- ColorValue_MDL7 Emissive;
- //! Phong power
- float Power;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct Skin
- * \brief Skin data structure #1 - used by Quake1, MDL2, MDL3 and MDL4
- */
- struct Skin {
- //! 0 = single (Skin), 1 = group (GroupSkin)
- //! For MDL3-5: Defines the type of the skin and there
- //! fore the size of the data to skip:
- //-------------------------------------------------------
- //! 2 for 565 RGB,
- //! 3 for 4444 ARGB,
- //! 10 for 565 mipmapped,
- //! 11 for 4444 mipmapped (bpp = 2),
- //! 12 for 888 RGB mipmapped (bpp = 3),
- //! 13 for 8888 ARGB mipmapped (bpp = 4)
- //-------------------------------------------------------
- int32_t group;
- //! Texture data
- uint8_t *data;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct Skin
- * \brief Skin data structure #2 - used by MDL5, MDL6 and MDL7
- * \see Skin
- */
- struct Skin_MDL5 {
- int32_t size, width, height;
- uint8_t *data;
- } PACK_STRUCT;
- // maximum length of texture file name
- #if (!defined AI_MDL7_MAX_TEXNAMESIZE)
- # define AI_MDL7_MAX_TEXNAMESIZE 0x10
- #endif
- // ---------------------------------------------------------------------------
- /** \struct Skin_MDL7
- * \brief Skin data structure #3 - used by MDL7 and HMP7
- */
- struct Skin_MDL7 {
- uint8_t typ;
- int8_t _unused_[3];
- int32_t width;
- int32_t height;
- char texture_name[AI_MDL7_MAX_TEXNAMESIZE];
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct RGB565
- * \brief Data structure for a RGB565 pixel in a texture
- */
- struct RGB565 {
- uint16_t r : 5;
- uint16_t g : 6;
- uint16_t b : 5;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct ARGB4
- * \brief Data structure for a ARGB4444 pixel in a texture
- */
- struct ARGB4 {
- uint16_t a : 4;
- uint16_t r : 4;
- uint16_t g : 4;
- uint16_t b : 4;
- } /*PACK_STRUCT*/;
- // -------------------------------------------------------------------------------------
- /** \struct GroupSkin
- * \brief Skin data structure #2 (group of pictures)
- */
- struct GroupSkin {
- //! 0 = single (Skin), 1 = group (GroupSkin)
- int32_t group;
- //! Number of images
- int32_t nb;
- //! Time for each image
- float *time;
- //! Data of each image
- uint8_t **data;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct TexCoord
- * \brief Texture coordinate data structure used by the Quake1 MDL format
- */
- struct TexCoord {
- //! Is the vertex on the noundary between front and back piece?
- int32_t onseam;
- //! Texture coordinate in the tx direction
- int32_t s;
- //! Texture coordinate in the ty direction
- int32_t t;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct TexCoord_MDL3
- * \brief Data structure for an UV coordinate in the 3DGS MDL3 format
- */
- struct TexCoord_MDL3 {
- //! position, horizontally in range 0..skinwidth-1
- int16_t u;
- //! position, vertically in range 0..skinheight-1
- int16_t v;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct TexCoord_MDL7
- * \brief Data structure for an UV coordinate in the 3DGS MDL7 format
- */
- struct TexCoord_MDL7 {
- //! position, horizontally in range 0..1
- float u;
- //! position, vertically in range 0..1
- float v;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct SkinSet_MDL7
- * \brief Skin set data structure for the 3DGS MDL7 format
- * MDL7 references UV coordinates per face via an index list.
- * This allows the use of multiple skins per face with just one
- * UV coordinate set.
- */
- struct SkinSet_MDL7
- {
- //! Index into the UV coordinate list
- uint16_t st_index[3]; // size 6
- //! Material index
- int32_t material; // size 4
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct Triangle
- * \brief Triangle data structure for the Quake1 MDL format
- */
- struct Triangle
- {
- //! 0 = backface, 1 = frontface
- int32_t facesfront;
- //! Vertex indices
- int32_t vertex[3];
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct Triangle_MDL3
- * \brief Triangle data structure for the 3DGS MDL3 format
- */
- struct Triangle_MDL3
- {
- //! Index of 3 3D vertices in range 0..numverts
- uint16_t index_xyz[3];
- //! Index of 3 skin vertices in range 0..numskinverts
- uint16_t index_uv[3];
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct Triangle_MDL7
- * \brief Triangle data structure for the 3DGS MDL7 format
- */
- struct Triangle_MDL7
- {
- //! Vertex indices
- uint16_t v_index[3]; // size 6
- //! Two skinsets. The second will be used for multi-texturing
- SkinSet_MDL7 skinsets[2];
- } PACK_STRUCT;
- #if (!defined AI_MDL7_TRIANGLE_STD_SIZE_ONE_UV)
- # define AI_MDL7_TRIANGLE_STD_SIZE_ONE_UV (6+sizeof(SkinSet_MDL7)-sizeof(uint32_t))
- #endif
- #if (!defined AI_MDL7_TRIANGLE_STD_SIZE_ONE_UV_WITH_MATINDEX)
- # define AI_MDL7_TRIANGLE_STD_SIZE_ONE_UV_WITH_MATINDEX (6+sizeof(SkinSet_MDL7))
- #endif
- #if (!defined AI_MDL7_TRIANGLE_STD_SIZE_TWO_UV)
- # define AI_MDL7_TRIANGLE_STD_SIZE_TWO_UV (6+2*sizeof(SkinSet_MDL7))
- #endif
- // Helper constants for Triangle::facesfront
- #if (!defined AI_MDL_BACKFACE)
- # define AI_MDL_BACKFACE 0x0
- #endif
- #if (!defined AI_MDL_FRONTFACE)
- # define AI_MDL_FRONTFACE 0x1
- #endif
- // -------------------------------------------------------------------------------------
- /** \struct Vertex
- * \brief Vertex data structure
- */
- struct Vertex
- {
- uint8_t v[3];
- uint8_t normalIndex;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- struct Vertex_MDL4
- {
- uint16_t v[3];
- uint8_t normalIndex;
- uint8_t unused;
- } PACK_STRUCT;
- #define AI_MDL7_FRAMEVERTEX120503_STCSIZE 16
- #define AI_MDL7_FRAMEVERTEX030305_STCSIZE 26
- // -------------------------------------------------------------------------------------
- /** \struct Vertex_MDL7
- * \brief Vertex data structure used in MDL7 files
- */
- struct Vertex_MDL7
- {
- float x,y,z;
- uint16_t vertindex; // = bone index
- union {
- uint8_t norm162index;
- float norm[3];
- };
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct BoneTransform_MDL7
- * \brief bone transformation matrix structure used in MDL7 files
- */
- struct BoneTransform_MDL7
- {
- //! 4*3
- float m [4*4];
- //! the index of this vertex, 0.. header::bones_num - 1
- uint16_t bone_index;
- //! I HATE 3DGS AND THE SILLY DEVELOPER WHO DESIGNED
- //! THIS STUPID FILE FORMAT!
- int8_t _unused_[2];
- } PACK_STRUCT;
- #define AI_MDL7_MAX_FRAMENAMESIZE 16
- // -------------------------------------------------------------------------------------
- /** \struct Frame_MDL7
- * \brief Frame data structure used by MDL7 files
- */
- struct Frame_MDL7
- {
- char frame_name[AI_MDL7_MAX_FRAMENAMESIZE];
- uint32_t vertices_count;
- uint32_t transmatrix_count;
- };
- // -------------------------------------------------------------------------------------
- /** \struct SimpleFrame
- * \brief Data structure for a simple frame
- */
- struct SimpleFrame
- {
- //! Minimum vertex of the bounding box
- Vertex bboxmin;
- //! Maximum vertex of the bounding box
- Vertex bboxmax;
- //! Name of the frame
- char name[16];
- //! Vertex list of the frame
- Vertex *verts;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct Frame
- * \brief Model frame data structure
- */
- struct Frame
- {
- //! 0 = simple frame, !0 = group frame
- int32_t type;
- //! Frame data
- SimpleFrame frame;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- struct SimpleFrame_MDLn_SP
- {
- //! Minimum vertex of the bounding box
- Vertex_MDL4 bboxmin;
- //! Maximum vertex of the bounding box
- Vertex_MDL4 bboxmax;
- //! Name of the frame
- char name[16];
- //! Vertex list of the frame
- Vertex_MDL4 *verts;
- } PACK_STRUCT;
- // -------------------------------------------------------------------------------------
- /** \struct GroupFrame
- * \brief Data structure for a group of frames
- */
- struct GroupFrame
- {
- //! 0 = simple frame, !0 = group frame
- int32_t type;
- int32_t numframes;
- //! Minimum vertex for all single frames
- Vertex min;
- //! Maximum vertex for all single frames
- Vertex max;
- //! List of times for all single frames
- float *times;
- //! List of single frames
- SimpleFrame *frames;
- } PACK_STRUCT;
- #include <assimp/Compiler/poppack1.h>
- // -------------------------------------------------------------------------------------
- /** \struct IntFace_MDL7
- * \brief Internal data structure to temporarily represent a face
- */
- struct IntFace_MDL7 {
- // provide a constructor for our own convenience
- IntFace_MDL7() AI_NO_EXCEPT {
- ::memset( mIndices, 0, sizeof(uint32_t) *3);
- ::memset( iMatIndex, 0, sizeof( unsigned int) *2);
- }
- //! Vertex indices
- uint32_t mIndices[3];
- //! Material index (maximally two channels, which are joined later)
- unsigned int iMatIndex[2];
- };
- // -------------------------------------------------------------------------------------
- /** \struct IntMaterial_MDL7
- * \brief Internal data structure to temporarily represent a material
- * which has been created from two single materials along with the
- * original material indices.
- */
- struct IntMaterial_MDL7 {
- // provide a constructor for our own convenience
- IntMaterial_MDL7() AI_NO_EXCEPT
- : pcMat( nullptr ) {
- ::memset( iOldMatIndices, 0, sizeof(unsigned int) *2);
- }
- //! Material instance
- aiMaterial* pcMat;
- //! Old material indices
- unsigned int iOldMatIndices[2];
- };
- // -------------------------------------------------------------------------------------
- /** \struct IntBone_MDL7
- * \brief Internal data structure to represent a bone in a MDL7 file with
- * all of its animation channels assigned to it.
- */
- struct IntBone_MDL7 : aiBone
- {
- //! Default constructor
- IntBone_MDL7() AI_NO_EXCEPT : iParent (0xffff)
- {
- pkeyPositions.reserve(30);
- pkeyScalings.reserve(30);
- pkeyRotations.reserve(30);
- }
- //! Parent bone of the bone
- uint64_t iParent;
- //! Relative position of the bone
- aiVector3D vPosition;
- //! Array of position keys
- std::vector<aiVectorKey> pkeyPositions;
- //! Array of scaling keys
- std::vector<aiVectorKey> pkeyScalings;
- //! Array of rotation keys
- std::vector<aiQuatKey> pkeyRotations;
- };
- // -------------------------------------------------------------------------------------
- //! Describes a MDL7 frame
- struct IntFrameInfo_MDL7
- {
- //! Construction from an existing frame header
- IntFrameInfo_MDL7(BE_NCONST MDL::Frame_MDL7* _pcFrame,unsigned int _iIndex)
- : iIndex(_iIndex)
- , pcFrame(_pcFrame)
- {}
- //! Index of the frame
- unsigned int iIndex;
- //! Points to the header of the frame
- BE_NCONST MDL::Frame_MDL7* pcFrame;
- };
- // -------------------------------------------------------------------------------------
- //! Describes a MDL7 mesh group
- struct IntGroupInfo_MDL7
- {
- //! Default constructor
- IntGroupInfo_MDL7() AI_NO_EXCEPT
- : iIndex(0)
- , pcGroup(nullptr)
- , pcGroupUVs(nullptr)
- , pcGroupTris(nullptr)
- , pcGroupVerts(nullptr)
- {}
- //! Construction from an existing group header
- IntGroupInfo_MDL7(BE_NCONST MDL::Group_MDL7* _pcGroup, unsigned int _iIndex)
- : iIndex(_iIndex)
- , pcGroup(_pcGroup)
- , pcGroupUVs()
- , pcGroupTris()
- , pcGroupVerts()
- {}
- //! Index of the group
- unsigned int iIndex;
- //! Points to the header of the group
- BE_NCONST MDL::Group_MDL7* pcGroup;
- //! Points to the beginning of the uv coordinate section
- BE_NCONST MDL::TexCoord_MDL7* pcGroupUVs;
- //! Points to the beginning of the triangle section
- MDL::Triangle_MDL7* pcGroupTris;
- //! Points to the beginning of the vertex section
- BE_NCONST MDL::Vertex_MDL7* pcGroupVerts;
- };
- // -------------------------------------------------------------------------------------
- //! Holds the data that belongs to a MDL7 mesh group
- struct IntGroupData_MDL7
- {
- IntGroupData_MDL7() AI_NO_EXCEPT
- : bNeed2UV(false)
- {}
- //! Array of faces that belong to the group
- std::vector<MDL::IntFace_MDL7> pcFaces;
- //! Array of vertex positions
- std::vector<aiVector3D> vPositions;
- //! Array of vertex normals
- std::vector<aiVector3D> vNormals;
- //! Array of bones indices
- std::vector<unsigned int> aiBones;
- //! First UV coordinate set
- std::vector<aiVector3D> vTextureCoords1;
- //! Optional second UV coordinate set
- std::vector<aiVector3D> vTextureCoords2;
- //! Specifies whether there are two texture
- //! coordinate sets required
- bool bNeed2UV;
- };
- // -------------------------------------------------------------------------------------
- //! Holds data from an MDL7 file that is shared by all mesh groups
- struct IntSharedData_MDL7 {
- //! Default constructor
- IntSharedData_MDL7() AI_NO_EXCEPT
- : apcOutBones(),
- iNum()
- {
- abNeedMaterials.reserve(12);
- }
- //! Destruction: properly delete all allocated resources
- ~IntSharedData_MDL7()
- {
- // kill all bones
- if (this->apcOutBones)
- {
- for (unsigned int m = 0; m < iNum;++m)
- delete this->apcOutBones[m];
- delete[] this->apcOutBones;
- }
- }
- //! Specifies which materials are used
- std::vector<bool> abNeedMaterials;
- //! List of all materials
- std::vector<aiMaterial*> pcMats;
- //! List of all bones
- IntBone_MDL7** apcOutBones;
- //! number of bones
- unsigned int iNum;
- };
- // -------------------------------------------------------------------------------------
- //! Contains input data for GenerateOutputMeshes_3DGS_MDL7
- struct IntSplitGroupData_MDL7
- {
- //! Construction from a given shared data set
- IntSplitGroupData_MDL7(IntSharedData_MDL7& _shared,
- std::vector<aiMesh*>& _avOutList)
- : aiSplit(), shared(_shared), avOutList(_avOutList)
- {
- }
- //! Destruction: properly delete all allocated resources
- ~IntSplitGroupData_MDL7()
- {
- // kill all face lists
- if(this->aiSplit)
- {
- for (unsigned int m = 0; m < shared.pcMats.size();++m)
- delete this->aiSplit[m];
- delete[] this->aiSplit;
- }
- }
- //! Contains a list of all faces per material
- std::vector<unsigned int>** aiSplit;
- //! Shared data for all groups of the model
- IntSharedData_MDL7& shared;
- //! List of meshes
- std::vector<aiMesh*>& avOutList;
- };
- }
- } // end namespaces
- #endif // !! AI_MDLFILEHELPER_H_INC
|