ON ERROR IF ERR=17 CHAIN @lib$+"../examples/tools/touchide" ELSE MODE 3 : PRINT REPORT$ : END REM 'Slit Scan' effect by Roy Wiggins, http://roy.red/, 27th April 2016 REM BBCSDL version by Richard Russell, www.rtrussell.co.uk, 08-Feb-2019 REM This version has been adapted to work in both OpenGL and OpenGL ES2 REM Install libraries: INSTALL @lib$ + "shaderlib" REM Create arrays and structures: DIM Vertex$(10), Fragment$(999), Float{0%,1%} REM Fill vertex and fragment shader arrays from DATA statements: PROC_readshader(Vertex$()) PROC_readshader(Fragment$()) REM Initialise window and get its size: ON MOVE IF @msg% <> 5 RETURN ELSE PROCcleanup VDU 26 IF POS REM SDL thread sync ScrW% = @size.x% ScrH% = @size.y% REM Ensure cleanup on exit: ON CLOSE PROCcleanup : QUIT ON ERROR PROCcleanup : IF ERR=17 CHAIN @lib$+"../examples/tools/touchide" ELSE MODE 3 : PRINT REPORT$ : END REM Initialise shader library: PROC_shaderinit(oVertex%, oFragment%) REM Compile shaders: PROC_compileshader(oVertex%, Vertex$(), "Vertex") PROC_compileshader(oFragment%, Fragment$(), "Fragment") REM Link and use shaders: oProgram% = FN_useshaders(oVertex%, oFragment%) SYS `glGetUniformLocation`, oProgram%, "iTime", @memhdc% TO pTime% SYS `glGetUniformLocation`, oProgram%, "iMouse", @memhdc% TO pMouse% SYS `glGetUniformLocation`, oProgram%, "iResolution", @memhdc% TO pResolution% SYS `glGetUniformLocation`, oProgram%, "iChannel0", @memhdc% TO pChannel0% REM Load and bind noise terrain texture to uniform: SYS `glUniform1i`, pChannel0%, 0, @memhdc% SYS `glActiveTexture`, GL_TEXTURE0, @memhdc% Texture% = FN_loadtexture1(@dir$ + "slitscan.png") IF Texture% = 0 ERROR 100, "Couldn't load slitscan.png" REM Render loop: TIME = 0 REPEAT MOUSE X%,Y%,B% Float.0% = FN_f4(TIME/100) IF B%=0 SYS `glUniform1fv`, pTime%, 1, Float{}, @memhdc% Float.0% = FN_f4(X%/2) : Float.1% = FN_f4(Y%/2) SYS `glUniform2fv`, pMouse%, 1, Float{}, @memhdc% Float.0% = FN_f4(ScrW%) : Float.1% = FN_f4(ScrH%) SYS `glUniform2fv`, pResolution%, 1, Float{}, @memhdc% PROC_render UNTIL FALSE END DEF PROCcleanup ON ERROR OFF Texture% += 0 : IF Texture% SYS `glDeleteTextures`, 1, ^Texture%, @memhdc% oProgram% += 0 : oVertex% += 0 : oFragment% += 0 PROC_shaderexit(oProgram%, oVertex%, oFragment%) *REFRESH ON ENDPROC REM Minimal vertex shader: DATA "attribute vec4 vPosition;" DATA "void main()" DATA "{" DATA "gl_Position = vPosition ;" DATA "}" DATA "" REM Fragment Shader code from http://roy.red/slitscan-.html DATA "uniform float iTime;" DATA "uniform vec2 iMouse;" DATA "uniform vec2 iResolution;" DATA "uniform sampler2D iChannel0;" DATA "// Inspired by physical slit-scan photography, in which you dolly the camera" DATA "// backwards while you drag the image across a slit. This 'slit' is circular." DATA "void main()" DATA "{" DATA "vec2 pt = gl_FragCoord.xy;" DATA "pt = 3.0*(pt.xy / iResolution.xy - 0.5)*vec2(iResolution.x/iResolution.y,1.0);" DATA "float rInv = 1.0/length(pt);" DATA "pt = pt * rInv - vec2(rInv + iTime,0.5);" DATA "gl_FragColor = mix(texture2D(iChannel0, pt*0.5) * rInv*0.5," DATA "vec4(0.5,0.9,0.9,1.0), smoothstep(4.5,6.0,rInv));" DATA "}" DATA ""