# HG changeset patch # User John Tsiombikas # Date 1390442235 -7200 # Node ID 76d0f55f9d5f5b41ab84d3e3f0ee50ea5889e445 # Parent ca549434dc956ee6eada6d7c7205e7196991aaf0 mesh and animation saving looks done... diff -r ca549434dc95 -r 76d0f55f9d5f converters/ass2goat/src/main.c --- a/converters/ass2goat/src/main.c Thu Jan 23 02:50:54 2014 +0200 +++ b/converters/ass2goat/src/main.c Thu Jan 23 03:57:15 2014 +0200 @@ -13,6 +13,7 @@ int convert(const char *infname); int convert_anim(const char *infname); void process_material(struct goat3d_material *mtl, struct aiMaterial *aimtl); +void process_mesh(struct goat3d *goat, struct goat3d_mesh *mesh, struct aiMesh *aimesh); void process_node(struct goat3d *goat, struct goat3d_node *parent, struct aiNode *ainode); int process_anim(struct goat3d *goat, struct aiAnimation *aianim); static int output_filename(char *buf, int bufsz, const char *fname, const char *suffix); @@ -101,6 +102,14 @@ goat3d_add_mtl(goat, mat); } + for(i=0; i<(int)aiscn->mNumMeshes; i++) { + struct aiMesh *aimesh = aiscn->mMeshes[i]; + struct goat3d_mesh *mesh = goat3d_create_mesh(); + + process_mesh(goat, mesh, aimesh); + goat3d_add_mesh(goat, mesh); + } + for(i=0; i<(int)aiscn->mRootNode->mNumChildren; i++) { process_node(goat, 0, aiscn->mRootNode->mChildren[i]); } @@ -195,11 +204,60 @@ goat3d_set_mtl_attrib_map(mtl, GOAT3D_MAT_ATTR_REFLECTION, aistr.data); } if(aiGetMaterialString(aimtl, AI_MATKEY_TEXTURE_OPACITY(0), &aistr) == aiReturn_SUCCESS) { - // TODO this is semantically inverted... maybe add an alpha attribute? + /* TODO this is semantically inverted... maybe add an alpha attribute? */ goat3d_set_mtl_attrib_map(mtl, GOAT3D_MAT_ATTR_TRANSMISSION, aistr.data); } } +void process_mesh(struct goat3d *goat, struct goat3d_mesh *mesh, struct aiMesh *aimesh) +{ + int i, num_verts, num_faces; + struct goat3d_material *mtl; + + if(aimesh->mName.length > 0) { + goat3d_set_mesh_name(mesh, aimesh->mName.data); + } + + if((mtl = goat3d_get_mtl(goat, aimesh->mMaterialIndex))) { + goat3d_set_mesh_mtl(mesh, mtl); + } + + num_verts = aimesh->mNumVertices; + num_faces = aimesh->mNumFaces; + + for(i=0; imVertices + i; + goat3d_add_mesh_attrib3f(mesh, GOAT3D_MESH_ATTR_VERTEX, v->x, v->y, v->z); + + if(aimesh->mNormals) { + v = aimesh->mNormals + i; + goat3d_add_mesh_attrib3f(mesh, GOAT3D_MESH_ATTR_NORMAL, v->x, v->y, v->z); + } + if(aimesh->mTangents) { + v = aimesh->mTangents + i; + goat3d_add_mesh_attrib3f(mesh, GOAT3D_MESH_ATTR_TANGENT, v->x, v->y, v->z); + } + if(aimesh->mTextureCoords[0]) { + v = aimesh->mTextureCoords[0] + i; + goat3d_add_mesh_attrib2f(mesh, GOAT3D_MESH_ATTR_TEXCOORD, v->x, v->y); + } + if(aimesh->mColors[0]) { + col = aimesh->mColors[0] + i; + goat3d_add_mesh_attrib4f(mesh, GOAT3D_MESH_ATTR_COLOR, col->r, col->g, col->b, col->a); + } + /* TODO: add bones */ + } + + for(i=0; imFaces + i; + + goat3d_add_mesh_face(mesh, face->mIndices[0], face->mIndices[1], face->mIndices[2]); + } +} + void process_node(struct goat3d *goat, struct goat3d_node *parent, struct aiNode *ainode) { int i; diff -r ca549434dc95 -r 76d0f55f9d5f src/goat3d.cc --- a/src/goat3d.cc Thu Jan 23 02:50:54 2014 +0200 +++ b/src/goat3d.cc Thu Jan 23 03:57:15 2014 +0200 @@ -247,6 +247,21 @@ g->scn->add_material(mtl); } +GOAT3DAPI int goat3d_get_mtl_count(struct goat3d *g) +{ + return g->scn->get_material_count(); +} + +GOAT3DAPI struct goat3d_material *goat3d_get_mtl(struct goat3d *g, int idx) +{ + return (goat3d_material*)g->scn->get_material(idx); +} + +GOAT3DAPI struct goat3d_material *goat3d_get_mtl_by_name(struct goat3d *g, const char *name) +{ + return (goat3d_material*)g->scn->get_material(name); +} + GOAT3DAPI struct goat3d_material *goat3d_create_mtl(void) { return new goat3d_material; @@ -405,6 +420,12 @@ goat3d_add_mesh_attrib4f(mesh, attrib, val, 0, 0, 1); } +GOAT3DAPI void goat3d_add_mesh_attrib2f(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, + float x, float y) +{ + goat3d_add_mesh_attrib4f(mesh, attrib, x, y, 0, 1); +} + GOAT3DAPI void goat3d_add_mesh_attrib3f(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, float x, float y, float z) { diff -r ca549434dc95 -r 76d0f55f9d5f src/goat3d.h --- a/src/goat3d.h Thu Jan 23 02:50:54 2014 +0200 +++ b/src/goat3d.h Thu Jan 23 03:57:15 2014 +0200 @@ -108,6 +108,9 @@ /* materials */ GOAT3DAPI void goat3d_add_mtl(struct goat3d *g, struct goat3d_material *mtl); +GOAT3DAPI int goat3d_get_mtl_count(struct goat3d *g); +GOAT3DAPI struct goat3d_material *goat3d_get_mtl(struct goat3d *g, int idx); +GOAT3DAPI struct goat3d_material *goat3d_get_mtl_by_name(struct goat3d *g, const char *name); GOAT3DAPI struct goat3d_material *goat3d_create_mtl(void); GOAT3DAPI void goat3d_destroy_mtl(struct goat3d_material *mtl); @@ -156,6 +159,8 @@ GOAT3DAPI void goat3d_set_mesh_attribs(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, const void *data, int vnum); GOAT3DAPI void goat3d_add_mesh_attrib1f(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, float val); +GOAT3DAPI void goat3d_add_mesh_attrib2f(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, + float x, float y); GOAT3DAPI void goat3d_add_mesh_attrib3f(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, float x, float y, float z); GOAT3DAPI void goat3d_add_mesh_attrib4f(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib,