1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-06-18 11:19:59 +00:00

shader:: added missing mediump

This commit is contained in:
Zeno Rogue 2020-01-15 18:26:40 +01:00
parent bd3a8ae3bb
commit 2e5ee99570

View File

@ -84,7 +84,7 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
} }
if(shader_flags & GF_LIGHTFOG) { if(shader_flags & GF_LIGHTFOG) {
vmain += "float fogx = clamp(1.0 + aPosition.z * uFog, 0.0, 1.0); vColor = vColor * fogx + uFogColor * (1.0-fogx);\n"; vmain += "mediump float fogx = clamp(1.0 + aPosition.z * uFog, 0.0, 1.0); vColor = vColor * fogx + uFogColor * (1.0-fogx);\n";
vsh += "uniform mediump float uFog;\n"; vsh += "uniform mediump float uFog;\n";
vsh += "uniform mediump vec4 uFogColor;\n"; vsh += "uniform mediump vec4 uFogColor;\n";
} }
@ -99,7 +99,7 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
bool skip_t = false; bool skip_t = false;
if(pmodel == mdPixel) { if(pmodel == mdPixel) {
vmain += "vec4 pos = aPosition; pos[3] = 1.0;\n"; vmain += "mediump vec4 pos = aPosition; pos[3] = 1.0;\n";
vmain += "pos = uMV * pos;\n"; vmain += "pos = uMV * pos;\n";
if(shader_flags & GF_LEVELS) vmain += "vPos = pos;\n"; if(shader_flags & GF_LEVELS) vmain += "vPos = pos;\n";
vmain += "gl_Position = uP * pos;\n"; vmain += "gl_Position = uP * pos;\n";
@ -107,7 +107,7 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
shader_flags |= SF_PIXELS | SF_DIRECT; shader_flags |= SF_PIXELS | SF_DIRECT;
} }
else if(pmodel == mdManual) { else if(pmodel == mdManual) {
vmain += "vec4 pos = uMV * aPosition;\n"; vmain += "mediump vec4 pos = uMV * aPosition;\n";
if(shader_flags & GF_LEVELS) if(shader_flags & GF_LEVELS)
vmain += "vPos = pos;\n"; vmain += "vPos = pos;\n";
vmain += "gl_Position = uP * pos;\n"; vmain += "gl_Position = uP * pos;\n";
@ -132,10 +132,10 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
else if(pmodel == mdBand && hyperbolic) { else if(pmodel == mdBand && hyperbolic) {
shader_flags |= SF_BAND | SF_ORIENT | SF_BOX | SF_DIRECT; shader_flags |= SF_BAND | SF_ORIENT | SF_BOX | SF_DIRECT;
coordinator += "t = uPP * t;", vsh += "uniform mediump mat4 uPP;"; coordinator += "t = uPP * t;", vsh += "uniform mediump mat4 uPP;";
if(dim2) coordinator += "float zlev = zlevel(t); t /= zlev;\n"; if(dim2) coordinator += "mediump float zlev = zlevel(t); t /= zlev;\n";
if(dim3) coordinator += "float r = sqrt(t.y*t.y+t.z*t.z); float ty = asinh(r);\n"; if(dim3) coordinator += "mediump float r = sqrt(t.y*t.y+t.z*t.z); float ty = asinh(r);\n";
if(dim2) coordinator += "float ty = asinh(t.y);\n"; if(dim2) coordinator += "mediump float ty = asinh(t.y);\n";
coordinator += "float tx = asinh(t.x / cosh(ty)); ty = 2.0 * atan(tanh(ty/2.0));\n"; coordinator += "mediump float tx = asinh(t.x / cosh(ty)); ty = 2.0 * atan(tanh(ty/2.0));\n";
if(dim2) coordinator += "t[0] = tx; t[1] = ty; t[2] = 1.0; t[3] = 1.0;\n"; if(dim2) coordinator += "t[0] = tx; t[1] = ty; t[2] = 1.0; t[3] = 1.0;\n";
if(dim3) coordinator += "t[0] = tx; t[1] = ty*t.y/r; t[2] = ty*t.z/r; t[3] = 1.0;\n"; if(dim3) coordinator += "t[0] = tx; t[1] = ty*t.y/r; t[2] = ty*t.z/r; t[3] = 1.0;\n";
if(dim3) shader_flags |= SF_ZFOG; if(dim3) shader_flags |= SF_ZFOG;
@ -145,13 +145,13 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
if(dim2) shader_flags |= SF_USE_ALPHA; if(dim2) shader_flags |= SF_USE_ALPHA;
coordinator += "t = uPP * t;", vsh += "uniform mediump mat4 uPP;"; coordinator += "t = uPP * t;", vsh += "uniform mediump mat4 uPP;";
if(dim2) coordinator += if(dim2) coordinator +=
"float zlev = zlevel(t); t /= zlev;\n" "mediump float zlev = zlevel(t); t /= zlev;\n"
"t.xy /= t.z; t.y += 1.0;\n" "t.xy /= t.z; t.y += 1.0;\n"
"float rads = dot(t.xy, t.xy);\n" "mediump float rads = dot(t.xy, t.xy);\n"
"t.xy /= -rads; t.z = 1.0; t[3] = 1.0;\n"; "t.xy /= -rads; t.z = 1.0; t[3] = 1.0;\n";
if(dim3) coordinator += if(dim3) coordinator +=
"t.xyz /= (t.w + 1.0); t.y += 1.0;\n" "t.xyz /= (t.w + 1.0); t.y += 1.0;\n"
"float rads = dot(t.xyz, t.xyz);\n" "mediump float rads = dot(t.xyz, t.xyz);\n"
"t.xyz /= -rads; t[3] = 1.0;\n"; "t.xyz /= -rads; t[3] = 1.0;\n";
if(dim3) shader_flags |= SF_ZFOG; if(dim3) shader_flags |= SF_ZFOG;
} }
@ -160,9 +160,11 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
coordinator += "t = inverse_exp(t);\n"; coordinator += "t = inverse_exp(t);\n";
if(sn::in()) { if(sn::in()) {
coordinator += coordinator +=
"float d = sqrt(t[0] * t[0] + t[1] * t[1] + t[2] * t[2]);\n" "mediump float d = dot(t.xyz, t.xyz);\n"
"float ad = (d == 0.) ? 0. : (d < 1.) ? min(atanh(d), 10.) : 10.;\n" "mediump float hz = (1.+d) / (1.-d);\n"
"float m = ad / d; t[0] *= m; t[1] *= m; t[2] *= m;\n"; "mediump float ad = acosh(hz);\n"
"mediump float m = d == 0. ? 0. : d >= 1. ? 1.e4 : (hz+1.) * ad / sinh(ad);\n"
"t.xyz *= m;\n";
distfun = "ad"; distfun = "ad";
} }
else else
@ -200,10 +202,10 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
else if(in_h2xe() && pmodel == mdPerspective) { else if(in_h2xe() && pmodel == mdPerspective) {
shader_flags |= SF_PERS3 | SF_DIRECT; shader_flags |= SF_PERS3 | SF_DIRECT;
coordinator += coordinator +=
"float z = log(t[2] * t[2] - t[0] * t[0] - t[1] * t[1]) / 2.;\n" "mediump float z = log(t[2] * t[2] - t[0] * t[0] - t[1] * t[1]) / 2.;\n"
"float r = length(t.xy);\n" "mediump float r = length(t.xy);\n"
"float t2 = t[2] / exp(z);\n" "mediump float t2 = t[2] / exp(z);\n"
"float d = t2 >= 1. ? acosh(t2) : 0.;\n" "mediump float d = t2 >= 1. ? acosh(t2) : 0.;\n"
"if(r != 0.) r = d / r;\n" "if(r != 0.) r = d / r;\n"
"t.xy *= r; t.z = z;\n"; "t.xy *= r; t.z = z;\n";
distfun = "sqrt(z*z+d*d)"; distfun = "sqrt(z*z+d*d)";
@ -243,10 +245,10 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
} }
if(!skip_t) { if(!skip_t) {
vmain += "vec4 t = uMV * aPosition;\n"; vmain += "mediump vec4 t = uMV * aPosition;\n";
vmain += coordinator; vmain += coordinator;
if(distfun != "") { if(distfun != "") {
vmain += "float fogs = (uFogBase - " + distfun + " / uFog);\n"; vmain += "mediump float fogs = (uFogBase - " + distfun + " / uFog);\n";
vmain += "vColor.xyz = vColor.xyz * fogs + uFogColor.xyz * (1.0-fogs);\n"; vmain += "vColor.xyz = vColor.xyz * fogs + uFogColor.xyz * (1.0-fogs);\n";
vsh += vsh +=
"uniform mediump float uFog;\n" "uniform mediump float uFog;\n"
@ -264,7 +266,7 @@ shared_ptr<glhr::GLprogram> write_shader(flagtype shader_flags) {
if(shader_flags & SF_ZFOG) { if(shader_flags & SF_ZFOG) {
vmain += vmain +=
"float pz = 0.5 + gl_Position.z / 2.0;\n" "mediump float pz = 0.5 + gl_Position.z / 2.0;\n"
"vColor.xyz = vColor.xyz * (1.-pz) + uFogColor.xyz * pz;\n"; "vColor.xyz = vColor.xyz * (1.-pz) + uFogColor.xyz * pz;\n";
vsh += vsh +=
"uniform mediump vec4 uFogColor;\n"; "uniform mediump vec4 uFogColor;\n";
@ -474,14 +476,14 @@ EX void add_if(string& shader, const string& seek, const string& function) {
EX void add_fixed_functions(string& shader) { EX void add_fixed_functions(string& shader) {
/* from the most complex to the simplest */ /* from the most complex to the simplest */
add_if(shader, "tanh", "float tanh(float x) { return sinh(x) / cosh(x); }\n"); add_if(shader, "tanh", "mediump float tanh(mediump float x) { return sinh(x) / cosh(x); }\n");
add_if(shader, "sinh", "float sinh(float x) { return (exp(x) - exp(-x)) / 2.0; }\n"); add_if(shader, "sinh", "mediump float sinh(mediump float x) { return (exp(x) - exp(-x)) / 2.0; }\n");
add_if(shader, "cosh", "float cosh(float x) { return (exp(x) + exp(-x)) / 2.0; }\n"); add_if(shader, "cosh", "mediump float cosh(mediump float x) { return (exp(x) + exp(-x)) / 2.0; }\n");
add_if(shader, "asinh", "float asinh(float x) { return log(sqrt(x*x + 1.0) + x); }\n"); add_if(shader, "asinh", "mediump float asinh(mediump float x) { return log(sqrt(x*x + 1.0) + x); }\n");
add_if(shader, "acosh", "float acosh(float x) { return log(sqrt(x*x - 1.0) + x); }\n"); add_if(shader, "acosh", "mediump float acosh(mediump float x) { return log(sqrt(x*x - 1.0) + x); }\n");
add_if(shader, "atanh", "float atanh(float x) { return (log(1.+x)-log(1.-x))/2.; }\n"); add_if(shader, "atanh", "mediump float atanh(mediump float x) { return (log(1.+x)-log(1.-x))/2.; }\n");
add_if(shader, "zlevel", "float zlevel(vec4 h) { return (h[2] < 0.0 ? -1.0 : 1.0) * sqrt(h[2]*h[2] - h[0]*h[0] - h[1]*h[1]); }\n"); add_if(shader, "zlevel", "mediump float zlevel(mediump vec4 h) { return (h[2] < 0.0 ? -1.0 : 1.0) * sqrt(h[2]*h[2] - h[0]*h[0] - h[1]*h[1]); }\n");
add_if(shader, "atan2", "float atan2(float y, float x) {\n" add_if(shader, "atan2", "mediump float atan2(mediump float y, mediump float x) {\n"
"if(x == 0.) return y > 0. ? PI/2. : -PI/2.;\n" "if(x == 0.) return y > 0. ? PI/2. : -PI/2.;\n"
"if(x > 0.) return atan(y / x);\n" "if(x > 0.) return atan(y / x);\n"
"if(y >= 0.) return atan(y / x) + PI;\n" "if(y >= 0.) return atan(y / x) + PI;\n"