Skip to content

Commit 9d7c718

Browse files
committed
Merge branch 'develop' of https://github.com/cocos2d/cocos2d-iphone into develop
2 parents d6e2988 + dd31ff8 commit 9d7c718

11 files changed

+137
-103
lines changed

cocos2d/CCEffect.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,9 @@ typedef void (^CCEffectRenderPassEndBlock)(CCEffectRenderPass *pass);
120120
@property (nonatomic, copy) NSString *debugName;
121121

122122

123-
-(id)initWithFragmentUniforms:(NSArray*)fragmentUniforms vertextUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying;
124-
-(id)initWithFragmentFunction:(NSMutableArray*) fragmentFunctions fragmentUniforms:(NSArray*)fragmentUniforms vertextUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying;
125-
-(id)initWithFragmentFunction:(NSMutableArray*) fragmentFunctions vertexFunctions:(NSMutableArray*)vertextFunctions fragmentUniforms:(NSArray*)fragmentUniforms vertextUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying;
123+
-(id)initWithFragmentUniforms:(NSArray*)fragmentUniforms vertexUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying;
124+
-(id)initWithFragmentFunction:(NSMutableArray*) fragmentFunctions fragmentUniforms:(NSArray*)fragmentUniforms vertexUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying;
125+
-(id)initWithFragmentFunction:(NSMutableArray*) fragmentFunctions vertexFunctions:(NSMutableArray*)vertexFunctions fragmentUniforms:(NSArray*)fragmentUniforms vertexUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying;
126126

127127
-(CCEffectPrepareStatus)prepareForRendering;
128128
-(CCEffectRenderPass *)renderPassAtIndex:(NSInteger)passIndex;

cocos2d/CCEffect.m

Lines changed: 59 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -297,93 +297,84 @@ + (NSSet *)defaultEffectVertexUniformNames
297297

298298

299299
-(id)init
300+
{
301+
return [self initWithFragmentFunction:nil vertexFunctions:nil fragmentUniforms:nil vertexUniforms:nil varying:nil];
302+
}
303+
304+
-(id)initWithFragmentUniforms:(NSArray*)fragmentUniforms vertexUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying
305+
{
306+
return [self initWithFragmentFunction:nil vertexFunctions:nil fragmentUniforms:fragmentUniforms vertexUniforms:vertexUniforms varying:varying];
307+
}
308+
309+
-(id)initWithFragmentFunction:(NSMutableArray*) fragmentFunctions fragmentUniforms:(NSArray*)fragmentUniforms vertexUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying
310+
{
311+
return [self initWithFragmentFunction:fragmentFunctions vertexFunctions:nil fragmentUniforms:fragmentUniforms vertexUniforms:vertexUniforms varying:varying];
312+
}
313+
314+
-(id)initWithFragmentFunction:(NSMutableArray*) fragmentFunctions vertexFunctions:(NSMutableArray*)vertexFunctions fragmentUniforms:(NSArray*)fragmentUniforms vertexUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying
300315
{
301316
if((self = [super init]))
302317
{
303-
_fragmentUniforms = [[CCEffect defaultEffectFragmentUniforms] copy];
304-
_vertexUniforms = [[CCEffect defaultEffectVertexUniforms] copy];
305-
_fragmentFunctions = [[NSMutableArray alloc] init];
306-
_vertexFunctions = [[NSMutableArray alloc] init];
307-
_stitchFlags = CCEffectFunctionStitchBoth;
308-
309-
[self buildUniformTranslationTable];
310-
[self buildFragmentFunctions];
311-
[self buildVertexFunctions];
312-
[self buildEffectShader];
313-
[self buildRenderPasses];
314-
315-
return self;
318+
[self buildEffectWithFragmentFunction:fragmentFunctions vertexFunctions:vertexFunctions fragmentUniforms:fragmentUniforms vertexUniforms:vertexUniforms varying:varying];
316319
}
317-
318320
return self;
319321
}
320322

321-
-(id)initWithFragmentUniforms:(NSArray*)fragmentUniforms vertextUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying
323+
- (void)buildEffectWithFragmentFunction:(NSMutableArray*) fragmentFunctions vertexFunctions:(NSMutableArray*)vertexFunctions fragmentUniforms:(NSArray*)fragmentUniforms vertexUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying
322324
{
323-
if((self = [super init]))
325+
if (fragmentFunctions)
326+
{
327+
_fragmentFunctions = fragmentFunctions;
328+
}
329+
else
324330
{
325-
_fragmentUniforms = [[CCEffect defaultEffectFragmentUniforms] arrayByAddingObjectsFromArray:fragmentUniforms];
326-
_vertexUniforms = [[CCEffect defaultEffectVertexUniforms] arrayByAddingObjectsFromArray:vertexUniforms];
327-
_varyingVars = [varying copy];
328-
_fragmentFunctions = [[NSMutableArray alloc] init];
329-
_vertexFunctions = [[NSMutableArray alloc] init];
330-
_stitchFlags = CCEffectFunctionStitchBoth;
331-
332-
[self buildShaderUniforms:_fragmentUniforms vertexUniforms:_vertexUniforms];
333-
[self buildUniformTranslationTable];
334331
[self buildFragmentFunctions];
332+
}
333+
334+
if (vertexFunctions)
335+
{
336+
_vertexFunctions = vertexFunctions;
337+
}
338+
else
339+
{
335340
[self buildVertexFunctions];
336-
[self buildEffectShader];
337-
[self buildRenderPasses];
338-
339-
return self;
340341
}
341342

342-
return self;
343-
}
344-
345-
-(id)initWithFragmentFunction:(NSMutableArray*) fragmentFunctions fragmentUniforms:(NSArray*)fragmentUniforms vertextUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying
346-
{
347-
if((self = [super init]))
343+
if (fragmentUniforms)
348344
{
349345
_fragmentUniforms = [[CCEffect defaultEffectFragmentUniforms] arrayByAddingObjectsFromArray:fragmentUniforms];
346+
}
347+
else
348+
{
349+
_fragmentUniforms = [[CCEffect defaultEffectFragmentUniforms] copy];
350+
}
351+
352+
if (vertexUniforms)
353+
{
350354
_vertexUniforms = [[CCEffect defaultEffectVertexUniforms] arrayByAddingObjectsFromArray:vertexUniforms];
351-
_fragmentFunctions = fragmentFunctions;
352-
_varyingVars = [varying copy];
353-
_stitchFlags = CCEffectFunctionStitchBoth;
354-
355-
[self buildShaderUniforms:_fragmentUniforms vertexUniforms:_vertexUniforms];
356-
[self buildUniformTranslationTable];
357-
[self buildVertexFunctions];
358-
[self buildEffectShader];
359-
[self buildRenderPasses];
360355

361-
return self;
356+
}
357+
else
358+
{
359+
_vertexUniforms = [[CCEffect defaultEffectVertexUniforms] copy];
362360
}
363361

364-
return self;
365-
}
366-
367-
-(id)initWithFragmentFunction:(NSMutableArray*) fragmentFunctions vertexFunctions:(NSMutableArray*)vertextFunctions fragmentUniforms:(NSArray*)fragmentUniforms vertextUniforms:(NSArray*)vertexUniforms varying:(NSArray*)varying
368-
{
369-
if((self = [super init]))
362+
if (varying)
370363
{
371-
_fragmentUniforms = [[CCEffect defaultEffectFragmentUniforms] arrayByAddingObjectsFromArray:fragmentUniforms];
372-
_vertexUniforms = [[CCEffect defaultEffectVertexUniforms] arrayByAddingObjectsFromArray:vertexUniforms];
373-
_fragmentFunctions = fragmentFunctions;
374-
_vertexFunctions = vertextFunctions;
375364
_varyingVars = [varying copy];
376-
_stitchFlags = CCEffectFunctionStitchBoth;
377-
378-
[self buildShaderUniforms:_fragmentUniforms vertexUniforms:_vertexUniforms];
379-
[self buildUniformTranslationTable];
380-
[self buildEffectShader];
381-
[self buildRenderPasses];
382-
383-
return self;
365+
}
366+
else
367+
{
368+
_varyingVars = nil;
384369
}
385370

386-
return self;
371+
_stitchFlags = CCEffectFunctionStitchBoth;
372+
373+
[self buildShaderUniforms:_fragmentUniforms vertexUniforms:_vertexUniforms];
374+
[self buildUniformTranslationTable];
375+
376+
[self buildEffectShader];
377+
[self buildRenderPasses];
387378
}
388379

389380
-(void)buildShaderUniforms:(NSArray*)fragmentUniforms vertexUniforms:(NSArray*)vertexUniforms
@@ -418,9 +409,6 @@ -(void)buildUniformTranslationTable
418409

419410
-(void)buildEffectShader
420411
{
421-
if(_shader != nil)
422-
return;
423-
424412
//Build varying vars
425413
NSMutableString* varyingVarsToInsert = [[NSMutableString alloc] init];
426414
for(CCEffectVarying* varying in _varyingVars)
@@ -459,11 +447,6 @@ -(void)buildEffectShader
459447
}
460448

461449
[effectFunctionBody appendFormat:@"tmp = %@;\n", [curFunction callStringWithInputs:inputs]];
462-
//
463-
// if([_fragmentFunctions lastObject] != curFunction)
464-
// [effectFunctionBody appendString:@" + "];
465-
// else
466-
// [effectFunctionBody appendString:@";"];
467450
}
468451
[effectFunctionBody appendString:@"return tmp;\n"];
469452

@@ -510,14 +493,14 @@ -(void)buildEffectShader
510493

511494
-(void)buildFragmentFunctions
512495
{
513-
CCEffectFunction* fragmentFunction = [[CCEffectFunction alloc] initWithName:@"defaultEffect" body:@"return cc_FragColor;" inputs:nil returnType:@"vec4"];
514-
[_fragmentFunctions addObject:fragmentFunction];
496+
_fragmentFunctions = [[NSMutableArray alloc] init];
497+
[_fragmentFunctions addObject:[[CCEffectFunction alloc] initWithName:@"defaultEffect" body:@"return cc_FragColor;" inputs:nil returnType:@"vec4"]];
515498
}
516499

517500
-(void)buildVertexFunctions
518501
{
519-
CCEffectFunction* vertexFunction = [[CCEffectFunction alloc] initWithName:@"defaultEffect" body:@"return cc_Position;" inputs:nil returnType:@"vec4"];
520-
[_vertexFunctions addObject:vertexFunction];
502+
_vertexFunctions = [[NSMutableArray alloc] init];
503+
[_vertexFunctions addObject:[[CCEffectFunction alloc] initWithName:@"defaultEffect" body:@"return cc_Position;" inputs:nil returnType:@"vec4"]];
521504
}
522505

523506
-(void)buildRenderPasses

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: 50 additions & 13 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]];
@@ -91,7 +103,7 @@ -(id)initWithPixelBlurRadius:(NSUInteger)blurRadius intensity:(float)intensity l
91103
CCEffectVarying* v_blurCoords = [CCEffectVarying varying:@"vec2" name:@"v_blurCoordinates" count:count];
92104

93105
if(self = [super initWithFragmentUniforms:@[u_enableGlowMap, u_luminanceThreshold]
94-
vertextUniforms:@[u_blurDirection]
106+
vertexUniforms:@[u_blurDirection]
95107
varying:@[v_blurCoords]])
96108
{
97109

@@ -110,6 +122,8 @@ +(id)effectWithPixelBlurRadius:(NSUInteger)blurRadius intensity:(float)intensity
110122

111123
-(void)buildFragmentFunctions
112124
{
125+
self.fragmentFunctions = [[NSMutableArray alloc] init];
126+
113127
GLfloat *standardGaussianWeights = calloc(_blurRadius + 1, sizeof(GLfloat));
114128
GLfloat sumOfWeights = 0.0;
115129
for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < _blurRadius + 1; currentGaussianWeightIndex++)
@@ -206,6 +220,8 @@ -(void)buildFragmentFunctions
206220

207221
-(void)buildVertexFunctions
208222
{
223+
self.vertexFunctions = [[NSMutableArray alloc] init];
224+
209225
GLfloat* standardGaussianWeights = calloc(_blurRadius + 1, sizeof(GLfloat));
210226
GLfloat sumOfWeights = 0.0;
211227
for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < _blurRadius + 1; currentGaussianWeightIndex++)
@@ -314,6 +330,27 @@ -(void)buildRenderPasses
314330
self.renderPasses = @[pass0, pass1, pass2];
315331
}
316332

333+
- (BOOL)readyForRendering
334+
{
335+
return !_shaderDirty;
336+
}
337+
338+
- (CCEffectPrepareStatus)prepareForRendering
339+
{
340+
CCEffectPrepareStatus result = CCEffectPrepareNothingToDo;
341+
if (_shaderDirty)
342+
{
343+
[self buildFragmentFunctions];
344+
[self buildVertexFunctions];
345+
[self buildEffectShader];
346+
[self buildRenderPasses];
347+
348+
_shaderDirty = NO;
349+
result = CCEffectPrepareSuccess;
350+
}
351+
return result;
352+
}
353+
317354
@end
318355
#endif
319356

cocos2d/CCEffectBrightness.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ -(id)init
2727
{
2828
CCEffectUniform* uniformBrightness = [CCEffectUniform uniform:@"float" name:@"u_brightness" value:[NSNumber numberWithFloat:0.0f]];
2929

30-
if((self = [super initWithFragmentUniforms:@[uniformBrightness] vertextUniforms:nil varying:nil]))
30+
if((self = [super initWithFragmentUniforms:@[uniformBrightness] vertexUniforms:nil varying:nil]))
3131
{
3232
self.debugName = @"CCEffectBrightness";
3333
return self;
@@ -52,6 +52,8 @@ +(id)effectWithBrightness:(float)brightness
5252

5353
-(void)buildFragmentFunctions
5454
{
55+
self.fragmentFunctions = [[NSMutableArray alloc] init];
56+
5557
CCEffectFunctionInput *input = [[CCEffectFunctionInput alloc] initWithType:@"vec4" name:@"inputValue" snippet:@"texture2D(cc_PreviousPassTexture, cc_FragTexCoord1)"];
5658

5759
NSString* effectBody = CC_GLSL(

cocos2d/CCEffectContrast.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ -(id)init
2828
{
2929
CCEffectUniform* uniformContrast = [CCEffectUniform uniform:@"float" name:@"u_contrast" value:[NSNumber numberWithFloat:1.0f]];
3030

31-
if((self = [super initWithFragmentUniforms:@[uniformContrast] vertextUniforms:nil varying:nil]))
31+
if((self = [super initWithFragmentUniforms:@[uniformContrast] vertexUniforms:nil varying:nil]))
3232
{
3333
self.debugName = @"CCEffectContrast";
3434
return self;
@@ -53,6 +53,8 @@ +(id)effectWithContrast:(float)contrast
5353

5454
-(void)buildFragmentFunctions
5555
{
56+
self.fragmentFunctions = [[NSMutableArray alloc] init];
57+
5658
CCEffectFunctionInput *input = [[CCEffectFunctionInput alloc] initWithType:@"vec4" name:@"inputValue" snippet:@"texture2D(cc_PreviousPassTexture, cc_FragTexCoord1)"];
5759

5860
NSString* effectBody = CC_GLSL(

cocos2d/CCEffectGaussianBlur.m

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ -(id)initWithPixelBlurRadius:(NSUInteger)blurRadius
8080
CCEffectVarying* v_blurCoords = [CCEffectVarying varying:@"vec2" name:@"v_blurCoordinates" count:count];
8181

8282
if(self = [super initWithFragmentUniforms:nil
83-
vertextUniforms:[NSArray arrayWithObjects:u_blurDirection, nil]
83+
vertexUniforms:[NSArray arrayWithObjects:u_blurDirection, nil]
8484
varying:[NSArray arrayWithObjects:v_blurCoords, nil]])
8585
{
8686

@@ -99,6 +99,8 @@ +(id)effectWithPixelBlurRadius:(NSUInteger)blurRadius
9999

100100
-(void)buildFragmentFunctions
101101
{
102+
self.fragmentFunctions = [[NSMutableArray alloc] init];
103+
102104
GLfloat *standardGaussianWeights = calloc(_blurRadius + 1, sizeof(GLfloat));
103105
GLfloat sumOfWeights = 0.0;
104106
for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < _blurRadius + 1; currentGaussianWeightIndex++)
@@ -175,6 +177,8 @@ -(void)buildFragmentFunctions
175177

176178
-(void)buildVertexFunctions
177179
{
180+
self.vertexFunctions = [[NSMutableArray alloc] init];
181+
178182
GLfloat* standardGaussianWeights = calloc(_blurRadius + 1, sizeof(GLfloat));
179183
GLfloat sumOfWeights = 0.0;
180184
for (NSUInteger currentGaussianWeightIndex = 0; currentGaussianWeightIndex < _blurRadius + 1; currentGaussianWeightIndex++)

cocos2d/CCEffectPixellate.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ -(id)init
6262
CCEffectUniform* uniformUStep = [CCEffectUniform uniform:@"float" name:@"u_uStep" value:[NSNumber numberWithFloat:1.0f]];
6363
CCEffectUniform* uniformVStep = [CCEffectUniform uniform:@"float" name:@"u_vStep" value:[NSNumber numberWithFloat:1.0f]];
6464

65-
if((self = [super initWithFragmentUniforms:@[uniformUStep, uniformVStep] vertextUniforms:nil varying:nil]))
65+
if((self = [super initWithFragmentUniforms:@[uniformUStep, uniformVStep] vertexUniforms:nil varying:nil]))
6666
{
6767
self.debugName = @"CCEffectPixellate";
6868
self.stitchFlags = CCEffectFunctionStitchAfter;
@@ -88,6 +88,8 @@ +(id)effectWithBlockSize:(float)blockSize;
8888

8989
-(void)buildFragmentFunctions
9090
{
91+
self.fragmentFunctions = [[NSMutableArray alloc] init];
92+
9193
// Image pixellation shader based on pixellation filter in GPUImage - https://github.com/BradLarson/GPUImage
9294
NSString* effectBody = CC_GLSL(
9395
vec2 samplePos = cc_FragTexCoord1 - mod(cc_FragTexCoord1, vec2(u_uStep, u_vStep)) + 0.5 * vec2(u_uStep, u_vStep);

0 commit comments

Comments
 (0)