mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 07:56:40 +00:00 
			
		
		
		
	disable water effects for spherical screenshots
This commit is contained in:
		
							parent
							
								
									5698d70806
								
							
						
					
					
						commit
						f60840754f
					
				
					 3 changed files with 31 additions and 13 deletions
				
			
		| 
						 | 
					@ -644,7 +644,7 @@ namespace MWRender
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (int j = 0; j < h; ++j)
 | 
					            for (int j = 0; j < h; ++j)
 | 
				
			||||||
                for (int i = 0; i < w; ++i)
 | 
					                for (int i = 0; i < w; ++i)
 | 
				
			||||||
                    dest->setColor(getColorByDirection(smallPlanetCoords(i / ((float) w), j / ((float) h))),i,j);
 | 
					                    dest->setColor(getColorByDirection(sphericalCoords(i / ((float) w), j / ((float) h))),i,j);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        osg::Vec3d cylindricalCoords(double x, double y)
 | 
					        osg::Vec3d cylindricalCoords(double x, double y)
 | 
				
			||||||
| 
						 | 
					@ -766,12 +766,6 @@ namespace MWRender
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            osg::Image *sideImage = s.getImage(i);
 | 
					            osg::Image *sideImage = s.getImage(i);
 | 
				
			||||||
            screenshot(sideImage,w,w,directions[i]);
 | 
					            screenshot(sideImage,w,w,directions[i]);
 | 
				
			||||||
 | 
					 | 
				
			||||||
          //    if (i == 0)
 | 
					 | 
				
			||||||
                //image->allocateImage(resultW,resultH,sideImage->r(),sideImage->getPixelFormat(),sideImage->getDataType());
 | 
					 | 
				
			||||||
                //image->allocateImage(6 * w,w,sideImage->r(),sideImage->getPixelFormat(),sideImage->getDataType());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          //    osg::copyImage(sideImage,0,0,0,sideImage->s(),sideImage->t(),sideImage->r(),image,w * i,0,0);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (mCamera->isFirstPerson())
 | 
					        if (mCamera->isFirstPerson())
 | 
				
			||||||
| 
						 | 
					@ -795,8 +789,6 @@ namespace MWRender
 | 
				
			||||||
          mViewer->getCamera()->getViewMatrix() * osg::Matrixd::rotate(osg::Vec3(0,0,-1),direction)
 | 
					          mViewer->getCamera()->getViewMatrix() * osg::Matrixd::rotate(osg::Vec3(0,0,-1),direction)
 | 
				
			||||||
          );
 | 
					          );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: water reflections have to be transformed as well!!!!!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        rttCamera->setViewport(0, 0, w, h);
 | 
					        rttCamera->setViewport(0, 0, w, h);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        osg::ref_ptr<osg::Texture2D> texture (new osg::Texture2D);
 | 
					        osg::ref_ptr<osg::Texture2D> texture (new osg::Texture2D);
 | 
				
			||||||
