Skip to content

Commit 302af8d

Browse files
committed
new astral shader
1 parent 21b835a commit 302af8d

File tree

2 files changed

+171
-14
lines changed

2 files changed

+171
-14
lines changed

assets/shaders/astral.fs

Lines changed: 167 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ extern MY_HIGHP_OR_MEDIUMP vec2 image_details;
1212
extern bool shadow;
1313
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1;
1414
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2;
15+
extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos;
16+
extern MY_HIGHP_OR_MEDIUMP float hovering;
17+
extern MY_HIGHP_OR_MEDIUMP float screen_scale;
1518

1619
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
1720
{
@@ -94,20 +97,144 @@ vec4 HSL(vec4 c)
9497
return hsl;
9598
}
9699

100+
vec4 RGBtoHSV(vec4 rgb)
101+
{
102+
vec4 hsv;
103+
float minVal = min(min(rgb.r, rgb.g), rgb.b);
104+
float maxVal = max(max(rgb.r, rgb.g), rgb.b);
105+
float delta = maxVal - minVal;
106+
107+
// Value
108+
hsv.z = maxVal;
109+
110+
// Saturation
111+
if (maxVal != 0.0)
112+
hsv.y = delta / maxVal;
113+
else {
114+
// r = g = b = 0, s = 0, v is undefined
115+
hsv.y = 0.0;
116+
hsv.x = -1.0;
117+
return hsv;
118+
}
119+
120+
// Hue
121+
if (rgb.r == maxVal)
122+
hsv.x = (rgb.g - rgb.b) / delta; // between yellow & magenta
123+
else if (rgb.g == maxVal)
124+
hsv.x = 2.0 + (rgb.b - rgb.r) / delta; // between cyan & yellow
125+
else
126+
hsv.x = 4.0 + (rgb.r - rgb.g) / delta; // between magenta & cyan
127+
128+
hsv.x = hsv.x * (1.0 / 6.0);
129+
if (hsv.x < 0.0)
130+
hsv.x += 1.0;
131+
132+
// Alpha
133+
hsv.w = rgb.a;
134+
135+
return hsv;
136+
}
137+
138+
vec4 HSVtoRGB(vec4 hsv) {
139+
vec4 rgb;
140+
141+
float h = hsv.x * 6.0;
142+
float c = hsv.z * hsv.y;
143+
float x = c * (1.0 - abs(mod(h, 2.0) - 1.0));
144+
float m = hsv.z - c;
145+
146+
if (h < 1.0) {
147+
rgb = vec4(c, x, 0.0, hsv.a);
148+
} else if (h < 2.0) {
149+
rgb = vec4(x, c, 0.0, hsv.a);
150+
} else if (h < 3.0) {
151+
rgb = vec4(0.0, c, x, hsv.a);
152+
} else if (h < 4.0) {
153+
rgb = vec4(0.0, x, c, hsv.a);
154+
} else if (h < 5.0) {
155+
rgb = vec4(x, 0.0, c, hsv.a);
156+
} else {
157+
rgb = vec4(c, 0.0, x, hsv.a);
158+
}
159+
160+
rgb.rgb += m;
161+
162+
return rgb;
163+
}
164+
165+
float bitxor(float val1, float val2)
166+
{
167+
float outp = 0;
168+
for(int i = 1; i < 9; i++) outp += floor(mod(mod(floor(val1*pow(2,-i)),pow(2,i))+mod(floor(val2*pow(2,-i)),pow(2,i)),2))*pow(2,i);
169+
return outp/256;
170+
}
171+
172+
float mod2(float val1, float mod1)
173+
{
174+
val1 /= mod1;
175+
val1 -= floor(val1);
176+
return(mod1 * val1);
177+
}
178+
179+
#define PI 3.14159265358979323846
180+
181+
float rand(vec2 c){
182+
return fract(sin(dot(c.xy ,vec2(12.9898,78.233))) * 43758.5453);
183+
}
184+
185+
float noise(vec2 p, float freq ){
186+
float unit = 1/freq;
187+
vec2 ij = floor(p/unit);
188+
vec2 xy = mod(p,unit)/unit;
189+
//xy = 3.*xy*xy-2.*xy*xy*xy;
190+
xy = .5*(1.-cos(PI*xy));
191+
float a = rand((ij+vec2(0.,0.)));
192+
float b = rand((ij+vec2(1.,0.)));
193+
float c = rand((ij+vec2(0.,1.)));
194+
float d = rand((ij+vec2(1.,1.)));
195+
float x1 = mix(a, b, xy.x);
196+
float x2 = mix(c, d, xy.x);
197+
return mix(x1, x2, xy.y);
198+
}
199+
200+
float pNoise(vec2 p, int res){
201+
float persistance = .5;
202+
float n = 0.;
203+
float normK = 0.;
204+
float f = 4.;
205+
float amp = 1.;
206+
int iCount = 0;
207+
for (int i = 0; i<50; i++){
208+
n+=amp*noise(p, f);
209+
f*=2.;
210+
normK+=amp;
211+
amp*=persistance;
212+
if (iCount == res) break;
213+
iCount++;
214+
}
215+
float nf = n/normK;
216+
return nf*nf*nf*nf;
217+
}
218+
97219
vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords )
98220
{
99221
vec4 tex = Texel(texture, texture_coords);
100222
vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba;
101223

224+
// Dummy, doesn't do anything but at least it makes the shader useable
225+
if (uv.x > uv.x * 2.){
226+
uv = astral;
227+
}
228+
229+
float mod = astral.r * 1.0;
230+
102231
number low = min(tex.r, min(tex.g, tex.b));
103232
number high = max(tex.r, max(tex.g, tex.b));
104233
number delta = high - low;
105234

106-
number saturation_fac = 1. - max(0., 0.05*(1.1-delta));
235+
//vec4 hsl = HSL(vec4(tex.r, tex.g, tex.b, tex.a));
107236

108-
vec4 hsl = HSL(vec4(tex.r*saturation_fac, tex.g*saturation_fac, tex.b, tex.a));
109-
110-
float t = astral.y*2.221 + mod(time,1.);
237+
float t = astral.y*2.221 + time;
111238
vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba;
112239
vec2 uv_scaled_centered = (floored_uv - 0.5) * 50.;
113240

@@ -119,22 +246,48 @@ vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords
119246
cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) +
120247
cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.;
121248

