Skip to content

Commit

Permalink
Add skin size uniform
Browse files Browse the repository at this point in the history
  • Loading branch information
adazem009 committed Oct 27, 2024
1 parent ca7ab44 commit 4045e25
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 20 deletions.
2 changes: 1 addition & 1 deletion src/penlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ void PenLayer::stamp(IRenderedTarget *target)
m_glF->glBindVertexArray(m_vao);
m_glF->glActiveTexture(GL_TEXTURE0);
m_glF->glBindTexture(GL_TEXTURE_2D, texture.handle());
shaderManager->setUniforms(shaderProgram, 0, effects); // set texture and effect uniforms
shaderManager->setUniforms(shaderProgram, 0, texture.size(), effects); // set texture and effect uniforms
m_glF->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

m_painter->endFrame();
Expand Down
6 changes: 5 additions & 1 deletion src/shadermanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ static const QString SHADER_PREFIX = "#version 140\n";
#endif

static const char *TEXTURE_UNIT_UNIFORM = "u_skin";
static const char *SKIN_SIZE_UNIFORM = "u_skinSize";

static const std::unordered_map<ShaderManager::Effect, const char *> EFFECT_TO_NAME = {
{ ShaderManager::Effect::Color, "color" },
Expand Down Expand Up @@ -146,11 +147,14 @@ void ShaderManager::getUniformValuesForEffects(const std::unordered_map<Effect,
}
}

void ShaderManager::setUniforms(QOpenGLShaderProgram *program, int textureUnit, const std::unordered_map<Effect, double> &effectValues)
void ShaderManager::setUniforms(QOpenGLShaderProgram *program, int textureUnit, const QSize skinSize, const std::unordered_map<Effect, double> &effectValues)
{
// Set the texture unit
program->setUniformValue(TEXTURE_UNIT_UNIFORM, textureUnit);

// Set skin size
program->setUniformValue(SKIN_SIZE_UNIFORM, QVector2D(skinSize.width(), skinSize.height()));

// Set uniform values
std::unordered_map<Effect, float> values;
getUniformValuesForEffects(effectValues, values);
Expand Down
5 changes: 3 additions & 2 deletions src/shadermanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ class ShaderManager : public QObject
Brightness = 1 << 1,
Ghost = 1 << 2,
Fisheye = 1 << 3,
Whirl = 1 << 4
Whirl = 1 << 4,
Pixelate = 1 << 5
};

explicit ShaderManager(QObject *parent = nullptr);
Expand All @@ -29,7 +30,7 @@ class ShaderManager : public QObject

QOpenGLShaderProgram *getShaderProgram(const std::unordered_map<Effect, double> &effectValues);
static void getUniformValuesForEffects(const std::unordered_map<Effect, double> &effectValues, std::unordered_map<Effect, float> &dst);
void setUniforms(QOpenGLShaderProgram *program, int textureUnit, const std::unordered_map<Effect, double> &effectValues);
void setUniforms(QOpenGLShaderProgram *program, int textureUnit, const QSize skinSize, const std::unordered_map<Effect, double> &effectValues);

private:
struct Registrar
Expand Down
2 changes: 1 addition & 1 deletion src/targetpainter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ void TargetPainter::paint(QNanoPainter *painter)
glF.glBindVertexArray(VAO);
glF.glActiveTexture(GL_TEXTURE0);
glF.glBindTexture(GL_TEXTURE_2D, texture.handle());
shaderManager->setUniforms(shaderProgram, 0, effects); // set texture and effect uniforms
shaderManager->setUniforms(shaderProgram, 0, m_target->cpuTexture().size(), effects); // set texture and effect uniforms
glF.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// Process the resulting texture
Expand Down
30 changes: 15 additions & 15 deletions test/shadermanager/shadermanager_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ TEST_F(ShaderManagerTest, SetUniforms)
std::unordered_map<ShaderManager::Effect, double> effects = { { ShaderManager::Effect::Color, 64.9 }, { ShaderManager::Effect::Ghost, 12.5 } };
QOpenGLShaderProgram *program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 4, effects);
manager.setUniforms(program, 4, QSize(), effects);

GLint texUnit = -1;
glF.glGetUniformiv(program->programId(), program->uniformLocation("u_skin"), &texUnit);
Expand Down Expand Up @@ -132,7 +132,7 @@ TEST_F(ShaderManagerTest, ColorEffectValue)
std::unordered_map<ShaderManager::Effect, double> effects = { { effect, 64.9 } };
QOpenGLShaderProgram *program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

GLfloat value = 0.0f;
Expand All @@ -144,7 +144,7 @@ TEST_F(ShaderManagerTest, ColorEffectValue)
effects[effect] = -395.7;
program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

