diff --git a/src/osg/ShadowVolumeOccluder.cpp b/src/osg/ShadowVolumeOccluder.cpp index bada08cf0..44d992b47 100644 --- a/src/osg/ShadowVolumeOccluder.cpp +++ b/src/osg/ShadowVolumeOccluder.cpp @@ -9,7 +9,7 @@ using namespace osg; -typedef std::pair Point; // bool=true signifies a newly created point, false indicates original point. +typedef std::pair Point; // bool=true signifies a newly created point, false indicates original point. typedef std::vector PointList; typedef std::vector VertexList; @@ -22,13 +22,13 @@ void convert(const VertexList& in,PointList& out) itr!=in.end(); ++itr) { - out.push_back(Point(false,*itr)); + out.push_back(Point(0,*itr)); } } // clip the convex hull 'in' to plane to generate a clipped convex hull 'out' // return true if points remain after clipping. -unsigned int clip(const Plane& plane,const PointList& in, PointList& out) +unsigned int clip(const Plane& plane,const PointList& in, PointList& out,unsigned int planeMask) { std::vector distance; distance.reserve(in.size()); @@ -49,17 +49,20 @@ unsigned int clip(const Plane& plane,const PointList& in, PointList& out) { out.push_back(in[i]); + if (distance[i_1]<0.0f) { + unsigned int mask = (in[i].first & in[i_1].first) | planeMask; float r = distance[i_1]/(distance[i_1]-distance[i]); - out.push_back(Point(true,in[i].second*r+in[i_1].second*(1.0f-r))); + out.push_back(Point(mask,in[i].second*r+in[i_1].second*(1.0f-r))); } } else if (distance[i_1]>0.0f) { + unsigned int mask = (in[i].first & in[i_1].first) | planeMask; float r = distance[i_1]/(distance[i_1]-distance[i]); - out.push_back(Point(true,in[i].second*r+in[i_1].second*(1.0f-r))); + out.push_back(Point(mask,in[i].second*r+in[i_1].second*(1.0f-r))); } } @@ -73,12 +76,14 @@ unsigned int clip(const Polytope::PlaneList& planeList,const VertexList& vin,Poi PointList in; convert(vin,in); + unsigned int planeMask = 0x1; for(Polytope::PlaneList::const_iterator itr=planeList.begin(); itr!=planeList.end(); ++itr) { - if (!clip(*itr,in,out)) return false; + if (!clip(*itr,in,out,planeMask)) return false; in.swap(out); + planeMask <<= 1; } in.swap(out); @@ -112,9 +117,7 @@ void pushToFarPlane(PointList& points) itr!=points.end(); ++itr) { -// std::cout << "itr->second "<< itr->second<< " after "; - itr->second.z() += 1.0f; -// std::cout << itr->second<< std::endl; + itr->second.z() = 1.0f; } } @@ -123,7 +126,7 @@ void computePlanes(const PointList& front, const PointList& back, Polytope::Plan for(unsigned int i=0;i0.0f) @@ -280,13 +269,6 @@ bool ShadowVolumeOccluder::computeOccluder(const NodePath& nodePath,const Convex transform(points,invMV); transform(farPoints,invMV); -// Vec3 v6=v5*invMV; -// std::cout<<"******************"<addChild(geode); geode->addDrawable(createOccluderDrawable(points,farPoints)); @@ -298,7 +280,6 @@ bool ShadowVolumeOccluder::computeOccluder(const NodePath& nodePath,const Convex } else { - std::cout << " occluder clipped out of frustum."<