]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/SGClipGroup.cxx
Merge branch 'timoore/aptsign' into next
[simgear.git] / simgear / scene / model / SGClipGroup.cxx
index bbddbcb07675fd25f22804380cddaa3660ddcc56..758a5b6a197de8166918c11499a38770324ecd71 100644 (file)
@@ -52,15 +52,15 @@ public:
   {
     osg::State* state = renderInfo.getState();
 
-    glPushAttrib(GL_TRANSFORM_BIT);
-
     state->applyModelViewMatrix(mModelView.get());
-    for (unsigned i = 0; i < mClipPlanes.size(); ++i)
-      mClipPlanes[i]->apply(*state);
+    for (unsigned i = 0; i < mClipPlanes.size(); ++i) {
+      osg::StateAttribute::GLMode planeNum;
+      planeNum = GL_CLIP_PLANE0 + mClipPlanes[i]->getClipPlaneNum();
+      state->applyMode(planeNum, false);
+      glClipPlane(planeNum, mClipPlanes[i]->getClipPlane().ptr());
+    }
 
     osgUtil::RenderBin::drawImplementation(renderInfo, previous);
-
-    glPopAttrib();
   }
 
   virtual void reset()
@@ -98,11 +98,13 @@ public:
   }
 };
 
+#if 0
 static osg::Vec4d clipPlane(const osg::Vec2& p0, const osg::Vec2& p1)
 {
   osg::Vec2d v(p1[0] - p0[0], p1[1] - p0[1]);
   return osg::Vec4d(v[1], -v[0], 0, v[0]*p0[1] - v[1]*p0[0]);
 }
+#endif
 
 SGClipGroup::SGClipGroup()
 {
@@ -110,6 +112,15 @@ SGClipGroup::SGClipGroup()
   setCullCallback(new CullCallback);
 }
 
+SGClipGroup::SGClipGroup(const SGClipGroup& clip, const osg::CopyOp& copyop) :
+  osg::Group(clip, copyop)
+{
+  for (unsigned i = 0; i < mClipPlanes.size(); ++i) {
+    osg::StateAttribute* sa = copyop(mClipPlanes[i].get());
+    mClipPlanes.push_back(static_cast<osg::ClipPlane*>(sa));
+  }
+}
+
 osg::BoundingSphere
 SGClipGroup::computeBound() const
 {