X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmodel%2FSGClipGroup.cxx;h=6d2ab7f1920de92c138774f29120f23de8babad8;hb=32a6bd78d8bf143f40922f1a0bc7a88ea7706a7d;hp=fdf9305ae1a3af3f9ee3f95237712d06da58a909;hpb=37c4dcf8ba1b790dd63a93b62ed0c41d8f1fe18b;p=simgear.git diff --git a/simgear/scene/model/SGClipGroup.cxx b/simgear/scene/model/SGClipGroup.cxx index fdf9305a..6d2ab7f1 100644 --- a/simgear/scene/model/SGClipGroup.cxx +++ b/simgear/scene/model/SGClipGroup.cxx @@ -19,6 +19,10 @@ * */ +#ifdef HAVE_CONFIG_H +# include +#endif + #include "SGClipGroup.hxx" #include @@ -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 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(sa)); + } +} + osg::BoundingSphere SGClipGroup::computeBound() const {