//=========================================================================== // GetTexture // Returns a def_t for the given texture. If it already exists, the earlier // definition is deleted. //=========================================================================== def_t *GetTexture(char *name) { def_t *it; for(it = root[group].next; it != &root[group]; it = it->next) { if(!stricmp(name, it->tex.name)) { // This'll do. return it; } } // Not found, add a new definition. it = NewTexture(); strcpy(it->tex.name, name); return it; }
CGMeshMD5::CModel * CGmResMan::NewModelMD5( const char *pcFileNameMesh, const CArray<CStr> &roArrFileNameAnim, bool bTexSmooth ) { CGMeshMD5::CModel *poModel = 0; CStr oFileEntry( pcFileNameMesh ); for( unsigned int i=0; i<roArrFileNameAnim.GetSize(); ++i ) { oFileEntry += "&"; oFileEntry += roArrFileNameAnim[i]; } poModel = (CGMeshMD5::CModel *)FindFileEntry( oFileEntry.GetData() ); if( !poModel ) { poModel = new CGMeshMD5::CModel; //if( !MakeModelMD5_( poModel, pcFileNameMesh, roArrFileNameAnim, bTexSmooth ) ) //{ // ERR( "ModelMD5 %s.\n", pcFileNameMesh ); // DELETE_INSTANCE( poModel ); // return 0; //} { if( !poModel->InitModel( DATA_DIR + /*"model/" +*/ pcFileNameMesh ) ) { ERR( "ModelMD5 %s.\n", pcFileNameMesh ); DELETE_INSTANCE( poModel ); return 0; } CArray<CGTex2 *> oArrTex; const unsigned int uiMeshCount = poModel->GetMeshCount(); oArrTex.Resize( uiMeshCount ); oArrTex.Fill( 0 ); unsigned int i = uiMeshCount; while( i ) { --i; const char *pcMaterialName = poModel->GetMaterialName( i ); if( pcMaterialName ) { oArrTex[i] = NewTexture( pcMaterialName, bTexSmooth, false ); } } const unsigned int uiAnimCount = roArrFileNameAnim.GetSize(); for( unsigned int uiAnim=0; uiAnim<uiAnimCount; ++uiAnim ) { LOG( "Loading %s.\n", roArrFileNameAnim[uiAnim].GetData() ); if( poModel->InsertNewAnim( DATA_DIR + /*"model/" +*/ roArrFileNameAnim[uiAnim] ) ) { for( unsigned int i=0; i<uiMeshCount; ++i ) { if( oArrTex.GetSize() >= i && oArrTex[i] ) { poModel->SetTex( i, uiAnim, oArrTex[i] ); } } } } poModel->SetAnim( poModel->GetAnimCount() - 1 ); } m_oArrModelMD5.Append( poModel ); NewFileEntry( oFileEntry.GetData(), poModel ); } else { LOG( "ModelMD5 skipped: %s.\n", pcFileNameMesh ); } //else //{ // // copy with shared data // poModel = new CGMeshMD5::CModel( *poModel ); // // m_oArrModelMD5.Append( poModel ); // LOG( "ModelMD5 copied: %s.\n", pcFileNameMesh ); //} return poModel; }
void CGmResMan::NewMeshObj( const char *pcSubDir, const char *pcFileName, CArray<CGMeshObj *> &roArr, bool bTexSmooth, bool bRawPoly ) { roArr.Clear(); CStr oPre( DATA_DIR + "model/" + pcSubDir ); if( oPre[oPre.GetSize()-1] != '/' ) oPre += '/'; CFileBlockTxt oFile; if( oFile.Load( ( oPre + pcFileName ).GetData() ) ) { LOG( "Loading %s.\n", ( oPre + pcFileName ).GetData() ); CStr oMaterialLibName; if( CGMeshObj::LoadModel_( oFile.GetString(), &roArr, bRawPoly, &oMaterialLibName ) ) { LOG( "%d OBJ-Meshes loaded.\n", roArr.GetSize() ); bool bMtllibOk = false; CFileBlockTxt oFileMaterialLib; if( oMaterialLibName.GetSize() ) { if( oFileMaterialLib.Load( ( oPre + oMaterialLibName ).GetData() ) ) { //LOG( "\nmtllib:\n%s\n", (const char *)oFileMaterialLib.m_pucData ); LOG( "%s loaded.\n", oMaterialLibName.GetData() ); bMtllibOk = true; } } for( unsigned int i=0; i<roArr.GetSize(); ++i ) { CGMeshObj *poMesh = roArr[i]; //poMesh->RotateX( M_PI ); //poMesh->ScaleX( 1.1f ); //poMesh->ScaleY( 1.1f ); //poMesh->ScaleZ( 1.1f ); LOG( "\t%s\n", poMesh->m_oName.GetData() ); LOG( "\t%d vertices\n", poMesh->m_oArrVertex.GetSize() ); LOG( "\t%d indices\n", poMesh->m_oArrIndex.GetSize() ); LOG( "\tmaterial: %s\n", poMesh->m_oMaterialName.GetData() ); if( bMtllibOk ) { CStr oTexNameDiffuse, oTexNameNormal; poMesh->LoadMaterial( oFileMaterialLib.GetString(), poMesh->m_oMaterialName, &oTexNameDiffuse, 0, &oTexNameNormal ); if( !bRawPoly ) { if( oTexNameDiffuse.GetSize() ) { poMesh->SetTex( NewTexture( oTexNameDiffuse, bTexSmooth, false ), 0 ); } if( oTexNameNormal.GetSize() ) { poMesh->SetTex( NewTexture( oTexNameNormal, false, false ), 1 ); } } } else if( !bRawPoly && poMesh->m_oMaterialName.GetSize() ) { poMesh->SetTex( NewTexture( poMesh->m_oMaterialName, bTexSmooth, false ), 0 ); } poMesh->m_bEnableColor = false; // Hat keine Funktion bei beim Wavefront Object Meshes. poMesh->Init(); m_oArrMesh.Append( poMesh ); // new } } } else { ERR( "OBJ Mesh %s.\n", pcFileName ); } }
D3DTEXTUREHANDLE LoadMBlareTexture(char *Name){ static LPDIRECTDRAWSURFACE lpSurf; LPDIRECT3DTEXTURE2 lpComObj; return NewTexture(Name, &lpSurf, &lpComObj); }