]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - plugins/md3model/md3.cpp
reformat code! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / plugins / md3model / md3.cpp
index 0b459827144b16da77cb380eba25c97a43426d71..3c5c50602463a1acdb9aa8f9a64be1c46a233af3 100644 (file)
@@ -42,56 +42,59 @@ const int MAX_QPATH = 64;
    ========================================================================
  */
 
-const unsigned char MD3_IDENT[4] = { 'I', 'D', 'P', '3', };
+const unsigned char MD3_IDENT[4] = {'I', 'D', 'P', '3',};
 const int MD3_VERSION = 15;
 
 // limits
-const int MD3_MAX_LODS        = 4;
-const int MD3_MAX_TRIANGLES   = 8192;    // per surface
-const int MD3_MAX_VERTS       = 4096;    // per surface
-const int MD3_MAX_SHADERS     = 256;     // per surface
-const int MD3_MAX_FRAMES      = 1024;    // per model
-const int MD3_MAX_SURFACES    = 32;      // per model
-const int MD3_MAX_TAGS        = 16;      // per frame
+const int MD3_MAX_LODS = 4;
+const int MD3_MAX_TRIANGLES = 8192;    // per surface
+const int MD3_MAX_VERTS = 4096;    // per surface
+const int MD3_MAX_SHADERS = 256;     // per surface
+const int MD3_MAX_FRAMES = 1024;    // per model
+const int MD3_MAX_SURFACES = 32;      // per model
+const int MD3_MAX_TAGS = 16;      // per frame
 
 // vertex scales
-const float MD3_XYZ_SCALE = ( 1.f / 64 );
+const float MD3_XYZ_SCALE = (1.f / 64);
 
 typedef float float3[3];
 
