コード例 #1
0
/*!
*  \brief      Go through the scene nodes and load and transform all meshes them.
*  \author     Sascha Kaden
*  \param[in]  scene
*  \param[in]  node
*  \param[in]  transformation
*  \param[out] vector of meshes
*  \date       2017-05-09
*/
void getMeshes(const aiScene *scene, const aiNode *node, aiMatrix4x4 *trafo, std::vector<Mesh> &meshes, const bool useTrafo) {
    aiMatrix4x4 prevTrafo;

    prevTrafo = *trafo;
    aiMultiplyMatrix4(trafo, &node->mTransformation);

    for (size_t i = 0; i < node->mNumMeshes; ++i) {
        Mesh mesh;
        const aiMesh *aimesh = scene->mMeshes[node->mMeshes[i]];
        for (size_t j = 0; j < aimesh->mNumVertices; ++j) {
            aiVector3D vertex = aimesh->mVertices[j];
            if (useTrafo)
                aiTransformVecByMatrix4(&vertex, trafo);
            mesh.vertices.emplace_back(vertex.x, vertex.y, vertex.z);
        }
        for (size_t j = 0; j < aimesh->mNumFaces; ++j) {
            if (aimesh->mFaces[j].mNumIndices > 2) {
                mesh.faces.emplace_back(aimesh->mFaces[j].mIndices[0], aimesh->mFaces[j].mIndices[1], aimesh->mFaces[j].mIndices[2]);
            } else {
                Logging::warning("Face array is to short", "CadProcessing");
            }
        }
        meshes.push_back(mesh);
    }

    for (size_t i = 0; i < node->mNumChildren; ++i) {
        getMeshes(scene, node->mChildren[i], trafo, meshes);
    }
    *trafo = prevTrafo;
}
コード例 #2
0
	void ModelRenderProcessor::deleteModelFromGpu(string modelPath) {
		auto model = loader->getModelBy(modelPath);
		auto materials = model->getMaterials();
		for(auto& i : materials) {
			auto program = loader->getProgramBy(i.getProgramName());
			auto programName = program->getName();
			
			if(!hasMaterialWithProgram(programName))
				deleteProgramFromGpu(programName);
		}

		vector<Mesh3d>& meshes = model->getMeshes();
		unordered_map<uint32_t, string> texturesToRemove;
		for(auto& s : meshes) {
			string mName = model->getUniqueMeshName(s);
			deleteGeometryFromGpu(mName);
			
			Texture2d& texture = model->getTextureBy(s);
			texturesToRemove.emplace(s.getMaterialId(), texture.getPath());
		}

		for(auto& s : texturesToRemove) {
			deleteTextureFromGpu(s.second);
		}
	}
コード例 #3
0
ファイル: KeyFrame.cpp プロジェクト: foxostro/heroman
bool KeyFrame::merge(const KeyFrame &o)
{
	if(getMeshes().size() == 0)
	{
		meshes = o.getMeshes();
	}
	else
	{
		if(getMeshes().size() != o.getMeshes().size())
			return false;

		for(vector<Mesh*>::const_iterator iter=o.getMeshes().begin();
            iter != o.getMeshes().end();
            ++iter)
		{
			meshes.push_back(*iter);
		}
	}

	return true;
}
コード例 #4
0
ファイル: ASceneDecoder.cpp プロジェクト: laulandne/src
AScene3D *ASceneDecoder::createNewSceneObject()
{
  DEBUG_OUT<<"ASceneDecoder::createNewSceneObject() starting...\n";
  AScene3D *s=new AScene3D();
  DEBUG_OUT<<"Meshes...\n";
  s->setMeshes((AMesh3D **)allocArrayBigEnoughForList(getMeshes()));
  s->setNumMeshes(buildArrayFromList((void **)s->getMeshes(),getMeshes()));
  DEBUG_OUT<<"Lights...\n";
  s->setLights((ALight3D **)allocArrayBigEnoughForList(getLights()));
  s->setNumLights(buildArrayFromList((void **)s->getLights(),getLights()));
  DEBUG_OUT<<"Cameras...\n";
  s->setCameras((ACamera3D **)allocArrayBigEnoughForList(getCameras()));
  s->setNumCameras(buildArrayFromList((void **)s->getCameras(),getCameras()));
  //
  //DEBUG_OUT<<"Sky...\n";
  //theSky.surf=readFile->getTheSky()->surf;
  //theSky.fRed=readFile->getTheSky()->fRed;
  //theSky.fBlue=readFile->getTheSky()->fBlue;
  //theSky.fGreen=readFile->getTheSky()->fGreen;
  //DEBUG_OUT<<"Ground...\n";
  //createGroundMesh(readFile->getTheGround());
  DEBUG_OUT<<"Done.\n";
  return s;
}
コード例 #5
0
	void ModelRenderProcessor::loadModelToGpu(string modelPath) {
		auto model = loader->getModelBy(modelPath);
		auto materials = model->getMaterials();
		for(auto& i : materials) {
			auto program = loader->getProgramBy(i.getProgramName());
			auto programName = program->getName();
			if(!hasMaterialWithProgram(programName))
				loadProgramToGpu(programName, program);
		}

		vector<Mesh3d>& meshes = model->getMeshes();
		for(auto& s : meshes) {
			string meshName = model->getUniqueMeshName(s);

			loadGeometryToGpu(meshName, s.getRawVertices(), s.getIndices());

			Texture2d& texture = model->getTextureBy(s);
			loadTextureToGpu(texture);

			auto& buffer = meshToBuffer.at(meshName);
			buffer.texture = textureToId.at(texture.getPath());
		}
	}
