Skip to content

Commit dc1c7b2

Browse files
committed
Merge pull request #874 from osinoleg/develop
blur/bloom blur properties now work as expected.
2 parents e1fc647 + 7c1d497 commit dc1c7b2

File tree

7 files changed

+69
-25
lines changed

7 files changed

+69
-25
lines changed

cocos2d-ui-tests/tests/CCEffectsTest.m

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,14 +233,13 @@ -(void)setupBlurEffectNodeTest
233233
sampleSprite4.position = ccp(0.5, 0.5);
234234
sampleSprite4.positionType = CCPositionTypeNormalized;
235235

236-
237236
CCEffectNode* effectNode4 = [[CCEffectNode alloc] initWithWidth:80 height:80];
238237
effectNode4.positionType = CCPositionTypeNormalized;
239238
effectNode4.position = ccp(0.6, 0.5);
240239
[effectNode4 addChild:sampleSprite4];
241240
CCEffectGaussianBlur* effect4 = [CCEffectGaussianBlur effectWithPixelBlurRadius:7.0];
242241
effectNode4.effect = effect4;
243-
242+
244243
[self.contentNode addChild:effectNode4];
245244
}
246245

cocos2d/CCEffect.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,5 +129,7 @@ typedef void (^CCEffectRenderPassEndBlock)(CCEffectRenderPass *pass);
129129

130130
-(BOOL)stitchSupported:(CCEffectFunctionStitchFlags)stitch;
131131

132+
-(void)setVarying:(NSArray*)varying;
133+
132134
@end
133135
#endif

cocos2d/CCEffect.m

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -359,14 +359,7 @@ - (void)buildEffectWithFragmentFunction:(NSMutableArray*) fragmentFunctions vert
359359
_vertexUniforms = [[CCEffect defaultEffectVertexUniforms] copy];
360360
}
361361

362-
if (varying)
363-
{
364-
_varyingVars = [varying copy];
365-
}
366-
else
367-
{
368-
_varyingVars = nil;
369-
}
362+
[self setVarying:varying];
370363

371364
_stitchFlags = CCEffectFunctionStitchBoth;
372365

@@ -406,6 +399,17 @@ -(void)buildUniformTranslationTable
406399
}
407400
}
408401

402+
-(void)setVarying:(NSArray*)varying
403+
{
404+
if (varying)
405+
{
406+
_varyingVars = [varying copy];
407+
}
408+
else
409+
{
410+
_varyingVars = nil;
411+
}
412+
}
409413