-void istream_read_float3( PointerInputStream& inputStream, float3 f ){
-       f[0] = istream_read_float32_le( inputStream );
-       f[1] = istream_read_float32_le( inputStream );
-       f[2] = istream_read_float32_le( inputStream );
+void istream_read_float3(PointerInputStream &inputStream, float3 f)
+{
+    f[0] = istream_read_float32_le(inputStream);
+    f[1] = istream_read_float32_le(inputStream);
+    f[2] = istream_read_float32_le(inputStream);
 }
 
 typedef struct md3Frame_s {
-       float3 bounds[2];
-       float3 localOrigin;
-       float radius;
-       char name[16];
+    float3 bounds[2];
+    float3 localOrigin;
+    float radius;
+    char name[16];
 } md3Frame_t;
 
-void istream_read_md3Frame( PointerInputStream& inputStream, md3Frame_t& frame ){
-       istream_read_float3( inputStream, frame.bounds[0] );
-       istream_read_float3( inputStream, frame.bounds[1] );
-       istream_read_float3( inputStream, frame.localOrigin );
-       frame.radius = istream_read_float32_le( inputStream );
-       inputStream.read( reinterpret_cast<unsigned char*>( frame.name ), 16 );
+void istream_read_md3Frame(PointerInputStream &inputStream, md3Frame_t &frame)
+{
+    istream_read_float3(inputStream, frame.bounds[0]);
+    istream_read_float3(inputStream, frame.bounds[1]);
+    istream_read_float3(inputStream, frame.localOrigin);
+    frame.radius = istream_read_float32_le(inputStream);
+    inputStream.read(reinterpret_cast<unsigned char *>( frame.name ), 16);
 }
 
 typedef struct md3Tag_s {
-       char name[MAX_QPATH];           // tag name
-       float3 origin;
-       float3 axis[3];
+    char name[MAX_QPATH];           // tag name
+    float3 origin;
+    float3 axis[3];
 } md3Tag_t;
 
-void istream_read_md3Shader( PointerInputStream& inputStream, md3Tag_t& tag ){
-       inputStream.read( reinterpret_cast<unsigned char*>( tag.name ), MAX_QPATH );
-       istream_read_float3( inputStream, tag.origin );
-       istream_read_float3( inputStream, tag.axis[0] );
-       istream_read_float3( inputStream, tag.axis[1] );
-       istream_read_float3( inputStream, tag.axis[2] );
+void istream_read_md3Shader(PointerInputStream &inputStream, md3Tag_t &tag)
+{
+    inputStream.read(reinterpret_cast<unsigned char *>( tag.name ), MAX_QPATH);
+    istream_read_float3(inputStream, tag.origin);
+    istream_read_float3(inputStream, tag.axis[0]);
+    istream_read_float3(inputStream, tag.axis[1]);
+    istream_read_float3(inputStream, tag.axis[2]);
 }
 
 /*
@@ -105,219 +108,227 @@ void istream_read_md3Shader( PointerInputStream& inputStream, md3Tag_t& tag ){
 ** XyzNormals          sizeof( md3XyzNormal_t ) * numVerts * numFrames
 */
 typedef struct {
-       char ident[4];              //
+    char ident[4];              //
 
-       char name[MAX_QPATH]; // polyset name
+    char name[MAX_QPATH]; // polyset name
 
-       int flags;
-       int numFrames; // all surfaces in a model should have the same
+    int flags;
+    int numFrames; // all surfaces in a model should have the same
 
-       int numShaders; // all surfaces in a model should have the same
-       int numVerts;
+    int numShaders; // all surfaces in a model should have the same
+    int numVerts;
 
-       int numTriangles;
-       int ofsTriangles;
+    int numTriangles;
+    int ofsTriangles;
 
-       int ofsShaders; // offset from start of md3Surface_t
-       int ofsSt; // texture coords are common for all frames
-       int ofsXyzNormals; // numVerts * numFrames
+    int ofsShaders; // offset from start of md3Surface_t
+    int ofsSt; // texture coords are common for all frames
+    int ofsXyzNormals; // numVerts * numFrames
 
-       int ofsEnd; // next surface follows
+    int ofsEnd; // next surface follows
 } md3Surface_t;
 
-void istream_read_md3Surface( PointerInputStream& inputStream, md3Surface_t& surface ){
-       inputStream.read( reinterpret_cast<unsigned char*>( surface.ident ), 4 );
-       inputStream.read( reinterpret_cast<unsigned char*>( surface.name ), MAX_QPATH );
-       surface.flags = istream_read_int32_le( inputStream );
-       surface.numFrames = istream_read_int32_le( inputStream );
-       surface.numShaders = istream_read_int32_le( inputStream );
-       surface.numVerts = istream_read_int32_le( inputStream );
-       surface.numTriangles = istream_read_int32_le( inputStream );
-       surface.ofsTriangles = istream_read_int32_le( inputStream );
-       surface.ofsShaders = istream_read_int32_le( inputStream );
-       surface.ofsSt = istream_read_int32_le( inputStream );
-       surface.ofsXyzNormals = istream_read_int32_le( inputStream );
-       surface.ofsEnd = istream_read_int32_le( inputStream );
+void istream_read_md3Surface(PointerInputStream &inputStream, md3Surface_t &surface)
+{
+    inputStream.read(reinterpret_cast<unsigned char *>( surface.ident ), 4);
+    inputStream.read(reinterpret_cast<unsigned char *>( surface.name ), MAX_QPATH);
+    surface.flags = istream_read_int32_le(inputStream);
+    surface.numFrames = istream_read_int32_le(inputStream);
+    surface.numShaders = istream_read_int32_le(inputStream);
+    surface.numVerts = istream_read_int32_le(inputStream);
+    surface.numTriangles = istream_read_int32_le(inputStream);
+    surface.ofsTriangles = istream_read_int32_le(inputStream);
+    surface.ofsShaders = istream_read_int32_le(inputStream);
+    surface.ofsSt = istream_read_int32_le(inputStream);
+    surface.ofsXyzNormals = istream_read_int32_le(inputStream);
+    surface.ofsEnd = istream_read_int32_le(inputStream);
 }
 
 typedef struct {
-       char name[MAX_QPATH];
-       int shaderIndex;                // for in-game use
+    char name[MAX_QPATH];
+    int shaderIndex;                // for in-game use
 } md3Shader_t;
 
-void istream_read_md3Shader( PointerInputStream& inputStream, md3Shader_t& shader ){
-       inputStream.read( reinterpret_cast<unsigned char*>( shader.name ), MAX_QPATH );
-       shader.shaderIndex = istream_read_int32_le( inputStream );
+void istream_read_md3Shader(PointerInputStream &inputStream, md3Shader_t &shader)
+{
+    inputStream.read(reinterpret_cast<unsigned char *>( shader.name ), MAX_QPATH);
+    shader.shaderIndex = istream_read_int32_le(inputStream);
 }
 
 typedef struct {
-       int indexes[3];
+    int indexes[3];
 } md3Triangle_t;
 
-void istream_read_md3Triangle( PointerInputStream& inputStream, md3Triangle_t& triangle ){
-       triangle.indexes[0] = istream_read_int32_le( inputStream );
-       triangle.indexes[1] = istream_read_int32_le( inputStream );
-       triangle.indexes[2] = istream_read_int32_le( inputStream );
+void istream_read_md3Triangle(PointerInputStream &inputStream, md3Triangle_t &triangle)
+{
+    triangle.indexes[0] = istream_read_int32_le(inputStream);
+    triangle.indexes[1] = istream_read_int32_le(inputStream);
+    triangle.indexes[2] = istream_read_int32_le(inputStream);
 }
 
 typedef struct {
-       float st[2];
+    float st[2];
 } md3St_t;
 
-void istream_read_md3St( PointerInputStream& inputStream, md3St_t& st ){
-       st.st[0] = istream_read_float32_le( inputStream );
-       st.st[1] = istream_read_float32_le( inputStream );
+void istream_read_md3St(PointerInputStream &inputStream, md3St_t &st)
+{
+    st.st[0] = istream_read_float32_le(inputStream);
+    st.st[1] = istream_read_float32_le(inputStream);
 }
 
 typedef struct {
-       short xyz[3];
-       short normal;
+    short xyz[3];
+    short normal;
 } md3XyzNormal_t;
 
-void istream_read_md3XyzNormal( PointerInputStream& inputStream, md3XyzNormal_t& xyz ){
-       xyz.xyz[0] = istream_read_int16_le( inputStream );
-       xyz.xyz[1] = istream_read_int16_le( inputStream );
-       xyz.xyz[2] = istream_read_int16_le( inputStream );
-       xyz.normal = istream_read_int16_le( inputStream );
+void istream_read_md3XyzNormal(PointerInputStream &inputStream, md3XyzNormal_t &xyz)
+{
+    xyz.xyz[0] = istream_read_int16_le(inputStream);
+    xyz.xyz[1] = istream_read_int16_le(inputStream);
+    xyz.xyz[2] = istream_read_int16_le(inputStream);
+    xyz.normal = istream_read_int16_le(inputStream);
 }
 
 typedef struct {
-       char ident[4];
-       int version;
+    char ident[4];
+    int version;
 
-       char name[MAX_QPATH];           // model name
+    char name[MAX_QPATH];           // model name
 
-       int flags;
+    int flags;
 
-       int numFrames;
-       int numTags;
-       int numSurfaces;
+    int numFrames;
+    int numTags;
+    int numSurfaces;
 
-       int numSkins;
+    int numSkins;
 
-       int ofsFrames;                  // offset for first frame
-       int ofsTags;                    // numFrames * numTags
-       int ofsSurfaces;                // first surface, others follow
+    int ofsFrames;                  // offset for first frame
+    int ofsTags;                    // numFrames * numTags
+    int ofsSurfaces;                // first surface, others follow
 
-       int ofsEnd;                     // end of file
+    int ofsEnd;                     // end of file
 } md3Header_t;
 
-void istream_read_md3Header( PointerInputStream& inputStream, md3Header_t& header ){
-       inputStream.read( reinterpret_cast<unsigned char*>( header.ident ), 4 );
-       header.version = istream_read_int32_le( inputStream );
-       inputStream.read( reinterpret_cast<unsigned char*>( header.name ), MAX_QPATH );
-       header.flags = istream_read_int32_le( inputStream );
-       header.numFrames = istream_read_int32_le( inputStream );
-       header.numTags = istream_read_int32_le( inputStream );
-       header.numSurfaces = istream_read_int32_le( inputStream );
-       header.numSkins = istream_read_int32_le( inputStream );
-       header.ofsFrames = istream_read_int32_le( inputStream );
-       header.ofsTags = istream_read_int32_le( inputStream );
-       header.ofsSurfaces = istream_read_int32_le( inputStream );
-       header.ofsEnd = istream_read_int32_le( inputStream );
+void istream_read_md3Header(PointerInputStream &inputStream, md3Header_t &header)
+{
+    inputStream.read(reinterpret_cast<unsigned char *>( header.ident ), 4);
+    header.version = istream_read_int32_le(inputStream);
+    inputStream.read(reinterpret_cast<unsigned char *>( header.name ), MAX_QPATH);
+    header.flags = istream_read_int32_le(inputStream);
+    header.numFrames = istream_read_int32_le(inputStream);
+    header.numTags = istream_read_int32_le(inputStream);
+    header.numSurfaces = istream_read_int32_le(inputStream);
+    header.numSkins = istream_read_int32_le(inputStream);
+    header.ofsFrames = istream_read_int32_le(inputStream);
+    header.ofsTags = istream_read_int32_le(inputStream);
+    header.ofsSurfaces = istream_read_int32_le(inputStream);
+    header.ofsEnd = istream_read_int32_le(inputStream);
 }
 
-int MD3Surface_read( Surface& surface, unsigned char* buffer ){
-       md3Surface_t md3Surface;
-       {
-               PointerInputStream inputStream( buffer );
-               istream_read_md3Surface( inputStream, md3Surface );
-       }
-
-       {
-               surface.vertices().reserve( md3Surface.numVerts );
-
-               PointerInputStream xyzNormalStream( buffer + md3Surface.ofsXyzNormals );
-               PointerInputStream stStream( buffer + md3Surface.ofsSt );
-
-               // read verts into vertex array - xyz, st, normal
-               for ( int i = 0; i < md3Surface.numVerts; i++ )
-               {
-                       md3XyzNormal_t md3Xyz;
-                       istream_read_md3XyzNormal( xyzNormalStream, md3Xyz );
-
-                       md3St_t md3St;
-                       istream_read_md3St( stStream, md3St );
-
-                       surface.vertices().push_back(
-                               ArbitraryMeshVertex(
-                                       Vertex3f( md3Xyz.xyz[0] * MD3_XYZ_SCALE, md3Xyz.xyz[1] * MD3_XYZ_SCALE, md3Xyz.xyz[2] * MD3_XYZ_SCALE ),
-                                       DecodeNormal( reinterpret_cast<byte*>( &md3Xyz.normal ) ),
-                                       TexCoord2f( md3St.st[0], md3St.st[1] )
-                                       )
-                               );
-               }
-       }
-
-       {
-               surface.indices().reserve( md3Surface.numTriangles * 3 );
-
-               PointerInputStream inputStream( buffer + md3Surface.ofsTriangles );
-               for ( int i = 0; i < md3Surface.numTriangles; i++ )
-               {
-                       md3Triangle_t md3Triangle;
-                       istream_read_md3Triangle( inputStream, md3Triangle );
-                       surface.indices().insert( md3Triangle.indexes[0] );
-                       surface.indices().insert( md3Triangle.indexes[1] );
-                       surface.indices().insert( md3Triangle.indexes[2] );
-               }
-       }
-
-       {
-               md3Shader_t md3Shader;
-               {
-                       PointerInputStream inputStream( buffer + md3Surface.ofsShaders );
-                       istream_read_md3Shader( inputStream, md3Shader );
-               }
-               surface.setShader( md3Shader.name );
-       }
-
-       surface.updateAABB();
-
-       return md3Surface.ofsEnd;
+int MD3Surface_read(Surface &surface, unsigned char *buffer)
+{
+    md3Surface_t md3Surface;
+    {
+        PointerInputStream inputStream(buffer);
+        istream_read_md3Surface(inputStream, md3Surface);
+    }
+
+    {
+        surface.vertices().reserve(md3Surface.numVerts);
+
+        PointerInputStream xyzNormalStream(buffer + md3Surface.ofsXyzNormals);
+        PointerInputStream stStream(buffer + md3Surface.ofsSt);
+
+        // read verts into vertex array - xyz, st, normal
+        for (int i = 0; i < md3Surface.numVerts; i++) {
+            md3XyzNormal_t md3Xyz;
+            istream_read_md3XyzNormal(xyzNormalStream, md3Xyz);
+
+            md3St_t md3St;
+            istream_read_md3St(stStream, md3St);
+
+            surface.vertices().push_back(
+                    ArbitraryMeshVertex(
+                            Vertex3f(md3Xyz.xyz[0] * MD3_XYZ_SCALE, md3Xyz.xyz[1] * MD3_XYZ_SCALE,
+                                     md3Xyz.xyz[2] * MD3_XYZ_SCALE),
+                            DecodeNormal(reinterpret_cast<byte *>( &md3Xyz.normal )),
+                            TexCoord2f(md3St.st[0], md3St.st[1])
+                    )
+            );
+        }
+    }
+
+    {
+        surface.indices().reserve(md3Surface.numTriangles * 3);
+
+        PointerInputStream inputStream(buffer + md3Surface.ofsTriangles);
+        for (int i = 0; i < md3Surface.numTriangles; i++) {
+            md3Triangle_t md3Triangle;
+            istream_read_md3Triangle(inputStream, md3Triangle);
+            surface.indices().insert(md3Triangle.indexes[0]);
+            surface.indices().insert(md3Triangle.indexes[1]);
+            surface.indices().insert(md3Triangle.indexes[2]);
+        }
+    }
+
+    {
+        md3Shader_t md3Shader;
+        {
+            PointerInputStream inputStream(buffer + md3Surface.ofsShaders);
+            istream_read_md3Shader(inputStream, md3Shader);
+        }
+        surface.setShader(md3Shader.name);
+    }
+
+    surface.updateAABB();
+
+    return md3Surface.ofsEnd;
 }
 
-void MD3Model_read( Model& model, unsigned char* buffer ){
-       md3Header_t md3Header;
-       {
-               PointerInputStream inputStream( buffer );
-               istream_read_md3Header( inputStream, md3Header );
-       }
+void MD3Model_read(Model &model, unsigned char *buffer)
+{
+    md3Header_t md3Header;
+    {
+        PointerInputStream inputStream(buffer);
+        istream_read_md3Header(inputStream, md3Header);
+    }
 
-       unsigned char* surfacePosition = buffer + md3Header.ofsSurfaces;
+    unsigned char *surfacePosition = buffer + md3Header.ofsSurfaces;
 
-       for ( int i = 0; i != md3Header.numSurfaces; ++i )
-       {
-               surfacePosition += MD3Surface_read( model.newSurface(), surfacePosition );
-       }
+    for (int i = 0; i != md3Header.numSurfaces; ++i) {
+        surfacePosition += MD3Surface_read(model.newSurface(), surfacePosition);
+    }
 
-       model.updateAABB();
+    model.updateAABB();
 }
 
-scene::Node& MD3Model_new( unsigned char* buffer ){
-       ModelNode* modelNode = new ModelNode();
-       MD3Model_read( modelNode->model(), buffer );
-       return modelNode->node();
+scene::Node &MD3Model_new(unsigned char *buffer)
+{
+    ModelNode *modelNode = new ModelNode();
+    MD3Model_read(modelNode->model(), buffer);
+    return modelNode->node();
 }
 
-scene::Node& MD3Model_default(){
-       ModelNode* modelNode = new ModelNode();
-       Model_constructNull( modelNode->model() );
-       return modelNode->node();
+scene::Node &MD3Model_default()
+{
+    ModelNode *modelNode = new ModelNode();
+    Model_constructNull(modelNode->model());
+    return modelNode->node();
 }
 
-scene::Node& MD3Model_fromBuffer( unsigned char* buffer ){
-       if ( !ident_equal( buffer, MD3_IDENT ) ) {
-               globalErrorStream() << "MD3 read error: incorrect ident\n";
-               return MD3Model_default();
-       }
-       else
-       {
-               return MD3Model_new( buffer );
-       }
+scene::Node &MD3Model_fromBuffer(unsigned char *buffer)
+{
+    if (!ident_equal(buffer, MD3_IDENT)) {
+        globalErrorStream() << "MD3 read error: incorrect ident\n";
+        return MD3Model_default();
+    } else {
+        return MD3Model_new(buffer);
+    }
 }
 
-scene::Node& loadMD3Model( ArchiveFile& file ){
-       ScopedArchiveBuffer buffer( file );
-       return MD3Model_fromBuffer( buffer.buffer );
+scene::Node &loadMD3Model(ArchiveFile &file)
+{
+    ScopedArchiveBuffer buffer(file);
+    return MD3Model_fromBuffer(buffer.buffer);
 }