//--- NGF events ---------------------------------------------------------------- StaticBrush::StaticBrush(Ogre::Vector3 pos, Ogre::Quaternion rot, NGF::ID id, NGF::PropertyList properties, Ogre::String name) : NGF::GameObject(pos, rot, id , properties, name) { addFlag("StaticBrush"); //Python init event. NGF_PY_CALL_EVENT(init); //Get properties. bool convex = Ogre::StringConverter::parseBool(mProperties.getValue("convex", 0, "no")); //Create the Ogre stuff. mEntity = createBrushEntity(); mNode = GlbVar.ogreSmgr->getRootSceneNode()->createChildSceneNode(mOgreName, pos, rot); mNode->attachObject(mEntity); //Create the Physics stuff. BtOgre::StaticMeshToShapeConverter converter(mEntity); if (convex) { mShape = converter.createConvex(); mShape->setMargin(0); } else mShape = converter.createTrimesh(); BtOgre::RigidBodyState *state = new BtOgre::RigidBodyState(mNode); mBody = new btRigidBody(0, state, mShape, btVector3(0,0,0)); initBody( DimensionManager::STATIC ); }
//--- NGF events ---------------------------------------------------------------- Pickup::Pickup(Ogre::Vector3 pos, Ogre::Quaternion rot, NGF::ID id, NGF::PropertyList properties, Ogre::String name) : NGF::GameObject(pos, rot, id , properties, name), mTime(0) { addFlag("Pickup"); //Python init event. NGF_PY_CALL_EVENT(init); NGF_PY_SAVE_EVENT(pickedUp); //Store properties. mPickupType = mProperties.getValue("pickupType", 0, "KeyR"); mSpin = Ogre::Math::DegreesToRadians(Ogre::StringConverter::parseReal(mProperties.getValue("spin", 0, "0"))); mBobAmp = Ogre::StringConverter::parseReal(mProperties.getValue("bobAmplitude", 0, "0")); mBobVel = 2 * Ogre::Math::PI * Ogre::StringConverter::parseReal(mProperties.getValue("bobFrequency", 0, "0")); //Create the Ogre stuff. Pickups can be brushes too. :-) if (mProperties.getValue("brushMeshFile", 0, "n") == "n") { Ogre::String meshFile = mProperties.getValue("meshFile", 0, "Mesh_Key.mesh"); Ogre::String material = mProperties.getValue("material", 0, "Objects/KeyR"); mEntity = GlbVar.ogreSmgr->createEntity(mOgreName, meshFile); mEntity->setMaterialName(material); } else { mEntity = createBrushEntity(); } mNode = GlbVar.ogreSmgr->getRootSceneNode()->createChildSceneNode(mOgreName, pos, rot); mChildNode = mNode->createChildSceneNode(mOgreName + "_child"); mChildNode->attachObject(mEntity); //Create the Physics stuff. BtOgre::StaticMeshToShapeConverter converter(mEntity); mShape = converter.createConvex(); BtOgre::RigidBodyState *state = new BtOgre::RigidBodyState(mNode); mBody = new btRigidBody(0, state, mShape, btVector3(0,0,0)); initBody( DimensionManager::NO_DIM_CHECK | DimensionManager::NO_BULLET_HIT ); mBody->setCollisionFlags(mBody->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE); }
//--- NGF events ---------------------------------------------------------------- OneWay::OneWay(Ogre::Vector3 pos, Ogre::Quaternion rot, NGF::ID id, NGF::PropertyList properties, Ogre::String name) : NGF::GameObject(pos, rot, id , properties, name) { addFlag("OneWay"); //Python init event. NGF_PY_CALL_EVENT(init); //Create the Ogre stuff. if (mProperties.getValue("brushMeshFile", 0, "n") == "n") { mEntity = GlbVar.ogreSmgr->createEntity(mOgreName, "OneWay.mesh"); BtOgre::StaticMeshToShapeConverter converter(mEntity); mShape = converter.createBox(); } else { mEntity = createBrushEntity(); BtOgre::StaticMeshToShapeConverter converter(mEntity); mShape = converter.createTrimesh(); mShape->setMargin(0); } mEntity->setMaterialName("Objects/OneWay"); mNode = GlbVar.ogreSmgr->getRootSceneNode()->createChildSceneNode(mOgreName, pos, rot); mNode->attachObject(mEntity); //Create the Physics stuff. BtOgre::RigidBodyState *state = new BtOgre::RigidBodyState(mNode); mBody = new btRigidBody(0, state, mShape, btVector3(0,0,0)); initBody( DimensionManager::NO_DIM_CHECK | DimensionManager::NO_CRATE_CHECK | DimensionManager::NO_MOVING_CHECK | DimensionManager::NO_BULLET_HIT ); mBody->setCollisionFlags(mBody->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE); }
//--- NGF events ---------------------------------------------------------------- SlidingBrush::SlidingBrush(Ogre::Vector3 pos, Ogre::Quaternion rot, NGF::ID id, NGF::PropertyList properties, Ogre::String name) : NGF::GameObject(pos, rot, id , properties, name), mCurrentPlace(0.5), mLastPlace(1), mForward(false) { addFlag("SlidingBrush"); //Save the director event. NGF_PY_SAVE_EVENT(point); //Python init event. NGF_PY_CALL_EVENT(init); //Get properties. mEnabled = Ogre::StringConverter::parseBool(mProperties.getValue("enabled", 0, "yes")); mSpeed = Ogre::StringConverter::parseReal(mProperties.getValue("speed", 0, "2")); //Create the Ogre stuff. mEntity = createBrushEntity(); mNode = GlbVar.ogreSmgr->getRootSceneNode()->createChildSceneNode(mOgreName, pos, rot); mNode->attachObject(mEntity); //Create the Physics stuff. BtOgre::StaticMeshToShapeConverter converter(mEntity); mShape = converter.createConvex(); mShape->setMargin(0); //Bad, but we gotta. BtOgre::RigidBodyState *state = new BtOgre::RigidBodyState(mNode); mBody = new btRigidBody(0, state, mShape); mBody->setCollisionFlags(mBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); mBody->setActivationState(DISABLE_DEACTIVATION); initBody(); //First point is here. mPoints.push_back(pos); //If we're a simple slider, we just move in one direction till a point and then return. Ogre::String distanceStr = mProperties.getValue("distance", 0, "n"); if(!(distanceStr == "n")) { Ogre::Real distance = Ogre::StringConverter::parseReal(distanceStr); mPoints.push_back(pos + (rot * Ogre::Vector3(0,0,-distance))); } mIgnoreCollisions = Ogre::StringConverter::parseBool(mProperties.getValue("ignoreCollisions", 0, "no")); //mIgnoreCollisions = true; //Make smaller shape for cast. //Get vertices. btAlignedObjectArray<btVector3> offsetVerts; btVector3 *iter = mShape->getUnscaledPoints(); for (int i = 0; i < mShape->getNumPoints(); ++i, ++iter) offsetVerts.push_back(*iter); //Push 'em in by 0.1; btAlignedObjectArray<btVector3> offsetPlanes; btGeometryUtil::getPlaneEquationsFromVertices(offsetVerts, offsetPlanes); int sz = offsetPlanes.size(); for (int i=0 ; i<sz ; ++i) offsetPlanes[i][3] += CAST_SHAPE_SHRINK; offsetVerts.clear(); btGeometryUtil::getVerticesFromPlaneEquations(offsetPlanes, offsetVerts); //Fill the shape with the new points. mCastShape = new btConvexHullShape(); for (int i = 0; i < offsetVerts.size() ; ++i) mCastShape->addPoint(offsetVerts[i]); }