   Mmk, updating an outdated MilkShape Loader Function!
  Alright, I spent a week and a half working on a milkshape model load that only loads versions 1.3-1.4... What do I need to change to make it compatible with the latest version, 1.7?I will send you my source code if you need to see it, and to solve the problem, I'm sure you will.  Just PM me.   
  The obvious one is to make sure your code checks the verion number in the file. Next, AFAIK there have only been two changes to the file format that affect anything except the MS3D app itself (eg internal selection states etc).1) ms3d now uses relative paths to textures2) ms3d now ignores the alpha texture and expects an alpha channel in the main texture.   ;  That sounds right, because the only thing my milkshape model isnt loading when I add a 1.7 model is the textures... do you have any example code for the texture loading part?Heres my loading code btw..bool MS3DModel::LoadModelData(const char *filename){ifstream inputFile( filename, ios::in | ios::binary | ios::nocreate );if ( inputFile.fail())return false;// "Couldn't open the model file."inputFile.seekg( 0, ios::end );long fileSize = inputFile.tellg();inputFile.seekg( 0, ios::beg );byte *pBuffer = new byte[fileSize];inputFile.read( pBuffer, fileSize );inputFile.close();const byte *pPtr = pBuffer;MS3DHeader *pHeader = ( MS3DHeader* )pPtr;pPtr += sizeof( MS3DHeader );if ( strncmp( pHeader->m_ID, "MS3D000000", 10 ) != 0 )return false; // "Not a valid Milkshape3D model file."if ( pHeader->m_version < 3 || pHeader->m_version > 4 )return false; // "Unhandled file version. Only Milkshape3D Version 1.3 and 1.4 is supported." );int nVertices = *( word* )pPtr; NumVertices = nVertices;Vertices = new Vertex[nVertices];pPtr += sizeof( word );int i;for ( i = 0; i < nVertices; i++ ){MS3DVertex *pVertex = ( MS3DVertex* )pPtr;Vertices.BoneID = pVertex->m_boneID;memcpy( Vertices.Location, pVertex->m_vertex, sizeof( float )*3 );pPtr += sizeof( MS3DVertex );}int nTriangles = *( word* )pPtr;NumTriangles = nTriangles;Triangles = new Triangle[nTriangles];pPtr += sizeof( word );for ( i = 0; i < nTriangles; i++ ){MS3DTriangle *pTriangle = ( MS3DTriangle* )pPtr;int vertexIndices[3] = { pTriangle->m_vertexIndices[0], pTriangle->m_vertexIndices[1], pTriangle->m_vertexIndices[2] };float t[3] = { 1.0f-pTriangle->m_t[0], 1.0f-pTriangle->m_t[1], 1.0f-pTriangle->m_t[2] };memcpy( Triangles.VertexNormals, pTriangle->m_vertexNormals, sizeof( float )*3*3 );memcpy( Triangles.Textures1, pTriangle->m_s, sizeof( float )*3 );memcpy( Triangles.Textures2, t, sizeof( float )*3 );memcpy( Triangles.VertexIndices, vertexIndices, sizeof( int )*3 );pPtr += sizeof( MS3DTriangle );}int nGroups = *( word* )pPtr;NumMeshes = nGroups;Meshes = new Mesh[nGroups];pPtr += sizeof( word );for ( i = 0; i < nGroups; i++ ){pPtr += sizeof( byte );// flagspPtr += 32;// nameword nTriangles = *( word* )pPtr;pPtr += sizeof( word );int *pTriangleIndices = new int[nTriangles];for ( int j = 0; j < nTriangles; j++ ){pTriangleIndices[j] = *( word* )pPtr;pPtr += sizeof( word );}char materialIndex = *( char* )pPtr;pPtr += sizeof( char );Meshes.MaterialIndex = materialIndex;Meshes.NumTriangles = nTriangles;Meshes.TriangleIndices = pTriangleIndices;}int nMaterials = *( word* )pPtr;NumMaterials = nMaterials;Materials = new Material[nMaterials];pPtr += sizeof( word );for ( i = 0; i < nMaterials; i++ ){MS3DMaterial *pMaterial = ( MS3DMaterial* )pPtr;memcpy( Materials.Ambient, pMaterial->m_ambient, sizeof( float )*4 );memcpy( Materials.Diffuse, pMaterial->m_diffuse, sizeof( float )*4 );memcpy( Materials.Specular, pMaterial->m_specular, sizeof( float )*4 );memcpy( Materials.Emissive, pMaterial->m_emissive, sizeof( float )*4 );Materials.Shininess = pMaterial->m_shininess;Materials.TextureFilename = new char[strlen( pMaterial->m_texture )+1];strcpy( Materials.TextureFilename, pMaterial->m_texture );pPtr += sizeof( MS3DMaterial );}ReloadTextures();delete[] pBuffer;return true;};  The problem is not in the code you posted, it's in how you load the textures. If you want transparency you need to treat the materials texture as RGBA. As the file name paths are relative to the ms3d file when it was created, you need to change them to reflect the actual path of the file when used with your app.edit: actually there is one problem with the code you posted, but I only just noticed it because I already told you to fix in in the previous post.   ;  Which one am i doing that needs fixed? I know I have a version checker, but it doesn't reeeally do anything, it still goes on and tries to load the model...   ;  fair enough - that was the bit I meant.   ;  Maybe it's where I actually set up my MS3D data structures, I'll post em here...This is the Actual MS3D Data structure that the file holds, or so I think, I probably have a few errors here because of version differences./* MS3D STRUCTURES */// byte-align structures#ifdef _MSC_VER#pragma pack( push, packing )#pragma pack( 1 )#define PACK_STRUCT#elif defined( __GNUC__ )#define PACK_STRUCT__attribute__((packed))#else#error you must byte-align these structures with the appropriate compiler directives#endiftypedef unsigned char byte;typedef unsigned short word;// File headerstruct MS3DHeader{char m_ID[10];int m_version;} PACK_STRUCT;// Vertex informationstruct MS3DVertex{byte m_flags;float m_vertex[3];char m_boneID;byte m_refCount;} PACK_STRUCT;// Triangle informationstruct MS3DTriangle{word m_flags;word m_vertexIndices[3];float m_vertexNormals[3][3];float m_s[3], m_t[3];byte m_smoothingGroup;byte m_groupIndex;} PACK_STRUCT;// Material informationstruct MS3DMaterial{    char m_name[32];    float m_ambient[4];    float m_diffuse[4];    float m_specular[4];    float m_emissive[4];    float m_shininess;// 0.0f - 128.0f    float m_transparency;// 0.0f - 1.0f    byte m_mode;// 0, 1, 2 is unused now    char m_texture[128];    char m_alphamap[128];} PACK_STRUCT;//Joint informationstruct MS3DJoint{byte m_flags;char m_name[32];char m_parentName[32];float m_rotation[3];float m_translation[3];word m_numRotationKeyframes;word m_numTranslationKeyframes;} PACK_STRUCT;// Keyframe datastruct MS3DKeyframe{float m_time;float m_parameter[3];} PACK_STRUCT;// Default alignment#ifdef _MSC_VER#pragma pack( pop, packing )#endif#undef PACK_STRUCAnd here are the storage containers I put all that data instruct Vertex{char BoneID;float Location[3];};int NumVertices;Vertex *Vertices;struct Triangle{float VertexNormals[3][3];float Textures1[3], Textures2[3];int VertexIndices[3];};int NumTriangles;Triangle *Triangles;struct Mesh{int MaterialIndex;int NumTriangles;int *TriangleIndices;};int NumMeshes;Mesh *Meshes;struct Material{float Ambient[4], Diffuse[4], Specular[4], Emissive[4];float Shininess;GLuint Texture;char *TextureFilename;};int NumMaterials;Material *Materials;Any clues on what I should change?   ;  And about the texture name being relative to the file when it created they are identical, the texture loader function reads a string given directly from the MS3D file and loads it accordingly.   