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) { 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]; if (svp->size >= IndexCount*5) svp->count = 0; else { svp->size = IndexCount*5; svp->count = 0; delete [] svp->vertices; svp->vertices = new core::vector3df[svp->size]; } ++ShadowVolumesUsed; } else { // add a buffer SShadowVolume tmp; // lets make a rather large shadowbuffer tmp.size = IndexCount*5; tmp.count = 0; tmp.vertices = new core::vector3df[tmp.size]; ShadowVolumes.push_back(tmp); svp = &ShadowVolumes[ShadowVolumes.size()-1]; ++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->vertices && svp->count < svp->size-5) { svp->vertices[svp->count++] = v1; svp->vertices[svp->count++] = v2; svp->vertices[svp->count++] = v3; svp->vertices[svp->count++] = v2; svp->vertices[svp->count++] = v4; svp->vertices[svp->count++] = v3; } } }