//! renders the node. void CShadowVolumeSceneNode::render() { video::IVideoDriver* driver = SceneManager->getVideoDriver(); if (!ShadowVolumesUsed || !driver) return; driver->setTransform(video::ETS_WORLD, Parent->getAbsoluteTransformation()); for (u32 i=0; i<ShadowVolumesUsed; ++i) { bool drawShadow = true; if (UseZFailMethod && SceneManager->getActiveCamera()) { // Disable shadows drawing, when back cap is behind of ZFar plane. SViewFrustum frust = *SceneManager->getActiveCamera()->getViewFrustum(); core::matrix4 invTrans(Parent->getAbsoluteTransformation(), core::matrix4::EM4CONST_INVERSE); frust.transform(invTrans); core::vector3df edges[8]; ShadowBBox[i].getEdges(edges); core::vector3df largestEdge = edges[0]; f32 maxDistance = core::vector3df(SceneManager->getActiveCamera()->getPosition() - edges[0]).getLength(); f32 curDistance = 0.f; for(int j = 1; j < 8; ++j) { curDistance = core::vector3df(SceneManager->getActiveCamera()->getPosition() - edges[j]).getLength(); if(curDistance > maxDistance) { maxDistance = curDistance; largestEdge = edges[j]; } } if (!(frust.planes[scene::SViewFrustum::VF_FAR_PLANE].classifyPointRelation(largestEdge) != core::ISREL3D_FRONT)) drawShadow = false; } if(drawShadow) driver->drawStencilShadowVolume(ShadowVolumes[i], UseZFailMethod, DebugDataVisible); else { core::array<core::vector3df> triangles; driver->drawStencilShadowVolume(triangles, UseZFailMethod, DebugDataVisible); } } }
//! renders the node. void COctTreeSceneNode::render() { video::IVideoDriver* driver = SceneManager->getVideoDriver(); if (vertexType == -1 || !driver) return; ICameraSceneNode* camera = SceneManager->getActiveCamera(); if (!camera) return; bool isTransparentPass = SceneManager->getSceneNodeRenderPass() == scene::ESNRP_TRANSPARENT; ++PassCount; driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); SViewFrustum frust = *camera->getViewFrustum(); //transform the frustum to the current absolute transformation core::matrix4 invTrans(AbsoluteTransformation); invTrans.makeInverse(); frust.transform(invTrans); /* //const core::aabbox3d<float> &box = frust.getBoundingBox(); */ switch(vertexType) { case video::EVT_STANDARD: { //StdOctTree->calculatePolys(box); StdOctTree->calculatePolys(frust); const OctTree<video::S3DVertex>::SIndexData* d = StdOctTree->getIndexData(); for (u32 i=0; i<Materials.size(); ++i) { if ( 0 == d[i].CurrentSize ) continue; const video::IMaterialRenderer* const rnd = driver->getMaterialRenderer(Materials[i].MaterialType); const bool transparent = (rnd && rnd->isTransparent()); // only render transparent buffer if this is the transparent render pass // and solid only in solid pass if (transparent == isTransparentPass) { driver->setMaterial(Materials[i]); driver->drawIndexedTriangleList( &StdMeshes[i].Vertices[0], StdMeshes[i].Vertices.size(), d[i].Indices, d[i].CurrentSize / 3); } } // for debug purposes only if (DebugDataVisible && !Materials.empty() && PassCount==1) { const core::aabbox3df& box = frust.getBoundingBox(); core::array< const core::aabbox3d<f32>* > boxes; video::SMaterial m; m.Lighting = false; driver->setMaterial(m); if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS ) { StdOctTree->getBoundingBoxes(box, boxes); for (u32 b=0; b!=boxes.size(); ++b) driver->draw3DBox(*boxes[b]); } if ( DebugDataVisible & scene::EDS_BBOX ) driver->draw3DBox(Box,video::SColor(0,255,0,0)); } } break; case video::EVT_2TCOORDS: { //LightMapOctTree->calculatePolys(box); LightMapOctTree->calculatePolys(frust); const OctTree<video::S3DVertex2TCoords>::SIndexData* d = LightMapOctTree->getIndexData(); for (u32 i=0; i<Materials.size(); ++i) { if ( 0 == d[i].CurrentSize ) continue; const video::IMaterialRenderer* const rnd = driver->getMaterialRenderer(Materials[i].MaterialType); const bool transparent = (rnd && rnd->isTransparent()); // only render transparent buffer if this is the transparent render pass // and solid only in solid pass if (transparent == isTransparentPass) { driver->setMaterial(Materials[i]); driver->drawIndexedTriangleList( &LightMapMeshes[i].Vertices[0], LightMapMeshes[i].Vertices.size(), d[i].Indices, d[i].CurrentSize / 3); } } // for debug purposes only if (DebugDataVisible && !Materials.empty() && PassCount==1) { const core::aabbox3d<float> &box = frust.getBoundingBox(); core::array< const core::aabbox3d<f32>* > boxes; video::SMaterial m; m.Lighting = false; driver->setMaterial(m); if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS ) { LightMapOctTree->getBoundingBoxes(box, boxes); for (u32 b=0; b<boxes.size(); ++b) driver->draw3DBox(*boxes[b]); } if ( DebugDataVisible & scene::EDS_BBOX ) driver->draw3DBox(Box,video::SColor(0,255,0,0)); } } break; case video::EVT_TANGENTS: { //TangentsOctTree->calculatePolys(box); TangentsOctTree->calculatePolys(frust); const OctTree<video::S3DVertexTangents>::SIndexData* d = TangentsOctTree->getIndexData(); for (u32 i=0; i<Materials.size(); ++i) { if ( 0 == d[i].CurrentSize ) continue; const video::IMaterialRenderer* const rnd = driver->getMaterialRenderer(Materials[i].MaterialType); const bool transparent = (rnd && rnd->isTransparent()); // only render transparent buffer if this is the transparent render pass // and solid only in solid pass if (transparent == isTransparentPass) { driver->setMaterial(Materials[i]); driver->drawIndexedTriangleList( &TangentsMeshes[i].Vertices[0], TangentsMeshes[i].Vertices.size(), d[i].Indices, d[i].CurrentSize / 3); } } // for debug purposes only if (DebugDataVisible && !Materials.empty() && PassCount==1) { const core::aabbox3d<float> &box = frust.getBoundingBox(); core::array< const core::aabbox3d<f32>* > boxes; video::SMaterial m; m.Lighting = false; driver->setMaterial(m); if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS ) { TangentsOctTree->getBoundingBoxes(box, boxes); for (u32 b=0; b<boxes.size(); ++b) driver->draw3DBox(*boxes[b]); } if ( DebugDataVisible & scene::EDS_BBOX ) driver->draw3DBox(Box,video::SColor(0,255,0,0)); } } break; } }
//! renders the node. void COctreeSceneNode::render() { video::IVideoDriver* driver = SceneManager->getVideoDriver(); if (!driver) return; ICameraSceneNode* camera = SceneManager->getActiveCamera(); if (!camera) return; bool isTransparentPass = SceneManager->getSceneNodeRenderPass() == scene::ESNRP_TRANSPARENT; ++PassCount; driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); if (Shadow) Shadow->updateShadowVolumes(); SViewFrustum frust = *camera->getViewFrustum(); //transform the frustum to the current absolute transformation if ( !AbsoluteTransformation.isIdentity() ) { core::matrix4 invTrans(AbsoluteTransformation, core::matrix4::EM4CONST_INVERSE); frust.transform(invTrans); } const core::aabbox3d<float> &box = frust.getBoundingBox(); if (BoxBased) StdOctree->calculatePolys(box); else StdOctree->calculatePolys(frust); const Octree::SIndexData* d = StdOctree->getIndexData(); for (u32 i=0; i<Materials.size(); ++i) { if ( 0 == d[i].CurrentSize ) continue; const video::IMaterialRenderer* const rnd = driver->getMaterialRenderer(Materials[i].MaterialType); const bool transparent = (rnd && rnd->isTransparent()); // only render transparent buffer if this is the transparent render pass // and solid only in solid pass if (transparent == isTransparentPass) { driver->setMaterial(Materials[i]); if (UseVBOs) { if (UseVisibilityAndVBOs) { scene::IIndexBuffer* oldBuffer = StdMeshes[i]->getIndexBuffer(); oldBuffer->grab(); StdMeshes[i]->setIndexBuffer(d[i].IndexBuffer); StdMeshes[i]->setDirty(scene::EBT_INDEX); driver->drawMeshBuffer ( StdMeshes[i] ); StdMeshes[i]->setIndexBuffer(oldBuffer); oldBuffer->drop(); StdMeshes[i]->setDirty(scene::EBT_INDEX); } else driver->drawMeshBuffer ( StdMeshes[i] ); } else driver->drawIndexedTriangleList(false, StdMeshes[i]->getVertexBuffer(), false, d[i].IndexBuffer, d[i].CurrentSize / 3); } } // for debug purposes only if (DebugDataVisible && !Materials.empty() && PassCount==1) { const core::aabbox3d<float> &box = frust.getBoundingBox(); core::array< const core::aabbox3d<f32>* > boxes; video::SMaterial m; m.Lighting = false; driver->setMaterial(m); if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS ) { StdOctree->getBoundingBoxes(box, boxes); for (u32 b=0; b<boxes.size(); ++b) driver->draw3DBox(*boxes[b]); } if ( DebugDataVisible & scene::EDS_BBOX ) driver->draw3DBox(Box,video::SColor(0,255,0,0)); } }