void ResourceManager::cpQuadFaces(const aiMesh &aimesh, Mesh3D &mesh) { unsigned count = 0; for (unsigned i(0); i < aimesh.mNumFaces; ++i) { const aiFace &face = aimesh.mFaces[i]; int vi[4]; int ti[4]; for (unsigned j(0); j < 4; ++j) { aiVector3D p = aimesh.mVertices[face.mIndices[j]]; aiVector3D n = aimesh.mNormals[face.mIndices[j]]; aiVector3D t = aimesh.mTextureCoords[0][face.mIndices[j]]; mesh.vertices_.push_back(Vec3(p.x, p.z, p.y)); if (aimesh.HasNormals()) mesh.vertexNormals_.push_back(Vec3(n.x, n.z, n.y)); mesh.texCoords_.push_back(Vec2(t.x, t.y)); vi[j] = count; ti[j] = count; count++; } mesh.faces_.push_back(TriFace(vi, ti)); } }
void ObjLoader::readSubMesh(ifstream &in, Mesh3D *pMesh) { char strLine[256]; while(!in.eof()) { in>>type_; if(type_ == string("#")) { in.getline(strLine,256); continue; } //case: Vertex else if(type_ == string("v")) readVertices(in,strLine); //case: TexCoord //case: Face else if(type_ == string("f")) { readFaces(in, strLine); break; } //default else in.getline(strLine,256); }//end while //assign number of vertices pMesh->vertices_ = vertices_; pMesh->numVerts_=vertices_.size(); pMesh->numFaces_=faces_.size(); pMesh->numTexCoords_=texCoords_.size(); pMesh->texCoords_.reserve(texCoords_.size()); pMesh->faces_.reserve(faces_.size()); for(unsigned int i=0;i<vertices_.size();i++) { pMesh->vertices_[i] = vertices_[i]; } for(unsigned int i=0;i<texCoords_.size();i++) { pMesh->texCoords_[i] = texCoords_[i]; } for(unsigned int i=0;i<faces_.size();i++) { pMesh->faces_.push_back(TriFace(faces_[i].VertexIndex)); }//end for //reset the vectors faces_.clear(); texCoords_.clear(); vertices_.clear(); }
bool ResourceManager::loadScene(std::string fileName) { // Check if file exists std::ifstream fin(fileName.c_str()); if(!fin.fail()) { fin.close(); } else { std::cout << "File: " << fileName << " could not be loaded." << std::endl; return false; } scene = importer.ReadFile( fileName, aiProcessPreset_TargetRealtime_Quality); size_t pos = fileName.find_last_of("."); std::string sType = fileName.substr(pos); // If the import failed, report it if( !scene) { std::cout << "Scene import failed." << std::endl; return false; } std::cout << "Assimp meshes: " << scene->mNumMeshes << std::endl; std::cout << "Assimp vertices: " << scene->mMeshes[0]->mNumVertices << std::endl; if(scene->mMeshes[0]->HasNormals()) std::cout << "Assimp normals present" << std::endl; std::cout << "Assimp faces: " << scene->mMeshes[0]->mNumFaces << std::endl; std::cout << "Assimp tcoords: " << scene->mMeshes[0]->mTextureCoords << std::endl; std::cout << "Material index: " << scene->mMeshes[0]->mMaterialIndex << std::endl; std::cout << "Number of materials: " << scene->mNumMaterials << std::endl; textures_.reserve(scene->mNumMaterials); for(unsigned k(0); k < scene->mNumMaterials; ++k) { aiMaterial *mat = scene->mMaterials[k]; aiString name; mat->Get(AI_MATKEY_NAME,name); std::cout << "Material name: " << name.C_Str() << std::endl; std::cout << "Number of textures: " << mat->GetTextureCount(aiTextureType_DIFFUSE) << std::endl; aiString path; if(mat->GetTexture(aiTextureType_DIFFUSE, 0, &path, nullptr, nullptr, nullptr, nullptr, nullptr) == AI_SUCCESS) { std::cout << "Texture path: " << path.C_Str() << std::endl; std::cout << "Texture path: " << sType << std::endl; std::string texName; if(sType == ".dae") { std::string dir("../../textures/"); std::string basename(path.C_Str()); texName = std::string(dir + basename); } else { texName = std::string(path.C_Str()); } Texture tex; tex.createTextureFromImage(i3dTexType::i3d_tex_diffuse_map, texName); textures_.push_back(std::move(tex)); } else { std::cout << "Default Texture path: " << std::endl; std::string texName("../../textures/greyhalf.png"); Texture tex; tex.createTextureFromImage(i3dTexType::i3d_tex_diffuse_map, texName); textures_.push_back(std::move(tex)); } float specularExponent; if(mat->Get(AI_MATKEY_SHININESS, specularExponent) == AI_SUCCESS) { specularExponent = 40.0f; std::cout << "Specular Exponent: " << specularExponent << std::endl; } else { specularExponent = 20.0f; std::cout << "Specular Exponent: " << specularExponent << std::endl; } float specularIntensity; if(mat->Get(AI_MATKEY_SHININESS_STRENGTH, specularIntensity) == AI_SUCCESS) std::cout << "Specular Intensity: " << specularIntensity << std::endl; else { specularIntensity = 0.8f; std::cout << "Specular Intensity: " << specularIntensity << std::endl; } aiVector3D col_diffuse; float diffuseIntensity(0.0f); if(mat->Get(AI_MATKEY_COLOR_DIFFUSE, col_diffuse) == AI_SUCCESS) { std::cout << "Diffuse color: " << col_diffuse.x << std::endl; } else { diffuseIntensity = 1.0f; } PhongMaterial phong; phong.specularIntensity_ = specularIntensity; phong.specularExponent_ = specularExponent; phong.diffuseIntensity_ = 0.8f; phong.textures_.push_back(&(textures_.back())); materials_.push_back(phong); } meshObjects_.reserve(scene->mNumMeshes); for(unsigned k(0); k < scene->mNumMeshes; ++k) { gameObjects_.push_back(GameObject()); GameObject &go = gameObjects_.back(); meshObjects_.push_back(Mesh()); Mesh &meshObj = meshObjects_.back(); go.meshObject_ = &meshObj; meshObj.polygonMode_ = GL_FILL; meshObj.texFormat_ = tCoordFormat::i3d_format_assimp; meshObj.model_.meshes_.push_back(Mesh3D()); Mesh3D &mesh = meshObj.model_.meshes_.front(); unsigned numVerts = scene->mMeshes[k]->mNumFaces * 3; mesh.vertices_.reserve(numVerts); if(scene->mMeshes[k]->HasNormals()) mesh.vertexNormals_.reserve(numVerts); mesh.texCoords_.reserve(numVerts); std::cout << "Loading mesh with: " << numVerts << " vertices." << std::endl; std::cout << "Loading " << scene->mMeshes[k]->mName.C_Str() << "." << std::endl; if(scene->mMeshes[k]->mMaterialIndex < scene->mNumMaterials) { meshObj.hasTexture_ = true; go.material_ = &materials_[scene->mMeshes[k]->mMaterialIndex]; } unsigned count = 0; if(scene->mMeshes[k]->mFaces[0].mNumIndices > 3) { std::cerr << "Cannot handle faces with more than 3 vertices: file: " << __FILE__ << " line: " << __LINE__ << std::endl; std::exit(EXIT_FAILURE); } for(unsigned i(0); i < scene->mMeshes[k]->mNumFaces; ++i) { const aiFace &face = scene->mMeshes[k]->mFaces[i]; int vi[3]; int ti[3]; for(unsigned j(0); j < 3; ++j) { aiVector3D p = scene->mMeshes[k]->mVertices[face.mIndices[j]]; aiVector3D n = scene->mMeshes[k]->mNormals[face.mIndices[j]]; aiVector3D t = scene->mMeshes[k]->mTextureCoords[0][face.mIndices[j]]; mesh.vertices_.push_back(Vec3(p.x,p.z,p.y)); if(scene->mMeshes[k]->HasNormals()) mesh.vertexNormals_.push_back(Vec3(n.x,n.z,n.y)); mesh.texCoords_.push_back(Vec2(t.x,t.y)); vi[j] = count; ti[j] = count; count++; } mesh.faces_.push_back(TriFace(vi, ti)); //std::cout << "face: " << vi[0] << " " << vi[1] << " " << vi[2] << std::endl; } meshObj.transform_.translation_ = i3d::Vec4(0.f, 0.0f, 0.f, 0.f); meshObj.transform_.setRotationEuler(i3d::Vec3(0.0f, 0.0f, 0.0f)); meshObj.initRender(); } // We're done. Everything will be cleaned up by the importer destructor return true; }
C3DModel CTriangulator<Real, OBB3<Real> >::Triangulate(const OBB3<Real> &pShape) { C3DModel model; std::vector<Vector3<Real> > vVertices; std::vector<TriFace> vFaces; Vector3<Real> vertices[8]; pShape.computeVertices(vertices); for(int i=0;i<8;i++) vVertices.push_back(vertices[i]); //front faces int verts[3]; verts[0]=0; verts[1]=1; verts[2]=5; TriFace face(verts); vFaces.push_back(face); verts[0]=0; verts[1]=5; verts[2]=4; face=TriFace(verts); vFaces.push_back(face); //back faces verts[0]=3; verts[1]=6; verts[2]=7; face=TriFace(verts); vFaces.push_back(face); verts[0]=3; verts[1]=2; verts[2]=6; face=TriFace(verts); vFaces.push_back(face); //bottom faces verts[0]=0; verts[1]=1; verts[2]=2; face=TriFace(verts); vFaces.push_back(face); verts[0]=0; verts[1]=2; verts[2]=3; face=TriFace(verts); vFaces.push_back(face); //top faces verts[0]=4; verts[1]=5; verts[2]=6; face=TriFace(verts); vFaces.push_back(face); verts[0]=4; verts[1]=6; verts[2]=7; face=TriFace(verts); vFaces.push_back(face); //left faces verts[0]=3; verts[1]=7; verts[2]=4; face=TriFace(verts); vFaces.push_back(face); verts[0]=3; verts[1]=4; verts[2]=0; face=TriFace(verts); vFaces.push_back(face); //right faces verts[0]=1; verts[1]=2; verts[2]=6; face=TriFace(verts); vFaces.push_back(face); verts[0]=1; verts[1]=6; verts[2]=5; face=TriFace(verts); vFaces.push_back(face); model.CreateFrom(vVertices,vFaces); return model; }