Skip to content

Commit 4c21280

Browse files
committed
PenLayer: Fix pen lines after stamping
1 parent 81dc992 commit 4c21280

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

src/penlayer.cpp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,13 @@ void PenLayer::setEngine(libscratchcpp::IEngine *newEngine)
119119
void PenLayer::beginFrame()
120120
{
121121
m_fbo->bind();
122-
m_painter->beginFrame(m_fbo->width(), m_fbo->height());
122+
beginPainterFrame();
123+
m_frameChanged = false;
123124
}
124125

125126
void PenLayer::endFrame()
126127
{
127-
m_painter->endFrame();
128+
endPainterFrame();
128129
m_fbo->release();
129130
}
130131

@@ -149,6 +150,13 @@ void scratchcpprender::PenLayer::clear()
149150
return;
150151

151152
Q_ASSERT(m_fbo->isBound());
153+
154+
if (m_frameChanged) {
155+
endPainterFrame();
156+
beginPainterFrame();
157+
m_frameChanged = false;
158+
}
159+
152160
m_glF->glDisable(GL_SCISSOR_TEST);
153161
m_glF->glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
154162
m_glF->glClear(GL_COLOR_BUFFER_BIT);
@@ -210,6 +218,7 @@ void scratchcpprender::PenLayer::drawLine(const PenAttributes &penAttributes, do
210218

211219
m_textureDirty = true;
212220
m_boundsDirty = true;
221+
m_frameChanged = true;
213222
update();
214223
}
215224

@@ -220,6 +229,9 @@ void PenLayer::stamp(IRenderedTarget *target)
220229

221230
Q_ASSERT(m_fbo->isBound());
222231

232+
if (m_frameChanged)
233+
endPainterFrame();
234+
223235
m_glF->glDisable(GL_SCISSOR_TEST);
224236
m_glF->glDisable(GL_DEPTH_TEST);
225237

@@ -234,6 +246,11 @@ void PenLayer::stamp(IRenderedTarget *target)
234246
m_glF->glEnable(GL_SCISSOR_TEST);
235247
m_glF->glEnable(GL_DEPTH_TEST);
236248

249+
if (m_frameChanged) {
250+
beginPainterFrame();
251+
m_frameChanged = false;
252+
}
253+
237254
m_textureDirty = true;
238255
m_boundsDirty = true;
239256
update();
@@ -415,6 +432,17 @@ void PenLayer::geometryChange(const QRectF &newGeometry, const QRectF &oldGeomet
415432
QNanoQuickItem::geometryChange(newGeometry, oldGeometry);
416433
}
417434

435+
void PenLayer::beginPainterFrame()
436+
{
437+
m_painter->beginFrame(m_fbo->width(), m_fbo->height());
438+
}
439+
440+
void PenLayer::endPainterFrame()
441+
{
442+
m_glF->glViewport(0, 0, m_fbo->width(), m_fbo->height());
443+
m_painter->endFrame();
444+
}
445+
418446
void PenLayer::updateTexture()
419447
{
420448
if (!m_fbo)

src/penlayer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class PenLayer : public IPenLayer
6464
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
6565

6666
private:
67+
void beginPainterFrame();
68+
void endPainterFrame();
6769
void updateTexture();
6870

6971
static std::unordered_map<libscratchcpp::IEngine *, IPenLayer *> m_projectPenLayers;
@@ -83,6 +85,7 @@ class PenLayer : public IPenLayer
8385
mutable libscratchcpp::Rect m_bounds;
8486
GLuint m_vbo = 0;
8587
GLuint m_vao = 0;
88+
bool m_frameChanged = false;
8689
};
8790

8891
} // namespace scratchcpprender

0 commit comments

Comments
 (0)