foo
[laserbrain_demo] / src / sceneload.cc
index b2b00eb..5179e4a 100644 (file)
@@ -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<std::string, SceneNode*> node_by_name;
 static std::map<aiMesh*, Mesh*> 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; i<aiscn->mRootNode->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; i<ainode->mNumChildren; 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; i<num_verts; i++) {
+                       *vptr = vptr->xzy();
+                       ++vptr;
+               }
+
+               Vec3 *nptr = (Vec3*)mesh->get_attrib_data(MESH_ATTR_NORMAL);
+               for(int i=0; i<num_verts; i++) {
+                       *nptr = nptr->xzy();
+                       ++nptr;
+               }
+
+               Vec3 *tptr = (Vec3*)mesh->get_attrib_data(MESH_ATTR_TANGENT);
+               for(int i=0; i<num_verts; i++) {
+                       *tptr = tptr->xzy();
+                       ++tptr;
+               }
+       }
+
        unsigned int *iptr = mesh->set_index_data(num_faces * 3);
        for(int i=0; i<num_faces; i++) {
-               for(int j=0; j<3; j++) {
-                       *iptr++ = aimesh->mFaces[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;