コード例 #6
0
	void ModelRenderProcessor::doStep(const StepData& stepData) {
		auto sGConnector = graphics.lock();
		if(!sGConnector)
			throw WeakPtrException(EXCEPTION_INFO);

		for(auto& i : idToObject) {
			View& object = i.second;
			object.doAnimationStep(stepData.stepMSec);

			mat4 mvpMatrix = stepData.perspectiveView * object.getTransform();

			auto model = loader->getModelBy(object.getPath());
			vector<Mesh3d>& meshes = model->getMeshes();
			for(auto& s : meshes) {
				auto material = model->getMaterialBy(s);
				auto programName = material.getProgramName();
				auto programContext = nameToProgramContext.at(programName);

				std::vector<IGraphicsConnector::ProgramParam> params;
				IGraphicsConnector::ProgramParam mvp;
				mvp.id = programContext->getLoc(programContext->getMvpBinding());
				mvp.mat4 = std::make_shared<glm::mat4>(mvpMatrix);
				params.push_back(mvp);

				auto bonesData = prepareAnimationStep(object, s);			
				string meshName = model->getUniqueMeshName(s);
				auto& buffer = meshToBuffer.at(meshName);

				sGConnector->draw(buffer, programContext, params, bonesData);
			}
		}

		StepData step = stepData;
		step.extraData = &idToObject;
		__super::doStep(step);
	}
