void FBXScene::ProcessMesh(FbxNode* pNode) { FbxMesh* pFBXMesh = pNode->GetMesh(); if( !pFBXMesh ) return; if ( pFBXMesh->GetPolygonVertexCount() != pFBXMesh->GetPolygonCount() * 3 ) { FbxGeometryConverter GeometryConverter(pNode->GetFbxManager()); if( !GeometryConverter.TriangulateInPlace( pNode ) ) { return; } pFBXMesh = pNode->GetMesh(); } pFBXMesh->InitNormals(); pFBXMesh->ComputeVertexNormals(true); pFBXMesh->GenerateTangentsDataForAllUVSets(); int nVertexCount = pFBXMesh->GetControlPointsCount(); if( nVertexCount <= 0 ) return; std::vector<BoneWeights> boneWeights(nVertexCount); ProcessBoneWeights(pFBXMesh, boneWeights); Model* pModel = new Model(pNode->GetName(), m_Models.GetCount(), false); FbxVector4* aControlPoints = pFBXMesh->GetControlPoints(); for( int pi = 0; pi < pFBXMesh->GetPolygonCount(); ++pi ) // Whole for-loop takes some time too, investigate further. { // Material Material* pMaterial = NULL; for( unsigned int pvi = 0; pvi < 3; ++pvi ) { int nVertexIndex = pFBXMesh->GetPolygonVertex(pi, pvi); if( nVertexIndex < 0 || nVertexIndex >= nVertexCount ) continue; // Material if( pMaterial == NULL ) pMaterial = GetMaterialLinkedWithPolygon(pFBXMesh, 0, pi, 0, nVertexIndex); // Position FbxVector4 fbxPosition = aControlPoints[nVertexIndex]; // Normals And Tangents FbxVector4 fbxNormal, fbxTangent; fbxNormal = GetNormal(pFBXMesh, 0, pi, pvi, nVertexIndex); fbxTangent = GetTangent(pFBXMesh, 0, pi, pvi, nVertexIndex); // Add Vertex pModel->AddVertex(pMaterial, FbxVector4ToBTHFBX_VEC3(fbxPosition), FbxVector4ToBTHFBX_VEC3(fbxNormal), FbxVector4ToBTHFBX_VEC3(fbxTangent), GetTexCoord(pFBXMesh, 0, pi, pvi, nVertexIndex), boneWeights[nVertexIndex]); // Update Bounding Box UpdateBoundingBoxDataFromVertex(FbxVector4ToBTHFBX_VEC3(fbxPosition)); } } // Geometric Offset pModel->SetGeometricOffset2(GetGeometricOffset2(pNode)); // Insert Model m_Models.Add(pModel->GetName(), pModel); }
void ObjLoader::Load(char* path, Model &loadedmodel) { //reads the model from the path specified and stores it to the model object specified by loaded model std::vector<std::string*> contentsoffile; char textbuffer[256]; std::ifstream in(path); if(!in.is_open()) { std::cerr<<"model can not be opened"<<std::endl; } while(!in.eof()) { //read to end of file in.getline(textbuffer,256); contentsoffile.push_back(new std::string(textbuffer)); } for(unsigned int i=0;i<contentsoffile.size();i++) { //loop through read file if(contentsoffile[i]->c_str()[0]=='#')//# means its a comment { continue; } else if(contentsoffile[i]->c_str()[0]=='v'&& contentsoffile[i]->c_str()[1]==' ')//'v ' means a vertex { float tmpx,tmpy,tmpz; sscanf_s(contentsoffile[i]->c_str(),"v %f %f %f",&tmpx,&tmpy,&tmpz); loadedmodel.AddVertex(fVector3d(tmpx,tmpy,tmpz)); } else if(contentsoffile[i]->c_str()[0]=='v' && contentsoffile[i]->c_str()[1]=='t')//'vt' means a uv coordinate { float u,v; sscanf_s(contentsoffile[i]->c_str(),"vt %f %f %f",&u,&v); loadedmodel.AddUV(fTexCoords3d(u,v)); } else if(contentsoffile[i]->c_str()[0]=='v'&& contentsoffile[i]->c_str()[1]=='n')//'vt' means a vector normal { float tmpx,tmpy,tmpz; sscanf_s(contentsoffile[i]->c_str(),"vn %f %f %f",&tmpx,&tmpy,&tmpz); loadedmodel.AddNormal(fVector3d(tmpx,tmpy,tmpz)); } else if(contentsoffile[i]->c_str()[0]=='f')//'f ' means a face { int fa,fb,fc,na,nb,nc,ta,tb,tc; fa=fb=fc=na=nb=nc=ta=tb=tc= 0; for (;;) { if (sscanf_s(contentsoffile[i]->c_str(),"f %d/%d/%d %d/%d/%d %d/%d/%d",&fa,&ta,&na,&fb,&tb,&nb,&fc,&tc,&nc) == 9){ break; } if (sscanf_s(contentsoffile[i]->c_str(),"f %d//%d %d//%d %d//%d",&fa,&na,&fb,&nb,&fc,&nc) == 6){ break;} if (sscanf_s(contentsoffile[i]->c_str(),"f %d/%d %d/%d %d/%d",&fa,&ta,&fb,&tb,&fc,&tc) == 6){ break;} if (sscanf_s(contentsoffile[i]->c_str(),"f %d %d %d",&fa,&fb,&fc) == 3){ break;} else { std::cerr<<"the file you loaded is invalid"<<std::endl; break; } } loadedmodel.AddTriangle(fTriangle(iVector3d(fa-1,fb-1,fc-1),iVector3d(na-1,nb-1,nc-1),iVector3d(ta-1,tb-1,tc-1))); } else { continue; } } }