Skip to content

Commit 12ffae9

Browse files
committed
WIP - outerglow, using SDF.
1 parent 400cb18 commit 12ffae9

File tree

7 files changed

+221
-0
lines changed

7 files changed

+221
-0
lines changed

Resources/Images/dist4.tga

16 KB
Binary file not shown.

cocos2d-ios.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,10 @@
263263
D208E79E1993FEDA00BD8D6B /* CCEffectDropShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = D208E79B1993FEDA00BD8D6B /* CCEffectDropShadow.h */; };
264264
D208E79F1993FEDA00BD8D6B /* CCEffectDropShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = D208E79C1993FEDA00BD8D6B /* CCEffectDropShadow.m */; };
265265
D208E7A01993FEDA00BD8D6B /* CCEffectDropShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = D208E79C1993FEDA00BD8D6B /* CCEffectDropShadow.m */; };
266+
D208E7AD19959A4800BD8D6B /* CCEffectOuterGlow.h in Headers */ = {isa = PBXBuildFile; fileRef = D208E7AB19959A4800BD8D6B /* CCEffectOuterGlow.h */; };
267+
D208E7AE19959A4800BD8D6B /* CCEffectOuterGlow.h in Headers */ = {isa = PBXBuildFile; fileRef = D208E7AB19959A4800BD8D6B /* CCEffectOuterGlow.h */; };
268+
D208E7AF19959A4800BD8D6B /* CCEffectOuterGlow.m in Sources */ = {isa = PBXBuildFile; fileRef = D208E7AC19959A4800BD8D6B /* CCEffectOuterGlow.m */; };
269+
D208E7B019959A4800BD8D6B /* CCEffectOuterGlow.m in Sources */ = {isa = PBXBuildFile; fileRef = D208E7AC19959A4800BD8D6B /* CCEffectOuterGlow.m */; };
266270
D23C5CB4194BC108007CA669 /* CCTouchIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = D23C5CB2194BC108007CA669 /* CCTouchIOS.h */; };
267271
D23C5CB5194BC108007CA669 /* CCTouchIOS.m in Sources */ = {isa = PBXBuildFile; fileRef = D23C5CB3194BC108007CA669 /* CCTouchIOS.m */; };
268272
D23C5CBC194BC500007CA669 /* CCTouchAndroid.h in Headers */ = {isa = PBXBuildFile; fileRef = D23C5CBA194BC500007CA669 /* CCTouchAndroid.h */; };
@@ -982,6 +986,8 @@
982986
B7EE6A1D181AE34600B983FE /* CCSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CCSlider.m; path = "cocos2d-ui/CCSlider.m"; sourceTree = "<group>"; };
983987
D208E79B1993FEDA00BD8D6B /* CCEffectDropShadow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCEffectDropShadow.h; sourceTree = "<group>"; };
984988
D208E79C1993FEDA00BD8D6B /* CCEffectDropShadow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCEffectDropShadow.m; sourceTree = "<group>"; };
989+
D208E7AB19959A4800BD8D6B /* CCEffectOuterGlow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCEffectOuterGlow.h; sourceTree = "<group>"; };
990+
D208E7AC19959A4800BD8D6B /* CCEffectOuterGlow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCEffectOuterGlow.m; sourceTree = "<group>"; };
985991
D23C5CB2194BC108007CA669 /* CCTouchIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCTouchIOS.h; sourceTree = "<group>"; };
986992
D23C5CB3194BC108007CA669 /* CCTouchIOS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CCTouchIOS.m; sourceTree = "<group>"; };
987993
D23C5CBA194BC500007CA669 /* CCTouchAndroid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CCTouchAndroid.h; path = Android/CCTouchAndroid.h; sourceTree = "<group>"; };
@@ -1773,6 +1779,8 @@
17731779
D2B49103192146FB00C3443A /* CCEffectGaussianBlur.m */,
17741780
D208E79B1993FEDA00BD8D6B /* CCEffectDropShadow.h */,
17751781
D208E79C1993FEDA00BD8D6B /* CCEffectDropShadow.m */,
1782+
D208E7AB19959A4800BD8D6B /* CCEffectOuterGlow.h */,
1783+
D208E7AC19959A4800BD8D6B /* CCEffectOuterGlow.m */,
17761784
);
17771785
name = Effects;
17781786
sourceTree = "<group>";
@@ -1918,6 +1926,7 @@
19181926
B7705FF81831A07B0043CC67 /* OALSuspendHandler.h in Headers */,
19191927
D268FE0F198078FF00ECBCD0 /* CCEffectGlass.h in Headers */,
19201928
D24160FE1958F6EE003673BD /* CCAnimationManager.h in Headers */,
1929+
D208E7AD19959A4800BD8D6B /* CCEffectOuterGlow.h in Headers */,
19211930
50305AF40E40E33200F63373 /* cocos2d.h in Headers */,
19221931
D285ECF8192EF5B2009F4E88 /* CCDirectorAndroid.h in Headers */,
19231932
B7705FE81831A07B0043CC67 /* ALDevice.h in Headers */,
@@ -2206,6 +2215,7 @@
22062215
D2FEB68F194F6C9E00FC0574 /* ObjectALConfig.h in Headers */,
22072216
D2FEB690194F6C9E00FC0574 /* CCDirectorMac.h in Headers */,
22082217
D2FEB691194F6C9E00FC0574 /* CCGLView.h in Headers */,
2218+
D208E7AE19959A4800BD8D6B /* CCEffectOuterGlow.h in Headers */,
22092219
D2FEB692194F6C9E00FC0574 /* CCWindow.h in Headers */,
22102220
D208E79E1993FEDA00BD8D6B /* CCEffectDropShadow.h in Headers */,
22112221
D2FEB693194F6C9E00FC0574 /* CCProgressNode.h in Headers */,
@@ -2419,6 +2429,7 @@
24192429
D208E79F1993FEDA00BD8D6B /* CCEffectDropShadow.m in Sources */,
24202430
B7705FE71831A07B0043CC67 /* ALContext.m in Sources */,
24212431
B7EE6A1F181AE34600B983FE /* CCSlider.m in Sources */,
2432+
D208E7AF19959A4800BD8D6B /* CCEffectOuterGlow.m in Sources */,
24222433
D37D197A18B6665700B23FDE /* CCTMXXMLParser.m in Sources */,
24232434
509A79980F6188420032F449 /* CCSprite.m in Sources */,
24242435
D37D197718B6665700B23FDE /* CCTiledMap.m in Sources */,
@@ -2624,6 +2635,7 @@
26242635
D2FEB702194F6C9E00FC0574 /* CCGLView.m in Sources */,
26252636
D2FEB703194F6C9E00FC0574 /* CCEffectBrightness.m in Sources */,
26262637
D24161171958F738003673BD /* CCAnimationManager+FrameAnimation.m in Sources */,
2638+
D208E7B019959A4800BD8D6B /* CCEffectOuterGlow.m in Sources */,
26272639
D2FEB705194F6C9E00FC0574 /* CCBKeyframe.m in Sources */,
26282640
D2FEB706194F6C9E00FC0574 /* CCTexturePVR.m in Sources */,
26292641
D2FEB707194F6C9E00FC0574 /* ALListener.m in Sources */,

cocos2d-ui-tests/tests/CCEffectsTest.m

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,28 @@ -(id)init
1616
return self;
1717
}
1818

19+
-(void)setupOuterGlowEffectTest
20+
{
21+
self.subTitle = @"OuterGlow Effect Test";
22+
23+
CCNodeColor* environment = [CCNodeColor nodeWithColor:[CCColor whiteColor]];
24+
environment.positionType = CCPositionTypeNormalized;
25+
environment.anchorPoint = ccp(0.5, 0.5);
26+
environment.position = ccp(0.5f, 0.5f);
27+
28+
[self.contentNode addChild:environment];
29+
30+
CCColor *glowColor = [CCColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:0.5];
31+
CCEffectOuterGlow* effect = [CCEffectOuterGlow effectWithGlowColor:glowColor];
32+
33+
CCSprite *sampleSprite = [CCSprite spriteWithImageNamed:@"Images/dist4.tga"];
34+
sampleSprite.position = ccp(0.5, 0.5);
35+
sampleSprite.positionType = CCPositionTypeNormalized;
36+
sampleSprite.effect = effect;
37+
38+
[self.contentNode addChild:sampleSprite];
39+
}
40+
1941
-(void)setupDropShadowEffectTest
2042
{
2143
self.subTitle = @"DropShadow Effect Test";

cocos2d/CCEffectOuterGlow.h

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//
2+
// CCEffectOuterGlow.h
3+
// cocos2d-ios
4+
//
5+
// Created by Oleg Osin on 8/8/14.
6+
//
7+
//
8+
9+
#import "CCEffect.h"
10+
11+
/**
12+
* CCEffectOuterGlow create a drop shadow.
13+
*
14+
*/
15+
16+
@interface CCEffectOuterGlow : CCEffect
17+
18+
/// -----------------------------------------------------------------------
19+
/// @name Accessing Effect Attributes
20+
/// -----------------------------------------------------------------------
21+
22+
/** Color of the shadow,
23+
* [CCColor blackColor] will result in an opaque black drop shadow.
24+
*/
25+
@property (nonatomic) CCColor* glowColor;
26+
27+
/// -----------------------------------------------------------------------
28+
/// @name Initializing a CCEffectOuterGlow object
29+
/// -----------------------------------------------------------------------
30+
31+
/**
32+
* Initializes a CCEffectOuterGlow object with a (5, -5) black drop shadow offset .
33+
*
34+
* @return The CCEffectOuterGlow object.
35+
*/
36+
-(id)init;
37+
38+
/**
39+
* Initializes a CCEffectOuterGlow object with the supplied parameters.
40+
*
41+
* @param glowColor Color of the glow, a [CCColor blackColor] will result in an opaque black drop shadow.
42+
*
43+
* @return The CCEffectOuterGlow object.
44+
*/
45+
-(id)initWithGlowColor:(CCColor*)glowColor;
46+
47+
48+
/// -----------------------------------------------------------------------
49+
/// @name Creating a CCEffectOuterGlow object
50+
/// -----------------------------------------------------------------------
51+
52+
/**
53+
* Initializes a CCEffectOuterGlow object with the supplied parameters.
54+
*
55+
* @param glowColor Color of the glow, a [CCColor blackColor] will result in an opaque black drop shadow.
56+
*
57+
* @return The CCEffectOuterGlow object.
58+
*/
59+
+(id)effectWithGlowColor:(CCColor*)glowColor;
60+
61+
@end

cocos2d/CCEffectOuterGlow.m

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
//
2+
// CCEffectOuterGlow.m
3+
// cocos2d-ios
4+
//
5+
// Created by Oleg Osin on 8/8/14.
6+
//
7+
//
8+
9+
#import "CCEffectOuterGlow.h"
10+
11+
#import "CCEffectOuterGlow.h"
12+
#import "CCEffect_Private.h"
13+
#import "CCRenderer.h"
14+
#import "CCTexture.h"
15+
16+
@implementation CCEffectOuterGlow
17+
18+
-(id)init
19+
{
20+
return [self initWithGlowColor:[CCColor blackColor]];
21+
}
22+
23+
-(id)initWithGlowColor:(CCColor*)glowColor
24+
{
25+
NSArray *uniforms = @[
26+
[CCEffectUniform uniform:@"vec4" name:@"u_glowColor" value: [NSValue valueWithGLKVector4:glowColor.glkVector4]]
27+
];
28+
29+
if((self = [super initWithFragmentUniforms:uniforms vertexUniforms:nil varying:nil]))
30+
{
31+
_glowColor = glowColor;
32+
self.debugName = @"CCEffectOuterGlow";
33+
}
34+
return self;
35+
}
36+
37+
+(id)effectWithGlowColor:(CCColor*)glowColor
38+
{
39+
return [[self alloc] initWithGlowColor:glowColor];
40+
}
41+
42+
-(void)buildFragmentFunctions
43+
{
44+
self.fragmentFunctions = [[NSMutableArray alloc] init];
45+
46+
NSString* effectBody = CC_GLSL(
47+
48+
// Make the color values to go from [-1, 1].
49+
vec4 distanceField = 2.0 * texture2D(cc_MainTexture, cc_FragTexCoord1) - 1.0;
50+
vec4 fw = fwidth(distanceField);
51+
vec4 mask = smoothstep(-fw, fw, distanceField);
52+
53+
float distAlphaMask = distanceField.a;
54+
// outline
55+
const float min0 = 0.0;
56+
const float min1 = 0.4;
57+
const float max0 = 0.4;
58+
const float max1 = 0.9;
59+
60+
bool less = distAlphaMask >= min0;
61+
bool more = distAlphaMask <= max1;
62+
63+
if(less && more)
64+
{
65+
float oFactor = 1.0;
66+
if(distAlphaMask <= min1)
67+
{
68+
oFactor = smoothstep(min0, min1, distAlphaMask);
69+
}
70+
else
71+
{
72+
oFactor = smoothstep(max1, max0, distAlphaMask);
73+
}
74+
75+
mask = vec4(1.0, 0.0, 0.0, 1.0);//mix(mask, vec4(1.0, 1.0, 0.0, 1.0), oFactor);
76+
77+
}
78+
79+
if(distAlphaMask >= 0.5)
80+
mask.a = 1.0;
81+
else
82+
mask.a = 0.0;
83+
84+
85+
86+
if(false) {
87+
vec4 glowTexel = texture2D(cc_MainTexture, cc_FragTexCoord1);
88+
vec4 glowc = vec4(1.0, 0.0, 0.0, 1.0) * smoothstep(0.0, 0.0, glowTexel.a);
89+
90+
distanceField = mix(glowc, distanceField, mask);
91+
92+
vec4 outputColor = distanceField;
93+
}
94+
95+
96+
return mask;
97+
);
98+
99+
CCEffectFunction* fragmentFunction = [[CCEffectFunction alloc] initWithName:@"outerGlowEffect"
100+
body:effectBody inputs:nil returnType:@"vec4"];
101+
[self.fragmentFunctions addObject:fragmentFunction];
102+
}
103+
104+
-(void)buildRenderPasses
105+
{
106+
__weak CCEffectOuterGlow *weakSelf = self;
107+
108+
CCEffectRenderPass *pass0 = [[CCEffectRenderPass alloc] init];
109+
pass0.debugLabel = @"CCEffectOuterGlow pass 0";
110+
pass0.shader = self.shader;
111+
pass0.blendMode = [CCBlendMode premultipliedAlphaMode];
112+
pass0.beginBlocks = @[[^(CCEffectRenderPass *pass, CCTexture *previousPassTexture){
113+
114+
pass.shaderUniforms[CCShaderUniformMainTexture] = previousPassTexture;
115+
pass.shaderUniforms[CCShaderUniformPreviousPassTexture] = previousPassTexture;
116+
117+
pass.shaderUniforms[weakSelf.uniformTranslationTable[@"u_glowColor"]] = [NSValue valueWithGLKVector4:weakSelf.glowColor.glkVector4];
118+
119+
} copy]];
120+
121+
self.renderPasses = @[pass0];
122+
}
123+
124+
@end

cocos2d/CCShader.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
static const GLchar *CCFragmentShaderHeader =
101101
"#ifdef GL_ES\n"
102102
"precision " XSTR(CC_SHADER_DEFAULT_FRAGMENT_PRECISION) " float;\n"
103+
"#extension GL_OES_standard_derivatives : enable\n"
103104
"#endif\n\n"
104105
"// End Cocos2D fragment shader header.\n\n";
105106

cocos2d/cocos2d.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
#import "CCEffectGaussianBlur.h"
7070
#import "CCEffectGlass.h"
7171
#import "CCEffectDropShadow.h"
72+
#import "CCEffectOuterGlow.h"
7273
#import "CCEffectHue.h"
7374
#import "CCEffectNode.h"
7475
#import "CCEffectPixellate.h"

0 commit comments

Comments
 (0)