forked from teamnwah/openmw-tes3coop
Fix applying of plane height in ClipCullNode (Fixes #2985)
This commit is contained in:
parent
3f988327c7
commit
0348b8df1c
1 changed files with 12 additions and 8 deletions
|
@ -145,14 +145,18 @@ class ClipCullNode : public osg::Group
|
|||
|
||||
osg::RefMatrix* modelViewMatrix = new osg::RefMatrix(*cv->getModelViewMatrix());
|
||||
|
||||
// move the plane back along its normal a little bit to prevent bleeding at the water shore
|
||||
const float clipFudge = -5;
|
||||
// now apply the height of the plane
|
||||
// we can't apply this height in the addClipPlane() since the "flip the below graph" function would otherwise flip the height as well
|
||||
float translate = clipFudge + ((*mCullPlane)[3] * -1);
|
||||
modelViewMatrix->preMultTranslate(mCullPlane->getNormal() * translate);
|
||||
|
||||
// flip the below graph if the eye point is above the plane
|
||||
if (mCullPlane->intersect(osg::BoundingSphere(osg::Vec3d(0,0,eyePoint.z()), 0)) > 0)
|
||||
{
|
||||
modelViewMatrix->preMultScale(osg::Vec3(1,1,-1));
|
||||
}
|
||||
// move the plane back along its normal a little bit to prevent bleeding at the water shore
|
||||
const float clipFudge = 5;
|
||||
modelViewMatrix->preMultTranslate(mCullPlane->getNormal() * (-clipFudge));
|
||||
|
||||
cv->pushModelViewMatrix(modelViewMatrix, osg::Transform::RELATIVE_RF);
|
||||
traverse(node, nv);
|
||||
|
@ -168,7 +172,7 @@ public:
|
|||
{
|
||||
addCullCallback (new PlaneCullCallback(&mPlane));
|
||||
|
||||
mClipNodeTransform = new osg::PositionAttitudeTransform;
|
||||
mClipNodeTransform = new osg::Group;
|
||||
mClipNodeTransform->addCullCallback(new FlipCallback(&mPlane));
|
||||
addChild(mClipNodeTransform);
|
||||
|
||||
|
@ -184,12 +188,12 @@ public:
|
|||
mPlane = plane;
|
||||
|
||||
mClipNode->getClipPlaneList().clear();
|
||||
mClipNode->addClipPlane(new osg::ClipPlane(0, mPlane));
|
||||
mClipNode->addClipPlane(new osg::ClipPlane(0, osg::Plane(mPlane.getNormal(), 0))); // mPlane.d() applied in FlipCallback
|
||||
mClipNode->setStateSetModes(*getOrCreateStateSet(), osg::StateAttribute::ON);
|
||||
}
|
||||
|
||||
private:
|
||||
osg::ref_ptr<osg::PositionAttitudeTransform> mClipNodeTransform;
|
||||
osg::ref_ptr<osg::Group> mClipNodeTransform;
|
||||
osg::ref_ptr<osg::ClipNode> mClipNode;
|
||||
|
||||
osg::Plane mPlane;
|
||||
|
@ -205,7 +209,7 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/// Moves water mesh away from the camera slightly if the camera gets to close on the Z axis.
|
||||
/// Moves water mesh away from the camera slightly if the camera gets too close on the Z axis.
|
||||
/// The offset works around graphics artifacts that occured with the GL_DEPTH_CLAMP when the camera gets extremely close to the mesh (seen on NVIDIA at least).
|
||||
/// Must be added as a Cull callback.
|
||||
class FudgeCallback : public osg::NodeCallback
|
||||
|
@ -215,7 +219,7 @@ public:
|
|||
{
|
||||
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(nv);
|
||||
|
||||
const float fudge = 0.1;
|
||||
const float fudge = 0.2;
|
||||
if (std::abs(cv->getEyeLocal().z()) < fudge)
|
||||
{
|
||||
float diff = fudge - cv->getEyeLocal().z();
|
||||
|
|
Loading…
Reference in a new issue