1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-06 00:40:04 +00:00
OpenMW/apps/openmw/mwrender/pingpongcull.cpp

84 lines
2.9 KiB
C++
Raw Normal View History

2022-05-13 18:58:00 -07:00
#include "pingpongcull.hpp"
#include <osg/Camera>
#include <osg/FrameBufferObject>
2022-07-02 15:26:35 +00:00
#include <osg/Texture2DArray>
2022-09-22 21:26:05 +03:00
#include <osg/Texture>
2022-05-13 18:58:00 -07:00
#include <osgUtil/CullVisitor>
2022-06-21 15:55:06 +00:00
#include <components/stereo/multiview.hpp>
2022-09-22 21:26:05 +03:00
#include <components/stereo/stereomanager.hpp>
2022-06-21 15:55:06 +00:00
2022-09-22 21:26:05 +03:00
#include "postprocessor.hpp"
2022-05-13 18:58:00 -07:00
namespace MWRender
{
2022-07-02 15:26:35 +00:00
2022-06-21 15:55:06 +00:00
PingPongCull::PingPongCull(PostProcessor* pp)
: mViewportStateset(nullptr)
, mPostProcessor(pp)
{
if (Stereo::getStereo())
{
mViewportStateset = new osg::StateSet();
mViewport = new osg::Viewport;
2022-06-21 15:55:06 +00:00
mViewportStateset->setAttribute(mViewport);
}
}
PingPongCull::~PingPongCull()
{
// Instantiate osg::ref_ptr<> destructor
}
2022-05-13 18:58:00 -07:00
void PingPongCull::operator()(osg::Node* node, osgUtil::CullVisitor* cv)
{
osgUtil::RenderStage* renderStage = cv->getCurrentRenderStage();
size_t frame = cv->getTraversalNumber();
size_t frameId = frame % 2;
2022-06-21 15:55:06 +00:00
if (Stereo::getStereo())
{
auto& sm = Stereo::Manager::instance();
auto view = sm.getEye(cv);
int index = view == Stereo::Eye::Right ? 1 : 0;
auto projectionMatrix = sm.computeEyeProjection(index, true);
mPostProcessor->getStateUpdater()->setProjectionMatrix(projectionMatrix);
2022-06-21 15:55:06 +00:00
}
mPostProcessor->getStateUpdater()->setViewMatrix(cv->getCurrentCamera()->getViewMatrix());
mPostProcessor->getStateUpdater()->setPrevViewMatrix(mLastViewMatrix[0]);
2022-06-21 15:55:06 +00:00
mLastViewMatrix[0] = cv->getCurrentCamera()->getViewMatrix();
mPostProcessor->getStateUpdater()->setEyePos(cv->getEyePoint());
mPostProcessor->getStateUpdater()->setEyeVec(cv->getLookVectorLocal());
2022-05-13 18:58:00 -07:00
if (!mPostProcessor->getFbo(PostProcessor::FBO_Multisample, frameId))
2022-05-13 18:58:00 -07:00
{
renderStage->setFrameBufferObject(mPostProcessor->getFbo(PostProcessor::FBO_Primary, frameId));
2022-05-13 18:58:00 -07:00
}
else
{
2022-09-22 21:26:05 +03:00
renderStage->setMultisampleResolveFramebufferObject(
mPostProcessor->getFbo(PostProcessor::FBO_Primary, frameId));
renderStage->setFrameBufferObject(mPostProcessor->getFbo(PostProcessor::FBO_Multisample, frameId));
2022-07-02 15:26:35 +00:00
2022-09-22 21:26:05 +03:00
// The MultiView patch has a bug where it does not update resolve layers if the resolve framebuffer is
// changed. So we do blit manually in this case
2022-07-02 15:26:35 +00:00
if (Stereo::getMultiview() && !renderStage->getDrawCallback())
Stereo::setMultiviewMSAAResolveCallback(renderStage);
2022-05-13 18:58:00 -07:00
}
2022-06-21 15:55:06 +00:00
if (mViewportStateset)
{
mViewport->setViewport(0, 0, mPostProcessor->renderWidth(), mPostProcessor->renderHeight());
renderStage->setViewport(mViewport);
cv->pushStateSet(mViewportStateset.get());
traverse(node, cv);
cv->popStateSet();
}
else
traverse(node, cv);
2022-05-13 18:58:00 -07:00
}
}