/* Find the best (smallest) zone that contains a point */ PCZone * PCZSceneManager::findZoneForPoint(Vector3 & point) { PCZone * zone; PCZone * bestZone = mDefaultZone; Real bestVolume = Ogre::Math::POS_INFINITY; ZoneMap::iterator zit = mZones.begin(); while ( zit != mZones.end() ) { zone = zit->second; AxisAlignedBox aabb; zone->getAABB(aabb); SceneNode * enclosureNode = zone->getEnclosureNode(); if (enclosureNode != 0) { // since this is the "local" AABB, add in world translation of the enclosure node aabb.setMinimum(aabb.getMinimum() + enclosureNode->_getDerivedPosition()); aabb.setMaximum(aabb.getMaximum() + enclosureNode->_getDerivedPosition()); } if (aabb.contains(point)) { if (aabb.volume() < bestVolume) { // this zone is "smaller" than the current best zone, so make it // the new best zone bestZone = zone; bestVolume = aabb.volume(); } } // proceed to next zone in the list ++zit; } return bestZone; }
void PhysicsManager::addLevelGeometry( Ogre::Entity* levelEntity, const std::vector<OgreNewt::CollisionPtr> &collisions) { RlAssert1(levelEntity); RlAssert1(levelEntity->getParentSceneNode()); SceneNode* node = levelEntity->getParentSceneNode(); //Level entity has to be attached to a scene node. // try one compound collision for the entity if there are several collisions OgreNewt::CollisionPtr collision; switch( collisions.size() ) { case 0: break; case 1: collision = collisions[0]; break; default: collision = OgreNewt::CollisionPtr(new OgreNewt::CollisionPrimitives::CompoundCollision(mWorld, collisions, 0)); break; } if( collision ) { OgreNewt::Body* body = new OgreNewt::Body(mWorld, collision ); body->attachNode(node); body->setPositionOrientation(node->_getDerivedPosition(), node->_getDerivedOrientation()); body->setMaterialGroupID(getMaterialID("level")); mLevelBodiesQuadTree.add(body); //mLevelBodies.push_back(body); } // adjust worldAABB Vector3 minV(mWorldAABB.getMinimum()); Vector3 maxV(mWorldAABB.getMaximum()); AxisAlignedBox entityAABB = levelEntity->getWorldBoundingBox(true); minV.makeFloor(entityAABB.getMinimum()); maxV.makeCeil(entityAABB.getMaximum()); mWorldAABB.setMinimum(minV - Vector3(50, 50, 50)); mWorldAABB.setMaximum(maxV + Vector3(50, 50, 50)); mWorld->setWorldSize(mWorldAABB); }
void DotSceneLoader::processLookTarget(TiXmlElement *XMLNode, SceneNode *pParent) { //! @todo Is this correct? Cause I don't have a clue actually // Process attributes String nodeName = getAttrib(XMLNode, "nodeName"); Node::TransformSpace relativeTo = Node::TS_PARENT; String sValue = getAttrib(XMLNode, "relativeTo"); if (sValue == "local") relativeTo = Node::TS_LOCAL; else if (sValue == "parent") relativeTo = Node::TS_PARENT; else if (sValue == "world") relativeTo = Node::TS_WORLD; TiXmlElement *pElement; // Process position (?) Vector3 position; pElement = XMLNode->FirstChildElement("position"); if (pElement) position = parseVector3(pElement); // Process localDirection (?) Vector3 localDirection = Vector3::NEGATIVE_UNIT_Z; pElement = XMLNode->FirstChildElement("localDirection"); if (pElement) localDirection = parseVector3(pElement); // Setup the look target try { if (!nodeName.empty()) { SceneNode *pLookNode = mSceneMgr->getSceneNode(nodeName); position = pLookNode->_getDerivedPosition(); } pParent->lookAt(position, relativeTo, localDirection); } catch (Ogre::Exception &/*e*/) { LogManager::getSingleton().logMessage("[DotSceneLoader] Error processing a look target!"); } }
// ------------------------------------------------------------------------- OgreBulletDynamics::RigidBody* OgreBulletListener::getBodyUnderCursorUsingOgre(Ogre::Vector3 &intersectionPoint, Ray &rayTo) { rayTo = mCamera->getCameraToViewportRay (mInputListener->getAbsMouseX(), mInputListener->getAbsMouseY()); mRayQuery->setRay (rayTo); const RaySceneQueryResult& result = mRayQuery->execute(); if (!result.empty()) { RaySceneQueryResult::const_iterator i = result.begin(); mRayQuery->setSortByDistance (true, 1);//only one hit while((i != result.end())) { SceneNode *node = i->movable->getParentSceneNode() ; #if (OGRE_VERSION >= ((1 << 16) | (5 << 8) | 0)) // must have at least shoggoth (1.5.0) intersectionPoint = node->_getDerivedPosition (); #else intersectionPoint = node->getWorldPosition (); #endif const unsigned short num = node->numAttachedObjects(); MovableObject* movable; for (unsigned short cur = 0;cur < num; cur++) { movable = node->getAttachedObject(cur); if (movable->getMovableType() == OgreBulletCollisions::Object::mMovableType) { OgreBulletCollisions::Object *object = static_cast <OgreBulletCollisions::Object *>(movable); OgreBulletDynamics::RigidBody *body = static_cast <OgreBulletDynamics::RigidBody *>(object); setDebugText ("Hit :" + body->getName()); return body; } } ++i; } }// if results. return 0; }