#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);
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) {
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);
}
// 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);
}
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);
/* 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);
}
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;
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;