mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 07:56:38 +00:00 
			
		
		
		
	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()); |             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
 |             // 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) |             if (mCullPlane->intersect(osg::BoundingSphere(osg::Vec3d(0,0,eyePoint.z()), 0)) > 0) | ||||||
|             { |             { | ||||||
|                 modelViewMatrix->preMultScale(osg::Vec3(1,1,-1)); |                 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); |             cv->pushModelViewMatrix(modelViewMatrix, osg::Transform::RELATIVE_RF); | ||||||
|             traverse(node, nv); |             traverse(node, nv); | ||||||
|  | @ -168,7 +172,7 @@ public: | ||||||
|     { |     { | ||||||
|         addCullCallback (new PlaneCullCallback(&mPlane)); |         addCullCallback (new PlaneCullCallback(&mPlane)); | ||||||
| 
 | 
 | ||||||
|         mClipNodeTransform = new osg::PositionAttitudeTransform; |         mClipNodeTransform = new osg::Group; | ||||||
|         mClipNodeTransform->addCullCallback(new FlipCallback(&mPlane)); |         mClipNodeTransform->addCullCallback(new FlipCallback(&mPlane)); | ||||||
|         addChild(mClipNodeTransform); |         addChild(mClipNodeTransform); | ||||||
| 
 | 
 | ||||||
|  | @ -184,12 +188,12 @@ public: | ||||||
|         mPlane = plane; |         mPlane = plane; | ||||||
| 
 | 
 | ||||||
|         mClipNode->getClipPlaneList().clear(); |         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); |         mClipNode->setStateSetModes(*getOrCreateStateSet(), osg::StateAttribute::ON); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     osg::ref_ptr<osg::PositionAttitudeTransform> mClipNodeTransform; |     osg::ref_ptr<osg::Group> mClipNodeTransform; | ||||||
|     osg::ref_ptr<osg::ClipNode> mClipNode; |     osg::ref_ptr<osg::ClipNode> mClipNode; | ||||||
| 
 | 
 | ||||||
|     osg::Plane mPlane; |     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).
 | /// 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.
 | /// Must be added as a Cull callback.
 | ||||||
| class FudgeCallback : public osg::NodeCallback | class FudgeCallback : public osg::NodeCallback | ||||||
|  | @ -215,7 +219,7 @@ public: | ||||||
|     { |     { | ||||||
|         osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(nv); |         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) |         if (std::abs(cv->getEyeLocal().z()) < fudge) | ||||||
|         { |         { | ||||||
|             float diff = fudge - cv->getEyeLocal().z(); |             float diff = fudge - cv->getEyeLocal().z(); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue