/*********************************************************************
*
*	file: glsl_shaders.h
*	note: string literals auto-generated by build_runtime.py
*	date: 09/082023
*
**********************************************************************/
#ifndef __GLSL_SHADERS_H__
#define __GLSL_SHADERS_H__


//NOTE: string imported from src/shaders/advect.glsl
const char* glsl_advect = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D src;\n"
"uniform sampler2D velocity;\n"
"uniform float delta;\n"
"uniform float dissipation;\n"
"\n"
"vec2 u(ivec2 coord)\n"
"{\n"
"	return(texelFetch(velocity, coord, 0).xy);\n"
"}\n"
"\n"
"vec4 q(ivec2 coord)\n"
"{\n"
"	if(  coord.x < 0\n"
"	  || coord.x >= textureSize(src, 0).x\n"
"	  || coord.y < 0\n"
"	  || coord.y >= textureSize(src, 0).y)\n"
"	{\n"
"		return(vec4(0.));\n"
"	}\n"
"	return(texelFetch(src, coord, 0));\n"
"}\n"
"\n"
"vec4 bilerpSrc(vec2 pos)\n"
"{\n"
"	vec2 offset = fract(pos);\n"
"\n"
"	ivec2 bl = ivec2(floor(pos));\n"
"\n"
"	ivec2 br = bl + ivec2(1, 0);\n"
"	ivec2 tl = bl + ivec2(0, 1);\n"
"	ivec2 tr = bl + ivec2(1, 1);\n"
"\n"
"	vec4 lerpTop = (1.-offset.x)*q(tl) + offset.x*q(tr);\n"
"	vec4 lerpBottom = (1.-offset.x)*q(bl) + offset.x*q(br);\n"
"	vec4 result = (1.-offset.y)*lerpBottom + offset.y*lerpTop;\n"
"\n"
"	return(result);\n"
"}\n"
"\n"
"void main()\n"
"{\n"
"	float texWidth = float(textureSize(velocity, 0).x);\n"
"\n"
"	ivec2 pixelCoord = ivec2(floor(gl_FragCoord.xy));\n"
"\n"
"	vec2 samplePos = vec2(pixelCoord) - texWidth * delta * u(pixelCoord);\n"
"	fragColor = bilerpSrc(samplePos) / (1. + dissipation*delta);\n"
"}\n";

//NOTE: string imported from src/shaders/blit_div_fragment.glsl
const char* glsl_blit_div_fragment = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D tex;\n"
"\n"
"vec3 color_map(float v)\n"
"{\n"
"	float logv = log(abs(v))/log(10.0);\n"
"	float f = floor(logv + 7.0);\n"
"	float i = floor(4.0*(logv + 7.0 - f));\n"
"\n"
"	if(f < 0.0) return vec3(0.0);\n"
"	if(f < 1.0) return mix(vec3(1.0, 0.0, 0.0), vec3(1.0), i/4.0);\n"
"	if(f < 2.0) return mix(vec3(0.0, 1.0, 0.0), vec3(1.0), i/4.0);\n"
"	if(f < 3.0) return mix(vec3(0.0, 0.0, 1.0), vec3(1.0), i/4.0);\n"
"	if(f < 4.0) return mix(vec3(1.0, 1.0, 0.0), vec3(1.0), i/4.0);\n"
"	if(f < 5.0) return mix(vec3(1.0, 0.0, 1.0), vec3(1.0), i/4.0);\n"
"	if(f < 6.0) return mix(vec3(0.0, 1.0, 1.0), vec3(1.0), i/4.0);\n"
"	if(f < 7.0) return mix(vec3(1.0, 0.5, 0.0), vec3(1.0), i/4.0);\n"
"	if(f < 8.0) return mix(vec3(1.0, 1.0, 1.0), vec3(1.0), i/4.0);\n"
"	return vec3(1.0);\n"
"}\n"
"\n"
"void main()\n"
"{\n"
"	ivec2 pixelCoord = ivec2(floor(texCoord.xy * vec2(textureSize(tex, 0).xy)));\n"
"	float f = texelFetch(tex, pixelCoord, 0).x;\n"
"	fragColor = vec4(color_map(f), 1.0);\n"
"}\n";

