disable water effects for spherical screenshots

0.6.3
Miloslav Číž 7 years ago
parent 5698d70806
commit f60840754f

@ -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…
Cancel
Save