bool Game::initialize() { if( !initializeOgre() ) return false; if( !initializeCEGUI() ) return false; if( !initializeOIS() ) return false; if( !initializeBullet() ) return false; //create the plane in Ogre3D Ogre::Plane plane(Ogre::Vector3::UNIT_Z, -15); Ogre::MeshManager::getSingleton().createPlane("ground", "meshes", plane, 1500, 1500, 20, 20, true, 1, 5, 5, Ogre::Vector3::UNIT_Y); Ogre::Entity* entGround = m_pScene->createEntity("ground"); Ogre::SceneNode* groundNode = m_pScene->getRootSceneNode()->createChildSceneNode("groundNode"); groundNode->attachObject(entGround); entGround->setMaterialName("BluePill"); //create the Bullet ground plane m_pGroundShape = new btStaticPlaneShape(btVector3(0, 0, 1), -15); m_pGroundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 0, -1))); btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI(0, m_pGroundMotionState, m_pGroundShape, btVector3(0, 0, 0)); m_pGroundBody = new btRigidBody(groundRigidBodyCI); m_pDynamicsWorld->addRigidBody(m_pGroundBody); //create the player in Ogre3D Ogre::String meshname = "Pill.mesh"; Ogre::Entity* entity = m_pScene->createEntity(meshname); m_pPlayerSceneNode = m_pRootSceneNode->createChildSceneNode(); m_pPlayerSceneNode->attachObject(entity); m_pPlayerSceneNode->scale(Ogre::Vector3(0.5f, 0.5f, 0.5f)); m_PlayerPosition = Ogre::Vector3(0.0f, 0.0f, -10.0f); m_PlayerVelocity = Ogre::Vector3(0.0f, 0.0f, 0.0f); m_pPlayerSceneNode->translate(m_PlayerPosition); //create the Bullet player m_pPlayerShape = new btBoxShape(btVector3(1,1,1)); m_pPlayerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 0, -10))); btScalar playerMass = 1; btVector3 playerInertia(0, 0, 0); m_pPlayerShape->calculateLocalInertia(playerMass, playerInertia); btRigidBody::btRigidBodyConstructionInfo playerRigidBodyCI(playerMass, m_pPlayerMotionState, m_pPlayerShape, playerInertia); m_pPlayerBody = new btRigidBody(playerRigidBodyCI); //body->setRestitution(1); m_pPlayerBody->setUserPointer(m_pPlayerSceneNode); m_pDynamicsWorld->addRigidBody(m_pPlayerBody); return true; }//Game::initialize
// Loads all the object files as Rigid Bodies into the physics world void MapLoader::loadMap() { ConvexDecomposition::WavefrontObj wobj; // push all the strings for loading objects std::string* file; /* file = new std::string("./assets/map/new_objects/structures/barn.obj"); fileNames.push_back((*file).c_str()); file = new std::string("./assets/map/new_objects/structures/bench.obj"); fileNames.push_back((*file).c_str()); //file = new std::string("./assets/map/new_objects/structures/house.obj"); //fileNames.push_back((*file).c_str()); //file = new std::string("./assets/map/new_objects/structures/boat.obj"); //fileNames.push_back((*file).c_str()); file = new std::string("./assets/map/new_objects/structures/floating_hottub.obj"); fileNames.push_back((*file).c_str()); file = new std::string("./assets/map/new_objects/structures/silo.obj"); fileNames.push_back((*file).c_str()); file = new std::string("./assets/map/new_objects/structures/windmill.obj"); fileNames.push_back((*file).c_str()); file = new std::string("./assets/map/new_objects/structures/house_under_construction.obj"); fileNames.push_back((*file).c_str()); //file = new std::string("./assets/map/new_objects/structures/patio.obj"); //fileNames.push_back((*file).c_str()); //file = new std::string("./assets/map/new_objects/nature/pumpkin_patch.obj"); //fileNames.push_back((*file).c_str()); */ int result; for (auto const& file : fileNames) { result = wobj.loadObj(file); printf("loading file: %s\n", file); // Error loops if the obj file wasn't loaded correctly while (!result) { printf("loading failed \"%s\"\n", file); } btTriangleMesh* trimesh = new btTriangleMesh(); int i; for (i = 0; i < wobj.mTriCount; i++) { int index0 = wobj.mIndices[i * 3]; int index1 = wobj.mIndices[i * 3 + 1]; int index2 = wobj.mIndices[i * 3 + 2]; btVector3 vertex0(wobj.mVertices[index0 * 3], wobj.mVertices[index0 * 3 + 1], wobj.mVertices[index0 * 3 + 2]); btVector3 vertex1(wobj.mVertices[index1 * 3], wobj.mVertices[index1 * 3 + 1], wobj.mVertices[index1 * 3 + 2]); btVector3 vertex2(wobj.mVertices[index2 * 3], wobj.mVertices[index2 * 3 + 1], wobj.mVertices[index2 * 3 + 2]); trimesh->addTriangle(vertex0, vertex1, vertex2); } btBvhTriangleMeshShape* tmpConvexShape = new btBvhTriangleMeshShape(trimesh, false); btDefaultMotionState*playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 0, 0))); //btScalar mass = 500; //btVector3 playerInertia(0, 0, 0); //convexShape->calculateLocalInertia(mass, playerInertia); btRigidBody::btRigidBodyConstructionInfo playerRigidBodyCI(0, playerMotionState, tmpConvexShape, btVector3(0, 0, 0)); btRigidBody* pRigidBody = new btRigidBody(playerRigidBodyCI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); } // Windmill object bottom top btCollisionShape* windmill = new btCylinderShape(btVector3(30, 110, 15)); btDefaultMotionState*playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(-128, 1, 3))); btRigidBody::btRigidBodyConstructionInfo playerRigidBodyCIz(0, playerMotionState, windmill, btVector3(0, 0, 0)); btRigidBody* pRigidBody = new btRigidBody(playerRigidBodyCIz); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); btCollisionShape* windmill_plat = new btCylinderShape(btVector3(33, 2, 33)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(-129, 37, 4))); btRigidBody::btRigidBodyConstructionInfo platRigidBodyCIy(0, playerMotionState, windmill_plat, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(platRigidBodyCIy); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); // patio btCollisionShape* patio = new btBoxShape(btVector3(32, 2, 16)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(49, 16, 111))); btRigidBody::btRigidBodyConstructionInfo patioCI(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(patioCI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); patio = new btBoxShape(btVector3(10, 15, 6)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(31.6, 0, 130))); btRigidBody::btRigidBodyConstructionInfo patio4CI(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(patio4CI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); patio = new btBoxShape(btVector3(10, 15, 6)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(69, 0, 130))); btRigidBody::btRigidBodyConstructionInfo patio1CI(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(patio1CI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); patio = new btBoxShape(btVector3(5, 15, 7)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(15, 0, 101))); btRigidBody::btRigidBodyConstructionInfo patio2CI(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(patio2CI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); patio = new btBoxShape(btVector3(5, 15, 7)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(83, 0, 100))); btRigidBody::btRigidBodyConstructionInfo patio3CI(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(patio3CI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); // Rock btCollisionShape* rock = new btCylinderShape(btVector3(7, 11, 7)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(-15.4, 0, 103))); btRigidBody::btRigidBodyConstructionInfo platRigidBodyCI(0, playerMotionState, rock, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(platRigidBodyCI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); //boat patio = new btBoxShape(btVector3(50, 2, 23)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(-145, 20, 136))); btRigidBody::btRigidBodyConstructionInfo boatCI(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(boatCI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); // House patio = new btBoxShape(btVector3(40, 50, 60)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(155, 0, 114))); btRigidBody::btRigidBodyConstructionInfo houseCI(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(houseCI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); patio = new btBoxShape(btVector3(22, 2, 60)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(btVector3(0,0,-1), -.60), btVector3(135, 60, 114))); btRigidBody::btRigidBodyConstructionInfo roof1(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(roof1); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); patio = new btBoxShape(btVector3(22, 2, 60)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(btVector3(0, 0, 1), -.60), btVector3(175, 60, 114))); btRigidBody::btRigidBodyConstructionInfo roof2(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(roof2); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); // Construction House patio = new btBoxShape(btVector3(36, 9, 55)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(-141, 0, -121))); btRigidBody::btRigidBodyConstructionInfo conH(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(conH); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); patio = new btBoxShape(btVector3(36, 1, 55)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(-141, 24, -121))); btRigidBody::btRigidBodyConstructionInfo conH0(0, playerMotionState, patio, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(conH0); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); // Silo btCollisionShape* silo = new btCylinderShape(btVector3(20, 63, 20)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(146.5, 0, 4))); btRigidBody::btRigidBodyConstructionInfo siloc(0, playerMotionState, silo, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(siloc); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); // barn btCollisionShape* barn = new btBoxShape(btVector3(18, 50, 25)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(143.6, 0, -54))); btRigidBody::btRigidBodyConstructionInfo barnCI(0, playerMotionState, barn, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(barnCI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); // barbara btCollisionShape* bb = new btBoxShape(btVector3(20, 7, 10)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(-71, 0, 108))); btRigidBody::btRigidBodyConstructionInfo bbCI(0, playerMotionState, bb, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(bbCI); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); btCollisionShape* bb1 = new btBoxShape(btVector3(20, 2, 10)); playerMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(-71, 17, 108))); btRigidBody::btRigidBodyConstructionInfo bbCI1(0, playerMotionState, bb1, btVector3(0, 0, 0)); pRigidBody = new btRigidBody(bbCI1); pRigidBody->setFriction((btScalar)0.5); pRigidBody->setDamping((btScalar)100, (btScalar)100); pRigidBody->setUserIndex(ClassId::OBSTACLE); curWorld->addRigidBody(pRigidBody); }