Skip to content

Commit 71ddc53

Browse files
committed
Add graphic effect API to RenderedTarget
1 parent f5d4508 commit 71ddc53

File tree

5 files changed

+79
-0
lines changed

5 files changed

+79
-0
lines changed

src/irenderedtarget.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include <qnanoquickitem.h>
77
#include <scratchcpp/sprite.h>
88

9+
#include "shadermanager.h"
10+
911
class QBuffer;
1012
class QNanoPainter;
1113
class QOpenGLContext;
@@ -75,6 +77,10 @@ class IRenderedTarget : public QNanoQuickItem
7577

7678
virtual Texture texture() const = 0;
7779

80+
virtual const std::unordered_map<ShaderManager::Effect, double> &graphicEffects() const = 0;
81+
virtual void setGraphicEffect(ShaderManager::Effect effect, double value) = 0;
82+
virtual void clearGraphicEffects() = 0;
83+
7884
virtual void updateHullPoints(QOpenGLFramebufferObject *fbo) = 0;
7985
virtual const std::vector<QPointF> &hullPoints() const = 0;
8086
};

src/renderedtarget.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,42 @@ Texture RenderedTarget::texture() const
425425
return m_texture;
426426
}
427427

428+
const std::unordered_map<ShaderManager::Effect, double> &RenderedTarget::graphicEffects() const
429+
{
430+
return m_graphicEffects;
431+
}
432+
433+
void RenderedTarget::setGraphicEffect(ShaderManager::Effect effect, double value)
434+
{
435+
bool changed = false;
436+
auto it = m_graphicEffects.find(effect);
437+
438+
if (value == 0) {
439+
if (it != m_graphicEffects.cend()) {
440+
changed = true;
441+
m_graphicEffects.erase(effect);
442+
}
443+
} else {
444+
if (it != m_graphicEffects.cend())
445+
changed = it->second != value;
446+
else
447+
changed = true;
448+
449+
m_graphicEffects[effect] = value;
450+
}
451+
452+
if (changed)
453+
update();
454+
}
455+
456+
void RenderedTarget::clearGraphicEffects()
457+
{
458+
if (!m_graphicEffects.empty())
459+
update();
460+
461+
m_graphicEffects.clear();
462+
}
463+
428464
void RenderedTarget::updateHullPoints(QOpenGLFramebufferObject *fbo)
429465
{
430466
if (m_stageModel)

src/renderedtarget.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ class RenderedTarget : public IRenderedTarget
8282

8383
Texture texture() const override;
8484

85+
const std::unordered_map<ShaderManager::Effect, double> &graphicEffects() const override;
86+
void setGraphicEffect(ShaderManager::Effect effect, double value) override;
87+
void clearGraphicEffects() override;
88+
8589
void updateHullPoints(QOpenGLFramebufferObject *fbo) override;
8690
const std::vector<QPointF> &hullPoints() const override;
8791

@@ -119,6 +123,7 @@ class RenderedTarget : public IRenderedTarget
119123
Skin *m_skin = nullptr;
120124
Texture m_texture;
121125
Texture m_oldTexture;
126+
std::unordered_map<ShaderManager::Effect, double> m_graphicEffects;
122127
double m_size = 1;
123128
double m_x = 0;
124129
double m_y = 0;

test/mocks/renderedtargetmock.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ class RenderedTargetMock : public IRenderedTarget
6161

6262
MOCK_METHOD(Texture, texture, (), (const, override));
6363

64+
MOCK_METHOD((const std::unordered_map<ShaderManager::Effect, double> &), graphicEffects, (), (const, override));
65+
MOCK_METHOD(void, setGraphicEffect, (ShaderManager::Effect effect, double value), (override));
66+
MOCK_METHOD(void, clearGraphicEffects, (), (override));
67+
6468
MOCK_METHOD(void, updateHullPoints, (QOpenGLFramebufferObject *), (override));
6569
MOCK_METHOD(const std::vector<QPointF> &, hullPoints, (), (const, override));
6670

test/renderedtarget/renderedtarget_test.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,34 @@ TEST_F(RenderedTargetTest, StageScale)
556556
ASSERT_EQ(target.stageScale(), 6.4);
557557
}
558558

559+
TEST_F(RenderedTargetTest, GraphicEffects)
560+
{
561+
RenderedTarget target;
562+
ASSERT_TRUE(target.graphicEffects().empty());
563+
564+
target.setGraphicEffect(ShaderManager::Effect::Color, 23.5);
565+
target.setGraphicEffect(ShaderManager::Effect::Ghost, 95.7);
566+
std::unordered_map<ShaderManager::Effect, double> expected;
567+
expected[ShaderManager::Effect::Color] = 23.5;
568+
expected[ShaderManager::Effect::Ghost] = 95.7;
569+
ASSERT_EQ(target.graphicEffects(), expected);
570+
571+
target.setGraphicEffect(ShaderManager::Effect::Color, 0);
572+
expected.erase(ShaderManager::Effect::Color);
573+
ASSERT_EQ(target.graphicEffects(), expected);
574+
575+
target.setGraphicEffect(ShaderManager::Effect::Ghost, 0.5);
576+
expected[ShaderManager::Effect::Ghost] = 0.5;
577+
ASSERT_EQ(target.graphicEffects(), expected);
578+
579+
target.setGraphicEffect(ShaderManager::Effect::Brightness, -150.7);
580+
expected[ShaderManager::Effect::Brightness] = -150.7;
581+
ASSERT_EQ(target.graphicEffects(), expected);
582+
583+
target.clearGraphicEffects();
584+
ASSERT_TRUE(target.graphicEffects().empty());
585+
}
586+
559587
TEST_F(RenderedTargetTest, GetBounds)
560588
{
561589
QOpenGLContext context;

0 commit comments

Comments
 (0)