Skip to content

Commit 1288589

Browse files
author
Thayer J Andrews
committed
CCEffectGlass / Reflection - Properly condition the shininess, fresnel bias, and fresnel power.
Make sure these are all within their valid ranges.
1 parent 6833331 commit 1288589

File tree

4 files changed

+95
-12
lines changed

4 files changed

+95
-12
lines changed

cocos2d/CCEffectGlass.m

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,16 @@
1818
#import "CCSprite_Private.h"
1919

2020

21+
static const float CCEffectGlassDefaultFresnelBias = 0.1f;
22+
static const float CCEffectGlassDefaultFresnelPower = 2.0f;
23+
24+
2125
@interface CCEffectGlass ()
2226

2327
@property (nonatomic) float conditionedRefraction;
28+
@property (nonatomic) float conditionedShininess;
29+
@property (nonatomic) float conditionedFresnelBias;
30+
@property (nonatomic) float conditionedFresnelPower;
2431

2532
@end
2633

@@ -61,10 +68,17 @@ -(id)initWithShininess:(float)shininess refraction:(float)refraction refractionE
6168
if((self = [super initWithFragmentUniforms:uniforms vertexUniforms:nil varying:nil]))
6269
{
6370
_refraction = refraction;
64-
_shininess = shininess;
65-
_fresnelBias = 0.1f;
66-
_fresnelPower = 2.0f;
6771
_conditionedRefraction = CCEffectUtilsConditionRefraction(refraction);
72+
73+
_shininess = shininess;
74+
_conditionedShininess = CCEffectUtilsConditionShininess(shininess);
75+
76+
_fresnelBias = CCEffectGlassDefaultFresnelBias;
77+
_conditionedFresnelBias = CCEffectUtilsConditionFresnelBias(CCEffectGlassDefaultFresnelBias);
78+
79+
_fresnelPower = CCEffectGlassDefaultFresnelPower;
80+
_conditionedFresnelPower = CCEffectUtilsConditionFresnelPower(CCEffectGlassDefaultFresnelPower);
81+
6882
_refractionEnvironment = refractionEnvironment;
6983
_reflectionEnvironment = reflectionEnvironment;
7084
_normalMap = normalMap;
@@ -185,9 +199,9 @@ -(void)buildRenderPasses
185199

186200
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_refraction"]] = [NSNumber numberWithFloat:weakSelf.conditionedRefraction];
187201

188-
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_shininess"]] = [NSNumber numberWithFloat:weakSelf.shininess];
189-
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_fresnelBias"]] = [NSNumber numberWithFloat:weakSelf.fresnelBias];
190-
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_fresnelPower"]] = [NSNumber numberWithFloat:weakSelf.fresnelPower];
202+
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_shininess"]] = [NSNumber numberWithFloat:weakSelf.conditionedShininess];
203+
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_fresnelBias"]] = [NSNumber numberWithFloat:weakSelf.conditionedFresnelBias];
204+
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_fresnelPower"]] = [NSNumber numberWithFloat:weakSelf.conditionedFresnelPower];
191205

192206
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_refractEnvMap"]] = weakSelf.refractionEnvironment.texture ?: [CCTexture none];
193207
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_reflectEnvMap"]] = weakSelf.reflectionEnvironment.texture ?: [CCTexture none];
@@ -235,4 +249,23 @@ -(void)setRefraction:(float)refraction
235249
_refraction = refraction;
236250
_conditionedRefraction = CCEffectUtilsConditionRefraction(refraction);
237251
}
252+
253+
-(void)setShininess:(float)shininess
254+
{
255+
_shininess = shininess;
256+
_conditionedShininess = CCEffectUtilsConditionShininess(shininess);
257+
}
258+
259+
-(void)setFresnelBias:(float)bias
260+
{
261+
_fresnelBias = bias;
262+
_conditionedFresnelBias = CCEffectUtilsConditionFresnelBias(bias);
263+
}
264+
265+
-(void)setFresnelPower:(float)power
266+
{
267+
_fresnelPower = power;
268+
_conditionedFresnelPower = CCEffectUtilsConditionFresnelPower(power);
269+
}
270+
238271
@end

cocos2d/CCEffectReflection.m

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222

2323
@interface CCEffectReflection ()
2424

25+
@property (nonatomic) float conditionedShininess;
26+
@property (nonatomic) float conditionedFresnelBias;
27+
@property (nonatomic) float conditionedFresnelPower;
2528

2629
@end
2730

@@ -62,11 +65,17 @@ -(id)initWithShininess:(float)shininess fresnelBias:(float)bias fresnelPower:(fl
6265

6366
if((self = [super initWithFragmentUniforms:uniforms vertexUniforms:nil varying:nil]))
6467
{
65-
_environment = environment;
66-
_normalMap = normalMap;
6768
_shininess = shininess;
69+
_conditionedShininess = CCEffectUtilsConditionShininess(shininess);
70+
6871
_fresnelBias = bias;
72+
_conditionedFresnelBias = CCEffectUtilsConditionFresnelBias(bias);
73+
6974
_fresnelPower = power;
75+
_conditionedFresnelPower = CCEffectUtilsConditionFresnelPower(power);
76+
77+
_environment = environment;
78+
_normalMap = normalMap;
7079

7180
self.debugName = @"CCEffectReflection";
7281
}
@@ -164,9 +173,9 @@ -(void)buildRenderPasses
164173
pass.verts = verts;
165174
}
166175

167-
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_shininess"]] = [NSNumber numberWithFloat:weakSelf.shininess];
168-
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_fresnelBias"]] = [NSNumber numberWithFloat:weakSelf.fresnelBias];
169-
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_fresnelPower"]] = [NSNumber numberWithFloat:weakSelf.fresnelPower];
176+
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_shininess"]] = [NSNumber numberWithFloat:weakSelf.conditionedShininess];
177+
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_fresnelBias"]] = [NSNumber numberWithFloat:weakSelf.conditionedFresnelBias];
178+
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_fresnelPower"]] = [NSNumber numberWithFloat:weakSelf.conditionedFresnelPower];
170179

171180
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_envMap"]] = weakSelf.environment.texture ?: [CCTexture none];
172181

@@ -189,6 +198,25 @@ -(void)buildRenderPasses
189198

190199
self.renderPasses = @[pass0];
191200
}
201+
202+
-(void)setShininess:(float)shininess
203+
{
204+
_shininess = shininess;
205+
_conditionedShininess = CCEffectUtilsConditionShininess(shininess);
206+
}
207+
208+
-(void)setFresnelBias:(float)bias
209+
{
210+
_fresnelBias = bias;
211+
_conditionedFresnelBias = CCEffectUtilsConditionFresnelBias(bias);
212+
}
213+
214+
-(void)setFresnelPower:(float)power
215+
{
216+
_fresnelPower = power;
217+
_conditionedFresnelPower = CCEffectUtilsConditionFresnelPower(power);
218+
}
219+
192220
@end
193221

194222
GLKMatrix4 GLKMatrix4FromAffineTransform(CGAffineTransform at)

cocos2d/CCEffectUtils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,7 @@ CGAffineTransform CCEffectUtilsWorldToEnvironmentTransform(CCSprite *environment
1313
GLKVector4 CCEffectUtilsTangentInEnvironmentSpace(GLKMatrix4 effectToWorldMat, GLKMatrix4 worldToEnvMat);
1414
GLKMatrix4 CCEffectUtilsMat4FromAffineTransform(CGAffineTransform at);
1515
float CCEffectUtilsConditionRefraction(float refraction);
16+
float CCEffectUtilsConditionShininess(float shininess);
17+
float CCEffectUtilsConditionFresnelBias(float bias);
18+
float CCEffectUtilsConditionFresnelPower(float power);
1619

cocos2d/CCEffectUtils.m

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ GLKMatrix4 CCEffectUtilsMat4FromAffineTransform(CGAffineTransform at)
4141

4242
float CCEffectUtilsConditionRefraction(float refraction)
4343
{
44-
NSCAssert((refraction >= -1.0) && (refraction <= 1.0), @"Supplied refraction out of range [-1..1].");
44+
NSCAssert((refraction >= -1.0f) && (refraction <= 1.0f), @"Supplied refraction out of range [-1..1].");
4545

4646
// Lerp between min and max
4747
if (refraction >= 0.0f)
@@ -54,3 +54,22 @@ float CCEffectUtilsConditionRefraction(float refraction)
5454
}
5555
}
5656

57+
float CCEffectUtilsConditionShininess(float shininess)
58+
{
59+
NSCAssert((shininess >= 0.0f) && (shininess <= 1.0f), @"Supplied shininess out of range [0..1].");
60+
return clampf(shininess, 0.0f, 1.0f);
61+
}
62+
63+
float CCEffectUtilsConditionFresnelBias(float bias)
64+
{
65+
NSCAssert((bias >= 0.0f) && (bias <= 1.0f), @"Supplied bias out of range [0..1].");
66+
return clampf(bias, 0.0f, 1.0f);
67+
}
68+
69+
float CCEffectUtilsConditionFresnelPower(float power)
70+
{
71+
NSCAssert(power >= 0.0f, @"Supplied power out of range [0..inf].");
72+
return (power < 0.0f) ? 0.0f : power;
73+
}
74+
75+

0 commit comments

Comments
 (0)