#include"model.h" #include"mesh.h" #include"material.h" #include"vector.h" #include"util.h" #include"bone.h" #include"root.h" #include"skeleton.h" #include"animation.h" #include #include #include #include #include using namespace std; using namespace Assimp; namespace vb01{ void Model::processNode(aiNode *node, const aiScene *scene, Node *currentNode){ for(int i=0;imNumMeshes;i++){ aiMesh *mesh=scene->mMeshes[node->mMeshes[i]]; processMesh(mesh,scene,currentNode); } for(int i=0;imNumChildren;i++){ Node *childNode=new Node(); currentNode->attachChild(childNode); processNode(node->mChildren[i],scene,childNode); } } void Model::processMesh(aiMesh *mesh, const aiScene *scene, Node *currentNode){ const int numTris=mesh->mNumFaces; Mesh::Vertex *vertices=new Mesh::Vertex[3*numTris]; u32 *indices=new u32[3*numTris]; for(int i=0;i<3*numTris;i++){ Mesh::Vertex v; v.pos.x=mesh->mVertices[i].x; v.pos.y=mesh->mVertices[i].y; v.pos.z=mesh->mVertices[i].z; v.norm.x=mesh->mNormals[i].x; v.norm.y=mesh->mNormals[i].y; v.norm.z=mesh->mNormals[i].z; v.tan.x=mesh->mTangents[i].x; v.tan.y=mesh->mTangents[i].y; v.tan.z=mesh->mTangents[i].z; v.biTan.x=mesh->mBitangents[i].x; v.biTan.y=mesh->mBitangents[i].y; v.biTan.z=mesh->mBitangents[i].z; if(mesh->mTextureCoords[0]){ v.uv.x=mesh->mTextureCoords[0][i].x; v.uv.y=mesh->mTextureCoords[0][i].y; } else v.uv=Vector2::VEC_ZERO; vertices[i]=v; } for(int i=0;imFaces[i].mNumIndices; for(int j=0;jmFaces[i].mIndices[j]; } } //if(mesh->mMaterialIndex>=0){ // aiMaterial *material=scene->mMaterial[mesh->mMaterialIndex]; //} currentNode->attachMesh(new Mesh(vertices,indices,numTris)); } Model::Model(string path,bool b) : Node(){ Node *rootNode=Root::getSingleton()->getRootNode(); if(b){ Importer importer; const aiScene *scene=importer.ReadFile(path,aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_GenNormals | aiProcess_CalcTangentSpace); if(!scene||scene->mFlags&AI_SCENE_FLAGS_INCOMPLETE||!scene->mRootNode){ cout<<"Failed to load model:"<mRootNode,scene,this); } else{ enum Stage{ARMATURE,MESH}; Stage stage; ifstream in(path); string l,name=""; Vector3 localPos=Vector3::VEC_ZERO,localScale=Vector3::VEC_IJK; Quaternion localRot=Quaternion::QUAT_W; vector childrenChain; vector skeletons; vector meshes; vector lights; vector nodes; Skeleton *skeleton=nullptr; string animName=""; Bone *animBone=nullptr; const int numVertsPerFace=3; int numFaces=0,vertId=0,faceId=0,groupId=0,groupVertId=0,numGroups=0,numShapeKeys=0,numBones=0; Mesh::Vertex *vertices; u32 *indices; vector vertPos,vertNorm; vector vertWeights; string *groups=nullptr,*shapeKeys=nullptr; while(getline(in,l)){ int colonId=-1; for(int i=0;iattachMesh(mesh); nodes.push_back(meshNode); for(string line : childrenChain){ int spaceId=-1; for(int i=0;igetName()==childName){ for(Skeleton *sk : skeletons){ if(sk->getName()==parentName) mesh->setSkeleton(sk); } } } } for(Light *light : lights){ Node *lightNode=new Node(localPos,localRot,localScale); lightNode->addLight(light); nodes.push_back(lightNode); } for(string line : childrenChain){ int spaceId=-1; for(int i=0;igetMesh(0); Skeleton *sk0=m0->getSkeleton(); if(m0->getName()==childName||(sk0&&sk0->getName()==childName)){ childNode=nodes[i]; for(int j=0;jgetMesh(0); Skeleton *sk1=m1->getSkeleton(); if(m1->getName()==parentName||(sk1&&sk1->getName()==parentName)) parentNode=nodes[j]; } } } if(childNode!=parentNode) parentNode->attachChild(childNode); } } } Model::~Model(){ delete children[0]->getMesh(0)->getMaterial(); vector descendants; getDescendants(this,descendants); for(Node *node : descendants) for(Mesh *mesh : node->getMeshes()) mesh->setMaterial(nullptr); while(!children.empty()){ Node *c=children[children.size()-1]; dettachChild(c); delete c; } } void Model::update(){ Node::update(); } void Model::setMaterial(Material *mat){ vector descendants; getDescendants(this,descendants); for(Node *node : descendants) for(Mesh *mesh : node->getMeshes()) mesh->setMaterial(mat); } void Model::setCastShadow(bool castShadow){ vector descendants; getDescendants(this,descendants); for(Node *node : descendants) for(Mesh *mesh : node->getMeshes()) mesh->setCastShadow(castShadow); this->castShadow=castShadow; } void Model::setReflect(bool reflect){ vector descendants; getDescendants(this,descendants); for(Node *node : descendants) for(Mesh *mesh : node->getMeshes()) mesh->setReflect(reflect); this->reflect=reflect; } void Model::setWireframe(bool wirefame){ vector descendants; getDescendants(this,descendants); for(Node *node : descendants) for(Mesh *mesh : node->getMeshes()) mesh->setWireframe(wirefame); this->wireframe=wireframe; } }