]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - plugins/md3model/md2.cpp
reformat code! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / plugins / md3model / md2.cpp
index e18ef2f6ca68016edf5dccd31f2fda6eb57caaef..a6d75fefbc0cf047bc2e3fb1df5d9b47229c177a 100644 (file)
@@ -42,74 +42,74 @@ typedef unsigned char byte;
  */
 const int MD2_NUMVERTEXNORMALS = 162;
 
-const unsigned char MD2_IDENT[4] = { 'I', 'D', 'P', '2', };
+const unsigned char MD2_IDENT[4] = {'I', 'D', 'P', '2',};
 const int MD2_VERSION = 8;
 
-const int MD2_MAX_TRIANGLES   = 4096;
-const int MD2_MAX_VERTS       = 2048;
-const int MD2_MAX_FRAMES      = 512;
-const int MD2_MAX_MD2SKINS    = 32;
-const int MD2_MAX_SKINNAME    = 64;
+const int MD2_MAX_TRIANGLES = 4096;
+const int MD2_MAX_VERTS = 2048;
+const int MD2_MAX_FRAMES = 512;
+const int MD2_MAX_MD2SKINS = 32;
+const int MD2_MAX_SKINNAME = 64;
 
-typedef struct
-{
-       short s;
-       short t;
+typedef struct {
+    short s;
+    short t;
 } md2St_t;
 
-void istream_read_md2St( PointerInputStream& inputStream, md2St_t& st ){
-       st.s = istream_read_int16_le( inputStream );
-       st.t = istream_read_int16_le( inputStream );
+void istream_read_md2St(PointerInputStream &inputStream, md2St_t &st)
+{
+    st.s = istream_read_int16_le(inputStream);
+    st.t = istream_read_int16_le(inputStream);
 }
 
-typedef struct
-{
-       short index_xyz[3];
-       short index_st[3];
+typedef struct {
+    short index_xyz[3];
+    short index_st[3];
 } md2Triangle_t;
 
-void istream_read_md2Triangle( PointerInputStream& inputStream, md2Triangle_t& triangle ){
-       triangle.index_xyz[0] = istream_read_int16_le( inputStream );
-       triangle.index_xyz[1] = istream_read_int16_le( inputStream );
-       triangle.index_xyz[2] = istream_read_int16_le( inputStream );
-       triangle.index_st[0] = istream_read_int16_le( inputStream );
-       triangle.index_st[1] = istream_read_int16_le( inputStream );
-       triangle.index_st[2] = istream_read_int16_le( inputStream );
+void istream_read_md2Triangle(PointerInputStream &inputStream, md2Triangle_t &triangle)
+{
+    triangle.index_xyz[0] = istream_read_int16_le(inputStream);
+    triangle.index_xyz[1] = istream_read_int16_le(inputStream);
+    triangle.index_xyz[2] = istream_read_int16_le(inputStream);
+    triangle.index_st[0] = istream_read_int16_le(inputStream);
+    triangle.index_st[1] = istream_read_int16_le(inputStream);
+    triangle.index_st[2] = istream_read_int16_le(inputStream);
 }
 
-typedef struct
-{
-       byte v[3];              // scaled byte to fit in frame mins/maxs
-       byte lightnormalindex;
+typedef struct {
+    byte v[3];              // scaled byte to fit in frame mins/maxs
+    byte lightnormalindex;
 } md2XyzNormal_t;
 
-void istream_read_md2XyzNormal( PointerInputStream& inputStream, md2XyzNormal_t& xyz ){
-       inputStream.read( xyz.v, 3 );
-       inputStream.read( &xyz.lightnormalindex, 1 );
+void istream_read_md2XyzNormal(PointerInputStream &inputStream, md2XyzNormal_t &xyz)
+{
+    inputStream.read(xyz.v, 3);
+    inputStream.read(&xyz.lightnormalindex, 1);
 }
 
-const int MD2_XYZNORMAL_V0   = 0;
-const int MD2_XYZNORMAL_V1   = 1;
-const int MD2_XYZNORMAL_V2   = 2;
-const int MD2_XYZNORMAL_LNI  = 3;
+const int MD2_XYZNORMAL_V0 = 0;
+const int MD2_XYZNORMAL_V1 = 1;
+const int MD2_XYZNORMAL_V2 = 2;
+const int MD2_XYZNORMAL_LNI = 3;
 const int MD2_XYZNORMAL_SIZE = 4;
 
-typedef struct
-{
-       float scale[3];         // multiply byte verts by this
-       float translate[3];         // then add this
-       char name[16];          // frame name from grabbing
-       md2XyzNormal_t verts[1];    // variable sized
+typedef struct {
+    float scale[3];         // multiply byte verts by this
+    float translate[3];         // then add this
+    char name[16];          // frame name from grabbing
+    md2XyzNormal_t verts[1];    // variable sized
 } md2Frame_t;
 
-void istream_read_md2Frame( PointerInputStream& inputStream, md2Frame_t& frame ){
-       frame.scale[0] = istream_read_float32_le( inputStream );
-       frame.scale[1] = istream_read_float32_le( inputStream );
-       frame.scale[2] = istream_read_float32_le( inputStream );
-       frame.translate[0] = istream_read_float32_le( inputStream );
-       frame.translate[1] = istream_read_float32_le( inputStream );
-       frame.translate[2] = istream_read_float32_le( inputStream );
-       inputStream.read( reinterpret_cast<unsigned char*>( frame.name ), 16 );
+void istream_read_md2Frame(PointerInputStream &inputStream, md2Frame_t &frame)
+{
+    frame.scale[0] = istream_read_float32_le(inputStream);
+    frame.scale[1] = istream_read_float32_le(inputStream);
+    frame.scale[2] = istream_read_float32_le(inputStream);
+    frame.translate[0] = istream_read_float32_le(inputStream);
+    frame.translate[1] = istream_read_float32_le(inputStream);
+    frame.translate[2] = istream_read_float32_le(inputStream);
+    inputStream.read(reinterpret_cast<unsigned char *>( frame.name ), 16);
 }
 
 
@@ -122,174 +122,180 @@ void istream_read_md2Frame( PointerInputStream& inputStream, md2Frame_t& frame )
 // and an integer vertex index.
 
 
-typedef struct
-{
-       unsigned char ident[4];
-       int version;
-
-       int skinwidth;
-       int skinheight;
-       int framesize;              // byte size of each frame
-
-       int num_skins;
-       int num_xyz;
-       int num_st;                 // greater than num_xyz for seams
-       int num_tris;
-       int num_glcmds;             // dwords in strip/fan command list
-       int num_frames;
-
-       int ofs_skins;              // each skin is a MAX_SKINNAME string
-       int ofs_st;                 // byte offset from start for md2St_t
-       int ofs_tris;               // offset for md2triangle_t
-       int ofs_frames;             // offset for first md2Frame_t
-       int ofs_glcmds;
-       int ofs_end;                // end of file
+typedef struct {
+    unsigned char ident[4];
+    int version;
+
+    int skinwidth;
+    int skinheight;
+    int framesize;              // byte size of each frame
+
+    int num_skins;
+    int num_xyz;
+    int num_st;                 // greater than num_xyz for seams
+    int num_tris;
+    int num_glcmds;             // dwords in strip/fan command list
+    int num_frames;
+
+    int ofs_skins;              // each skin is a MAX_SKINNAME string
+    int ofs_st;                 // byte offset from start for md2St_t
+    int ofs_tris;               // offset for md2triangle_t
+    int ofs_frames;             // offset for first md2Frame_t
+    int ofs_glcmds;
+    int ofs_end;                // end of file
 
 } md2Header_t;
 
-void istream_read_md2Header( PointerInputStream& inputStream, md2Header_t& header ){
-       inputStream.read( header.ident, 4 );
-       header.version = istream_read_int32_le( inputStream );
-       header.skinwidth = istream_read_int32_le( inputStream );
-       header.skinheight = istream_read_int32_le( inputStream );
-       header.framesize = istream_read_int32_le( inputStream );
-       header.num_skins = istream_read_int32_le( inputStream );
-       header.num_xyz = istream_read_int32_le( inputStream );
-       header.num_st = istream_read_int32_le( inputStream );
-       header.num_tris = istream_read_int32_le( inputStream );
-       header.num_glcmds = istream_read_int32_le( inputStream );
-       header.num_frames = istream_read_int32_le( inputStream );
-       header.ofs_skins = istream_read_int32_le( inputStream );
-       header.ofs_st = istream_read_int32_le( inputStream );
-       header.ofs_tris = istream_read_int32_le( inputStream );
-       header.ofs_frames = istream_read_int32_le( inputStream );
-       header.ofs_glcmds = istream_read_int32_le( inputStream );
-       header.ofs_end = istream_read_int32_le( inputStream );
+void istream_read_md2Header(PointerInputStream &inputStream, md2Header_t &header)
+{
+    inputStream.read(header.ident, 4);
+    header.version = istream_read_int32_le(inputStream);
+    header.skinwidth = istream_read_int32_le(inputStream);
+    header.skinheight = istream_read_int32_le(inputStream);
+    header.framesize = istream_read_int32_le(inputStream);
+    header.num_skins = istream_read_int32_le(inputStream);
+    header.num_xyz = istream_read_int32_le(inputStream);
+    header.num_st = istream_read_int32_le(inputStream);
+    header.num_tris = istream_read_int32_le(inputStream);
+    header.num_glcmds = istream_read_int32_le(inputStream);
+    header.num_frames = istream_read_int32_le(inputStream);
+    header.ofs_skins = istream_read_int32_le(inputStream);
+    header.ofs_st = istream_read_int32_le(inputStream);
+    header.ofs_tris = istream_read_int32_le(inputStream);
+    header.ofs_frames = istream_read_int32_le(inputStream);
+    header.ofs_glcmds = istream_read_int32_le(inputStream);
+    header.ofs_end = istream_read_int32_le(inputStream);
 }
 
 
-ArbitraryMeshVertex MD2Vertex_construct( const md2Header_t* pHeader, const md2Frame_t* pFrame, const md2XyzNormal_t* xyz, const md2St_t* st ){
-       return ArbitraryMeshVertex(
-                          Vertex3f(
-                                  xyz->v[0] * pFrame->scale[0] + pFrame->translate[0],
-                                  xyz->v[1] * pFrame->scale[1] + pFrame->translate[1],
-                                  xyz->v[2] * pFrame->scale[2] + pFrame->translate[2]
-                                  ),
-                          Normal3f(
-                                  g_mdl_normals[xyz->lightnormalindex][0],
-                                  g_mdl_normals[xyz->lightnormalindex][1],
-                                  g_mdl_normals[xyz->lightnormalindex][2]
-                                  ),
-                          TexCoord2f(
-                                  (float)st->s / pHeader->skinwidth,
-                                  (float)st->t / pHeader->skinheight
-                                  )
-                          );
+ArbitraryMeshVertex
+MD2Vertex_construct(const md2Header_t *pHeader, const md2Frame_t *pFrame, const md2XyzNormal_t *xyz, const md2St_t *st)
+{
+    return ArbitraryMeshVertex(
+            Vertex3f(
+                    xyz->v[0] * pFrame->scale[0] + pFrame->translate[0],
+                    xyz->v[1] * pFrame->scale[1] + pFrame->translate[1],
+                    xyz->v[2] * pFrame->scale[2] + pFrame->translate[2]
+            ),
+            Normal3f(
+                    g_mdl_normals[xyz->lightnormalindex][0],
+                    g_mdl_normals[xyz->lightnormalindex][1],
+                    g_mdl_normals[xyz->lightnormalindex][2]
+            ),
+            TexCoord2f(
+                    (float) st->s / pHeader->skinwidth,
+                    (float) st->t / pHeader->skinheight
+            )
+    );
 }
 
-void MD2Surface_read( Model& model, const byte* buffer, ArchiveFile& file ){
-       Surface& surface = model.newSurface();
-       md2Header_t header;
-       {
-               PointerInputStream inputStream( buffer );
-               istream_read_md2Header( inputStream, header );
-       }
-
-       {
-
-               md2Frame_t frame;
-               PointerInputStream frameStream( buffer + header.ofs_frames );
-               istream_read_md2Frame( frameStream, frame );
-
-
-               surface.indices().reserve( header.num_tris * 3 );
-
-               Array<md2XyzNormal_t> md2Xyz( header.num_xyz );
-               for ( Array<md2XyzNormal_t>::iterator i = md2Xyz.begin(); i != md2Xyz.end(); ++i )
-               {
-                       istream_read_md2XyzNormal( frameStream, *i );
-               }
-
-               Array<md2St_t> md2St( header.num_st );
-               PointerInputStream stStream( buffer + header.ofs_st );
-               for ( Array<md2St_t>::iterator i = md2St.begin(); i != md2St.end(); ++i )
-               {
-                       istream_read_md2St( stStream, *i );
-               }
-
-               UniqueVertexBuffer<ArbitraryMeshVertex> inserter( surface.vertices() );
-               inserter.reserve( header.num_st );
-
-               PointerInputStream triangleStream( buffer + header.ofs_tris );
-               for ( int i = 0; i < header.num_tris; ++i )
-               {
-                       md2Triangle_t triangle;
-                       istream_read_md2Triangle( triangleStream, triangle );
-                       surface.indices().insert( inserter.insert( MD2Vertex_construct( &header, &frame, &md2Xyz[triangle.index_xyz[0]], &md2St[triangle.index_st[0]] ) ) );
-                       surface.indices().insert( inserter.insert( MD2Vertex_construct( &header, &frame, &md2Xyz[triangle.index_xyz[1]], &md2St[triangle.index_st[1]] ) ) );
-                       surface.indices().insert( inserter.insert( MD2Vertex_construct( &header, &frame, &md2Xyz[triangle.index_xyz[2]], &md2St[triangle.index_st[2]] ) ) );
-               }
-       }
-
-       char skinname[MD2_MAX_SKINNAME];
-       char skinnameRelative[MD2_MAX_SKINNAME];
-       char path[MD2_MAX_SKINNAME];
-       int i = MD2_MAX_SKINNAME;
-       PointerInputStream inputStream( buffer + header.ofs_skins );
-       inputStream.read( reinterpret_cast<byte*>( skinnameRelative ), MD2_MAX_SKINNAME );
-       // relative texture path - allows moving of models in game dir structure without changing the skinpath
-       // e.g. used in ufo:ai
-       if ( skinnameRelative[0] == '.' ) {
-               strncpy( path, file.getName(), MD2_MAX_SKINNAME );
-               for (; i--; )
-               {
-                       // skip filename
-                       if ( path[i] == '/' || path[i] == '\\' ) {
-                               break;
-                       }
-                       path[i] = '\0';
-               }
+void MD2Surface_read(Model &model, const byte *buffer, ArchiveFile &file)
+{
+    Surface &surface = model.newSurface();
+    md2Header_t header;
+    {
+        PointerInputStream inputStream(buffer);
+        istream_read_md2Header(inputStream, header);
+    }
+
+    {
+
+        md2Frame_t frame;
+        PointerInputStream frameStream(buffer + header.ofs_frames);
+        istream_read_md2Frame(frameStream, frame);
+
+
+        surface.indices().reserve(header.num_tris * 3);
+
+        Array<md2XyzNormal_t> md2Xyz(header.num_xyz);
+        for (Array<md2XyzNormal_t>::iterator i = md2Xyz.begin(); i != md2Xyz.end(); ++i) {
+            istream_read_md2XyzNormal(frameStream, *i);
+        }
+
+        Array<md2St_t> md2St(header.num_st);
+        PointerInputStream stStream(buffer + header.ofs_st);
+        for (Array<md2St_t>::iterator i = md2St.begin(); i != md2St.end(); ++i) {
+            istream_read_md2St(stStream, *i);
+        }
+
+        UniqueVertexBuffer<ArbitraryMeshVertex> inserter(surface.vertices());
+        inserter.reserve(header.num_st);
+
+        PointerInputStream triangleStream(buffer + header.ofs_tris);
+        for (int i = 0; i < header.num_tris; ++i) {
+            md2Triangle_t triangle;
+            istream_read_md2Triangle(triangleStream, triangle);
+            surface.indices().insert(inserter.insert(
+                    MD2Vertex_construct(&header, &frame, &md2Xyz[triangle.index_xyz[0]],
+                                        &md2St[triangle.index_st[0]])));
+            surface.indices().insert(inserter.insert(
+                    MD2Vertex_construct(&header, &frame, &md2Xyz[triangle.index_xyz[1]],
+                                        &md2St[triangle.index_st[1]])));
+            surface.indices().insert(inserter.insert(
+                    MD2Vertex_construct(&header, &frame, &md2Xyz[triangle.index_xyz[2]],
+                                        &md2St[triangle.index_st[2]])));
+        }
+    }
+
+    char skinname[MD2_MAX_SKINNAME];
+    char skinnameRelative[MD2_MAX_SKINNAME];
+    char path[MD2_MAX_SKINNAME];
+    int i = MD2_MAX_SKINNAME;
+    PointerInputStream inputStream(buffer + header.ofs_skins);
+    inputStream.read(reinterpret_cast<byte *>( skinnameRelative ), MD2_MAX_SKINNAME);
+    // relative texture path - allows moving of models in game dir structure without changing the skinpath
+    // e.g. used in ufo:ai
+    if (skinnameRelative[0] == '.') {
+        strncpy(path, file.getName(), MD2_MAX_SKINNAME);
+        for (; i--;) {
+            // skip filename
+            if (path[i] == '/' || path[i] == '\\') {
+                break;
+            }
+            path[i] = '\0';
+        }
 //     globalErrorStream() << "modified skinname: " << path << " (path) and " << skinnameRelative << " (texture)" << "\n";
-               snprintf( skinname, MD2_MAX_SKINNAME, "%s%s", path, &skinnameRelative[1] );
+        snprintf(skinname, MD2_MAX_SKINNAME, "%s%s", path, &skinnameRelative[1]);
 //     globalErrorStream() << skinname << "\n";
-       }
-       else
-       {
-               strcpy( skinname, skinnameRelative );
-       }
-       surface.setShader( skinname );
-       surface.updateAABB();
+    } else {
+        strcpy(skinname, skinnameRelative);
+    }
+    surface.setShader(skinname);
+    surface.updateAABB();
 }
 
-void MD2Model_read( Model& model, const byte* buffer, ArchiveFile& file ){
-       MD2Surface_read( model, buffer, file );
-       model.updateAABB();
+void MD2Model_read(Model &model, const byte *buffer, ArchiveFile &file)
+{
+    MD2Surface_read(model, buffer, file);
+    model.updateAABB();
 }
 
-scene::Node& MD2Model_new( const byte* buffer, ArchiveFile& file ){
-       ModelNode* modelNode = new ModelNode();
-       MD2Model_read( modelNode->model(), buffer, file );
-       return modelNode->node();
+scene::Node &MD2Model_new(const byte *buffer, ArchiveFile &file)
+{
+    ModelNode *modelNode = new ModelNode();
+    MD2Model_read(modelNode->model(), buffer, file);
+    return modelNode->node();
 }
 
-scene::Node& MD2Model_default(){
-       ModelNode* modelNode = new ModelNode();
-       Model_constructNull( modelNode->model() );
-       return modelNode->node();
+scene::Node &MD2Model_default()
+{
+    ModelNode *modelNode = new ModelNode();
+    Model_constructNull(modelNode->model());
+    return modelNode->node();
 }
 
-scene::Node& MD2Model_fromBuffer( unsigned char* buffer, ArchiveFile& file ){
-       if ( !ident_equal( buffer, MD2_IDENT ) ) {
-               globalErrorStream() << "MD2 read error: incorrect ident\n";
-               return MD2Model_default();
-       }
-       else
-       {
-               return MD2Model_new( buffer, file );
-       }
+scene::Node &MD2Model_fromBuffer(unsigned char *buffer, ArchiveFile &file)
+{
+    if (!ident_equal(buffer, MD2_IDENT)) {
+        globalErrorStream() << "MD2 read error: incorrect ident\n";
+        return MD2Model_default();
+    } else {
+        return MD2Model_new(buffer, file);
+    }
 }
 
-scene::Node& loadMD2Model( ArchiveFile& file ){
-       ScopedArchiveBuffer buffer( file );
-       return MD2Model_fromBuffer( buffer.buffer, file );
+scene::Node &loadMD2Model(ArchiveFile &file)
+{
+    ScopedArchiveBuffer buffer(file);
+    return MD2Model_fromBuffer(buffer.buffer, file);
 }