410414
-(void)buildEffectShader
411415
{

cocos2d/CCEffectBloom.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
@property (nonatomic) float intensity;
1919

2020
// blurRadius number of pixels blur will extend to (6 is the maximum, because we are limited by the number
21+
// of varying variables that can be passed to a glsl program). TODO: create a slower bloom shader, that does not have this restriction.
2122
@property (nonatomic) NSUInteger blurRadius;
2223

2324
/**

cocos2d/CCEffectBloom.m

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ @implementation CCEffectBloom {
5050
NSUInteger _numberOfOptimizedOffsets;
5151
GLfloat _sigma;
5252
BOOL _shaderDirty;
53+
float _transformedIntensity;
5354
}
5455

5556
-(id)init
@@ -70,7 +71,7 @@ -(id)initWithPixelBlurRadius:(NSUInteger)blurRadius intensity:(float)intensity l
7071

7172
[self setBlurRadiusAndDependents:blurRadius];
7273

73-
CCEffectUniform* u_intensity = [CCEffectUniform uniform:@"float" name:@"u_intensity" value:[NSNumber numberWithFloat:_intensity]];
74+
CCEffectUniform* u_intensity = [CCEffectUniform uniform:@"float" name:@"u_intensity" value:[NSNumber numberWithFloat:_transformedIntensity]];
7475
CCEffectUniform* u_luminanceThreshold = [CCEffectUniform uniform:@"float" name:@"u_luminanceThreshold" value:[NSNumber numberWithFloat:_luminanceThreshold]];
7576
CCEffectUniform* u_enableGlowMap = [CCEffectUniform uniform:@"float" name:@"u_enableGlowMap" value:[NSNumber numberWithFloat:0.0f]];
7677
CCEffectUniform* u_blurDirection = [CCEffectUniform uniform:@"vec2" name:@"u_blurDirection"
@@ -105,7 +106,7 @@ -(void)setLuminanceThreshold:(float)luminanceThreshold
105106
-(void)setIntensity:(float)intensity
106107
{
107108
_intensity = clampf(intensity, 0.0f, 1.0f);
108-
_intensity = 1.0f - _intensity;
109+
_transformedIntensity = 1.0f - _intensity;
109110
}
110111

111112
-(void)setBlurRadius:(NSUInteger)blurRadius
@@ -212,6 +213,7 @@ -(void)buildFragmentFunctions
212213

213214

214215
// Choose one?
216+
// TODO: try using min(src, dst) to create a gloomEffect
215217
NSString* addativeBlending = @"src + dst";
216218
NSString* screenBlending = @"(src + dst) - ((src * dst) * u_intensity)";
217219

@@ -311,7 +313,7 @@ -(void)buildRenderPasses
311313
pass.shaderUniforms[CCShaderUniformPreviousPassTexture] = previousPassTexture;
312314
pass.shaderUniforms[self.uniformTranslationTable[@"u_enableGlowMap"]] = [NSNumber numberWithFloat:0.0f];
313315
pass.shaderUniforms[self.uniformTranslationTable[@"u_luminanceThreshold"]] = [NSNumber numberWithFloat:_luminanceThreshold];
314-
pass.shaderUniforms[self.uniformTranslationTable[@"u_intensity"]] = [NSNumber numberWithFloat:_intensity];
316+
pass.shaderUniforms[self.uniformTranslationTable[@"u_intensity"]] = [NSNumber numberWithFloat:_transformedIntensity];
315317

316318
GLKVector2 dur = GLKVector2Make(1.0 / (previousPassTexture.pixelWidth / previousPassTexture.contentScale), 0.0);
317319
pass.shaderUniforms[self.uniformTranslationTable[@"u_blurDirection"]] = [NSValue valueWithGLKVector2:dur];
@@ -326,7 +328,7 @@ -(void)buildRenderPasses
326328
pass.shaderUniforms[CCShaderUniformPreviousPassTexture] = previousPassTexture;
327329
pass.shaderUniforms[self.uniformTranslationTable[@"u_enableGlowMap"]] = [NSNumber numberWithFloat:0.0f];
328330
pass.shaderUniforms[self.uniformTranslationTable[@"u_luminanceThreshold"]] = [NSNumber numberWithFloat:_luminanceThreshold];
329-
pass.shaderUniforms[self.uniformTranslationTable[@"u_intensity"]] = [NSNumber numberWithFloat:_intensity];
331+
pass.shaderUniforms[self.uniformTranslationTable[@"u_intensity"]] = [NSNumber numberWithFloat:_transformedIntensity];
330332

331333
GLKVector2 dur = GLKVector2Make(0.0, 1.0 / (previousPassTexture.pixelHeight / previousPassTexture.contentScale));
332334
pass.shaderUniforms[self.uniformTranslationTable[@"u_blurDirection"]] = [NSValue valueWithGLKVector2:dur];
@@ -340,7 +342,7 @@ -(void)buildRenderPasses
340342
pass.shaderUniforms[CCShaderUniformPreviousPassTexture] = previousPassTexture;
341343
pass.shaderUniforms[self.uniformTranslationTable[@"u_enableGlowMap"]] = [NSNumber numberWithFloat:1.0f];
342344
pass.shaderUniforms[self.uniformTranslationTable[@"u_luminanceThreshold"]] = [NSNumber numberWithFloat:_luminanceThreshold];
343-
pass.shaderUniforms[self.uniformTranslationTable[@"u_intensity"]] = [NSNumber numberWithFloat:_intensity];
345+
pass.shaderUniforms[self.uniformTranslationTable[@"u_intensity"]] = [NSNumber numberWithFloat:_transformedIntensity];
344346

345347
} copy]];
346348

@@ -357,6 +359,10 @@ - (CCEffectPrepareStatus)prepareForRendering
357359
CCEffectPrepareStatus result = CCEffectPrepareNothingToDo;
358360
if (_shaderDirty)
359361
{
362+
unsigned long count = (unsigned long)(1 + (_numberOfOptimizedOffsets * 2));
363+
CCEffectVarying* v_blurCoords = [CCEffectVarying varying:@"vec2" name:@"v_blurCoordinates" count:count];
364+
[self setVarying:@[v_blurCoords]];
365+
360366
[self buildFragmentFunctions];
361367
[self buildVertexFunctions];
362368
[self buildEffectShader];

cocos2d/CCEffectGaussianBlur.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
@interface CCEffectGaussianBlur : CCEffect
1313

1414
// blurRadius number of pixels blur will extend to (6 is the maximum, because we are limited by the number
15+
// of varying variables that can be passed to a glsl program). TODO: create a slower bloom shader, that does not have this restriction.
1516
@property (nonatomic) NSUInteger blurRadius;
1617

17-
-(id)init;
1818
/**
1919
* @param blurRadius number of pixels blur will extend to (6 is the maximum, because we are limited by the number
2020
* of varying variables that can be passed to a glsl program). TODO: create a slower bloom shader, that does not have this restriction.
2121
*/
22+
-(id)init;
2223
-(id)initWithPixelBlurRadius:(NSUInteger)blurRadius;
2324
+(id)effectWithPixelBlurRadius:(NSUInteger)blurRadius;
2425

cocos2d/CCEffectGaussianBlur.m

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ @implementation CCEffectGaussianBlur {
4949
NSUInteger _numberOfOptimizedOffsets;
5050
NSUInteger _blurRadius;
5151
GLfloat _sigma;
52+
BOOL _shaderDirty;
5253
}
5354

5455
-(id)init
@@ -64,14 +65,7 @@ -(id)init
6465

6566
-(id)initWithPixelBlurRadius:(NSUInteger)blurRadius
6667
{
67-
// First, generate the normal Gaussian weights for a given sigma
68-
blurRadius = MIN(blurRadius, GAUSSIANBLUR_OPTMIZIED_RADIUS_MAX);
69-
_blurRadius = blurRadius;
70-
_sigma = blurRadius / 2;
71-
if(_sigma == 0.0)
72-
_sigma = 1.0f;
73-
74-
_numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), GAUSSIANBLUR_OPTMIZIED_RADIUS_MAX);
68+
[self setBlurRadiusAndDependents:blurRadius];
7569

