void MD5ModelNode::render(RenderableCollector& collector, const VolumeTest& volume, const Matrix4& localToWorld, const IRenderEntity& entity) const { // Do some rough culling (per model, not per surface) if (volume.TestAABB(localAABB(), localToWorld) == VOLUME_OUTSIDE) { return; } SurfaceLightLists::const_iterator j = _surfaceLightLists.begin(); // greebo: Iterate over all MD5 surfaces and render them for (MD5Model::const_iterator i = _model->begin(); i != _model->end(); ++i, ++j) { assert(i->shader); // Get the Material to test the shader name against the filter system const MaterialPtr& surfaceShader = i->shader->getMaterial(); if (surfaceShader->isVisible()) { collector.setLights(*j); i->surface->render(collector, localToWorld, i->shader, entity); } } // Uncomment to render the skeleton //collector.SetState(entity.getWireShader(), RenderableCollector::eFullMaterials); //collector.addRenderable(_model->getRenderableSkeleton(), localToWorld, entity); }
// Renderable submission void PicoModelNode::submitRenderables(RenderableCollector& collector, const VolumeTest& volume, const Matrix4& localToWorld, const IRenderEntity& entity) const { // Test the model's intersection volume, if it intersects pass on the // render call if (volume.TestAABB(_picoModel->localAABB(), localToWorld) != VOLUME_OUTSIDE) { // Submit the lights collector.setLights(_lights); // Submit the model's geometry _picoModel->submitRenderables(collector, localToWorld, entity); } }
bool SceneGraph::foreachNodeInVolume_r(const ISPNode& node, const VolumeTest& volume, const INode::VisitorFunc& functor, bool visitHidden) { _visitedSPNodes++; // Visit all members const ISPNode::MemberList& members = node.getMembers(); for (ISPNode::MemberList::const_iterator m = members.begin(); m != members.end(); /* in-loop increment */) { // Skip hidden nodes, if specified if (!visitHidden && !(*m)->visible()) { ++m; continue; } // We're done, as soon as the walker returns FALSE if (!functor(*m++)) { return false; } } // Now consider the children const ISPNode::NodeList& children = node.getChildNodes(); for (ISPNode::NodeList::const_iterator i = children.begin(); i != children.end(); ++i) { if (volume.TestAABB((*i)->getBounds()) == VOLUME_OUTSIDE) { // Skip this node, not visible _skippedSPNodes++; continue; } // Traverse all the children too, enter recursion if (!foreachNodeInVolume_r(**i, volume, functor, visitHidden)) { // The walker returned false somewhere in the recursion depths, propagate this message return false; } } return true; // continue traversal }
void MD5ModelNode::render(RenderableCollector& collector, const VolumeTest& volume, const Matrix4& localToWorld) const { // Do some rough culling (per model, not per surface) if (volume.TestAABB(localAABB(), localToWorld) == VOLUME_OUTSIDE) { return; } SurfaceLightLists::const_iterator j = _surfaceLightLists.begin(); SurfaceRemaps::const_iterator k = _surfaceRemaps.begin(); // greebo: Iterate over all MD5 surfaces and render them for (MD5Model::const_iterator i = _model->begin(); i != _model->end(); ++i, ++j, ++k) { collector.setLights(*j); (*i)->render(collector, localToWorld, k->shader != NULL ? k->shader : (*i)->getState()); } }
VolumeIntersectionValue intersectVolume (const VolumeTest& volume, const Matrix4& localToWorld) const { return volume.TestAABB(m_aabb_local, localToWorld); }
VolumeIntersectionValue RenderablePicoModel::intersectVolume (const VolumeTest& test, const Matrix4& localToWorld) const { return test.TestAABB(_localAABB, localToWorld); }
VolumeIntersectionValue MiscParticle::intersectVolume (const VolumeTest& volume, const Matrix4& localToWorld) const { return volume.TestAABB(localAABB(), localToWorld); }