Image* LoadMDLImageBuff( byte* buffer ){ if ( !LoadPalette() ) { return 0; } if ( !ident_equal( buffer, MDL_IDENT ) ) { globalErrorStream() << "LoadMDLImage: data has wrong ident\n"; return 0; } PointerInputStream inputStream( buffer ); inputStream.seek( 4 + 4 + 12 + 12 + 4 + 12 ); //int numskins = istream_read_int32_le( inputStream ); int skinwidth = istream_read_int32_le( inputStream ); int skinheight = istream_read_int32_le( inputStream ); inputStream.seek( 4 + 4 + 4 + 4 + 4 + 4 ); switch ( istream_read_int32_le( inputStream ) ) { case MDL_SKIN_SINGLE: break; case MDL_SKIN_GROUP: int numskins = istream_read_int32_le( inputStream ); inputStream.seek( numskins * 4 ); break; } RGBAImage* image = new RGBAImage( skinwidth, skinheight ); unsigned char* pRGBA = image->getRGBAPixels(); for ( int i = 0; i < ( skinheight ); i++ ) { for ( int j = 0; j < ( skinwidth ); j++ ) { byte index = istream_read_byte( inputStream ); *pRGBA++ = mdl_palette[index * 3 + 0]; *pRGBA++ = mdl_palette[index * 3 + 1]; *pRGBA++ = mdl_palette[index * 3 + 2]; *pRGBA++ = 255; } } return image; }
void istream_read_mdlHeader( PointerInputStream& inputStream, mdlHeader_t& header ){ inputStream.read( header.ident, 4 ); header.version = istream_read_int32_le( inputStream ); header.scale[0] = istream_read_float32_le( inputStream ); header.scale[1] = istream_read_float32_le( inputStream ); header.scale[2] = istream_read_float32_le( inputStream ); header.scale_origin[0] = istream_read_float32_le( inputStream ); header.scale_origin[1] = istream_read_float32_le( inputStream ); header.scale_origin[2] = istream_read_float32_le( inputStream ); header.boundingradius = istream_read_float32_le( inputStream ); header.eyeposition[0] = istream_read_float32_le( inputStream ); header.eyeposition[1] = istream_read_float32_le( inputStream ); header.eyeposition[2] = istream_read_float32_le( inputStream ); header.numskins = istream_read_int32_le( inputStream ); header.skinwidth = istream_read_int32_le( inputStream ); header.skinheight = istream_read_int32_le( inputStream ); header.numverts = istream_read_int32_le( inputStream ); header.numtris = istream_read_int32_le( inputStream ); header.numframes = istream_read_int32_le( inputStream ); header.synctype = istream_read_int32_le( inputStream ); header.flags = istream_read_int32_le( inputStream ); header.size = istream_read_float32_le( inputStream ); }
void MDLSurface_read( Surface& surface, const byte* buffer, const char* name ){ mdlHeader_t header; PointerInputStream inputStream( buffer ); istream_read_mdlHeader( inputStream, header ); for ( int i = 0; i < header.numskins; ++i ) { switch ( istream_read_int32_le( inputStream ) ) { case MDL_SKIN_SINGLE: inputStream.seek( header.skinwidth * header.skinheight ); break; case MDL_SKIN_GROUP: int numskins = istream_read_int32_le( inputStream ); inputStream.seek( numskins * ( 4 + ( header.skinwidth * header.skinheight ) ) ); break; } } Array<mdlSt_t> mdlSts( header.numverts ); for ( Array<mdlSt_t>::iterator i = mdlSts.begin(); i != mdlSts.end(); ++i ) { ( *i ).onseam = istream_read_int32_le( inputStream ); ( *i ).s = istream_read_int32_le( inputStream ); ( *i ).t = istream_read_int32_le( inputStream ); } Array<mdlTriangle_t> mdlTriangles( header.numtris ); for ( Array<mdlTriangle_t>::iterator i = mdlTriangles.begin(); i != mdlTriangles.end(); ++i ) { ( *i ).facesfront = istream_read_int32_le( inputStream ); ( *i ).vertindex[0] = istream_read_int32_le( inputStream ); ( *i ).vertindex[1] = istream_read_int32_le( inputStream ); ( *i ).vertindex[2] = istream_read_int32_le( inputStream ); } { bool found = false; for ( int i = 0; i < header.numframes && found == false; i++ ) { switch ( istream_read_int32_le( inputStream ) ) { case MDL_FRAME_SINGLE: inputStream.seek( MDL_FRAME_SIZE ); found = true; break; case MDL_FRAME_GROUP: int numframes = istream_read_int32_le( inputStream ); //inputStream.seek( ( MDL_XYZNORMAL_SIZE * 2 ) + ( numframes * 4 ) ); inputStream.seek( ( MDL_XYZNORMAL_SIZE * 4 ) + ( numframes * 4 ) + 16 );//group min_vec3 + max_vec3 + timings_float[numframes] + frame min_vec3 + max_vec3 + name_char[16] found = true; break; } } } Array<mdlXyzNormal_t> mdlXyzNormals( header.numverts ); for ( Array<mdlXyzNormal_t>::iterator i = mdlXyzNormals.begin(); i != mdlXyzNormals.end(); ++i ) { inputStream.read( ( *i ).v, 3 ); inputStream.read( &( *i ).lightnormalindex, 1 ); } { VertexBuffer<mdlVertex_t> mdl_vertices; { UniqueVertexBuffer<mdlVertex_t> inserter( mdl_vertices ); for ( Array<mdlTriangle_t>::iterator i = mdlTriangles.begin(); i != mdlTriangles.end(); ++i ) { surface.indices().insert( inserter.insert( mdlVertex_t( ( *i ).vertindex[0], ( *i ).facesfront ) ) ); surface.indices().insert( inserter.insert( mdlVertex_t( ( *i ).vertindex[1], ( *i ).facesfront ) ) ); surface.indices().insert( inserter.insert( mdlVertex_t( ( *i ).vertindex[2], ( *i ).facesfront ) ) ); } } { surface.vertices().reserve( mdl_vertices.size() ); for ( VertexBuffer<mdlVertex_t>::iterator i = mdl_vertices.begin(); i != mdl_vertices.end(); ++i ) { surface.vertices().push_back( MDLVertex_construct( header, mdlXyzNormals[( *i ).m_vertindex], mdlSts[( *i ).m_vertindex], ( *i ).m_facesfront == MDL_FACES_FRONT ) ); } } } surface.setShader( name ); surface.updateAABB(); }
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 ); }