//----------------------------------------------------------------------- void InstanceBatch::_updateBounds(void) { mFullBoundingBox.setNull(); InstancedEntityVec::const_iterator itor = mInstancedEntities.begin(); InstancedEntityVec::const_iterator end = mInstancedEntities.end(); Real maxScale = 0; while( itor != end ) { InstancedEntity* ent = (*itor); //Only increase the bounding box for those objects we know are in the scene if( ent->isInScene() ) { maxScale = std::max(maxScale, ent->getMaxScaleCoef()); mFullBoundingBox.merge( ent->_getDerivedPosition() ); } ++itor; } Real addToBound = maxScale * _getMeshReference()->getBoundingSphereRadius(); mFullBoundingBox.setMaximum(mFullBoundingBox.getMaximum() + addToBound); mFullBoundingBox.setMinimum(mFullBoundingBox.getMinimum() - addToBound); mBoundingRadius = Math::boundingRadiusFromAABB( mFullBoundingBox ); //Tell the SceneManager our bounds have changed getParentSceneNode()->needUpdate(true); mBoundsDirty = false; mBoundsUpdated = true; }
// 更新包围盒 void TerrainImpl::updateBounds() { m_aabb.setNull(); for (size_t i = 0; i < mTiles.size(); ++i) { for (size_t j = 0; j < mTiles[i].size(); ++j) { // update this tile m_aabb.merge(mTiles[i][j]->getBoundingBox()); } } if(getParentSceneNode()) { getParentSceneNode()->needUpdate(); } }
//----------------------------------------------------------------------------------- void WireAabb::track( const MovableObject *movableObject ) { assert( this != movableObject ); if( mTrackedObject ) mManager->_removeWireAabb( this ); mTrackedObject = movableObject; if( mTrackedObject ) mManager->_addWireAabb( this ); if( !mTrackedObject && mParentNode ) { //Not tracking anymore, need to get rid of our SceneNode SceneNode *sceneNode = getParentSceneNode(); sceneNode->getParentSceneNode()->removeAndDestroyChild( sceneNode ); mParentNode = 0; } else if( mTrackedObject && !mParentNode ) { //Started tracking, we need a node of our own. SceneNode *newNode = mManager->getRootSceneNode()->createChildSceneNode(); newNode->attachObject( this ); } }
Ogre::Real DeferredLight::getSquaredViewDepth(const Ogre::Camera* camera) const { if (ignoreWorld) { return 0.0; } else { Ogre::Vector3 dist = camera->getDerivedPosition() - getParentSceneNode()->_getDerivedPosition(); return dist.squaredLength(); } }
void NavigationInputGeometry::calculateExtents( const OgreItemVector& entities ) { auto entity = entities[0]; auto bbox = entity->getLocalAabb(); Matrix4 transform = mReferenceNode->_getFullTransformUpdated().inverse() * entity->getParentSceneNode()->_getFullTransformUpdated(); assert( transform.isAffine() ); bbox.transformAffine( transform ); Vector3 bbmin = bbox.getMinimum(); Vector3 bbmax = bbox.getMaximum(); for ( auto iterator : entities ) { entity = iterator; bbox = entity->getLocalAabb(); transform = mReferenceNode->_getFullTransformUpdated().inverse() * entity->getParentSceneNode()->_getFullTransformUpdated(); assert( transform.isAffine() ); bbox.transformAffine( transform ); Vector3 min2 = bbox.getMinimum(); if ( min2.x < bbmin.x ) bbmin.x = min2.x; if ( min2.y < bbmin.y ) bbmin.y = min2.y; if ( min2.z < bbmin.z ) bbmin.z = min2.z; Vector3 max2 = bbox.getMaximum(); if ( max2.x > bbmax.x ) bbmax.x = max2.x; if ( max2.y > bbmax.y ) bbmax.y = max2.y; if ( max2.z > bbmax.z ) bbmax.z = max2.z; } Math::ogreVec3ToFloatArray( bbmin, mBBoxMin ); Math::ogreVec3ToFloatArray( bbmax, mBBoxMax ); }
InstanceBatch::~InstanceBatch() { deleteAllInstancedEntities(); //Remove the parent scene node automatically SceneNode *sceneNode = getParentSceneNode(); if( sceneNode ) { sceneNode->detachAllObjects(); sceneNode->getParentSceneNode()->removeAndDestroyChild( sceneNode->getName() ); } if( mRemoveOwnVertexData ) OGRE_DELETE mRenderOperation.vertexData; if( mRemoveOwnIndexData ) OGRE_DELETE mRenderOperation.indexData; }
void PlanetMovable::_updateRenderQueue(RenderQueue* queue) { if (mCube) { mCube->updateRenderQueue(queue, getParentSceneNode()->_getFullTransform()); } }