ScenePlane::ScenePlane(const string &name_, const Planef &plane_) : SceneRigidBodyObject(name_), plane(plane_) { planeShape = new btStaticPlaneShape(btVector3(plane.v[0], plane.v[1], plane.v[2]), -plane.d); planeMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,0,0))); btRigidBody::btRigidBodyConstructionInfo planeRigidBodyCI(0, planeMotionState, planeShape, btVector3(0,0,0)); planeRigidBodyCI.m_restitution = 0.5; // planeRigidBodyCI.m_friction = 2.0; planeRigidBody = new btRigidBody(planeRigidBodyCI); }
u32 wsScene::addPrimitive(wsPrimitive* myPrimitive) { wsAssert(numPrimitives < WS_MAX_PRIMITIVES, "Cannot add another primitive to the scene. Maximum already reached."); primitives[numPrimitives] = myPrimitive; #if WS_PHYSICS_BACKEND == WS_BACKEND_BULLET switch (myPrimitive->getType()) { case WS_PRIM_TYPE_PLANE: { wsPlane* plane = (wsPlane*)myPrimitive; vec4 data = plane->getPosData(); btCollisionShape* planeShape = wsNew(btStaticPlaneShape, btStaticPlaneShape(btVector3(data.x, data.y, data.z), data.w)); btDefaultMotionState* planeState = wsNew(btDefaultMotionState, btDefaultMotionState(btTransform(btQuaternion(0.0f, 0.0f, 0.0f, 1.0f), btVector3(0.0f, 0.0f, 0.0f)))); btRigidBody::btRigidBodyConstructionInfo planeRigidBodyCI(0, planeState, planeShape, btVector3(0,0,0)); btRigidBody* groundRigidBody = wsNew(btRigidBody, btRigidBody(planeRigidBodyCI)); physicsWorld->addRigidBody(groundRigidBody, myPrimitive->getCollisionClass(), collisionClasses[(u32)wsLog2(myPrimitive->getCollisionClass())]); } break; case WS_PRIM_TYPE_CUBE: { wsCube* cube = (wsCube*)myPrimitive; vec4 dimensions = cube->getDimensions(); vec4 pos = cube->getPos(); quat rot = cube->getRot(); btCollisionShape* cubeShape = wsNew(btBoxShape, btBoxShape(btVector3(dimensions.x/2.0f, dimensions.y/2.0f, dimensions.z/2.0f))); btDefaultMotionState* cubeState = wsNew(btDefaultMotionState, btDefaultMotionState(btTransform(btQuaternion(rot.x, rot.y, rot.z, rot.w), btVector3(pos.x, pos.y, pos.z)))); btRigidBody::btRigidBodyConstructionInfo cubeRigidBodyCI(0, cubeState, cubeShape, btVector3(0, 0, 0)); btRigidBody* cubeRigidBody = wsNew(btRigidBody, btRigidBody(cubeRigidBodyCI)); physicsWorld->addRigidBody(cubeRigidBody, myPrimitive->getCollisionClass(), collisionClasses[(u32)wsLog2(myPrimitive->getCollisionClass())]); } break; default: break; } #endif return numPrimitives++; }