237 lines
4.8 KiB
GLSL
237 lines
4.8 KiB
GLSL
|
|
// eaglercraft opengl 1.3 emulation
|
|
// copyright (c) 2020 calder young
|
|
// creative commons BY-NC 4.0
|
|
|
|
#line 7
|
|
|
|
precision highp int;
|
|
precision highp sampler2D;
|
|
precision highp float;
|
|
|
|
uniform mat4 matrix_m;
|
|
uniform mat4 matrix_p;
|
|
uniform mat4 matrix_t;
|
|
|
|
#ifdef CC_VERT
|
|
|
|
in vec3 a_position;
|
|
#ifdef CC_a_texture0
|
|
in vec2 a_texture0;
|
|
#endif
|
|
#ifdef CC_a_color
|
|
in vec4 a_color;
|
|
#endif
|
|
#ifdef CC_a_normal
|
|
in vec4 a_normal;
|
|
#endif
|
|
#ifdef CC_a_texture1
|
|
in vec2 a_texture1;
|
|
#endif
|
|
|
|
#ifdef CC_TEX_GEN_STRQ
|
|
out vec4 v_object_pos;
|
|
#endif
|
|
out vec4 v_position;
|
|
#ifdef CC_a_color
|
|
out vec4 v_color;
|
|
#endif
|
|
#ifdef CC_a_normal
|
|
out vec4 v_normal;
|
|
#endif
|
|
#ifdef CC_a_texture0
|
|
out vec2 v_texture0;
|
|
#endif
|
|
#ifdef CC_a_texture1
|
|
out vec2 v_texture1;
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef CC_VERT
|
|
|
|
void main(){
|
|
vec4 pos = matrix_m * vec4(a_position, 1.0);
|
|
v_position = pos;
|
|
#ifdef CC_TEX_GEN_STRQ
|
|
v_object_pos = vec4(a_position, 1.0);
|
|
#endif
|
|
#ifdef CC_a_color
|
|
v_color = a_color;
|
|
#endif
|
|
#ifdef CC_a_normal
|
|
v_normal = a_normal;
|
|
#endif
|
|
#ifdef CC_a_texture0
|
|
v_texture0 = a_texture0;
|
|
#endif
|
|
#ifdef CC_a_texture1
|
|
v_texture1 = a_texture1;
|
|
#endif
|
|
gl_Position = matrix_p * pos;
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef CC_FRAG
|
|
|
|
uniform sampler2D tex0;
|
|
uniform sampler2D tex1;
|
|
uniform vec2 texCoordV0;
|
|
uniform vec2 texCoordV1;
|
|
#ifdef CC_lighting
|
|
uniform vec3 light0Pos;
|
|
uniform vec3 light1Pos;
|
|
uniform vec3 normalUniform;
|
|
#endif
|
|
#ifdef CC_fog
|
|
uniform vec4 fogColor;
|
|
uniform int fogMode;
|
|
uniform float fogStart;
|
|
uniform float fogEnd;
|
|
uniform float fogDensity;
|
|
uniform float fogPremultiply;
|
|
#endif
|
|
uniform vec4 colorUniform;
|
|
#ifdef CC_alphatest
|
|
uniform float alphaTestF;
|
|
#endif
|
|
#ifdef CC_TEX_GEN_STRQ
|
|
uniform int textureGenS_M;
|
|
uniform int textureGenT_M;
|
|
uniform int textureGenR_M;
|
|
uniform int textureGenQ_M;
|
|
uniform vec4 textureGenS_V;
|
|
uniform vec4 textureGenT_V;
|
|
uniform vec4 textureGenR_V;
|
|
uniform vec4 textureGenQ_V;
|
|
uniform mat4 matrix_inverse_m;
|
|
#endif
|
|
#ifdef CC_patch_anisotropic
|
|
uniform vec2 anisotropic_fix;
|
|
#endif
|
|
|
|
#ifdef CC_TEX_GEN_STRQ
|
|
in vec4 v_object_pos;
|
|
#endif
|
|
in vec4 v_position;
|
|
#ifdef CC_a_color
|
|
in vec4 v_color;
|
|
#endif
|
|
#ifdef CC_a_normal
|
|
in vec4 v_normal;
|
|
#endif
|
|
#ifdef CC_a_texture0
|
|
in vec2 v_texture0;
|
|
#endif
|
|
#ifdef CC_a_texture1
|
|
in vec2 v_texture1;
|
|
#endif
|
|
|
|
out vec4 fragColor;
|
|
|
|
void main(){
|
|
#ifdef CC_a_color
|
|
vec4 color = colorUniform * v_color;
|
|
#else
|
|
vec4 color = colorUniform;
|
|
#endif
|
|
|
|
#ifdef CC_TEX_GEN_STRQ
|
|
vec4 texPos;
|
|
if(textureGenS_M == 1){
|
|
texPos.x = dot(v_position, textureGenS_V * matrix_inverse_m);
|
|
}else{
|
|
texPos.x = dot(v_object_pos, textureGenS_V);
|
|
}
|
|
if(textureGenT_M == 1){
|
|
texPos.y = dot(v_position, textureGenT_V * matrix_inverse_m);
|
|
}else{
|
|
texPos.y = dot(v_object_pos, textureGenT_V);
|
|
}
|
|
if(textureGenR_M == 1){
|
|
texPos.z = dot(v_position, textureGenR_V * matrix_inverse_m);
|
|
}else{
|
|
texPos.z = dot(v_object_pos, textureGenR_V);
|
|
}
|
|
if(textureGenQ_M == 1){
|
|
texPos.w = dot(v_position, textureGenQ_V * matrix_inverse_m);
|
|
}else{
|
|
texPos.w = dot(v_object_pos, textureGenQ_V);
|
|
}
|
|
texPos = matrix_t * texPos;
|
|
texPos.x /= texPos.w;
|
|
texPos.y /= texPos.w;
|
|
texPos.z /= texPos.w;
|
|
texPos.w = 1.0;
|
|
color *= texture(tex0, texPos.xy).bgra;
|
|
#ifdef CC_alphatest
|
|
if(color.a < alphaTestF){
|
|
discard;
|
|
}
|
|
#endif
|
|
#else
|
|
#ifdef CC_unit0
|
|
#ifdef CC_a_texture0
|
|
|
|
#ifdef CC_patch_anisotropic
|
|
vec2 uv = (matrix_t * vec4(v_texture0, 0.0, 1.0)).xy;
|
|
|
|
/* https://bugs.chromium.org/p/angleproject/issues/detail?id=4994 */
|
|
uv = ((uv * anisotropic_fix) - fract(uv * anisotropic_fix) + 0.5) / anisotropic_fix;
|
|
|
|
vec4 texColor = texture(tex0, uv);
|
|
#else
|
|
vec4 texColor = texture(tex0, (matrix_t * vec4(v_texture0, 0.0, 1.0)).xy);
|
|
#endif
|
|
|
|
#else
|
|
vec4 texColor = texture(tex0, (matrix_t * vec4(texCoordV0, 0.0, 1.0)).xy);
|
|
#endif
|
|
|
|
#ifdef CC_swap_rb
|
|
color *= texColor.rgba;
|
|
#else
|
|
color *= texColor.bgra;
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#ifdef CC_alphatest
|
|
if(color.a < alphaTestF){
|
|
discard;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CC_unit1
|
|
#ifdef CC_a_texture1
|
|
color.rgb *= texture(tex1, (v_texture1 + 8.0) * 0.00390625).bgr;
|
|
#else
|
|
color.rgb *= texture(tex1, (texCoordV1 + 8.0) * 0.00390625).bgr;
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CC_lighting
|
|
#ifdef CC_a_normal
|
|
vec3 normal = ((v_normal.xyz - 0.5) * 2.0);
|
|
#else
|
|
vec3 normal = normalUniform;
|
|
#endif
|
|
normal = normalize(mat3(matrix_m) * normal);
|
|
float ins = max(dot(normal, -light0Pos), 0.0) + max(dot(normal, -light1Pos), 0.0);
|
|
color.rgb *= min((0.4 + ins * 0.6), 1.0);
|
|
#endif
|
|
|
|
#ifdef CC_fog
|
|
float dist = sqrt(dot(v_position, v_position));
|
|
float i = (fogMode == 1) ? clamp((dist - fogStart) / (fogEnd - fogStart), 0.0, 1.0) : clamp(1.0 - pow(2.718, -(fogDensity * dist)), 0.0, 1.0);
|
|
color.rgb = mix(color.rgb, fogColor.xyz, i * fogColor.a);
|
|
#endif
|
|
|
|
fragColor = color;
|
|
}
|
|
|
|
#endif
|
|
|