Skip to content

Commit 46cb3dc

Browse files
Merge branch 'main' into remove_mu_print_redirect
2 parents dd4d3a0 + 535b9cc commit 46cb3dc

File tree

3 files changed

+257
-45
lines changed

3 files changed

+257
-45
lines changed

src/lib/app/RvApp/CommandsModule.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -550,20 +550,25 @@ namespace Rv
550550
d->width() - m.left - m.right, d->height() - m.bottom - m.top, 4,
551551
TwkFB::FrameBuffer::UCHAR);
552552

553-
const ImageRenderer::GLFBO* fbo =
554-
renderer->newOutputOnlyImageFBO(GL_RGBA8)->fbo();
553+
// Get current framebuffer id.
554+
GLuint qtDefaultFBO;
555+
glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, (GLint*)&qtDefaultFBO);
556+
555557
renderer->render(s->currentFrame(), s->displayImage());
556558

557559
glFinish();
558560

561+
// Ensure we're reading from Qt's default framebuffer.
562+
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, d->fboID());
563+
559564
glReadPixels(m.left, m.bottom, d->width() - m.left - m.right,
560565
d->height() - m.bottom - m.top, GL_RGBA, GL_UNSIGNED_BYTE,
561566
fb->pixels<unsigned char>());
562567

563568
glFinish();
564569

565-
fbo->unbind();
566-
renderer->releaseImageFBO(fbo);
570+
// Restore original framebuffer.
571+
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, qtDefaultFBO);
567572

568573
TwkFB::FrameBufferIO::WriteRequest request;
569574
TwkFB::FrameBufferIO::ConstFrameBufferVector fbs(1);

src/lib/ip/IPMu/CommandsModule.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1805,6 +1805,49 @@ namespace IPMu
18051805
NODE_RETURN(mp);
18061806
}
18071807

1808+
NODE_IMPLEMENTATION(ndc2event, Mu::Vector2f)
1809+
{
1810+
// Convert from Normalized Device Coordinates (NDC) space [-1, 1] to
1811+
// event space coordinates.
1812+
// This bypasses image transforms and works purely in viewport space.
1813+
// Height spans 2 NDC units, and assumes the viewport fully contains the
1814+
// height of the image (eg: has vertical bars, no horizontal bars).
1815+
//
1816+
// When that is not the case (eg: we have horizontal bars) the
1817+
// scale of the drawing end up not being "quite" the same, but, since
1818+
// this functionality (at least for now) is purely to test concurrent
1819+
// annotation drawing on multiple computers in live review scenarios,
1820+
// this doesn't matter one bit.
1821+
//
1822+
Session* s = Session::currentSession();
1823+
Vector2f inp = NODE_ARG(0, Vector2f);
1824+
float x = inp[0];
1825+
float y = inp[1];
1826+
1827+
Vector2f mp;
1828+
try
1829+
{
1830+
Box2f vp = s->renderer()->viewport();
1831+
float vpWidth = vp.size().x;
1832+
float vpHeight = vp.size().y;
1833+
// Map from NDC space to viewport space using the smaller dimension
1834+
// This ensures square coordinate space regardless of viewport
1835+
// aspect ratio
1836+
float minDimension = min(vpWidth, vpHeight);
1837+
mp[0] = (x + 1.0f) * 0.5f * minDimension + vp.min.x
1838+
+ (vpWidth - minDimension) * 0.5f;
1839+
mp[1] = (y + 1.0f) * 0.5f * minDimension + vp.min.y
1840+
+ (vpHeight - minDimension) * 0.5f;
1841+
}
1842+
catch (...)
1843+
{
1844+
// If viewport is not available, return the input coordinates
1845+
mp[0] = x;
1846+
mp[1] = y;
1847+
}
1848+
NODE_RETURN(mp);
1849+
}
1850+
18081851
NODE_IMPLEMENTATION(imagesAtPixel, Pointer)
18091852
{
18101853
Process* p = NODE_THREAD.process();
@@ -6083,6 +6126,10 @@ namespace IPMu
60836126
new Param(c, "sourceName", "string"),
60846127
new Param(c, "point", "vector float[2]"), End),
60856128

6129+
new Function(c, "ndcToEventSpace", ndc2event, None, Return,
6130+
"vector float[2]", Parameters,
6131+
new Param(c, "point", "vector float[2]"), End),
6132+
60866133
new Function(c, "imagesAtPixel", imagesAtPixel, None, Return,
60876134
"PixelImageInfo[]", Parameters,
60886135
new Param(c, "point", "vector float[2]"),

0 commit comments

Comments
 (0)