value = 0.0f;
Expand All @@ -156,7 +156,7 @@ TEST_F(ShaderManagerTest, ColorEffectValue)
effects[effect] = 579.05;
program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

value = 0.0f;
Expand All @@ -183,7 +183,7 @@ TEST_F(ShaderManagerTest, BrightnessEffectValue)
std::unordered_map<ShaderManager::Effect, double> effects = { { effect, 4.6 } };
QOpenGLShaderProgram *program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

GLfloat value = 0.0f;
Expand All @@ -195,7 +195,7 @@ TEST_F(ShaderManagerTest, BrightnessEffectValue)
effects[effect] = -102.9;
program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

value = 0.0f;
Expand All @@ -207,7 +207,7 @@ TEST_F(ShaderManagerTest, BrightnessEffectValue)
effects[effect] = 353.2;
program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

value = 0.0f;
Expand All @@ -234,7 +234,7 @@ TEST_F(ShaderManagerTest, GhostEffectValue)
std::unordered_map<ShaderManager::Effect, double> effects = { { effect, 58.5 } };
QOpenGLShaderProgram *program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

GLfloat value = 0.0f;
Expand All @@ -245,7 +245,7 @@ TEST_F(ShaderManagerTest, GhostEffectValue)
// Below the minimum
effects[effect] = -20.8;
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

value = 0.0f;
Expand All @@ -256,7 +256,7 @@ TEST_F(ShaderManagerTest, GhostEffectValue)
// Above the maximum
effects[effect] = 248.2;
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

value = 0.0f;
Expand All @@ -283,7 +283,7 @@ TEST_F(ShaderManagerTest, FisheyeEffectValue)
std::unordered_map<ShaderManager::Effect, double> effects = { { effect, 58.5 } };
QOpenGLShaderProgram *program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

GLfloat value = 0.0f;
Expand All @@ -293,7 +293,7 @@ TEST_F(ShaderManagerTest, FisheyeEffectValue)

effects[effect] = -20.8;
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

value = 0.0f;
Expand All @@ -304,7 +304,7 @@ TEST_F(ShaderManagerTest, FisheyeEffectValue)
// Below the minimum
effects[effect] = -101;
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

value = 0.0f;
Expand All @@ -331,7 +331,7 @@ TEST_F(ShaderManagerTest, WhirlEffectValue)
std::unordered_map<ShaderManager::Effect, double> effects = { { effect, 58.5 } };
QOpenGLShaderProgram *program = manager.getShaderProgram(effects);
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

GLfloat value = 0.0f;
Expand All @@ -341,7 +341,7 @@ TEST_F(ShaderManagerTest, WhirlEffectValue)

effects[effect] = -20.8;
program->bind();
manager.setUniforms(program, 0, effects);
manager.setUniforms(program, 0, QSize(), effects);
manager.getUniformValuesForEffects(effects, values);

value = 0.0f;
Expand Down
3 changes: 3 additions & 0 deletions test/targetpainter/targetpainter_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ TEST_F(TargetPainterTest, Paint)
Texture texture(refFbo.texture(), refFbo.size());
std::unordered_map<ShaderManager::Effect, double> effects;
EXPECT_CALL(target, texture()).WillOnce(Return(texture));
EXPECT_CALL(target, cpuTexture()).WillOnce(ReturnRef(texture));
EXPECT_CALL(target, graphicEffects()).WillOnce(ReturnRef(effects));
targetPainter.paint(&painter);
painter.endFrame();
Expand All @@ -95,6 +96,7 @@ TEST_F(TargetPainterTest, Paint)
effects[ShaderManager::Effect::Brightness] = 20;
effects[ShaderManager::Effect::Ghost] = 84;
EXPECT_CALL(target, texture()).WillOnce(Return(texture));
EXPECT_CALL(target, cpuTexture()).WillOnce(ReturnRef(texture));
EXPECT_CALL(target, graphicEffects()).WillOnce(ReturnRef(effects));
targetPainter.paint(&painter);
painter.endFrame();
Expand All @@ -112,6 +114,7 @@ TEST_F(TargetPainterTest, Paint)
/*effects[ShaderManager::Effect::Pixelate] = 25;
effects[ShaderManager::Effect::Mosaic] = 30;*/
EXPECT_CALL(target, texture()).WillOnce(Return(texture));
EXPECT_CALL(target, cpuTexture()).WillOnce(ReturnRef(texture));
EXPECT_CALL(target, graphicEffects()).WillOnce(ReturnRef(effects));
targetPainter.paint(&painter);
painter.endFrame();
Expand Down

0 comments on commit 4045e25

Please sign in to comment.