//NOTE: string imported from src/shaders/blit_div_vertex.glsl
const char* glsl_blit_div_vertex = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"\n"
"in vec2 pos;\n"
"out vec2 texCoord;\n"
"\n"
"uniform mat4 mvp;\n"
"\n"
"void main()\n"
"{\n"
"	texCoord = 0.5*(pos + vec2(1,1));\n"
"	gl_Position = mvp * vec4(pos, 0, 1);\n"
"}\n";

//NOTE: string imported from src/shaders/blit_fragment.glsl
const char* glsl_blit_fragment = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D tex;\n"
"\n"
"void main()\n"
"{\n"
"	fragColor = texture(tex, texCoord);\n"
"	fragColor.a = 1.0;\n"
"}\n";

//NOTE: string imported from src/shaders/blit_residue_fragment.glsl
const char* glsl_blit_residue_fragment = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D xTex;\n"
"uniform sampler2D bTex;\n"
"\n"
"float x(ivec2 coord)\n"
"{\n"
"	if(  coord.x <= 0\n"
"	  || coord.x >= textureSize(xTex, 0).x\n"
"	  || coord.y <= 0\n"
"	  || coord.y >= textureSize(xTex, 0).y)\n"
"	{\n"
"		return(0.);\n"
"	}\n"
"	return(texelFetch(xTex, coord, 0).x);\n"
"}\n"
"\n"
"float b(ivec2 coord)\n"
"{\n"
"	if(  coord.x <= 0\n"
"	  || coord.x >= textureSize(bTex, 0).x\n"
"	  || coord.y <= 0\n"
"	  || coord.y >= textureSize(bTex, 0).y)\n"
"	{\n"
"		return(0.);\n"
"	}\n"
"	return(texelFetch(bTex, coord, 0).x);\n"
"}\n"
"\n"
"vec3 color_map(float v)\n"
"{\n"
"	float logv = log(abs(v))/log(10.0);\n"
"	float f = floor(logv + 7.0);\n"
"	float i = floor(4.0*(logv + 7.0 - f));\n"
"\n"
"	if(f < 0.0) return vec3(0.0);\n"
"	if(f < 1.0) return mix(vec3(1.0, 0.0, 0.0), vec3(1.0), i/4.0);\n"
"	if(f < 2.0) return mix(vec3(0.0, 1.0, 0.0), vec3(1.0), i/4.0);\n"
"	if(f < 3.0) return mix(vec3(0.0, 0.0, 1.0), vec3(1.0), i/4.0);\n"
"	if(f < 4.0) return mix(vec3(1.0, 1.0, 0.0), vec3(1.0), i/4.0);\n"
"	if(f < 5.0) return mix(vec3(1.0, 0.0, 1.0), vec3(1.0), i/4.0);\n"
"	if(f < 6.0) return mix(vec3(0.0, 1.0, 1.0), vec3(1.0), i/4.0);\n"
"	if(f < 7.0) return mix(vec3(1.0, 0.5, 0.0), vec3(1.0), i/4.0);\n"
"	if(f < 8.0) return mix(vec3(1.0, 1.0, 1.0), vec3(1.0), i/4.0);\n"
"	return vec3(1.0);\n"
"}\n"
"\n"
"void main()\n"
"{\n"
"	ivec2 pixelCoord = ivec2(floor(texCoord.xy * vec2(textureSize(xTex, 0).xy)));\n"
"\n"
"	float tl = x(pixelCoord + ivec2(-1, 1));\n"
"	float tr = x(pixelCoord + ivec2(1, 1));\n"
"	float bl = x(pixelCoord + ivec2(-1, -1));\n"
"	float br = x(pixelCoord + ivec2(1, -1));\n"
"\n"
"	float residue = b(pixelCoord) - (-tl - tr - bl - br + 4.*x(pixelCoord));\n"
"	fragColor = vec4(color_map(residue), 1);\n"
"}\n";

//NOTE: string imported from src/shaders/blit_vertex.glsl
const char* glsl_blit_vertex = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"\n"
"in vec2 pos;\n"
"out vec2 texCoord;\n"
"\n"
"uniform mat4 mvp;\n"
"uniform ivec2 gridSize;\n"
"\n"
"void main()\n"
"{\n"
"	float margin = 32.;\n"
"	float ratio = 1. - 2.*margin/float(gridSize.x);\n"
"\n"
"	texCoord = margin/float(gridSize.x) + ratio*(0.5*(pos + vec2(1,1)));\n"
"	gl_Position = mvp * vec4(pos, 0, 1);\n"
"}\n";

//NOTE: string imported from src/shaders/common_vertex.glsl
const char* glsl_common_vertex = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"\n"
"in vec2 pos;\n"
"out vec2 texCoord;\n"
"\n"
"void main()\n"
"{\n"
"	texCoord = 0.5*(pos + vec2(1,1));\n"
"	gl_Position = vec4(pos, 0, 1);\n"
"}\n";

//NOTE: string imported from src/shaders/divergence.glsl
const char* glsl_divergence = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D src;\n"
"\n"
"vec2 u(ivec2 coord)\n"
"{\n"
"	return(texelFetch(src, coord, 0).xy);\n"
"}\n"
"\n"
"void main()\n"
"{\n"
"	ivec2 pixelCoord = ivec2(floor(gl_FragCoord.xy));\n"
"\n"
"	if(  pixelCoord.x <= 0\n"
"	  || pixelCoord.x >= textureSize(src, 0).x\n"
"	  || pixelCoord.y <= 0\n"
"	  || pixelCoord.y >= textureSize(src, 0).y)\n"
"	{\n"
"		fragColor = vec4(0, 0, 0, 1);\n"
"	}\n"
"	else\n"
"	{\n"
"		vec2 tl = u(pixelCoord + ivec2(-1, 0));\n"
"		vec2 tr = u(pixelCoord);\n"
"		vec2 bl = u(pixelCoord + ivec2(-1, -1));\n"
"		vec2 br = u(pixelCoord + ivec2(0, -1));\n"
"\n"
"		float r = (tr.x + br.x)/2.;\n"
"		float l = (tl.x + bl.x)/2.;\n"
"		float t = (tl.y + tr.y)/2.;\n"
"		float b = (bl.y + br.y)/2.;\n"
"\n"
"		fragColor = vec4(-2.*(r - l + t - b), 0, 0, 1);\n"
"	}\n"
"}\n";

//NOTE: string imported from src/shaders/jacobi_step.glsl
const char* glsl_jacobi_step = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D xTex;\n"
"uniform sampler2D bTex;\n"
"\n"
"float x(ivec2 coord)\n"
"{\n"
"	if(  coord.x <= 0\n"
"	  || coord.x >= textureSize(xTex, 0).x\n"
"	  || coord.y <= 0\n"
"	  || coord.y >= textureSize(xTex, 0).y)\n"
"	{\n"
"		return(0.);\n"
"	}\n"
"	return(texelFetch(xTex, coord, 0).x);\n"
"}\n"
"\n"
"float b(ivec2 coord)\n"
"{\n"
"	if(  coord.x <= 0\n"
"	  || coord.x >= textureSize(bTex, 0).x\n"
"	  || coord.y <= 0\n"
"	  || coord.y >= textureSize(bTex, 0).y)\n"
"	{\n"
"		return(0.);\n"
"	}\n"
"	return(texelFetch(bTex, coord, 0).x);\n"
"}\n"
"\n"
"void main()\n"
"{\n"
"	ivec2 pixelCoord = ivec2(floor(gl_FragCoord.xy));\n"
"\n"
"	if(  pixelCoord.x <= 0\n"
"	  || pixelCoord.y <= 0)\n"
"	{\n"
"		fragColor = vec4(0, 0, 0, 1);\n"
"	}\n"
"	else\n"
"	{\n"
"		float tl = x(pixelCoord + ivec2(-1, 1));\n"
"		float tr = x(pixelCoord + ivec2(1, 1));\n"
"		float bl = x(pixelCoord + ivec2(-1, -1));\n"
"		float br = x(pixelCoord + ivec2(1, -1));\n"
"\n"
"		float jacobi = (tl + tr + bl + br + b(pixelCoord))/4.;\n"
"		fragColor = vec4(jacobi, 0, 0, 1);\n"
"	}\n"
"}\n";

