Skip to content

Commit e129996

Browse files
committed
Add getUniformValuesForEffects() method to ShaderManager
1 parent 2357cd4 commit e129996

File tree

3 files changed

+41
-5
lines changed

3 files changed

+41
-5
lines changed

src/shadermanager.cpp

+16-5
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,10 @@ QOpenGLShaderProgram *ShaderManager::getShaderProgram(const std::unordered_map<E
101101
return it->second;
102102
}
103103

104-
void ShaderManager::setUniforms(QOpenGLShaderProgram *program, int textureUnit, const std::unordered_map<Effect, double> &effectValues)
104+
void ShaderManager::getUniformValuesForEffects(const std::unordered_map<Effect, double> &effectValues, std::unordered_map<Effect, float> &dst)
105105
{
106-
// Set the texture unit
107-
program->setUniformValue(TEXTURE_UNIT_UNIFORM, textureUnit);
106+
dst.clear();
108107

109-
// Set the uniform values for the enabled effects and reset the other effects
110108
for (const auto &[effect, name] : EFFECT_TO_NAME) {
111109
const auto it = effectValues.find(effect);
112110
double value;
@@ -117,10 +115,23 @@ void ShaderManager::setUniforms(QOpenGLShaderProgram *program, int textureUnit,
117115
value = it->second;
118116

119117
auto converter = EFFECT_CONVERTER.at(effect);
120-
program->setUniformValue(EFFECT_UNIFORM_NAME.at(effect), converter(value));
118+
dst[effect] = converter(value);
121119
}
122120
}
123121

122+
void ShaderManager::setUniforms(QOpenGLShaderProgram *program, int textureUnit, const std::unordered_map<Effect, double> &effectValues)
123+
{
124+
// Set the texture unit
125+
program->setUniformValue(TEXTURE_UNIT_UNIFORM, textureUnit);
126+
127+
// Set uniform values
128+
std::unordered_map<Effect, float> values;
129+
getUniformValuesForEffects(effectValues, values);
130+
131+
for (const auto &[effect, value] : values)
132+
program->setUniformValue(EFFECT_UNIFORM_NAME.at(effect), value);
133+
}
134+
124135
void ShaderManager::registerEffects()
125136
{
126137
// Register graphic effects in libscratchcpp

src/shadermanager.h

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class ShaderManager : public QObject
2626
static ShaderManager *instance();
2727

2828
QOpenGLShaderProgram *getShaderProgram(const std::unordered_map<Effect, double> &effectValues);
29+
static void getUniformValuesForEffects(const std::unordered_map<Effect, double> &effectValues, std::unordered_map<Effect, float> &dst);
2930
void setUniforms(QOpenGLShaderProgram *program, int textureUnit, const std::unordered_map<Effect, double> &effectValues);
3031

3132
private:

test/shadermanager/shadermanager_test.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ TEST_F(ShaderManagerTest, ColorEffectValue)
179179
static const QString uniformName = "u_" + effectName;
180180
static const ShaderManager::Effect effect = ShaderManager::Effect::Color;
181181

182+
std::unordered_map<ShaderManager::Effect, float> values;
183+
182184
QOpenGLFunctions glF(&m_context);
183185
glF.initializeOpenGLFunctions();
184186
ShaderManager manager;
@@ -190,28 +192,34 @@ TEST_F(ShaderManagerTest, ColorEffectValue)
190192
std::unordered_map<ShaderManager::Effect, double> effects = { { effect, 64.9 } };
191193
program.bind();
192194
manager.setUniforms(&program, 0, effects);
195+
manager.getUniformValuesForEffects(effects, values);
193196

194197
GLfloat value = 0.0f;
195198
glF.glGetUniformfv(program.programId(), program.uniformLocation(uniformName), &value);
196199
ASSERT_EQ(value, 0.3245f);
200+
ASSERT_EQ(values.at(effect), value);
197201

198202
// Below the minimum
199203
effects[effect] = -395.7;
200204
program.bind();
201205
manager.setUniforms(&program, 0, effects);
206+
manager.getUniformValuesForEffects(effects, values);
202207

203208
value = 0.0f;
204209
glF.glGetUniformfv(program.programId(), program.uniformLocation(uniformName), &value);
205210
ASSERT_EQ(std::round(value * 100.0f) / 100.0f, 0.02f);
211+
ASSERT_EQ(values.at(effect), value);
206212

207213
// Above the maximum
208214
effects[effect] = 579.05;
209215
program.bind();
210216
manager.setUniforms(&program, 0, effects);
217+
manager.getUniformValuesForEffects(effects, values);
211218

212219
value = 0.0f;
213220
glF.glGetUniformfv(program.programId(), program.uniformLocation(uniformName), &value);
214221
ASSERT_EQ(std::round(value * 100.0f) / 100.0f, 0.9f);
222+
ASSERT_EQ(values.at(effect), value);
215223

216224
program.release();
217225
}
@@ -222,6 +230,8 @@ TEST_F(ShaderManagerTest, BrightnessEffectValue)
222230
static const QString uniformName = "u_" + effectName;
223231
static const ShaderManager::Effect effect = ShaderManager::Effect::Brightness;
224232

233+
std::unordered_map<ShaderManager::Effect, float> values;
234+
225235
QOpenGLFunctions glF(&m_context);
226236
glF.initializeOpenGLFunctions();
227237
ShaderManager manager;
@@ -233,28 +243,34 @@ TEST_F(ShaderManagerTest, BrightnessEffectValue)
233243
std::unordered_map<ShaderManager::Effect, double> effects = { { effect, 4.6 } };
234244
program.bind();
235245
manager.setUniforms(&program, 0, effects);
246+
manager.getUniformValuesForEffects(effects, values);
236247

237248
GLfloat value = 0.0f;
238249
glF.glGetUniformfv(program.programId(), program.uniformLocation(uniformName), &value);
239250
ASSERT_EQ(value, 0.046f);
251+
ASSERT_EQ(values.at(effect), value);
240252

241253
// Below the minimum
242254
effects[effect] = -102.9;
243255
program.bind();
244256
manager.setUniforms(&program, 0, effects);
257+
manager.getUniformValuesForEffects(effects, values);
245258

246259
value = 0.0f;
247260
glF.glGetUniformfv(program.programId(), program.uniformLocation(uniformName), &value);
248261
ASSERT_EQ(value, -1.0f);
262+
ASSERT_EQ(values.at(effect), value);
249263

250264
// Above the maximum
251265
effects[effect] = 353.2;
252266
program.bind();
253267
manager.setUniforms(&program, 0, effects);
268+
manager.getUniformValuesForEffects(effects, values);
254269

255270
value = 0.0f;
256271
glF.glGetUniformfv(program.programId(), program.uniformLocation(uniformName), &value);
257272
ASSERT_EQ(value, 1.0f);
273+
ASSERT_EQ(values.at(effect), value);
258274

259275
program.release();
260276
}
@@ -265,6 +281,8 @@ TEST_F(ShaderManagerTest, GhostEffectValue)
265281
static const QString uniformName = "u_" + effectName;
266282
static const ShaderManager::Effect effect = ShaderManager::Effect::Ghost;
267283

