]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/SGClipGroup.cxx
Make return type from loadPagedModel explicit.
[simgear.git] / simgear / scene / model / SGClipGroup.cxx
index fdf9305ae1a3af3f9ee3f95237712d06da58a909..6d2ab7f1920de92c138774f29120f23de8babad8 100644 (file)
  *
  */
 
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
+
 #include "SGClipGroup.hxx"
 
 #include <osg/ClipPlane>
@@ -48,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()
@@ -66,8 +70,18 @@ public:
   osg::ref_ptr<osg::RefMatrix> mModelView;
 };
 
-osgUtil::RegisterRenderBinProxy
-SGClipGroup::clipBinProxy("ClipRenderBin", new SGClipGroup::ClipRenderBin);
+struct SGClipGroup::ClipBinRegistrar
+{
+    ClipBinRegistrar()
+    {
+        osgUtil::RenderBin
+            ::addRenderBinPrototype("ClipRenderBin",
+                                    new SGClipGroup::ClipRenderBin);
+    }
+    static ClipBinRegistrar registrar;
+};
+
+SGClipGroup::ClipBinRegistrar SGClipGroup::ClipBinRegistrar::registrar;
 
 class SGClipGroup::CullCallback : public osg::NodeCallback {
 public:
@@ -94,11 +108,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()
 {
@@ -106,6 +122,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
 {