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

}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}