48
48
#if CC_ENABLE_EXPERIMENTAL_EFFECTS
49
49
@implementation CCEffectBloom {
50
50
NSUInteger _numberOfOptimizedOffsets;
51
- NSUInteger _blurRadius;
52
51
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 ];
55
75
}
56
76
57
77
-(id )init
@@ -72,15 +92,7 @@ -(id)initWithPixelBlurRadius:(NSUInteger)blurRadius intensity:(float)intensity l
72
92
73
93
_luminanceThreshold = clampf (luminanceThreshold, 0 .0f , 1 .0f );
74
94
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];
84
96
85
97
CCEffectUniform* u_luminanceThreshold = [CCEffectUniform uniform: @" float" name: @" u_luminanceThreshold" value: [NSNumber numberWithFloat: _luminanceThreshold]];
86
98
CCEffectUniform* u_enableGlowMap = [CCEffectUniform uniform: @" float" name: @" u_enableGlowMap" value: [NSNumber numberWithFloat: 0 .0f ]];
@@ -314,6 +326,27 @@ -(void)buildRenderPasses
314
326
self.renderPasses = @[pass0, pass1, pass2];
315
327
}
316
328
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
+
317
350
@end
318
351
#endif
319
352
0 commit comments