void CShadowVolumeSceneNode::createShadowVolume(const core::vector3df& light) { SShadowVolume* svp = 0; // builds the shadow volume and adds it to the shadow volume list. if (ShadowVolumes.size() > ShadowVolumesUsed) { // get the next unused buffer svp = &ShadowVolumes[ShadowVolumesUsed]; svp->set_used(0); } else { ShadowVolumes.push_back(SShadowVolume()); svp = &ShadowVolumes.getLast(); } svp->reallocate(IndexCount*5); ++ShadowVolumesUsed; const u32 faceCount = IndexCount / 3; if (faceCount * 6 > Edges.size()) Edges.set_used(faceCount*6); u32 numEdges = 0; const core::vector3df ls = light * Infinity; // light scaled //if (UseZFailMethod) // createZFailVolume(faceCount, numEdges, light, svp); //else // createZPassVolume(faceCount, numEdges, light, svp, false); // the createZFailVolume does currently not work 100% correctly, // so we create createZPassVolume with caps if the zfail method // is used createZPassVolume(faceCount, numEdges, light, svp, UseZFailMethod); for (u32 i=0; i<numEdges; ++i) { core::vector3df &v1 = Vertices[Edges[2*i+0]]; core::vector3df &v2 = Vertices[Edges[2*i+1]]; core::vector3df v3(v1 - ls); core::vector3df v4(v2 - ls); // Add a quad (two triangles) to the vertex list if (svp->size() < svp->allocated_size()-5) { svp->push_back(v1); svp->push_back(v2); svp->push_back(v3); svp->push_back(v2); svp->push_back(v4); svp->push_back(v3); } } }
void CShadowVolumeSceneNode::createShadowVolume(const core::vector3df& light, bool isDirectional) { SShadowVolume* svp = 0; core::aabbox3d<f32>* bb = 0; // builds the shadow volume and adds it to the shadow volume list. if (ShadowVolumes.size() > ShadowVolumesUsed) { // get the next unused buffer svp = &ShadowVolumes[ShadowVolumesUsed]; svp->set_used(0); bb = &ShadowBBox[ShadowVolumesUsed]; } else { ShadowVolumes.push_back(SShadowVolume()); svp = &ShadowVolumes.getLast(); ShadowBBox.push_back(core::aabbox3d<f32>()); bb = &ShadowBBox.getLast(); } svp->reallocate(IndexCount*5); ++ShadowVolumesUsed; // We use triangle lists Edges.set_used(IndexCount*2); u32 numEdges = 0; numEdges=createEdgesAndCaps(light, svp, bb); // for all edges add the near->far quads for (u32 i=0; i<numEdges; ++i) { const core::vector3df &v1 = Vertices[Edges[2*i+0]]; const core::vector3df &v2 = Vertices[Edges[2*i+1]]; const core::vector3df v3(v1+(v1 - light).normalize()*Infinity); const core::vector3df v4(v2+(v2 - light).normalize()*Infinity); // Add a quad (two triangles) to the vertex list #ifdef _DEBUG if (svp->size() >= svp->allocated_size()-5) os::Printer::log("Allocation too small.", ELL_DEBUG); #endif svp->push_back(v1); svp->push_back(v2); svp->push_back(v3); svp->push_back(v2); svp->push_back(v4); svp->push_back(v3); } }