void ImportObjSetup::initPhysics() { m_guiHelper->setUpAxis(2); this->createEmptyDynamicsWorld(); m_guiHelper->createPhysicsDebugDrawer(m_dynamicsWorld); m_dynamicsWorld->getDebugDrawer()->setDebugMode(btIDebugDraw::DBG_DrawWireframe); const char* fileName = "samurai_monastry.obj"; char relativeFileName[1024]; const char* prefix[]={"./data/","../data/","../../data/","../../../data/","../../../../data/"}; int prefixIndex=-1; { int numPrefixes = sizeof(prefix)/sizeof(char*); for (int i=0;i<numPrefixes;i++) { FILE* f = 0; sprintf(relativeFileName,"%s%s",prefix[i],fileName); f = fopen(relativeFileName,"r"); if (f) { fclose(f); prefixIndex = i; break; } } } if (prefixIndex<0) return; btVector3 shift(0,0,0); btVector3 scaling(10,10,10); // int index=10; { std::vector<tinyobj::shape_t> shapes; std::string err = tinyobj::LoadObj(shapes, relativeFileName, prefix[prefixIndex]); GLInstanceGraphicsShape* gfxShape = btgCreateGraphicsShapeFromWavefrontObj(shapes); btTransform trans; trans.setIdentity(); trans.setRotation(btQuaternion(btVector3(1,0,0),SIMD_HALF_PI)); btVector3 position = trans.getOrigin(); btQuaternion orn = trans.getRotation(); btVector3 color(0,0,1); int shapeId = m_guiHelper->getRenderInterface()->registerShape(&gfxShape->m_vertices->at(0).xyzw[0], gfxShape->m_numvertices, &gfxShape->m_indices->at(0), gfxShape->m_numIndices); //int id = m_guiHelper->getRenderInterface()->registerGraphicsInstance(shapeId,position,orn,color,scaling); } }
GLInstanceGraphicsShape* LoadMeshFromObj(const char* relativeFileName, const char* materialPrefixPath) { std::vector<tinyobj::shape_t> shapes; std::string err = tinyobj::LoadObj(shapes, relativeFileName, materialPrefixPath); GLInstanceGraphicsShape* gfxShape = btgCreateGraphicsShapeFromWavefrontObj(shapes); return gfxShape; }
bool b3ImportMeshUtility::loadAndRegisterMeshFromFileInternal(const std::string& fileName, b3ImportMeshData& meshData) { meshData.m_gfxShape = 0; meshData.m_textureImage = 0; meshData.m_textureHeight = 0; meshData.m_textureWidth = 0; char relativeFileName[1024]; if (b3ResourcePath::findResourcePath(fileName.c_str(), relativeFileName, 1024)) { char pathPrefix[1024]; b3FileUtils::extractPath(relativeFileName, pathPrefix, 1024); btVector3 shift(0,0,0); std::vector<tinyobj::shape_t> shapes; std::string err = tinyobj::LoadObj(shapes, relativeFileName, pathPrefix); GLInstanceGraphicsShape* gfxShape = btgCreateGraphicsShapeFromWavefrontObj(shapes); int textureIndex = -1; //try to load some texture for (int i=0;i<shapes.size();i++) { const tinyobj::shape_t& shape = shapes[i]; if (shape.material.diffuse_texname.length()>0) { int width,height,n; const char* filename = shape.material.diffuse_texname.c_str(); unsigned char* image=0; const char* prefix[]={ pathPrefix,"./","./data/","../data/","../../data/","../../../data/","../../../../data/"}; int numprefix = sizeof(prefix)/sizeof(const char*); for (int i=0;!image && i<numprefix;i++) { char relativeFileName[1024]; sprintf(relativeFileName,"%s%s",prefix[i],filename); char relativeFileName2[1024]; if (b3ResourcePath::findResourcePath(relativeFileName, relativeFileName2, 1024)) { image = stbi_load(relativeFileName, &width, &height, &n, 3); meshData.m_textureImage = image; if (image) { meshData.m_textureWidth = width; meshData.m_textureHeight = height; } else { meshData.m_textureWidth = 0; meshData.m_textureHeight = 0; } } else { b3Warning("not found %s\n",relativeFileName); } } } } meshData.m_gfxShape = gfxShape; return true; } else { b3Warning("Cannot find %s\n", fileName.c_str()); } return false; }
void ImportObjSetup::initPhysics(GraphicsPhysicsBridge& gfxBridge) { gfxBridge.setUpAxis(2); this->createEmptyDynamicsWorld(); gfxBridge.createPhysicsDebugDrawer(m_dynamicsWorld); m_dynamicsWorld->getDebugDrawer()->setDebugMode(btIDebugDraw::DBG_DrawWireframe); const char* fileName = "samurai_monastry.obj"; char relativeFileName[1024]; const char* prefix[]={"./data/","../data/","../../data/","../../../data/","../../../../data/"}; int prefixIndex=-1; { int numPrefixes = sizeof(prefix)/sizeof(char*); for (int i=0;i<numPrefixes;i++) { FILE* f = 0; sprintf(relativeFileName,"%s%s",prefix[i],fileName); f = fopen(relativeFileName,"r"); if (f) { fclose(f); prefixIndex = i; break; } } } if (prefixIndex<0) return; btVector3 shift(0,0,0); btVector3 scaling(10,10,10); // int index=10; { std::vector<tinyobj::shape_t> shapes; std::string err = tinyobj::LoadObj(shapes, relativeFileName, prefix[prefixIndex]); GLInstanceGraphicsShape* gfxShape = btgCreateGraphicsShapeFromWavefrontObj(shapes); btTransform trans; trans.setIdentity(); trans.setRotation(btQuaternion(btVector3(1,0,0),SIMD_HALF_PI)); btVector3 position = trans.getOrigin(); btQuaternion orn = trans.getRotation(); btVector3 color(0,0,1); int shapeId = m_app->m_renderer->registerShape(&gfxShape->m_vertices->at(0).xyzw[0], gfxShape->m_numvertices, &gfxShape->m_indices->at(0), gfxShape->m_numIndices); //int id = m_app->m_renderer->registerGraphicsInstance(shapeId,position,orn,color,scaling); /* btTriangleMesh* trimeshData = new btTriangleMesh(); for (int i=0;i<gfxShape->m_numvertices;i++) { for (int j=0;j<3;j++) gfxShape->m_vertices->at(i).xyzw[j] += shift[j]; } for (int i=0;i<gfxShape->m_numIndices;i+=3) { int index0 = gfxShape->m_indices->at(i); int index1 = gfxShape->m_indices->at(i+1); int index2 = gfxShape->m_indices->at(i+2); btVector3 v0(gfxShape->m_vertices->at(index0).xyzw[0], gfxShape->m_vertices->at(index0).xyzw[1], gfxShape->m_vertices->at(index0).xyzw[2]); btVector3 v1(gfxShape->m_vertices->at(index1).xyzw[0], gfxShape->m_vertices->at(index1).xyzw[1], gfxShape->m_vertices->at(index1).xyzw[2]); btVector3 v2(gfxShape->m_vertices->at(index2).xyzw[0], gfxShape->m_vertices->at(index2).xyzw[1], gfxShape->m_vertices->at(index2).xyzw[2]); trimeshData->addTriangle(v0,v1,v2); } //btConvexHullShape* convexShape = new btConvexHullShape(&verts[0].x(),verts.size(),sizeof(btVector3)); btBvhTriangleMeshShape* shape = new btBvhTriangleMeshShape(trimeshData,true);//meshInterface); btTransform startTrans;startTrans.setIdentity(); btRigidBody* body = this->createRigidBody(0,startTrans,shape); //gfxBridge.createCollisionShapeGraphicsObject(shape); btVector3 color(0,0,1); */ //gfxBridge.createRigidBodyGraphicsObject(body,color); } }