//NOTE: string imported from src/shaders/multigrid_correct.glsl
const char* glsl_multigrid_correct = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D src;\n"
"uniform sampler2D error;\n"
"uniform float invGridSize;\n"
"\n"
"float e(ivec2 coord)\n"
"{\n"
"	if(  coord.x <= 0\n"
"	  || coord.x >= textureSize(error, 0).x\n"
"	  || coord.y <= 0\n"
"	  || coord.y >= textureSize(error, 0).y)\n"
"	{\n"
"		return(0.);\n"
"	}\n"
"	return(texelFetch(error, coord, 0).x);\n"
"}\n"
"\n"
"float p(ivec2 coord)\n"
"{\n"
"	if(  coord.x <= 0\n"
"	  || coord.x >= textureSize(src, 0).x\n"
"	  || coord.y <= 0\n"
"	  || coord.y >= textureSize(src, 0).y)\n"
"	{\n"
"		return(0.);\n"
"	}\n"
"	return(texelFetch(src, coord, 0).x);\n"
"}\n"
"\n"
"void main()\n"
"{\n"
"	ivec2 pixelCoord = ivec2(floor(gl_FragCoord.xy));\n"
"	vec2 coarseCoord = vec2(pixelCoord)/2.;\n"
"	vec2 offset = fract(coarseCoord);\n"
"\n"
"	ivec2 bl = ivec2(floor(coarseCoord));\n"
"	ivec2 br = bl + ivec2(1, 0);\n"
"	ivec2 tl = bl + ivec2(0, 1);\n"
"	ivec2 tr = bl + ivec2(1, 1);\n"
"\n"
"	float topLerp = (1.-offset.x)*e(tl)+ offset.x*e(tr);\n"
"	float bottomLerp = (1.-offset.x)*e(bl) + offset.x*e(br);\n"
"	float bilerpError = (1.-offset.y)*bottomLerp + offset.y*topLerp;\n"
"\n"
"	fragColor = vec4(p(pixelCoord) + bilerpError, 0, 0, 1);\n"
"}\n";

//NOTE: string imported from src/shaders/multigrid_restrict_residual.glsl
const char* glsl_multigrid_restrict_residual = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D xTex;\n"
"uniform sampler2D bTex;\n"
"\n"
"float x(ivec2 coord)\n"
"{\n"
"	if(  coord.x <= 0\n"
"	  || coord.x >= textureSize(xTex, 0).x\n"
"	  || coord.y <= 0\n"
"	  || coord.y >= textureSize(xTex, 0).y)\n"
"	{\n"
"		return(0.);\n"
"	}\n"
"	return(texelFetch(xTex, coord, 0).x);\n"
"}\n"
"\n"
"float b(ivec2 coord)\n"
"{\n"
"	if(  coord.x <= 0\n"
"	  || coord.x >= textureSize(bTex, 0).x\n"
"	  || coord.y <= 0\n"
"	  || coord.y >= textureSize(bTex, 0).y)\n"
"	{\n"
"		return(0.);\n"
"	}\n"
"	return(texelFetch(bTex, coord, 0).x);\n"
"}\n"
"\n"
"float residual(ivec2 coord)\n"
"{\n"
"	ivec2 vr = coord + ivec2(1, 0);\n"
"	ivec2 vl = coord - ivec2(1, 0);\n"
"	ivec2 vt = coord + ivec2(0, 1);\n"
"	ivec2 vb = coord - ivec2(0, 1);\n"
"\n"
"	return((x(vl) + x(vr) + x(vt) + x(vb) + b(coord) - 4.*x(coord))*4.);\n"
"}\n"
"\n"
"void main()\n"
"{\n"
"	ivec2 pixelCoord = ivec2(floor(gl_FragCoord.xy));\n"
"\n"
"	float restricted = residual(2*pixelCoord + ivec2(-1, -1))\n"
"	                 + residual(2*pixelCoord + ivec2(1, -1))\n"
"	                 + residual(2*pixelCoord + ivec2(1, 1))\n"
"	                 + residual(2*pixelCoord + ivec2(-1, 1))\n"
"	                 + 2.*residual(2*pixelCoord + ivec2(-1, 0))\n"
"	                 + 2.*residual(2*pixelCoord + ivec2(1, 0))\n"
"	                 + 2.*residual(2*pixelCoord + ivec2(0, -1))\n"
"	                 + 2.*residual(2*pixelCoord + ivec2(0, 1))\n"
"	                 + 4.*residual(2*pixelCoord);\n"
"	restricted /= 16.;\n"
"	fragColor = vec4(restricted, 0, 0, 1);\n"
"}\n";

//NOTE: string imported from src/shaders/splat.glsl
const char* glsl_splat = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D src;\n"
"uniform vec2 splatPos;\n"
"uniform vec3 splatColor;\n"
"uniform float radius;\n"
"uniform float additive;\n"
"uniform float blending;\n"
"\n"
"uniform float randomize;\n"
"\n"
"void main()\n"
"{\n"
"	float d2 = dot(texCoord - splatPos, texCoord - splatPos);\n"
"	float intensity = exp(-10.*d2/radius);\n"
"	vec2 force = splatColor.xy;\n"
"\n"
"	vec3 u = texture(src, texCoord).xyz;\n"
"	vec3 uAdd = u + intensity*splatColor.xyz;\n"
"	vec3 uBlend = u*(1.-intensity) + intensity * splatColor;\n"
"\n"
"	fragColor = vec4(uAdd*additive + uBlend*blending, 1);\n"
"}\n";

//NOTE: string imported from src/shaders/subtract_pressure.glsl
const char* glsl_subtract_pressure = 
"#version 300 es\n"
"\n"
"precision highp float;\n"
"precision highp sampler2D;\n"
"\n"
"in vec2 texCoord;\n"
"out vec4 fragColor;\n"
"\n"
"uniform sampler2D src;\n"
"uniform sampler2D pressure;\n"
"uniform float invGridSize;\n"
"\n"
"vec2 u(ivec2 coord)\n"
"{\n"
"	return(texelFetch(src, coord, 0).xy);\n"
"}\n"
"\n"
"float p(ivec2 coord)\n"
"{\n"
"	if(  coord.x <= 0\n"
"	  || coord.x >= textureSize(pressure, 0).x\n"
"	  || coord.y <= 0\n"
"	  || coord.y >= textureSize(pressure, 0).y)\n"
"	{\n"
"		return(0.);\n"
"	}\n"
"	return(texelFetch(pressure, coord, 0).x);\n"
"}\n"
"\n"
"void main()\n"
"{\n"
"	ivec2 pixelCoord = ivec2(floor(gl_FragCoord.xy));\n"
"\n"
"	float tl = p(pixelCoord + ivec2(0, 1));\n"
"	float tr = p(pixelCoord + ivec2(1, 1));\n"
"	float bl = p(pixelCoord);\n"
"	float br = p(pixelCoord + ivec2(1, 0));\n"
"\n"
"	float r = (tr + br)/2.;\n"
"	float l = (tl + bl)/2.;\n"
"	float t = (tl + tr)/2.;\n"
"	float b = (bl + br)/2.;\n"
"\n"
"	vec2 gradP = vec2(r - l, t - b);\n"
"\n"
"	fragColor = vec4(u(pixelCoord) - gradP, 0, 1);\n"
"}\n";

#endif // __GLSL_SHADERS_H__