void OctreeNode::GetVisibleSceneNodes(SceneNodeList & list, Camera * cam) { _node * mynode = m_head; while (mynode) { SceneNode * node = mynode->node; const Aabb & bound = node->GetWorldAabb(); if (node->IsVisible() && cam->IsVisible(bound)) { list.PushBack(node); } mynode = mynode->next; } }
void OctreeNode::GetSceneNodesInSphere(SceneNodeList & list, const Sphere & sph) { _node * head = m_head; while (head) { SceneNode * node = head->node; const Aabb & aabb = node->GetWorldAabb(); if (Math::AABBIntersection(aabb, sph) == 0) { list.PushBack(node); } head = head->next; } }
void Water::_OnOptimizeCullResult(Event * _sender) { VisibleCullResult * result = (VisibleCullResult *)_sender->GetParam(0); SceneNodeList & list = result->nodes; SceneNodeList::Iterator whr = list.Begin(); SceneNodeList::Iterator end = list.End(); while (whr != end) { SceneNode * node = *whr; Vec3 pos = node->GetWorldAabb().GetCenter(); if (!HasWater(pos.x, pos.z)) node->_setVisibleMask(false); ++whr; } }
void OctreeNode::RayTracing(const Ray & ray, float dist, Array<Scene::TraceInfo> & nodes, int flag) { _node * head = m_head; while (head) { SceneNode * node = head->node; if (node->GetFlag().TestAny(flag)) { RayIntersectionInfo info; const Aabb & aabb = node->GetWorldAabb(); Math::RayIntersection(info, ray, aabb); if (info.iterscetion == TRUE && info.distance >= 0 && info.distance <= dist) { Scene::TraceInfo tinfo = { node, info.distance }; nodes.PushBack(tinfo); } } head = head->next; } }