123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- /*
- animace
- */
- #include "mss_on.h"
- #include <windows.h>
- #include <stdio.h>
- #include <math.h>
- #include <direct.h>
- #include <float.h>
- #include <assert.h>
- #include "objekt_editor_all.h"
- #include "oe_import_ms3d.h"
- #include "dbgwnd.h"
- EDIT_KONTEJNER *ms3d_import(byte * p_file, byte * p_dir)
- {
- EDIT_KONTEJNER *p_kont;
- FILE *f;
- byte *p_buffer;
- byte *p_akt;
- struct MS3DHeader *pHeader;
- int velikost;
- _chdir(p_dir);
- f = fopen(p_file, "rb");
- if (!f)
- return (NULL);
- fseek(f, 0, SEEK_END);
- velikost = ftell(f);
- fseek(f, 0, SEEK_SET);
- p_buffer = malloc(sizeof(byte) * velikost);
- mtest(p_buffer);
- fread(p_buffer, sizeof(byte), velikost, f);
- p_akt = p_buffer;
- pHeader = (struct MS3DHeader *) p_akt;
- p_akt += sizeof(struct MS3DHeader);
- if (strncmp(pHeader->m_ID, "MS3D000000", 10) != 0) {
- kprintf(TRUE, "Neodpovida hlavicka - nejedna se o MilkShape soubor.");
- return (NULL);
- }
- if (pHeader->m_version < 3 || pHeader->m_version > 4) {
- kprintf(TRUE, "Spatna verze souboru (%d)", pHeader->m_version);
- return (NULL); // "Unhandled file version. Only Milkshape3D Version 1.3 and 1.4 is supported." );
- }
- p_kont = vyrob_kontejner();
- return (p_kont);
- }
- /*
- bool MilkshapeModel::loadModelData( const char *filename )
- {
- int nVertices = *( word* )pPtr;
- m_numVertices = nVertices;
- m_pVertices = new Vertex[nVertices];
- pPtr += sizeof( word );
- int i;
- for ( i = 0; i < nVertices; i++ )
- {
- MS3DVertex *pVertex = ( MS3DVertex* )pPtr;
- m_pVertices[i].m_boneID = pVertex->m_boneID;
- memcpy( m_pVertices[i].m_location, pVertex->m_vertex, sizeof( float )*3 );
- pPtr += sizeof( MS3DVertex );
- }
- int nTriangles = *( word* )pPtr;
- m_numTriangles = nTriangles;
- m_pTriangles = 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( m_pTriangles[i].m_vertexNormals, pTriangle->m_vertexNormals, sizeof( float )*3*3 );
- memcpy( m_pTriangles[i].m_s, pTriangle->m_s, sizeof( float )*3 );
- memcpy( m_pTriangles[i].m_t, t, sizeof( float )*3 );
- memcpy( m_pTriangles[i].m_vertexIndices, vertexIndices, sizeof( int )*3 );
- pPtr += sizeof( MS3DTriangle );
- }
- int nGroups = *( word* )pPtr;
- m_numMeshes = nGroups;
- m_pMeshes = new Mesh[nGroups];
- pPtr += sizeof( word );
- for ( i = 0; i < nGroups; i++ )
- {
- pPtr += sizeof( byte ); // flags
- pPtr += 32; // name
- word 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 );
-
- m_pMeshes[i].m_materialIndex = materialIndex;
- m_pMeshes[i].m_numTriangles = nTriangles;
- m_pMeshes[i].m_pTriangleIndices = pTriangleIndices;
- }
- int nMaterials = *( word* )pPtr;
- m_numMaterials = nMaterials;
- m_pMaterials = new Material[nMaterials];
- pPtr += sizeof( word );
- for ( i = 0; i < nMaterials; i++ )
- {
- MS3DMaterial *pMaterial = ( MS3DMaterial* )pPtr;
- memcpy( m_pMaterials[i].m_ambient, pMaterial->m_ambient, sizeof( float )*4 );
- memcpy( m_pMaterials[i].m_diffuse, pMaterial->m_diffuse, sizeof( float )*4 );
- memcpy( m_pMaterials[i].m_specular, pMaterial->m_specular, sizeof( float )*4 );
- memcpy( m_pMaterials[i].m_emissive, pMaterial->m_emissive, sizeof( float )*4 );
- m_pMaterials[i].m_shininess = pMaterial->m_shininess;
- m_pMaterials[i].m_pTextureFilename = new char[strlen( pMaterial->m_texture )+1];
- strcpy( m_pMaterials[i].m_pTextureFilename, pMaterial->m_texture );
- pPtr += sizeof( MS3DMaterial );
- }
- reloadTextures();
- // { NEW }
- // Load Skeletal Animation Stuff
- float animFPS = *( float* )pPtr;
- pPtr += sizeof( float );
- // skip currentTime
- pPtr += sizeof( float );
- int totalFrames = *( int* )pPtr;
- pPtr += sizeof( int );
- m_totalTime = totalFrames*1000.0/animFPS;
- m_numJoints = *( word* )pPtr;
- pPtr += sizeof( word );
- m_pJoints = new Joint[m_numJoints];
- struct JointNameListRec
- {
- int m_jointIndex;
- const char *m_pName;
- };
- const byte *pTempPtr = pPtr;
- JointNameListRec *pNameList = new JointNameListRec[m_numJoints];
- for ( i = 0; i < m_numJoints; i++ )
- {
- MS3DJoint *pJoint = ( MS3DJoint* )pTempPtr;
- pTempPtr += sizeof( MS3DJoint );
- pTempPtr += sizeof( MS3DKeyframe )*( pJoint->m_numRotationKeyframes+pJoint->m_numTranslationKeyframes );
- pNameList[i].m_jointIndex = i;
- pNameList[i].m_pName = pJoint->m_name;
- }
- for ( i = 0; i < m_numJoints; i++ )
- {
- MS3DJoint *pJoint = ( MS3DJoint* )pPtr;
- pPtr += sizeof( MS3DJoint );
- int j, parentIndex = -1;
- if ( strlen( pJoint->m_parentName ) > 0 )
- {
- for ( j = 0; j < m_numJoints; j++ )
- {
- if ( stricmp( pNameList[j].m_pName, pJoint->m_parentName ) == 0 )
- {
- parentIndex = pNameList[j].m_jointIndex;
- break;
- }
- }
- if ( parentIndex == -1 ) // Unable to find parent bone in MS3D file
- return false;
- }
- memcpy( m_pJoints[i].m_localRotation, pJoint->m_rotation, sizeof( float )*3 );
- memcpy( m_pJoints[i].m_localTranslation, pJoint->m_translation, sizeof( float )*3 );
- m_pJoints[i].m_parent = parentIndex;
- m_pJoints[i].m_numRotationKeyframes = pJoint->m_numRotationKeyframes;
- m_pJoints[i].m_pRotationKeyframes = new Keyframe[pJoint->m_numRotationKeyframes];
- m_pJoints[i].m_numTranslationKeyframes = pJoint->m_numTranslationKeyframes;
- m_pJoints[i].m_pTranslationKeyframes = new Keyframe[pJoint->m_numTranslationKeyframes];
- for ( j = 0; j < pJoint->m_numRotationKeyframes; j++ )
- {
- MS3DKeyframe *pKeyframe = ( MS3DKeyframe* )pPtr;
- pPtr += sizeof( MS3DKeyframe );
- setJointKeyframe( i, j, pKeyframe->m_time*1000.0f, pKeyframe->m_parameter, true );
- }
- for ( j = 0; j < pJoint->m_numTranslationKeyframes; j++ )
- {
- MS3DKeyframe *pKeyframe = ( MS3DKeyframe* )pPtr;
- pPtr += sizeof( MS3DKeyframe );
- setJointKeyframe( i, j, pKeyframe->m_time*1000.0f, pKeyframe->m_parameter, false );
- }
- }
- delete[] pNameList;
- setupJoints();
- // { end NEW }
- delete[] pBuffer;
- return true;
- }
- */
|