LUALIB_FUNCTION(_G, MeshTest) { auto ent = my->ToEntity(1); auto entobj = ent->GetStatObj(ent->GetSlotCount()); auto mesh = entobj->GetIndexedMesh()->GetMesh(); obj = gEnv->p3DEngine->CreateStatObj(); obj->GetIndexedMesh(true)->SetMesh(*mesh); return 0; }
btCollisionShape * COLLISION_WORLD::AddMeshShape(const MODEL & model) { btTriangleIndexVertexArray * mesh = new btTriangleIndexVertexArray(); mesh->addIndexedMesh(GetIndexedMesh(model)); btCollisionShape * shape = new btBvhTriangleMeshShape(mesh, true); meshes.push_back(mesh); shapes.push_back(shape); return shape; }
void COLLISION_WORLD::SetTrack(TRACK * t) { assert(t); // remove old track if(track) { world->removeCollisionObject(trackObject); delete trackObject->getCollisionShape(); trackObject->setCollisionShape(NULL); delete trackObject; trackObject = NULL; delete trackMesh; trackMesh = NULL; } // setup new track track = t; trackMesh = new btTriangleIndexVertexArray(); //trackSurface.resize(0); const std::list<TRACK_OBJECT> & objects = track->GetTrackObjects(); for(std::list<TRACK_OBJECT>::const_iterator ob = objects.begin(); ob != objects.end(); ++ob) { if(ob->HasSurface()) { MODEL & model = *ob->GetModel(); btIndexedMesh mesh = GetIndexedMesh(model); trackMesh->addIndexedMesh(mesh); //const TRACKSURFACE * surface = ob->GetSurface(); //trackSurface.push_back(surface); } } // no objs track /*if (trackSurface.size()==0) { static TRACKSURFACE surface; trackSurface.push_back(&surface); } else*/ /// if (!objects.empty()) { // can not use QuantizedAabbCompression because of the track size btCollisionShape * trackShape = new btBvhTriangleMeshShape(trackMesh, false); trackObject = new btCollisionObject(); trackObject->setCollisionShape(trackShape); trackObject->setUserPointer(NULL); world->addCollisionObject(trackObject); } }