Skip to content

Commit b9b4676

Browse files
authored
Merge pull request #4 from matcool/main
Add option for alternative shader
2 parents 5dde0a9 + 9f069f0 commit b9b4676

File tree

3 files changed

+55
-6
lines changed

3 files changed

+55
-6
lines changed

mod.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,13 @@
2323
"source": "https://github.com/Alphalaneous/FineOutline",
2424
"community": "https://discord.gg/Txn2CA5dHF"
2525
},
26-
"tags": ["enhancement", "customization"]
26+
"tags": ["enhancement", "customization"],
27+
"settings": {
28+
"alternative-shader": {
29+
"type": "bool",
30+
"default": false,
31+
"name": "Alternative Shader",
32+
"description": "Use an alternative shader for the outline. This may work better on some icons, but can look bad on lighter outlines"
33+
}
34+
}
2735
}

src/ShaderCache.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ void ShaderCache::init() {
77
}
88

99
void ShaderCache::add(std::string name, CCGLProgram* program) {
10-
program->retain();
1110
m_shaders->setObject(program, name);
1211
}
1312

@@ -25,7 +24,7 @@ void ShaderCache::createShader(std::string name, std::string frag) {
2524
prg->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
2625
prg->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
2726

28-
prg->retain();
27+
prg->autorelease();
2928
prg->link();
3029
prg->updateUniforms();
3130
add(name, prg);

src/main.cpp

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
using namespace geode::prelude;
1616

1717
void loadShaders() {
18-
18+
bool alt = Mod::get()->getSettingValue<bool>("alternative-shader");
19+
1920
std::string fragIcon = R"(
2021
#ifdef GL_ES
2122
precision mediump float;
@@ -35,6 +36,21 @@ void loadShaders() {
3536
gl_FragColor = v_fragmentColor * c;
3637
}
3738
)";
39+
if (alt) {
40+
fragIcon = R"(
41+
#ifdef GL_ES
42+
precision mediump float;
43+
#endif
44+
45+
varying vec4 v_fragmentColor;
46+
varying vec2 v_texCoord;
47+
uniform sampler2D CC_Texture0;
48+
49+
void main() {
50+
gl_FragColor = texture2D(CC_Texture0, v_texCoord) * v_fragmentColor;
51+
}
52+
)";
53+
}
3854

3955
ShaderCache::get()->createShader("icon", fragIcon);
4056

@@ -59,12 +75,34 @@ void loadShaders() {
5975
gl_FragColor = v_fragmentColor * c;
6076
}
6177
)";
78+
if (alt) {
79+
fragOutline = R"(
80+
#ifdef GL_ES
81+
precision mediump float;
82+
#endif
83+
84+
varying vec4 v_fragmentColor;
85+
varying vec2 v_texCoord;
86+
uniform sampler2D CC_Texture0;
87+
88+
void main() {
89+
vec4 c = texture2D(CC_Texture0, v_texCoord);
90+
float brightness = dot(c.rgb, vec3(1./3.)) / c.a;
91+
float isOutline = smoothstep(0.9, 0.0, brightness);
92+
c = vec4(c.a * isOutline);
93+
gl_FragColor = c * v_fragmentColor;
94+
}
95+
)";
96+
}
6297

6398
ShaderCache::get()->createShader("outline", fragOutline);
6499
};
65100

66101
$on_mod(Loaded) {
67102
loadShaders();
103+
listenForSettingChanges("alternative-shader", [](bool) {
104+
loadShaders();
105+
});
68106
}
69107

70108
class $modify(MyGameManager, GameManager) {
@@ -87,6 +125,8 @@ void removeShaders(CCSprite* spr) {
87125
void updateSprite(CCSprite* spr, ccColor3B color = {0, 0, 0}) {
88126
if (!spr || color == ccColor3B{0, 0, 0}) return;
89127

128+
bool alt = Mod::get()->getSettingValue<bool>("alternative-shader");
129+
90130
spr->setCascadeOpacityEnabled(true);
91131

92132
CCSprite* blackOutline = CCSprite::createWithSpriteFrame(spr->displayFrame());
@@ -100,14 +140,16 @@ void updateSprite(CCSprite* spr, ccColor3B color = {0, 0, 0}) {
100140
prgOutline->setUniformsForBuiltins();
101141
blackOutline->setShaderProgram(prgOutline);
102142
prgOutline->use();
103-
blackOutline->setBlendFunc({GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA});
143+
if (!alt)
144+
blackOutline->setBlendFunc({GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA});
104145
}
105146

106147
if (CCGLProgram* progIcon = ShaderCache::get()->getProgram("icon")) {
107148
progIcon->setUniformsForBuiltins();
108149
spr->setShaderProgram(progIcon);
109150
progIcon->use();
110-
spr->setBlendFunc({GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA});
151+
if (!alt)
152+
spr->setBlendFunc({GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA});
111153
}
112154

113155
spr->removeChildByID("black_outline"_spr);

0 commit comments

Comments
 (0)