void ElMovableObject::intersects(ElRaySceneQuery& raySceneQuery) { if (!isVisible()) return; std::pair<bool, float> result = raySceneQuery.getRay().intersects(getWorldBoundingBox(true)); if (result.first) raySceneQuery.queryResult(this, result.second); }
void SceneNode::_findVisibleObjects(Camera *pCamera, RenderQueue &renderQueue) { if(mp_attachedMoveableObject && mp_attachedMoveableObject->visible()) { if(pCamera->isVisible(getWorldBoundingBox(), NULL)) { mp_attachedMoveableObject->addToRenderQueue(pCamera->getProjViewMatrix() * _getFullTransform(), renderQueue); } } for(ChildNodeIterator it = m_childVec.begin(); it != m_childVec.end(); ++it) { SceneNode *pChild = static_cast<SceneNode*>(*it); pChild->_findVisibleObjects(pCamera, renderQueue); } }
//----------------------------------------------------------------------- const AxisAlignedBox& MovableObject::getLightCapBounds(void) const { // Same as original bounds return getWorldBoundingBox(); }
// 更新触发器数据,调用这个会导致一次遍历查询,并回调 void OctreeTriggerPlayer::updateTrigger() { if(m_aabb.isNull()) return; // 更新有向包围盒信息 m_obb.setCenter(getPosition()); m_obb.setExtents(getBoundingBox().getHalfSize() * getScale()); m_obb.setOrientation(getOrientation()); m_query->setBox(getWorldBoundingBox(true)); SceneQueryResult& result = m_query->execute(); // 现在发生了碰撞的列表 MapCollideTriggerEntity mapCollideTriggerEntity; // 遍历结果 for(SceneQueryResultMovableList::iterator iter = result.movables.begin() ; iter != result.movables.end() ; iter ++) { // 先转换成ITriggerEntity ITriggerEntity *entity = trigger_cast((*iter)->getUserAny()); if(entity) { // 做碰撞计算,如果发生碰撞了 if(entity->collide(this)) { // 添加进去 mapCollideTriggerEntity[entity->getName()] = entity; } } } // 遍历发生碰撞的结果 for(MapCollideTriggerEntity::iterator iter = mapCollideTriggerEntity.begin() ; iter != mapCollideTriggerEntity.end() ; iter ++) { // 如果不在里面,就说明进去了 if(m_mapCollideTriggerEntity.find(iter->second->getName()) == m_mapCollideTriggerEntity.end()) { // 回调到玩家 const ITriggerPlayer::ListListener &listPlayer = getListenerList(); for(size_t i = 0 ; i < listPlayer.size() ; i ++) { listPlayer[i]->onEnter(iter->second , this); } // 回调到触发器 const ITriggerEntity::ListListener &listEntity = iter->second->getListenerList(); for(size_t i = 0 ; i < listEntity.size() ; i ++) { listEntity[i]->onEnter(iter->second , this); } // 回调到世界 const ITriggerWorld::ListListener &listWorld = m_world->getListenerList(); for(size_t i = 0 ; i < listWorld.size() ; i ++) { listWorld[i]->onEnter(iter->second , this); } } } // 遍历未发生碰撞的结果 for(MapCollideTriggerEntity::iterator iter = m_mapCollideTriggerEntity.begin() ; iter != m_mapCollideTriggerEntity.end() ; iter ++) { // 如果不在里面,就说明出去了 if(mapCollideTriggerEntity.find(iter->second->getName()) == mapCollideTriggerEntity.end()) { // 回调到玩家 const ITriggerPlayer::ListListener &listPlayer = getListenerList(); for(size_t i = 0 ; i < listPlayer.size() ; i ++) { listPlayer[i]->onLeave(iter->second , this); } // 回调到触发器 const ITriggerEntity::ListListener &listEntity = iter->second->getListenerList(); for(size_t i = 0 ; i < listEntity.size() ; i ++) { listEntity[i]->onLeave(iter->second , this); } // 回调到世界 const ITriggerWorld::ListListener &listWorld = m_world->getListenerList(); for(size_t i = 0 ; i < listWorld.size() ; i ++) { listWorld[i]->onLeave(iter->second , this); } } } // 保存新的结果 m_mapCollideTriggerEntity = mapCollideTriggerEntity; }