Skip to content

Commit 73ff763

Browse files
author
Thayer J Andrews
committed
CCEffectBloom - WIP - Start working on shader rebuild as properties change
1 parent 6c70f54 commit 73ff763

File tree

2 files changed

+48
-12
lines changed

2 files changed

+48
-12
lines changed

cocos2d/CCEffectBloom.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
#if CC_ENABLE_EXPERIMENTAL_EFFECTS
1212
@interface CCEffectBloom : CCEffect
1313

14+
@property (nonatomic) NSUInteger blurRadius;
15+
@property (nonatomic) float intensity;
16+
@property (nonatomic) float luminanceThreshold;
1417

1518
/**
1619
* @param blurRadius number of pixels blur will extend to (6 is the maximum, because we are limited by the number

cocos2d/CCEffectBloom.m

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,30 @@
4848
#if CC_ENABLE_EXPERIMENTAL_EFFECTS
4949
@implementation CCEffectBloom {
5050
NSUInteger _numberOfOptimizedOffsets;
51-
NSUInteger _blurRadius;
5251
GLfloat _sigma;
53-
float _intensity;
54-
float _luminanceThreshold;
52+
BOOL _shaderDirty;
53+
}
54+
55+
- (void)setBlurRadiusAndDependents:(NSUInteger)blurRadius
56+
{
57+
blurRadius = MIN(blurRadius, GAUSSIANBLUR_OPTMIZIED_RADIUS_MAX);
58+
_blurRadius = blurRadius;
59+
_sigma = blurRadius / 2;
60+
if(_sigma == 0.0)
61+
_sigma = 1.0f;
62+
63+
_numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), GAUSSIANBLUR_OPTMIZIED_RADIUS_MAX);
64+
}
65+
66+
-(void)setBlurRadius:(NSUInteger)blurRadius
67+
{
68+
[self setBlurRadiusAndDependents:blurRadius];
69+
70+
// The shader is constructed dynamically based on the blur radius
71+
// so mark it dirty and make sure this propagates up to any containing
72+
// effect stacks.
73+
_shaderDirty = YES;
74+
[self.owningStack passesDidChange:self];
5575
}
5676

5777
-(id)init
@@ -72,15 +92,7 @@ -(id)initWithPixelBlurRadius:(NSUInteger)blurRadius intensity:(float)intensity l
7292

7393
_luminanceThreshold = clampf(luminanceThreshold, 0.0f, 1.0f);
7494

75-
76-
// First, generate the normal Gaussian weights for a given sigma
77-
blurRadius = MIN(blurRadius, GAUSSIANBLUR_OPTMIZIED_RADIUS_MAX);
78-
_blurRadius = blurRadius;
79-
_sigma = blurRadius / 2;
80-
if(_sigma == 0.0)
81-
_sigma = 1.0f;
82-
83-
_numberOfOptimizedOffsets = MIN(blurRadius / 2 + (blurRadius % 2), GAUSSIANBLUR_OPTMIZIED_RADIUS_MAX);
95+
[self setBlurRadiusAndDependents:blurRadius];
8496

8597
CCEffectUniform* u_luminanceThreshold = [CCEffectUniform uniform:@"float" name:@"u_luminanceThreshold" value:[NSNumber numberWithFloat:_luminanceThreshold]];
8698
CCEffectUniform* u_enableGlowMap = [CCEffectUniform uniform:@"float" name:@"u_enableGlowMap" value:[NSNumber numberWithFloat:0.0f]];
@@ -314,6 +326,27 @@ -(void)buildRenderPasses
314326
self.renderPasses = @[pass0, pass1, pass2];
315327
}
316328

329+
- (BOOL)readyForRendering
330+
{
331+
return !_shaderDirty;
332+
}
333+
334+
- (CCEffectPrepareStatus)prepareForRendering
335+
{
336+
CCEffectPrepareStatus result = CCEffectPrepareNothingToDo;
337+
if (_shaderDirty)
338+
{
339+
[self buildFragmentFunctions];
340+
[self buildVertexFunctions];
341+
[self buildEffectShader];
342+
[self buildRenderPasses];
343+
344+
_shaderDirty = NO;
345+
result = CCEffectPrepareSuccess;
346+
}
347+
return result;
348+
}
349+
317350
@end
318351
#endif
319352

0 commit comments

Comments
 (0)