#include #include #include #include #include #include #include extern "C" { #include #include #include } #include #include #include "../gameparts.hpp" #include "cbphysbox.hpp" #include "cbphysmodel.hpp" #include #include #include #include #include using namespace irr; using namespace scene; using namespace core; using namespace video; extern IrrlichtDevice* device; extern btDiscreteDynamicsWorld* World; extern std::list Objects; //newbphysmodel("graphicfile","physicfile",mass,[,{position}][,{lookat}]) static int newbphysmodel(lua_State* L){ printf("Creating cbphysmodel\n"); int nargs = lua_gettop(L); double lx,ly,lz; double x,y,z; if(nargs > 4){ //"graphicsfile","physicsfile",{position},{lookat} popvector3d(L,&lx,&ly,&lz); }else{ lx = 1; ly = 1; lz = 1; } if(nargs > 3){ //"graphicsfile","physicsfile",{position} popvector3d(L,&x,&y,&z); }else{ x = 0; y = 0; z = 0; } //"graphicsfile","physicsfile",mass double mass = lua_tonumber(L,-1); const char *ppath = lua_tostring(L,-2); const char *gpath = lua_tostring(L,-3); lua_pop(L,3);// ISceneManager *smgr = device->getSceneManager(); printf("bphysnode, creating the scene node\n"); //Create the scene node //IMeshBuffer *buf = new CDynamicMeshBuffer(E_VERTEX_TYPE::EVT_STANDARD,E_INDEX_TYPE::EIT_16BIT); IMeshBuffer *buf = new SMeshBuffer(); tinyobj_attrib_t attrib; printf("At the very beginning, attrib is %p\n",(void*)&attrib); tinyobj_shape_t *shapes = NULL; size_t meshcount; tinyobj_material_t *materials = NULL; size_t num_materials; //Read data from the graphics file size_t data_len = 0; FILE *objfile = fopen(gpath,"rb"); fseek(objfile,0,SEEK_END); data_len = ftell(objfile); printf("model data is %d long\n",(int)data_len); fseek(objfile,0,SEEK_SET); char *objdata = (char*)malloc(sizeof(char)*data_len); fread(objdata, sizeof(char), data_len, objfile); fclose(objfile); //Parse the data into a tinyobj printf("About to tinyobj_parse_obj\n"); int err = tinyobj_parse_obj(&attrib, &shapes, &meshcount, &materials, &num_materials, objdata, data_len, TINYOBJ_FLAG_TRIANGULATE); free(objdata); //int err = tinyobj_parse_obj(&attrib, &shapes, &meshcount, &materials, &num_materials, objdata, data_len, 0); if(err != TINYOBJ_SUCCESS){ printf("Tinyobj failed to load model:%s\n",ppath); } printf("num_shapes: %d\n",(int)meshcount); for(size_t i = 0; i < meshcount; i++){ tinyobj_shape_t shape = shapes[i]; printf("Shape %d:\n\tname: %s\n\tface_offset: %d\n\tlength: %d\n",(int)i, shape.name, shape.face_offset, shape.length); } //u32 meshcount = pmesh->getMeshBufferCount(); //size_t numverts = attrib.num_vertices; //size_t stride = 9; //9 = 3 position floats + 3 normal floats + 3 color floats //size_t face_offset = 0; printf("Obj attrib:\n\tnum_vertices:%d\n\tnum_normals:%d\n\tnum_texcoords:%d\n\tnum_faces:%d\n\tnum_face_num_verts:%d\n", attrib.num_vertices, attrib.num_normals, attrib.num_texcoords, attrib.num_faces, attrib.num_face_num_verts); //S3DVertex verts[attrib.num_faces]; //for(size_t i = 0; i < attrib.num_face_num_verts; i++){ //printf("verts %d starts at %p\n",(int)i,(void*)&(verts[i])); //} //u16 indicies[attrib.num_faces]; size_t index_c = 0; printf("Faces for %d verts:\n",attrib.num_face_num_verts); //int num_faces = attrib.num_faces; //for(int i = 0; i < num_faces; i+=3){ ////printf("\t%u verts in face %u\n",attrib.face_num_verts[i],i); //tinyobj_vertex_index_t fac1 = attrib.faces[i + 0]; //tinyobj_vertex_index_t fac2 = attrib.faces[i + 1]; //tinyobj_vertex_index_t fac3 = attrib.faces[i + 2]; ////printf("Verts:\n\tPosition, normal, texture\n\t(%8d %7d %7d)\n\t(%8d %7d %7d)\n\t(%8d %7d %7d)\n",fac1.v_idx,fac1.vn_idx,fac1.vt_idx,fac2.v_idx,fac2.vn_idx,fac2.vt_idx,fac3.v_idx,fac3.vn_idx,fac3.vt_idx); //float f1px, f1py, f1pz; //f1px = attrib.vertices[(3 * fac1.v_idx) + 0]; //f1py = attrib.vertices[(3 * fac1.v_idx) + 1]; //f1pz = attrib.vertices[(3 * fac1.v_idx) + 2]; //float f1nx, f1ny, f1nz; //f1nx = attrib.normals[(3 * fac1.vn_idx) + 0]; //f1ny = attrib.normals[(3 * fac1.vn_idx) + 1]; //f1nz = attrib.normals[(3 * fac1.vn_idx) + 2]; //float f2px, f2py, f2pz; //f2px = attrib.vertices[(3 * fac2.v_idx) + 0]; //f2py = attrib.vertices[(3 * fac2.v_idx) + 1]; //f2pz = attrib.vertices[(3 * fac2.v_idx) + 2]; //float f2nx, f2ny, f2nz; //f2nx = attrib.normals[(3 * fac2.vn_idx) + 0]; //f2ny = attrib.normals[(3 * fac2.vn_idx) + 1]; //f2nz = attrib.normals[(3 * fac2.vn_idx) + 2]; //float f3px, f3py, f3pz; //f3px = attrib.vertices[(3 * fac3.v_idx) + 0]; //f3py = attrib.vertices[(3 * fac3.v_idx) + 1]; //f3pz = attrib.vertices[(3 * fac3.v_idx) + 2]; //float f3nx, f3ny, f3nz; //f3nx = attrib.normals[(3 * fac3.vn_idx) + 0]; //f3ny = attrib.normals[(3 * fac3.vn_idx) + 1]; //f3nz = attrib.normals[(3 * fac3.vn_idx) + 2]; /*printf("Triangle %d:\n\t\ //Positions:\n\t\t\ //(%f %f %f)\n\t\t\ //(%f %f %f)\n\t\t\ //(%f %f %f)\n\t\ //Normals:\n\t\t\ //(%f %f %f)\n\t\t\ //(%f %f %f)\n\t\t\ //(%f %f %f)\n",((int)i)/3,f1px,f1py,f1pz,f2px,f2py,f2pz,f3px,f3py,f3pz,f1nx,f1ny,f1nz,f2nx,f2ny,f2nz,f3nx,f3ny,f3nz); */ ////float //verts[i + 0] = S3DVertex(f1px,f1py,f1pz,f1nx,f1ny,f1nz,SColor(255,255,255,255),0,0); //verts[i + 1] = S3DVertex(f2px,f2py,f2pz,f2nx,f2ny,f2nz,SColor(255,255,255,255),0,0); //verts[i + 2] = S3DVertex(f3px,f3py,f3pz,f3nx,f3ny,f3nz,SColor(255,255,255,255),0,0); //indicies[index_c] = i; //index_c++; //indicies[index_c] = i + 1; //index_c++; //indicies[index_c] = i + 2; //index_c++; //} S3DVertex verts[attrib.num_vertices]; u16 indicies[attrib.num_faces]; for(size_t i = 0; i < attrib.num_vertices; i++){ float x,y,z; x = attrib.vertices[i * 3]; y = attrib.vertices[(i * 3) + 1]; z = attrib.vertices[(i * 3) + 2]; verts[i] = S3DVertex(x,y,z,0,0,0,SColor(255,255,255,255),0,0); } for(size_t i = 0; i < attrib.num_faces; i ++){ indicies[i] = attrib.faces[i].v_idx; } printf("indicies:\n"); for(size_t i = 0; i < index_c; i++){ printf("%d ",indicies[i]); } printf("\n"); //for(size_t i = 0; i < attrib.num_faces; i++){ //tinyobj_vertex_index_t tface = attrib.faces[i]; //printf("Looking at face %d: %d %d %d\n", (int)i, (int)tface.v_idx, (int)tface.vt_idx, (int)tface.vn_idx); //indicies[index_c] = (u16)tface.v_idx; //index_c++; //} buf->append(verts, attrib.num_vertices, indicies, (u32)attrib.num_faces); //buf->recalculateBoundingBox(); SMesh *gmesh = new SMesh(); gmesh->addMeshBuffer(buf); //gmesh->recalculateBoundingBox(); //gmesh->setDirty(); //IMesh *gmesh = smgr->getMesh(gpath); printf("Creating client physbox at %f %f %f\n",x,y,z); ISceneNode *node = smgr->addMeshSceneNode(gmesh,0,-1,vector3df(x,y,z)); printf("bphysnode, createing the physics body\n"); //Create the physics body lua_pushstring(L,ppath);//"physpath" lua_pushnumber(L,mass);//"physpath",mass pushvector3d(L,x,y,z);//"physpath",mass,{x,y,z} pushvector3d(L,lx,ly,lz);//"physpath,mass,{x,y,z},{lx,ly,lz} printf("About to makebphysmodel\n"); makebphysmodel(L);//ud_rigidbody printf("done makebphysmodel\n"); btRigidBody *rb = (btRigidBody*)lua_touserdata(L,-1); rb->setUserPointer(node); lua_pop(L,1); //Create the lua representation lua_newtable(L);//{} lua_pushlightuserdata(L,rb); lua_setfield(L,-2,"collider");//{rb=ud_rb} lua_pushstring(L,"rigidbody"); lua_setfield(L,-2,"type");//{rb=ud_rb, type="rigidbody"} lua_pushlightuserdata(L,node); lua_setfield(L,-2,"node");//{rb=ud_rb, node=ud_node, type="rigidbody"} luaL_getmetatable(L,"phys.physmodel"); lua_setmetatable(L,-2);//{physnode} lua_getglobal(L,"phys");//{rb},{phys} lua_getfield(L,-1,"colliders");//{rb},{phys},{phys.colliders} lua_pushlightuserdata(L,rb);//{rb},{phys},{colliders},ud_rb lua_pushvalue(L,-4);//{rb},{phys},{colliders},ud_rb,{rb} lua_settable(L,-3);//{rb},{phys},{phys.colliders} lua_pop(L,2);//{rb} printf("finished creating the lua representation\n"); return 1; } static const luaL_reg bphysmodel_f[] = { {"newphysmodel", newbphysmodel}, {0,0}, }; static const luaL_reg bphysmodel_m[] = { {0, 0}, }; int cbphysmodel_register(lua_State* L){ //printf("bphysmodel registered\n"); luaL_newmetatable(L, "phys.physmodel");//{} lua_newtable(L);//{physmodel_m},{} luaL_register(L,NULL,igeneric_m); //Inherit all the things to do with scene nodes luaL_register(L,NULL,bcollider_m); luaL_register(L,NULL,bphysmodel_m); lua_setfield(L,-2,"__index"); lua_getglobal(L,"phys"); luaL_register(L,NULL,bphysmodel_f); return 1; }