7670
CCEffectUniform* u_blurDirection = [CCEffectUniform uniform:@"vec2" name:@"u_blurDirection"
7771
value:[NSValue valueWithGLKVector2:GLKVector2Make(0.0f, 0.0f)]];
@@ -99,7 +93,24 @@ +(id)effectWithPixelBlurRadius:(NSUInteger)blurRadius
9993

10094
-(void)setBlurRadius:(NSUInteger)blurRadius
10195
{
102-
#warning does not work, waiting on change to CCEffect that will allow us to re-compile a shader easier
96+
[self setBlurRadiusAndDependents:blurRadius];
97+
98+
// The shader is constructed dynamically based on the blur radius
99+
// so mark it dirty and make sure this propagates up to any containing
100+
// effect stacks.
101+
_shaderDirty = YES;
102+
[self.owningStack passesDidChange:self];
103+
}
104+
105+
- (void)setBlurRadiusAndDependents:(NSUInteger)blurRadius
106+
{
107+
blurRadius = MIN(blurRadius, GAUSSIANBLUR_OPTMIZIED_RADIUS_MAX);
108+
_blurRadius = blurRadius;
109+
_sigma = blurRadius / 2;
110+
if(_sigma == 0.0)
111+
_sigma = 1.0f;
112+
113+
_numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), GAUSSIANBLUR_OPTMIZIED_RADIUS_MAX);
103114
}
104115

105116
-(void)buildFragmentFunctions
@@ -281,6 +292,26 @@ -(void)buildRenderPasses
281292
self.renderPasses = @[pass0, pass1];
282293
}
283294

295+
- (CCEffectPrepareStatus)prepareForRendering
296+
{
297+
CCEffectPrepareStatus result = CCEffectPrepareNothingToDo;
298+
if (_shaderDirty)
299+
{
300+
unsigned long count = (unsigned long)(1 + (_numberOfOptimizedOffsets * 2));
301+
CCEffectVarying* v_blurCoords = [CCEffectVarying varying:@"vec2" name:@"v_blurCoordinates" count:count];
302+
[self setVarying:@[v_blurCoords]];
303+
304+
[self buildFragmentFunctions];
305+
[self buildVertexFunctions];
306+
[self buildEffectShader];
307+
[self buildRenderPasses];
308+
309+
_shaderDirty = NO;
310+
result = CCEffectPrepareSuccess;
311+
}
312+
return result;
313+
}
314+
284315
@end
285316
#endif
286317

0 commit comments

Comments
 (0)