| 
						 | 
					@ -823,10 +815,14 @@ namespace MWRender
 | 
				
			||||||
        // at the time this function is called we are in the middle of a frame,
 | 
					        // at the time this function is called we are in the middle of a frame,
 | 
				
			||||||
        // so out of order calls are necessary to get a correct frameNumber for the next frame.
 | 
					        // so out of order calls are necessary to get a correct frameNumber for the next frame.
 | 
				
			||||||
        // refer to the advance() and frame() order in Engine::go()
 | 
					        // refer to the advance() and frame() order in Engine::go()
 | 
				
			||||||
 | 
					        mWater->setEffectsEnabled(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mViewer->eventTraversal();
 | 
					        mViewer->eventTraversal();
 | 
				
			||||||
        mViewer->updateTraversal();
 | 
					        mViewer->updateTraversal();
 | 
				
			||||||
        mViewer->renderingTraversals();
 | 
					        mViewer->renderingTraversals();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mWater->setEffectsEnabled(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        callback->waitTillDone();
 | 
					        callback->waitTillDone();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // now that we've "used up" the current frame, get a fresh framenumber for the next frame() following after the screenshot is completed
 | 
					        // now that we've "used up" the current frame, get a fresh framenumber for the next frame() following after the screenshot is completed
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -207,7 +207,6 @@ osg::ref_ptr<osg::Image> readPngImage (const std::string& file)
 | 
				
			||||||
    return result.getImage();
 | 
					    return result.getImage();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
class Refraction : public osg::Camera
 | 
					class Refraction : public osg::Camera
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
| 
						 | 
					@ -221,7 +220,7 @@ public:
 | 
				
			||||||
        setSmallFeatureCullingPixelSize(Settings::Manager::getInt("small feature culling pixel size", "Water"));
 | 
					        setSmallFeatureCullingPixelSize(Settings::Manager::getInt("small feature culling pixel size", "Water"));
 | 
				
			||||||
        setName("RefractionCamera");
 | 
					        setName("RefractionCamera");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        setCullMask(Mask_Effect|Mask_Scene|Mask_Terrain|Mask_Actor|Mask_ParticleSystem|Mask_Sky|Mask_Sun|Mask_Player|Mask_Lighting);
 | 
					        setupCullMask(true);
 | 
				
			||||||
        setNodeMask(Mask_RenderToTexture);
 | 
					        setNodeMask(Mask_RenderToTexture);
 | 
				
			||||||
        setViewport(0, 0, rttSize, rttSize);
 | 
					        setViewport(0, 0, rttSize, rttSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -262,6 +261,12 @@ public:
 | 
				
			||||||
        attach(osg::Camera::DEPTH_BUFFER, mRefractionDepthTexture);
 | 
					        attach(osg::Camera::DEPTH_BUFFER, mRefractionDepthTexture);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void setupCullMask(bool enabled)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        setCullMask(!enabled ? 0 :
 | 
				
			||||||
 | 
					           Mask_Effect|Mask_Scene|Mask_Terrain|Mask_Actor|Mask_ParticleSystem|Mask_Sky|Mask_Sun|Mask_Player|Mask_Lighting);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void setScene(osg::Node* scene)
 | 
					    void setScene(osg::Node* scene)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (mScene)
 | 
					        if (mScene)
 | 
				
			||||||
| 
						 | 
					@ -304,9 +309,9 @@ public:
 | 
				
			||||||
        setSmallFeatureCullingPixelSize(Settings::Manager::getInt("small feature culling pixel size", "Water"));
 | 
					        setSmallFeatureCullingPixelSize(Settings::Manager::getInt("small feature culling pixel size", "Water"));
 | 
				
			||||||
        setName("ReflectionCamera");
 | 
					        setName("ReflectionCamera");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bool reflectActors = Settings::Manager::getBool("reflect actors", "Water");
 | 
					        mReflectActors = Settings::Manager::getBool("reflect actors", "Water");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        setCullMask(Mask_Effect|Mask_Scene|Mask_Terrain|Mask_ParticleSystem|Mask_Sky|Mask_Player|Mask_Lighting|(reflectActors ? Mask_Actor : 0));
 | 
					        setupCullMask(true);
 | 
				
			||||||
        setNodeMask(Mask_RenderToTexture);
 | 
					        setNodeMask(Mask_RenderToTexture);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        unsigned int rttSize = Settings::Manager::getInt("rtt size", "Water");
 | 
					        unsigned int rttSize = Settings::Manager::getInt("rtt size", "Water");
 | 
				
			||||||
| 
						 | 
					@ -334,6 +339,12 @@ public:
 | 
				
			||||||
        addChild(mClipCullNode);
 | 
					        addChild(mClipCullNode);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void setupCullMask(bool enabled)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        setCullMask(!enabled ? 0 :
 | 
				
			||||||
 | 
					            Mask_Effect|Mask_Scene|Mask_Terrain|Mask_ParticleSystem|Mask_Sky|Mask_Player|Mask_Lighting|(mReflectActors ? Mask_Actor : 0));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void setWaterLevel(float waterLevel)
 | 
					    void setWaterLevel(float waterLevel)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        setViewMatrix(osg::Matrix::scale(1,1,-1) * osg::Matrix::translate(0,0,2 * waterLevel));
 | 
					        setViewMatrix(osg::Matrix::scale(1,1,-1) * osg::Matrix::translate(0,0,2 * waterLevel));
 | 
				
			||||||
| 
						 | 
					@ -357,6 +368,7 @@ private:
 | 
				
			||||||
    osg::ref_ptr<osg::Texture2D> mReflectionTexture;
 | 
					    osg::ref_ptr<osg::Texture2D> mReflectionTexture;
 | 
				
			||||||
    osg::ref_ptr<ClipCullNode> mClipCullNode;
 | 
					    osg::ref_ptr<ClipCullNode> mClipCullNode;
 | 
				
			||||||
    osg::ref_ptr<osg::Node> mScene;
 | 
					    osg::ref_ptr<osg::Node> mScene;
 | 
				
			||||||
 | 
					    bool mReflectActors;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// DepthClampCallback enables GL_DEPTH_CLAMP for the current draw, if supported.
 | 
					/// DepthClampCallback enables GL_DEPTH_CLAMP for the current draw, if supported.
 | 
				
			||||||
| 
						 | 
					@ -697,4 +709,13 @@ void Water::clearRipples()
 | 
				
			||||||
    mSimulation->clear();
 | 
					    mSimulation->clear();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Water::setEffectsEnabled(bool enabled)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					     if (mReflection)
 | 
				
			||||||
 | 
					       mReflection->setupCullMask(enabled); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     if (mRefraction)
 | 
				
			||||||
 | 
					       mRefraction->setupCullMask(enabled); 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,6 +106,7 @@ namespace MWRender
 | 
				
			||||||
        void removeCell(const MWWorld::CellStore* store); ///< remove all emitters in this cell
 | 
					        void removeCell(const MWWorld::CellStore* store); ///< remove all emitters in this cell
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void clearRipples();
 | 
					        void clearRipples();
 | 
				
			||||||
 | 
					        void setEffectsEnabled(bool enabled);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void changeCell(const MWWorld::CellStore* store);
 | 
					        void changeCell(const MWWorld::CellStore* store);
 | 
				
			||||||
        void setHeight(const float height);
 | 
					        void setHeight(const float height);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue