| 14 | } |
| 15 | |
| 16 | void Entity::genPhysicsMesh(){ |
| 17 | if(type == LIGHT){ |
| 18 | // Light mesh billboarded, generated AABB too large. Divide verts by scale factor to make smaller. |
| 19 | std::vector<glm::vec3> vertices = boost::get<Light>(glMesh).m_vertices; |
| 20 | glm::vec3 lightPosition = boost::get<Light>(glMesh).position; |
| 21 | float lightBoundScaleF = 10.f; |
| 22 | for(int i = 0; i < vertices.size()-2; i+=3){ |
| 23 | glm::vec3 triangle = glm::vec3(( vertices[i].x/lightBoundScaleF) + lightPosition.x, ( vertices[i].y/lightBoundScaleF) + lightPosition.y,( vertices[i].z/lightBoundScaleF) + lightPosition.z); |
| 24 | glm::vec3 triangle1= glm::vec3((vertices[i+1].x /lightBoundScaleF) + lightPosition.x, (vertices[i+1].y/lightBoundScaleF) + lightPosition.y,(vertices[i+1].z/lightBoundScaleF) + lightPosition.z); |
| 25 | glm::vec3 triangle2= glm::vec3((vertices[i+2].x /lightBoundScaleF) + lightPosition.x, (vertices[i+2].y/lightBoundScaleF) + lightPosition.y,(vertices[i+2].z/lightBoundScaleF) + lightPosition.z); |
| 26 | physicsMesh.addTriangle(Utils::glmToBullet(triangle), Utils::glmToBullet(triangle1), Utils::glmToBullet(triangle2), false); |
| 27 | } |
| 28 | } else { |
| 29 | std::vector<glm::vec3>vertices = boost::get<Track>(glMesh).m_vertices; |
| 30 | // TODO: Use passable flags (flags&0x80) of VROAD to work out whether collidable |
| 31 | for(int i = 0; i < vertices.size()-2; i+=3){ |
| 32 | glm::vec3 triangle = glm::vec3( vertices[i].x, vertices[i].y, vertices[i].z); |
| 33 | glm::vec3 triangle1= glm::vec3(vertices[i+1].x, vertices[i+1].y, vertices[i+1].z); |
| 34 | glm::vec3 triangle2= glm::vec3(vertices[i+2].x, vertices[i+2].y, vertices[i+2].z); |
| 35 | physicsMesh.addTriangle(Utils::glmToBullet(triangle), Utils::glmToBullet(triangle1), Utils::glmToBullet(triangle2), false); |
| 36 | } |
| 37 | } |
| 38 | physicsShape = new btBvhTriangleMeshShape(&physicsMesh, true, true); |
| 39 | motionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0,0,0))); |
| 40 | rigidBody = new btRigidBody( btRigidBody::btRigidBodyConstructionInfo(0, motionState, physicsShape, btVector3(0, 0, 0))); |
| 41 | rigidBody->setFriction(btScalar(1.f)); |
| 42 | rigidBody->setUserPointer(this); |
| 43 | } |
no test coverage detected