Skip to content

Commit e660932

Browse files
committed
The render target image for the overlay is now handled by the rhiSceneView. Fixed problem where recording with opengl backend did not stop.
1 parent 0e1251c commit e660932

5 files changed

Lines changed: 61 additions & 29 deletions

File tree

FEBioStudio/GLView.cpp

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,47 +1625,51 @@ void CGLView::RenderScene(GLRenderEngine& re)
16251625

16261626
RenderDecorations(re);
16271627

1628-
RenderOverlay(re, rc);
1629-
1630-
if (m_recorder.IsRecording() && !m_stopRequested)
1628+
if (m_recorder.IsRecording())
16311629
{
1632-
rhiRenderer* rhiRender = dynamic_cast<rhiRenderer*>(&re);
1633-
if (rhiRender)
1630+
if (!m_stopRequested)
16341631
{
1635-
frameCapturesRequested++;
1636-
rhiRender->setCaptureNextFrame(true);
1632+
rhiRenderer* rhiRender = dynamic_cast<rhiRenderer*>(&re);
1633+
if (rhiRender)
1634+
{
1635+
frameCapturesRequested++;
1636+
rhiRender->setCaptureNextFrame(true);
1637+
}
1638+
}
1639+
else if (frameCapturesRequested <= 0)
1640+
{
1641+
m_recorder.Stop();
1642+
m_stopRequested = false;
1643+
UnlockSafeFrame();
1644+
m_pWnd->UpdateTitle();
16371645
}
16381646
}
1639-
}
16401647

1641-
void CGLView::RenderOverlay(GLRenderEngine& re, GLContext& rc)
1642-
{
16431648
rhiRenderer* rhiRender = dynamic_cast<rhiRenderer*>(&re);
16441649
if (rhiRender == nullptr) return;
16451650
rhiRender->useOverlayImage(renderOverlay);
1646-
if (!renderOverlay) return;
1647-
1648-
// Create the overlay image that we'll paint in
1649-
QImage img(rhiRender->pixelSize(), QImage::Format_RGBA8888);
1650-
img.fill(QColor(255, 255, 255, 0));
1651-
QPainter painter(&img);
1652-
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
1651+
}
16531652

1653+
void CGLView::RenderOverlay(GLRenderEngine& re, QPainter& painter)
1654+
{
16541655
// compose the overlay image
16551656
RenderOverlayComponents(painter);
16561657

1657-
// all done with drawing
1658-
painter.end();
1659-
16601658
// the triad requires a bit of special handling
1661-
QRhiViewport vp = { (float)m_ptriad->x(), (float)m_ptriad->y(), (float)m_ptriad->w(), (float)m_ptriad->h() };
1662-
quatd q = rc.m_cam->GetOrientation();
1663-
QMatrix4x4 Q; Q.rotate(QQuaternion(q.w, q.x, q.y, q.z));
1664-
m_ptriad->setOrientation(q);
1665-
rhiRender->setTriadInfo(Q, vp);
1666-
1667-
// all done, send it to the renderer
1668-
rhiRender->setOverlayImage(img);
1659+
rhiRenderer* rhiRender = dynamic_cast<rhiRenderer*>(&re);
1660+
if (rhiRender)
1661+
{
1662+
GLScene* scene = GetActiveScene();
1663+
if (scene == nullptr) return;
1664+
1665+
GLCamera& cam = scene->GetCamera();
1666+
1667+
QRhiViewport vp = { (float)m_ptriad->x(), (float)m_ptriad->y(), (float)m_ptriad->w(), (float)m_ptriad->h() };
1668+
quatd q = cam.GetOrientation();
1669+
QMatrix4x4 Q; Q.rotate(QQuaternion(q.w, q.x, q.y, q.z));
1670+
m_ptriad->setOrientation(q);
1671+
rhiRender->setTriadInfo(Q, vp);
1672+
}
16691673
}
16701674

16711675
void CGLView::RenderOverlayComponents(QPainter& painter)

FEBioStudio/GLView.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,8 @@ class CGLView : public rhiSceneView
205205
void onFrameFinished() override;
206206

207207
private: // overlay rendering
208-
void RenderOverlay(GLRenderEngine& re, GLContext& rc);
208+
void RenderOverlay(GLRenderEngine& re, QPainter& painter) override;
209+
209210
void RenderOverlayComponents(QPainter& painter);
210211
void RenderTags(QPainter& painter);
211212
void RenderDecorations(GLRenderEngine& re);

RHILib/rhiRenderer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ class rhiRenderer : public QObject, public GLRenderEngine
154154
public:
155155
void setOverlayImage(const QImage& img);
156156
void useOverlayImage(bool b);
157+
bool useOverlayImage() const { return m_useOverlay; }
157158

158159
double getFPS() const { return timing.m_fps; }
159160
void showFPS(bool b);

RHILib/rhiSceneView.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,23 @@ void rhiSceneView::customRender()
6262

6363
RenderScene(*m_rhiRender);
6464

65+
if (m_rhiRender->useOverlayImage())
66+
{
67+
// Create the overlay image that we'll paint in
68+
QImage img(m_rhiRender->pixelSize(), QImage::Format_RGBA8888);
69+
img.fill(QColor(255, 255, 255, 0));
70+
QPainter painter(&img);
71+
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
72+
73+
RenderOverlay(*m_rhiRender, painter);
74+
75+
// all done with drawing
76+
painter.end();
77+
78+
// all done, send it to the renderer
79+
m_rhiRender->setOverlayImage(img);
80+
}
81+
6582
m_rhiRender->finish();
6683
}
6784

@@ -89,6 +106,11 @@ void rhiSceneView::RenderScene(GLRenderEngine& re)
89106
}
90107
}
91108

109+
void rhiSceneView::RenderOverlay(GLRenderEngine& re, QPainter& painter)
110+
{
111+
112+
}
113+
92114
void rhiSceneView::ShowFPS(bool b)
93115
{
94116
if (m_rhiRender) m_rhiRender->showFPS(b);

RHILib/rhiSceneView.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ SOFTWARE.*/
3030
#include <GLWLib/GLTriad.h>
3131
#include <GLLib/GLScene.h>
3232

33+
class QPainter;
34+
3335
class rhiSceneView : public RhiWindow
3436
{
3537
public:
@@ -41,6 +43,8 @@ class rhiSceneView : public RhiWindow
4143

4244
virtual void RenderScene(GLRenderEngine& re);
4345

46+
virtual void RenderOverlay(GLRenderEngine& re, QPainter& painter);
47+
4448
const GLRenderEngine* GetRenderEngine() { return m_rhiRender; }
4549

4650
void ShowFPS(bool b);

0 commit comments

Comments
 (0)