コード例 #1
0
ファイル: ElMovableObject.cpp プロジェクト: chenbk85/3dlearn
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);
}
コード例 #2
0
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);
	}
}
コード例 #3
0
 //-----------------------------------------------------------------------
 const AxisAlignedBox& MovableObject::getLightCapBounds(void) const
 {
     // Same as original bounds
     return getWorldBoundingBox();
 }
コード例 #4
0
	// 更新触发器数据,调用这个会导致一次遍历查询,并回调
	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;
	}