X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsceneload.cc;h=d173538407188325231d11f922ae0141801346b4;hb=572bf1ef8d54ef5a7cba7cdf38515cb16c4c312c;hp=865a4c8e4a628f216f3ac65bb9fc53568dac8929;hpb=8137121400748ee8afb1608253aae15323c5e3a2;p=laserbrain_demo diff --git a/src/sceneload.cc b/src/sceneload.cc index 865a4c8..d173538 100644 --- a/src/sceneload.cc +++ b/src/sceneload.cc @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -18,13 +19,16 @@ static bool load_material(Scene *scn, Material *mat, const aiMaterial *aimat); static SceneNode *load_node(Scene *scn, const aiScene *aiscn, unsigned int flags, const aiNode *ainode); static Mesh *load_mesh(Scene *scn, const aiScene *aiscn, unsigned int flags, const aiMesh *aimesh); +static void print_nodes(SceneNode *node, int lvl = 0); /*static const char *mprop_semantic(int x); static int count_textures(const aiMaterial *aimat);*/ static int assimp_textype(aiTextureType type); +static const char *assimp_textypestr(aiTextureType type); + +static Mat4 assimp_matrix(const aiMatrix4x4 &aim); /*static Vec3 assimp_vector(const aiVector3D &v); static Quat assimp_quat(const aiQuaternion &q); -static Mat4 assimp_matrix(const aiMatrix4x4 &aim); static long assimp_time(const aiAnimation *anim, double aitime); static void print_hierarchy(const aiNode *node); */ @@ -39,28 +43,37 @@ bool Scene::load(const char *fname, unsigned int flags) aiProcess_JoinIdenticalVertices | aiProcess_Triangulate | aiProcess_SortByPType | - aiProcess_TransformUVCoords | aiProcess_PreTransformVertices; + aiProcess_GenUVCoords | + //aiProcess_PreTransformVertices | + aiProcess_TransformUVCoords; if(flags & SCNLOAD_FLIPTEX) { ppflags |= aiProcess_FlipUVs; } + printf("Loading scene file: %s\n", fname); + const aiScene *aiscn = aiImportFile(fname, ppflags); if(!aiscn) { fprintf(stderr, "failed to load scene file: %s\n", fname); return false; } - /* + // assimp adds its own root node, which might have transformations Vec3 root_pos, root_scaling(1.0, 1.0, 1.0); Quat root_rot; if(aiscn->mRootNode) { Mat4 root_matrix = assimp_matrix(aiscn->mRootNode->mTransformation); root_pos = root_matrix.get_translation(); - root_rot = root_matrix.get_rotation_quat(); + root_rot = root_matrix.get_rotation(); root_scaling = root_matrix.get_scaling(); - }*/ + + printf("assimp root node: %s\n", aiscn->mRootNode->mName.data); + printf(" pos: %f %f %f\n", root_pos.x, root_pos.y, root_pos.z); + printf(" rot: %f %+f %+f %+f\n", root_rot.w, root_rot.x, root_rot.y, root_rot.z); + printf(" scaling: %f %f %f\n", root_scaling.x, root_scaling.y, root_scaling.z); + } // load all meshes for(unsigned int i=0; imNumMeshes; i++) { @@ -81,32 +94,29 @@ bool Scene::load(const char *fname, unsigned int flags) } } - SceneNode *root = new SceneNode; + if(!nodes) { + nodes = new SceneNode; + nodes->set_name("root"); + nodes->set_position(root_pos); + nodes->set_rotation(root_rot); + nodes->set_scaling(root_scaling); + } // load all the nodes recursively for(unsigned int i=0; imRootNode->mNumChildren; i++) { SceneNode *node = load_node(this, aiscn, flags, aiscn->mRootNode->mChildren[i]); if(node) { - root->add_child(node); + nodes->add_child(node); } } - int nnodes = root->get_num_children(); - if(nnodes <= 0) { - delete root; - } else if(nnodes == 1) { - nodes = root->get_child(0); - root->remove_child(nodes); - delete root; - } else { - nodes = root; - } - node_by_name.clear(); mesh_by_aimesh.clear(); aiReleaseImport(aiscn); printf("loaded scene file: %s, %d meshes\n", fname, (int)meshes.size()); + nodes->update(0); + print_nodes(nodes); return true; } @@ -166,44 +176,21 @@ static bool load_material(Scene *scn, Material *mat, const aiMaterial *aimat) } while(*sptr++); } - Texture *tex = scn->texset->get(fname); - if(!tex) { - fprintf(stderr, "failed to load texture: %s\n", fname); - delete [] fname; - continue; - } - delete [] fname; + int textype = assimp_textype(aitype); + printf("loading %s texture: %s\n", assimp_textypestr(aitype), fname); + Texture *tex = scn->texset->get_texture(fname, TEX_2D); + assert(tex); mat->textures.push_back(tex); - int textype = assimp_textype(aitype); + printf(" DBG(%p)\n", (void*)tex); + if(textype != MTL_TEX_UNKNOWN && !mat->stdtex[textype]) { mat->stdtex[textype] = tex; } } } - /* - for(size_t i=0; itex[textypes[i].type] = texset.get(fname); - } - } - } - */ - return true; } @@ -212,8 +199,20 @@ static SceneNode *load_node(Scene *scn, const aiScene *aiscn, unsigned int flags SceneNode *node = new SceneNode; node->set_name(ainode->mName.data); + // transformation + Mat4 matrix = assimp_matrix(ainode->mTransformation); + Vec3 pos = matrix.get_translation(); + Quat rot = matrix.get_rotation(); + Vec3 scale = matrix.get_scaling(); + + node->set_position(pos); + node->set_rotation(rot); + node->set_scaling(scale); + node->dbg_xform = matrix; + + // meshes for(unsigned int i=0; imNumMeshes; i++) { - aiMesh *aimesh = aiscn->mMeshes[ainode->mMeshes[0]]; + aiMesh *aimesh = aiscn->mMeshes[ainode->mMeshes[i]]; Mesh *mesh = mesh_by_aimesh[aimesh]; if(mesh) { @@ -289,9 +288,38 @@ static Mesh *load_mesh(Scene *scn, const aiScene *aiscn, unsigned int flags, con iptr += 3; } + AABox bbox = mesh->get_aabbox(); + printf("mesh bounding box: %f %f %f -> %f %f %f\n", bbox.min.x, bbox.min.y, bbox.min.z, + bbox.max.x, bbox.max.y, bbox.max.z); + return mesh; } +static void print_nodes(SceneNode *node, int lvl) +{ + Vec3 pos = node->get_node_position(); + Quat rot = node->get_node_rotation(); + Vec3 scale = node->get_node_scaling(); + + const char *type = node->get_num_objects() > 0 ? "mesh node" : "null node"; + + for(int i=0; iget_name(), + pos.x, pos.y, pos.z, rot.w, rot.x, rot.y, rot.z, scale.x, scale.y, scale.z); + + if(node->get_num_objects()) { + Mat4 xform = node->get_matrix(); + xform.print(stdout); + } + + int nchld = node->get_num_children(); + for(int i=0; iget_child(i), lvl + 1); + } +} + static int assimp_textype(aiTextureType type) { switch(type) { @@ -302,6 +330,7 @@ static int assimp_textype(aiTextureType type) case aiTextureType_NORMALS: return MTL_TEX_NORMALMAP; case aiTextureType_LIGHTMAP: + case aiTextureType_EMISSIVE: return MTL_TEX_LIGHTMAP; case aiTextureType_REFLECTION: return MTL_TEX_ENVMAP; @@ -310,3 +339,30 @@ static int assimp_textype(aiTextureType type) } return MTL_TEX_UNKNOWN; } + +static const char *assimp_textypestr(aiTextureType type) +{ + switch(type) { + case aiTextureType_DIFFUSE: + return "diffuse"; + case aiTextureType_SPECULAR: + return "specular"; + case aiTextureType_NORMALS: + return "normalmap"; + case aiTextureType_LIGHTMAP: + case aiTextureType_EMISSIVE: + return "lightmap"; + case aiTextureType_REFLECTION: + return "envmap"; + default: + break; + } + return "unknown"; +} + +static Mat4 assimp_matrix(const aiMatrix4x4 &aim) +{ + Mat4 m; + memcpy(m[0], &aim, 16 * sizeof(float)); + return transpose(m); +}