Skip to content

Instantly share code, notes, and snippets.

@kchapelier
Created January 15, 2016 20:24
Show Gist options
  • Save kchapelier/a4a92ad4611129068e41 to your computer and use it in GitHub Desktop.
Save kchapelier/a4a92ad4611129068e41 to your computer and use it in GitHub Desktop.
Working base for a full feature GPU-based CA runner in javascript
# original : https://www.shadertoy.com/view/Xd33WS
int getNeighbourhoodMoore1 (vec2 relativePos) {
int u = 0;
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0,-1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0,-1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0,-1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 0.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 0.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0, 1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 1.0))/iResolution.xy).x);
return u;
}
int getNeighbourhoodVonNeumann1 (vec2 relativePos) {
int u = 0;
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0,-1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 0.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 0.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0, 1.0))/iResolution.xy).x);
return u;
}
int getNeighbourhoodVonNeumann2 (vec2 relativePos) {
int u = 0;
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0,-1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0,-1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0,-1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 0.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 0.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2(-1.0, 1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0, 1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 1.0, 1.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0,-2.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2(-2.0, 0.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 2.0, 0.0))/iResolution.xy).x);
u+=int(texture2D(iChannel0,(relativePos+vec2( 0.0, 2.0))/iResolution.xy).x);
return u;
}
bool isBirth(int v) {
return (v == 4);
}
bool isSurvival(int v) {
return (v == 2 || v== 3 || v == 5);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
if((iFrame==0)||(length(iMouse.xy-fragCoord))<5.0)
{
fragColor.x=(fract(dot(sin(fragCoord*vec2(157.1,113.7)),
vec2(353.17+iGlobalTime,383.093-iGlobalTime)))>0.33)?0.0:1.0;
}
else
{
fragColor=texture2D(iChannel0, fragCoord/iResolution.xy);
int v = getNeighbourhoodVonNeumann2(fragCoord);
if(isBirth(v)) {
fragColor.x=1.0;
} else if(fragColor.x > 0.5 && isSurvival(v)) {
fragColor.x=1.0;
} else {
fragColor.x=0.0;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment