aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/phys/cbphysmodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/lua_api/phys/cbphysmodel.cpp')
-rw-r--r--src/client/lua_api/phys/cbphysmodel.cpp226
1 files changed, 180 insertions, 46 deletions
diff --git a/src/client/lua_api/phys/cbphysmodel.cpp b/src/client/lua_api/phys/cbphysmodel.cpp
index 51ff2d8..4f4c106 100644
--- a/src/client/lua_api/phys/cbphysmodel.cpp
+++ b/src/client/lua_api/phys/cbphysmodel.cpp
@@ -17,7 +17,10 @@ extern "C" {
#include "cbphysbox.hpp"
#include "cbphysmodel.hpp"
#include <client/lua_api/scene/igeneric.hpp>
+#include <shared/lua_api/phys/bphysmodel.hpp>
+#include <shared/lua_api/phys/bcollider.hpp>
#include <shared/lua_api/common.hpp>
+#include <shared/util/tinyobj.hpp>
using namespace irr;
@@ -32,81 +35,209 @@ extern std::list<btRigidBody*> Objects;
//newbphysmodel("graphicfile","physicfile",mass,[,{position}][,{lookat}])
static int newbphysmodel(lua_State* L){
- printf("Creating bphysmodel\n");
+ 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"
+ //"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);
+ lua_pop(L,3);//
ISceneManager *smgr = device->getSceneManager();
printf("bphysnode, creating the scene node\n");
//Create the scene node
- IMesh *gmesh = smgr->getMesh(gpath);
+ //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
- IMesh *pmesh = smgr->getMesh(ppath);
- printf("We have %d mesh buffers\n",pmesh->getMeshBufferCount());
- u32 meshcount = pmesh->getMeshBufferCount();
- btTriangleMesh* trimesh = new btTriangleMesh();
- for(u32 meshnum = 0; meshnum < meshcount; meshnum++){
- IMeshBuffer *b = pmesh->getMeshBuffer(meshnum);
- //assert(b->getVertexType() == video::EVT_STANDARD);
- u32 bi = b->getIndexCount();
- u16 *indices = b->getIndices();
- for(u32 i = 0; i < bi; i+= 3){
- printf("Getting triangle %u of %u\n",i,bi);
- u16 i1 = indices[i];
- u16 i2 = indices[i + 1];
- u16 i3 = indices[i + 2];
- vector3df p1 = b->getPosition(i1);
- vector3df p2 = b->getPosition(i2);
- vector3df p3 = b->getPosition(i3);
- btVector3 b1 = btVector3(p1.X,p1.Y,p1.Z) ;
- btVector3 b2 = btVector3(p2.X,p2.Y,p2.Z) ;
- btVector3 b3 = btVector3(p3.X,p3.Y,p3.Z) ;
- trimesh->addTriangle(b1,b2,b3);
- }
- }
- printf("Done building trimesh\n");
- btCollisionShape *shape = new btBvhTriangleMeshShape(trimesh,true);
- btTransform tr;
- tr.setIdentity();
- tr.setOrigin(btVector3(x,y,z));
- printf("Created default motion shape\n");
- btDefaultMotionState *ms = new btDefaultMotionState(btTransform(tr));
- btVector3 li;
- shape->calculateLocalInertia(mass, li);
- btRigidBody *rb = new btRigidBody(mass,ms,shape,li);
- rb->setUserPointer((void*) node);
- World->addRigidBody(rb);
- Objects.push_back(rb);
- printf("Rigid body finished\n");
+ 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_newtable(L);//{}
+
lua_pushlightuserdata(L,rb);
- lua_setfield(L,-2,"rigidbody");
+ 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");
+ lua_setfield(L,-2,"node");//{rb=ud_rb, node=ud_node, type="rigidbody"}
+
luaL_getmetatable(L,"phys.physmodel");
- lua_setmetatable(L,-2);
+ 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;
@@ -125,8 +256,11 @@ int cbphysmodel_register(lua_State* L){
//printf("bphysmodel registered\n");
luaL_newmetatable(L, "phys.physmodel");//{}
- luaL_register(L,NULL,bphysmodel_m);
+ 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);