X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fsceneload.cc;h=5179e4ac616b646af291ae37fe551aadb5159a45;hp=b2b00ebedeaddb7a919b28fcfea51988580c381f;hb=ab9fd0ac34f8107ff8067607fad229d08b1c3935;hpb=b7c92831285013b2a0783bccaf3d900545ebb5ba diff --git a/src/sceneload.cc b/src/sceneload.cc index b2b00eb..5179e4a 100644 --- a/src/sceneload.cc +++ b/src/sceneload.cc @@ -15,8 +15,8 @@ #include "objmesh.h" static bool load_material(Material *mat, const aiMaterial *aimat); -static SceneNode *load_node(const aiScene *aiscn, const aiNode *ainode); -static Mesh *load_mesh(const aiScene *aiscn, const aiMesh *aimesh); +static SceneNode *load_node(const aiScene *aiscn, unsigned int flags, const aiNode *ainode); +static Mesh *load_mesh(const aiScene *aiscn, unsigned int flags, const aiMesh *aimesh); /*static Vec3 assimp_vector(const aiVector3D &v); static Quat assimp_quat(const aiQuaternion &q); @@ -28,14 +28,18 @@ static void print_hierarchy(const aiNode *node); static std::map node_by_name; static std::map mesh_by_aimesh; -bool Scene::load(const char *fname) +bool Scene::load(const char *fname, unsigned int flags) { unsigned int ppflags = aiProcess_CalcTangentSpace | aiProcess_GenNormals | aiProcess_JoinIdenticalVertices | aiProcess_Triangulate | aiProcess_SortByPType | - aiProcess_TransformUVCoords; + aiProcess_TransformUVCoords | aiProcess_PreTransformVertices; + + if(flags & SCNLOAD_FLIPTEX) { + ppflags |= aiProcess_FlipUVs; + } const aiScene *aiscn = aiImportFile(fname, ppflags); if(!aiscn) { @@ -61,7 +65,7 @@ bool Scene::load(const char *fname) switch(aimesh->mPrimitiveTypes) { case aiPrimitiveType_TRIANGLE: - if((mesh = load_mesh(aiscn, aimesh))) { + if((mesh = load_mesh(aiscn, flags, aimesh))) { mesh_by_aimesh[aimesh] = mesh; meshes.push_back(mesh); } @@ -77,7 +81,7 @@ bool Scene::load(const char *fname) // load all the nodes recursively for(unsigned int i=0; imRootNode->mNumChildren; i++) { - SceneNode *node = load_node(aiscn, aiscn->mRootNode->mChildren[i]); + SceneNode *node = load_node(aiscn, flags, aiscn->mRootNode->mChildren[i]); if(node) { root->add_child(node); } @@ -154,7 +158,7 @@ static bool load_material(Material *mat, const aiMaterial *aimat) return true; } -static SceneNode *load_node(const aiScene *aiscn, const aiNode *ainode) +static SceneNode *load_node(const aiScene *aiscn, unsigned int flags, const aiNode *ainode) { SceneNode *node = new SceneNode; node->set_name(ainode->mName.data); @@ -175,7 +179,7 @@ static SceneNode *load_node(const aiScene *aiscn, const aiNode *ainode) /* recurse to all children */ for(unsigned int i=0; imNumChildren; i++) { - SceneNode *child = load_node(aiscn, ainode->mChildren[i]); + SceneNode *child = load_node(aiscn, flags, ainode->mChildren[i]); if(child) { node->add_child(child); } @@ -185,7 +189,7 @@ static SceneNode *load_node(const aiScene *aiscn, const aiNode *ainode) return node; } -static Mesh *load_mesh(const aiScene *aiscn, const aiMesh *aimesh) +static Mesh *load_mesh(const aiScene *aiscn, unsigned int flags, const aiMesh *aimesh) { Mesh *mesh = new Mesh; @@ -204,11 +208,32 @@ static Mesh *load_mesh(const aiScene *aiscn, const aiMesh *aimesh) mesh->set_attrib_data(MESH_ATTR_TEXCOORD, 3, num_verts, (float*)aimesh->mTextureCoords[0]); } + if(flags & SCNLOAD_FLIPYZ) { + Vec3 *vptr = (Vec3*)mesh->get_attrib_data(MESH_ATTR_VERTEX); + for(int i=0; ixzy(); + ++vptr; + } + + Vec3 *nptr = (Vec3*)mesh->get_attrib_data(MESH_ATTR_NORMAL); + for(int i=0; ixzy(); + ++nptr; + } + + Vec3 *tptr = (Vec3*)mesh->get_attrib_data(MESH_ATTR_TANGENT); + for(int i=0; ixzy(); + ++tptr; + } + } + unsigned int *iptr = mesh->set_index_data(num_faces * 3); for(int i=0; imFaces[i].mIndices[j]; - } + iptr[0] = aimesh->mFaces[i].mIndices[0]; + iptr[1] = aimesh->mFaces[i].mIndices[flags & SCNLOAD_FLIPYZ ? 2 : 1]; + iptr[2] = aimesh->mFaces[i].mIndices[flags & SCNLOAD_FLIPYZ ? 1 : 2]; + iptr += 3; } return mesh;