122-
float res = (.5 + .5* cos( (astral.x) * 2.612 + ( field + -.5 ) *3.14));
123-
hsl.x = .8;
124-
hsl.y = hsl.y * 0.8;
125-
hsl.z = hsl.z * 0.2 + 0.6 * sin(hsl.z/2.5 - res/4. + sin(astral.y)/8. + 0.5)/1.4;
249+
250+
vec4 pixel = Texel(texture, texture_coords);
251+
252+
float cx = uv_scaled_centered.x * 1;
253+
float cy = uv_scaled_centered.y * 1;
254+
255+
256+
257+
vec4 hsl = HSL(vec4(tex.r, tex.g, tex.b, tex.a));
258+
259+
260+
// |y| = 50, |x| = 50
126261

127262
tex.rgb = RGB(hsl).rgb;
128263

129-
if (tex[3] < 0.7)
130-
tex[3] = tex[3]/3.;
264+
vec2 mouse_offset = (screen_coords.xy - mouse_screen_pos.xy)/screen_scale;
265+
266+
float scaled_uvy = (uv.y +mouse_offset.y -0.5)*5*1.338;
267+
float scaled_uvx = (uv.x +mouse_offset.x -0.5)*5;
268+
float norm_uv = sqrt(scaled_uvx*scaled_uvx + scaled_uvy*scaled_uvy);
269+
270+
pixel = vec4(pixel.rgb * 0.0 + tex.rgb * tex.a, pixel.a);
271+
272+
float res = (.5 + .5* cos( (astral.x) * 2.612 + ( field + -.5 ) *3.14));
273+
vec4 textp = RGB(hsl);
274+
tex.rgb = textp.rgb;
275+
276+
float stars = ((pNoise(uv*10 + t/15.0, 10)*pNoise(uv*10 + t/15.0, 10)+1.5)/1+0.15 + ((pNoise(uv*12 + t/15.0, 10)+1.2)/1+0.3))/2.2+0.05 + 0.007*norm_uv * 1.1;
277+
278+
float clusters = (pNoise(uv*10.0-t/15.0, 10)+1.5)/1.5-0.25 + 0.007*norm_uv;
279+
280+
float super_clusters = (pNoise(uv/15.0, 10)+0.1)/2+0.3 - 0.008*norm_uv;
281+
282+
clusters *= clusters * clusters * clusters * 0.4;
283+
stars *= stars * stars;
284+
super_clusters *= super_clusters * super_clusters;
285+
286+
colour.rgb = vec3(0.6, 0.45, 1) * (((clusters + stars + super_clusters)+0.1)) * 0.285;
287+
131288
return dissolve_mask(tex*colour, texture_coords, uv);
132289
}
133290

134-
extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos;
135-
extern MY_HIGHP_OR_MEDIUMP float hovering;
136-
extern MY_HIGHP_OR_MEDIUMP float screen_scale;
137-
138291
#ifdef VERTEX
139292
vec4 position( mat4 transform_projection, vec4 vertex_position )
140293
{

items/misc.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,6 +1147,10 @@ local astral = {
11471147
code = {
11481148
"Math",
11491149
},
1150+
art = {
1151+
"lord.ruby",
1152+
"Oiiman"
1153+
}
11501154
},
11511155
object_type = "Edition",
11521156
dependencies = {

0 commit comments

Comments
 (0)