Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}