284+
std::unordered_map<ShaderManager::Effect, float> values;
285+
268286
QOpenGLFunctions glF(&m_context);
269287
glF.initializeOpenGLFunctions();
270288
ShaderManager manager;
@@ -276,28 +294,34 @@ TEST_F(ShaderManagerTest, GhostEffectValue)
276294
std::unordered_map<ShaderManager::Effect, double> effects = { { effect, 58.5 } };
277295
program.bind();
278296
manager.setUniforms(&program, 0, effects);
297+
manager.getUniformValuesForEffects(effects, values);
279298

280299
GLfloat value = 0.0f;
281300
glF.glGetUniformfv(program.programId(), program.uniformLocation(uniformName), &value);
282301
ASSERT_EQ(std::round(value * 1000.0f) / 1000.0f, 0.415f);
302+
ASSERT_EQ(values.at(effect), value);
283303

284304
// Below the minimum
285305
effects[effect] = -20.8;
286306
program.bind();
287307
manager.setUniforms(&program, 0, effects);
308+
manager.getUniformValuesForEffects(effects, values);
288309

289310
value = 0.0f;
290311
glF.glGetUniformfv(program.programId(), program.uniformLocation(uniformName), &value);
291312
ASSERT_EQ(value, 1.0f);
313+
ASSERT_EQ(values.at(effect), value);
292314

293315
// Above the maximum
294316
effects[effect] = 248.2;
295317
program.bind();
296318
manager.setUniforms(&program, 0, effects);
319+
manager.getUniformValuesForEffects(effects, values);
297320

298321
value = 0.0f;
299322
glF.glGetUniformfv(program.programId(), program.uniformLocation(uniformName), &value);
300323
ASSERT_EQ(value, 0.0f);
324+
ASSERT_EQ(values.at(effect), value);
301325

302326
program.release();
303327
}

0 commit comments

Comments
 (0)