Scene3DMesh* SGMExporter::ConvertMesh(IGameNode* meshNode) { std::string meshNodeName = StringUtils::ToNarrow(meshNode->GetName()); Log::LogT("exporting node '%s'", meshNodeName.c_str()); IGameMesh *gMesh = (IGameMesh*)meshNode ->GetIGameObject(); assert(gMesh); if (!gMesh ->InitializeData()) { Log::LogT("error: couldnt initialize data, skipping node"); return NULL; } if (!gMesh->IsObjectSkinned()) { Log::LogT("Mesh '%s' is not skinned", meshNodeName.c_str()); meshNode->ReleaseIGameObject(); return NULL; } else Log::LogT("Mesh '%s' is skinned", meshNodeName.c_str()); Scene3DMesh *mesh = new Scene3DMesh(); mesh->id = meshNode->GetNodeID(); mesh->name = StringUtils::ToNarrow(meshNode->GetName()); CollectProperties(mesh, gMesh); IGameMaterial *mat = meshNode ->GetNodeMaterial(); if (mat != NULL) mesh->materialName = StringUtils::ToNarrow(mat->GetMaterialName()); IGameSkin* skin = gMesh->GetIGameSkin(); for (int i = 0; i < skin->GetTotalSkinBoneCount(); i++) mesh->bonesIds.push_back(skin->GetIGameBone(i)->GetNodeID()); for (int i = 0; i < gMesh ->GetNumberOfFaces(); i++) ExtractVertices(skin, gMesh ->GetFace(i), gMesh, mesh->vertices); Log::LogT("Min bones = %d, max bones = %d", dbgMinBonesCount, dbgMaxBonesCount); meshNode ->ReleaseIGameObject(); return mesh; }
bool CMayaMesh::Save( FILE * pFile ) { if ( NULL == pFile ) { return false; } m_bValid &= ExtractVertices(); m_bValid &= ExtractUVSets(); /*m_bValid &=*/ ExtractSurfaces(); m_bValid &= FillMeshData(); // Настраиваем ссылки ( для удобства чтения кода ) const uint & nComponentCount = m_MeshData.tHeader.nComponentCount; const uint & nVertexCount = m_MeshData.tHeader.nVertexCount; const uint & nVertexSize = m_MeshData.tHeader.nVertexSize; const uint & nSurfaceCount = m_MeshData.tHeader.nSurfCount; //-------------------------------------------------------------------------- // Tip: Сохранение заголовка объекта //-------------------------------------------------------------------------- TObjectHdr tHeader; FillObjectHeader( &tHeader ); //tHeader.szParent[ 0 ] = 0; tHeader.nShapeBlockSize = 0; if ( m_bValid ) { tHeader.nShapeBlockSize = sizeof( TMeshData::THeader ) + nComponentCount * sizeof( TVertexComponent ) + nVertexCount * nVertexSize + nSurfaceCount * sizeof( TSurface::THeader ); } // Пишем заголовок object'а fwrite( &tHeader, sizeof( TObjectHdr ), 1, pFile ); if ( !m_bValid ) { return false; } //-------------------------------------------------------------------------- // Tip: Сохранение mesh'а //-------------------------------------------------------------------------- // Пишем заголовок mesh'а fwrite( &m_MeshData.tHeader, sizeof( TMeshData::THeader ), 1, pFile ); // Пишем компоненты вершины fwrite( m_MeshData.pComponents, nComponentCount * sizeof( TVertexComponent ), 1, pFile ); // Пишем массив вершин fwrite( m_MeshData.pVertices, nVertexCount * nVertexSize, 1, pFile ); // Записываем каждый материал ( surface ) for ( uint n = 0; n < nSurfaceCount; ++n ) { TSurface & tSurf = m_MeshData.pSurfaces[ n ]; // Пишем заголовок surface'а fwrite( &tSurf.tHeader, sizeof( TSurface::THeader ), 1, pFile ); // Пишем индексы вершин fwrite( tSurf.pIndices, tSurf.tHeader.nIndexCount * tSurf.tHeader.nIndexSize, 1, pFile ); } return true; }