コード例 #7
0
ファイル: KeyFrame.cpp プロジェクト: foxostro/heroman
void KeyFrame::applySkin(const Material &material)
{
    applySkinToModel(getMeshes(), material);
}
コード例 #8
0
ファイル: aselib.cpp プロジェクト: huhuhu1092/test-server
void ASE_Loader::Write(const char* filename)
{
    int materialNum = mSceneObject->mMats.size();
    SE_Material* materials = (SE_Material*)SE_Malloc(materialNum * sizeof(SE_Material));
    SE_Object_Clear(materials, sizeof(materialNum * sizeof(SE_Material)));
    int i;
    for(i = 0 ; i < materialNum ; i++)
    {
        ASE_Material* srcm = &mSceneObject->mMats[i];
        SE_Material* dstm = &materials[i];
        COPY_MATERIAL(ambient);
        COPY_MATERIAL(diffuse);
        COPY_MATERIAL(specular);
        SE_String_Init(&dstm->materialData.texturename, srcm->materialData.texName);
        dstm->subMaterialNum = srcm->numsubmaterials;
        if(srcm->numsubmaterials > 0)
        {
            dstm->subMaterialArray = (SE_MaterialData*)SE_Malloc(sizeof(SE_MaterialData) * dstm->subMaterialNum);
            for(int j = 0 ; j < dstm->subMaterialNum ; j++)
            {
                SE_MaterialData* subdstm = &dstm->subMaterialArray[j];
                ASE_MaterialData* subsrcm = &srcm->submaterials[j];
                COPY_SUBMATERIAL(ambient);
                COPY_SUBMATERIAL(diffuse);
                COPY_SUBMATERIAL(specular);
                SE_String_Init(&subdstm->texturename, subsrcm->texName);
            } 
        }
    }
    int geomDataNum = mSceneObject->mGeomObjects.size();
    SE_GeometryData* geomDataArray = (SE_GeometryData*)SE_Malloc(geomDataNum * sizeof(SE_GeometryData));
    std::list<ASE_GeometryObject*>::iterator it;
    i = 0;
    for(it = mSceneObject->mGeomObjects.begin();
        it != mSceneObject->mGeomObjects.end();
        it++, i++)
    {
        ASE_GeometryObject* go = *it;
        SE_GeometryData* dstgd = &geomDataArray[i];
        ASE_Mesh* mesh = go->mesh;
        SE_Object_Clear(dstgd, sizeof(SE_GeometryData));
        dstgd->type = SE_TRIANGLES;
        dstgd->vertexNum = mesh->numVertexes;
        dstgd->vertexArray = (SE_Vector3f*)SE_Malloc(dstgd->vertexNum * sizeof(SE_Vector3f));
        SE_Matrix3f rotate, rs;
        SE_Matrix4f transformMatrix, invertTransformMatrix;
        SE_Vector3f rotateAxis, translate, scale;
        SE_Quat rotateQuat;
        rotateAxis.x = go->rotateAxis[0];
        rotateAxis.y = go->rotateAxis[1];
        rotateAxis.z = go->rotateAxis[2];
        translate.x = go->translate[0];
        translate.y = go->translate[1];
        translate.z = go->translate[2];
        scale.x = go->scale[0];
        scale.y = go->scale[1];
        scale.z = go->scale[2];
        SE_Quat_InitFromAngleAxis(go->rotateAngle, &rotateAxis, &rotateQuat);
        SE_CreateTransformByRST(&rotateQuat, &scale, &translate, &transformMatrix);
        SE_Mat4f_Inverse(&transformMatrix, &invertTransformMatrix);
        int j;
        for(j = 0 ; j < dstgd->vertexNum ; j++ )
        {
            SE_Vector4f v1, v2;
            v1.x = mesh->vertexes[j].x;
            v1.y =  mesh->vertexes[j].y;
            v1.z = mesh->vertexes[j].z;
            v1.w = 1.0f;
            SE_Mat4f_Map(&invertTransformMatrix, &v1, &v2);
            SE_ASSERT(v2.w == 1.0f);
            dstgd->vertexArray[j].x = v2.x;
            dstgd->vertexArray[j].y = v2.y;
            dstgd->vertexArray[j].z = v2.z;

            /*
            dstgd->vertexArray[j].x = mesh->vertexes[j].x;
            dstgd->vertexArray[j].y = mesh->vertexes[j].y;
            dstgd->vertexArray[j].z = mesh->vertexes[j].z;
            */
        }
        dstgd->ownVertexArray = 1;
        dstgd->texVertexNum = mesh->numTVertexes;
        dstgd->texVertexArray = (SE_Vector3f*)SE_Malloc(dstgd->texVertexNum * sizeof(SE_Vector3f));
        for(j = 0 ; j < dstgd->texVertexNum ; j++)
        {
            dstgd->texVertexArray[j].x = mesh->tvertexes[j].s;
            dstgd->texVertexArray[j].y = mesh->tvertexes[j].t;
            dstgd->texVertexArray[j].z = 0;
        }
        dstgd->ownTexVertexArray = 1;
        dstgd->faceNum = mesh->numFaces;
        dstgd->faceArray = (SE_Face*)SE_Malloc(dstgd->faceNum * sizeof(SE_Face));
        for(j = 0 ; j < dstgd->faceNum ; j++)
        {
            dstgd->faceArray[j].v[0] = mesh->faces[j].vi[0];
            dstgd->faceArray[j].v[1] = mesh->faces[j].vi[1];
            dstgd->faceArray[j].v[2] = mesh->faces[j].vi[2];
        }
        dstgd->ownFaceArray = 1;
        if(mesh->tfaces)
        {
            dstgd->texFaceNum = mesh->numFaces;
            dstgd->texFaceArray = (SE_Face*)SE_Malloc(dstgd->texFaceNum * sizeof(SE_Face));
            for(j = 0 ; j < dstgd->texFaceNum ; j++)
            {
                dstgd->texFaceArray[j].v[0] = mesh->tfaces[j].vi[0];
                dstgd->texFaceArray[j].v[1] = mesh->tfaces[j].vi[1];
                dstgd->texFaceArray[j].v[2] = mesh->tfaces[j].vi[2];
            }
            dstgd->ownTexFaceArray = 1;
        }
    }
    std::list<SE_Mesh*> seMeshs;
    getMeshes(mSceneObject, seMeshs);
    int meshNum = seMeshs.size();
    FILE* fout = fopen(filename, "wb");
    if(!fout)
       return;
    fwrite(&MAGIC, sizeof(int), 1, fout);
    fwrite(&VERSION, sizeof(int), 1, fout);
    fwrite(&COORDINATE, sizeof(int), 1, fout);
    fwrite(&ENDIAN, sizeof(int), 1, fout);
    fwrite(&materialNum, sizeof(int), 1, fout);
    fwrite(&geomDataNum, sizeof(int), 1, fout);
    fwrite(&meshNum, sizeof(int), 1, fout);
    for(i = 0 ; i < materialNum ; i++)
    {
        LOGI("...write material\n");
        fwrite(&MATERIAL_ID, sizeof(short), 1, fout);
        SE_Material* m = &materials[i];
        writeString(SE_String_GetData(&m->materialData.texturename), fout);
        fwrite(&m->materialData.ambient.x, sizeof(float), 1, fout);
        fwrite(&m->materialData.ambient.y, sizeof(float), 1, fout);
        fwrite(&m->materialData.ambient.z, sizeof(float), 1, fout);
        
        fwrite(&m->materialData.diffuse.x, sizeof(float), 1, fout);
        fwrite(&m->materialData.diffuse.y, sizeof(float), 1, fout);
        fwrite(&m->materialData.diffuse.z, sizeof(float), 1, fout);
        
        fwrite(&m->materialData.specular.x, sizeof(float), 1, fout);
        fwrite(&m->materialData.specular.y, sizeof(float), 1, fout);
        fwrite(&m->materialData.specular.z, sizeof(float), 1, fout);
        fwrite(&m->subMaterialNum , sizeof(int), 1, fout);
        if(m->subMaterialNum > 0)
        {
            for(int j = 0 ; j < m->subMaterialNum ; j++)
            {
                SE_MaterialData* md = &m->subMaterialArray[j];
                writeString(SE_String_GetData(&md->texturename), fout);
                fwrite(&md->ambient.x, sizeof(float), 1, fout);
                fwrite(&md->ambient.y, sizeof(float), 1, fout);
                fwrite(&md->ambient.z, sizeof(float), 1, fout);
                
                fwrite(&md->diffuse.x, sizeof(float), 1, fout);
                fwrite(&md->diffuse.y, sizeof(float), 1, fout);
                fwrite(&md->diffuse.z, sizeof(float), 1, fout);
                
                fwrite(&md->specular.x, sizeof(float), 1, fout);
                fwrite(&md->specular.y, sizeof(float), 1, fout);
                fwrite(&md->specular.z, sizeof(float), 1, fout);
     
            }
        }

    }
    for(i = 0 ; i < geomDataNum ; i++)
    {
        LOGI("... write goem data\n");
        fwrite(&GEOMOBJECT_ID, sizeof(short), 1, fout);
        SE_GeometryData* gd = &geomDataArray[i];
        fwrite(&gd->type, sizeof(int), 1, fout);
        fwrite(&gd->vertexNum, sizeof(int), 1, fout);
        fwrite(&gd->faceNum, sizeof(int), 1, fout);
        fwrite(&gd->texVertexNum, sizeof(int), 1, fout);
        fwrite(&gd->colorNum, sizeof(int), 1, fout);
        int j;
        for(j = 0 ; j < gd->vertexNum ; j++)
        {
            fwrite(&gd->vertexArray[j].x, sizeof(float), 1, fout);
            fwrite(&gd->vertexArray[j].y, sizeof(float), 1, fout);
            fwrite(&gd->vertexArray[j].z, sizeof(float), 1, fout);
        }
        for(j = 0 ; j < gd->faceNum ; j++)
        {
            fwrite(&gd->faceArray[j].v[0], sizeof(int), 1, fout);
            fwrite(&gd->faceArray[j].v[1], sizeof(int), 1, fout);
            fwrite(&gd->faceArray[j].v[2], sizeof(int), 1, fout);

        }
        if(gd->texVertexNum > 0)
        {
            for(j = 0 ; j < gd->texVertexNum ; j++)
            {
                fwrite(&gd->texVertexArray[j].x, sizeof(float), 1, fout);
                fwrite(&gd->texVertexArray[j].y, sizeof(float), 1, fout);
                fwrite(&gd->texVertexArray[j].z, sizeof(float), 1, fout);
            }
            for(j = 0 ; j < gd->faceNum ; j++)
            {
                fwrite(&gd->texFaceArray[j].v[0], sizeof(int), 1, fout);
                fwrite(&gd->texFaceArray[j].v[1], sizeof(int), 1, fout);
                fwrite(&gd->texFaceArray[j].v[2], sizeof(int), 1, fout);
            }
        }
        if(gd->colorNum > 0)
        {
            for(j = 0 ; j < gd->colorNum ; j++)
            {
                fwrite(&gd->colorArray[j].x, sizeof(float), 1, fout);
                fwrite(&gd->colorArray[j].y, sizeof(float), 1, fout);
                fwrite(&gd->colorArray[j].z, sizeof(float), 1, fout);
            }
        }
    }
    i = 0;
    std::list<SE_Mesh*>::iterator itMesh;
    for(itMesh = seMeshs.begin() ; itMesh != seMeshs.end() ; itMesh++)
    {
        SE_Mesh* smesh = *itMesh;
        LOGI("... write mesh id\n");
        fwrite(&MESH_ID, sizeof(short), 1, fout);
        fwrite(&smesh->geomDataIndex, sizeof(int), 1, fout);
        fwrite(&smesh->materialIndex, sizeof(int), 1, fout);
        fwrite(&smesh->wireframeColor.x, sizeof(float), 1, fout);
        fwrite(&smesh->wireframeColor.y, sizeof(float), 1, fout);
        fwrite(&smesh->wireframeColor.z, sizeof(float), 1, fout);

        fwrite(&smesh->rotateAxis.x, sizeof(float), 1, fout);
        fwrite(&smesh->rotateAxis.y, sizeof(float), 1, fout);
        fwrite(&smesh->rotateAxis.z, sizeof(float), 1, fout);

        fwrite(&smesh->rotateAngle, sizeof(float), 1, fout);

        fwrite(&smesh->scaleAxis.x, sizeof(float), 1, fout);
        fwrite(&smesh->scaleAxis.y, sizeof(float), 1, fout);
        fwrite(&smesh->scaleAxis.z, sizeof(float), 1, fout);

        fwrite(&smesh->scale.x, sizeof(float), 1, fout);
        fwrite(&smesh->scale.y, sizeof(float), 1, fout);
        fwrite(&smesh->scale.z, sizeof(float), 1, fout);

        fwrite(&smesh->translate.x, sizeof(float), 1, fout);
        fwrite(&smesh->translate.y, sizeof(float), 1, fout);
        fwrite(&smesh->translate.z, sizeof(float), 1, fout);
        writeString(SE_String_GetData(&smesh->name), fout);
        fwrite(&smesh->subMeshNum, sizeof(int), 1, fout);
        if(smesh->subMeshNum > 0)
        {
            LOGI("...submesh num = %d\n", smesh->subMeshNum);
            int i;
            for(i = 0 ; i < smesh->subMeshNum ; i++)
            {
                SE_SubMesh* submesh = &smesh->subMeshArray[i];
                fwrite(&submesh->subMaterialIndex, sizeof(int), 1, fout);
                fwrite(&submesh->faceList.num, sizeof(int), 1, fout);
                int j;
                for(j = 0 ; j < submesh->faceList.num ; j++)
                {
                    fwrite(&submesh->faceList.faces[j], sizeof(int), 1, fout);
                }
            }
        }

    }
    for(i = 0 ; i < materialNum ; i++)
    {
	 if(materials[i].subMaterialNum > 0)
	 {
             for(int j = 0 ; j < materials[i].subMaterialNum ; j++)
	     {
		 SE_String_Release(&materials[i].subMaterialArray[j].texturename);
	     }
             SE_Free(materials[i].subMaterialArray);
	 }
	 SE_String_Release(&materials[i].materialData.texturename);
    } 
    SE_Free(materials);
    for(i = 0 ; i < geomDataNum ; i++)
    {
	SE_Free(geomDataArray[i].vertexArray);
	SE_Free(geomDataArray[i].texVertexArray);
	SE_Free(geomDataArray[i].faceArray);
	SE_Free(geomDataArray[i].texFaceArray);
	SE_Free(geomDataArray[i].colorArray);
    }
    SE_Free(geomDataArray);
    for(itMesh = seMeshs.begin() ; itMesh != seMeshs.end() ; itMesh++)
    {
	SE_Mesh* mesh = *itMesh;
	if(mesh->subMeshArray)
	{
	    for(int j = 0 ; j < mesh->subMeshNum; j++)
	    { 
	        SE_SubMesh* subMesh = &mesh->subMeshArray[j];
		SE_Free(subMesh->faceList.faces);
	    }
	    SE_Free(mesh->subMeshArray);
	}
	SE_String_Release(&mesh->name);
	SE_Free(*itMesh);
    }

    LOGI("write end\n");
    fclose(fout); 
}
コード例 #9
0
ファイル: text.cpp プロジェクト: whztt07/Magic3D-2
Magic3D::TextData* Magic3D::Text::getText()
{
    return static_cast<TextData*>(getMeshes()->at(0)->getData());
}