Compositor: fg_Viewport now contains the viewport properties of the specific pass it's being used on

This commit is contained in:
Fernando García Liñán 2021-08-31 18:08:59 +02:00
parent da750c5995
commit 0ee08cfa06
3 changed files with 28 additions and 5 deletions

View File

@ -136,6 +136,7 @@ Compositor::Compositor(osg::View *view,
_viewport(viewport), _viewport(viewport),
_uniforms{ _uniforms{
new osg::Uniform("fg_Viewport", osg::Vec4f()), new osg::Uniform("fg_Viewport", osg::Vec4f()),
new osg::Uniform("fg_PixelSize", osg::Vec2f()),
new osg::Uniform("fg_ViewMatrix", osg::Matrixf()), new osg::Uniform("fg_ViewMatrix", osg::Matrixf()),
new osg::Uniform("fg_ViewMatrixInverse", osg::Matrixf()), new osg::Uniform("fg_ViewMatrixInverse", osg::Matrixf()),
new osg::Uniform("fg_ProjectionMatrix", osg::Matrixf()), new osg::Uniform("fg_ProjectionMatrix", osg::Matrixf()),
@ -217,10 +218,6 @@ Compositor::update(const osg::Matrix &view_matrix,
for (int i = 0; i < SG_TOTAL_BUILTIN_UNIFORMS; ++i) { for (int i = 0; i < SG_TOTAL_BUILTIN_UNIFORMS; ++i) {
osg::ref_ptr<osg::Uniform> u = _uniforms[i]; osg::ref_ptr<osg::Uniform> u = _uniforms[i];
switch (i) { switch (i) {
case SG_UNIFORM_VIEWPORT:
u->set(osg::Vec4f(_viewport->x(), _viewport->y(),
_viewport->width(), _viewport->height()));
break;
case SG_UNIFORM_VIEW_MATRIX: case SG_UNIFORM_VIEW_MATRIX:
u->set(view_matrix); u->set(view_matrix);
break; break;
@ -281,7 +278,10 @@ Compositor::resized()
// viewport size. // viewport size.
for (const auto &pass : _passes) { for (const auto &pass : _passes) {
osg::Camera *camera = pass->camera; osg::Camera *camera = pass->camera;
if (camera && camera->isRenderToTextureCamera() if (!camera)
continue;
if (camera->isRenderToTextureCamera()
&& pass->viewport_width_scale != 0.0f && pass->viewport_width_scale != 0.0f
&& pass->viewport_height_scale != 0.0f) { && pass->viewport_height_scale != 0.0f) {
@ -292,6 +292,17 @@ Compositor::resized()
// Force the OSG rendering backend to handle the new sizes // Force the OSG rendering backend to handle the new sizes
camera->dirtyAttachmentMap(); camera->dirtyAttachmentMap();
} }
// Update the uniforms even if it isn't a RTT camera
osg::Viewport *viewport = camera->getViewport();
_uniforms[SG_UNIFORM_VIEWPORT]->set(
osg::Vec4f(viewport->x(),
viewport->y(),
viewport->width(),
viewport->height()));
_uniforms[Compositor::SG_UNIFORM_PIXEL_SIZE]->set(
osg::Vec2f(1.0f / viewport->width(),
1.0f / viewport->height()));
} }
// Resize buffers that must be a multiple of the screen size // Resize buffers that must be a multiple of the screen size

View File

@ -47,6 +47,7 @@ class Compositor {
public: public:
enum BuiltinUniform { enum BuiltinUniform {
SG_UNIFORM_VIEWPORT = 0, SG_UNIFORM_VIEWPORT = 0,
SG_UNIFORM_PIXEL_SIZE,
SG_UNIFORM_VIEW_MATRIX, SG_UNIFORM_VIEW_MATRIX,
SG_UNIFORM_VIEW_MATRIX_INV, SG_UNIFORM_VIEW_MATRIX_INV,
SG_UNIFORM_PROJECTION_MATRIX, SG_UNIFORM_PROJECTION_MATRIX,

View File

@ -401,6 +401,17 @@ PassBuilder::build(Compositor *compositor, const SGPropertyNode *root,
} }
} }
osg::Viewport *viewport = camera->getViewport();
auto &uniforms = compositor->getBuiltinUniforms();
uniforms[Compositor::SG_UNIFORM_VIEWPORT]->set(
osg::Vec4f(viewport->x(),
viewport->y(),
viewport->width(),
viewport->height()));
uniforms[Compositor::SG_UNIFORM_PIXEL_SIZE]->set(
osg::Vec2f(1.0f / viewport->width(),
1.0f / viewport->height()));
return pass.release(); return pass.release();
} }