mirror of
https://github.com/Eaglercraft-Archive/Eaglercraftx-1.8.8-src.git
synced 2025-07-13 19:09:57 -05:00
Update #53 - Improved FPS, reduced WebGL context loss crashes
This commit is contained in:
@ -63,7 +63,7 @@ uniform float u_alphaTestRef1f;
|
||||
|
||||
#ifdef COMPILE_ENABLE_MC_LIGHTING
|
||||
uniform int u_lightsEnabled1i;
|
||||
uniform vec4 u_lightsDirections4fv[4];
|
||||
uniform vec4 u_lightsDirections4fv[2];
|
||||
uniform vec3 u_lightsAmbient3f;
|
||||
#ifndef COMPILE_NORMAL_ATTRIB
|
||||
uniform vec3 u_uniformNormal3f;
|
||||
@ -166,20 +166,14 @@ void main() {
|
||||
#else
|
||||
vec3 normal = u_uniformNormal3f;
|
||||
#endif
|
||||
float diffuse = 0.0;
|
||||
vec4 light;
|
||||
#ifdef EAGLER_HAS_GLES_300
|
||||
for(int i = 0; i < u_lightsEnabled1i; ++i) {
|
||||
#else
|
||||
for(int i = 0; i < 4; ++i) {
|
||||
#endif
|
||||
light = u_lightsDirections4fv[i];
|
||||
diffuse += max(dot(light.xyz, normal), 0.0) * light.w;
|
||||
#ifndef EAGLER_HAS_GLES_300
|
||||
if(i + 1 >= u_lightsEnabled1i) {
|
||||
float diffuse = 0.0;
|
||||
for(int i = 0; i < 2; ++i) {
|
||||
if(i >= u_lightsEnabled1i) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
light = u_lightsDirections4fv[i];
|
||||
diffuse += max(dot(light.xyz, normal), 0.0) * light.w;
|
||||
}
|
||||
color.rgb *= min(u_lightsAmbient3f + vec3(diffuse), 1.0);
|
||||
#endif
|
||||
|
@ -20,7 +20,6 @@ precision lowp int;
|
||||
precision mediump float;
|
||||
precision mediump sampler2D;
|
||||
|
||||
in vec4 v_position4f;
|
||||
in vec2 v_texCoord2f;
|
||||
in vec4 v_color4f;
|
||||
in vec2 v_lightmap2f;
|
||||
@ -30,16 +29,6 @@ layout(location = 0) out vec4 output4f;
|
||||
uniform sampler2D u_inputTexture;
|
||||
uniform sampler2D u_lightmapTexture;
|
||||
|
||||
uniform mat4 u_inverseViewMatrix4f;
|
||||
|
||||
layout(std140) uniform u_chunkLightingData {
|
||||
mediump int u_dynamicLightCount1i;
|
||||
mediump int _paddingA_;
|
||||
mediump int _paddingB_;
|
||||
mediump int _paddingC_;
|
||||
mediump vec4 u_dynamicLightArray[12];
|
||||
};
|
||||
|
||||
void main() {
|
||||
vec4 color = texture(u_inputTexture, v_texCoord2f) * v_color4f;
|
||||
|
||||
@ -47,20 +36,7 @@ void main() {
|
||||
discard;
|
||||
}
|
||||
|
||||
vec4 dlight;
|
||||
float blockLight = v_lightmap2f.x;
|
||||
if(u_dynamicLightCount1i > 0) {
|
||||
vec4 worldPosition4f = u_inverseViewMatrix4f * v_position4f;
|
||||
worldPosition4f.xyz /= worldPosition4f.w;
|
||||
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i;
|
||||
for(int i = 0; i < safeLightCount; ++i) {
|
||||
dlight = u_dynamicLightArray[i];
|
||||
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
|
||||
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
|
||||
}
|
||||
}
|
||||
|
||||
color *= texture(u_lightmapTexture, vec2(blockLight, v_lightmap2f.y));
|
||||
color *= texture(u_lightmapTexture, v_lightmap2f);
|
||||
|
||||
output4f = color;
|
||||
}
|
||||
|
@ -28,21 +28,27 @@ layout(location = 3) in vec2 p_lightMap2f;
|
||||
layout(location = 4) in vec2 p_particleSize_texCoordsSize_2i;
|
||||
layout(location = 5) in vec4 p_color4f;
|
||||
|
||||
out vec4 v_position4f;
|
||||
out vec2 v_texCoord2f;
|
||||
out vec4 v_color4f;
|
||||
out vec2 v_lightmap2f;
|
||||
|
||||
uniform mat4 u_modelViewMatrix4f;
|
||||
uniform mat4 u_projectionMatrix4f;
|
||||
uniform mat4 u_inverseViewMatrix4f;
|
||||
uniform vec3 u_texCoordSize2f_particleSize1f;
|
||||
uniform vec3 u_transformParam_1_2_5_f;
|
||||
uniform vec2 u_transformParam_3_4_f;
|
||||
uniform vec4 u_color4f;
|
||||
|
||||
layout(std140) uniform u_chunkLightingData {
|
||||
mediump uvec2 u_dynamicLightOffsetCount2i;
|
||||
mediump int _paddingA_;
|
||||
mediump int _paddingB_;
|
||||
mediump uvec4 u_dynamicLightArray[4];
|
||||
};
|
||||
|
||||
void main() {
|
||||
v_color4f = u_color4f * p_color4f.bgra;
|
||||
v_lightmap2f = p_lightMap2f;
|
||||
|
||||
vec2 tex2f = a_position2f * 0.5 + 0.5;
|
||||
tex2f.y = 1.0 - tex2f.y;
|
||||
@ -56,6 +62,40 @@ void main() {
|
||||
pos3f += u_transformParam_1_2_5_f * spos2f.xyy;
|
||||
pos3f.zx += u_transformParam_3_4_f * spos2f;
|
||||
|
||||
v_position4f = u_modelViewMatrix4f * vec4(pos3f, 1.0);
|
||||
gl_Position = u_projectionMatrix4f * v_position4f;
|
||||
vec4 pos4f = u_modelViewMatrix4f * vec4(pos3f, 1.0);
|
||||
gl_Position = u_projectionMatrix4f * pos4f;
|
||||
|
||||
float blockLight = 0.0;
|
||||
|
||||
vec4 dlight;
|
||||
uvec4 dlighti1, dlighti2;
|
||||
if(u_dynamicLightOffsetCount2i.y > 0u) {
|
||||
vec3 dlightOffset = vec3(ivec3(
|
||||
int(u_dynamicLightOffsetCount2i.x << 16),
|
||||
int(u_dynamicLightOffsetCount2i.x << 8),
|
||||
int(u_dynamicLightOffsetCount2i.x)
|
||||
) >> 24);
|
||||
vec4 worldPosition4f = u_inverseViewMatrix4f * pos4f;
|
||||
worldPosition4f.xyz = worldPosition4f.xyz / worldPosition4f.w + dlightOffset;
|
||||
for(uint i = 0u; i < 4u; ++i) {
|
||||
dlighti1 = u_dynamicLightArray[i];
|
||||
dlighti2 = dlighti1 << 16;
|
||||
|
||||
dlight = vec4(ivec4(ivec2(dlighti2.xy), ivec2(dlighti1.xy)) >> 16) * 0.0009765923;
|
||||
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
|
||||
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
|
||||
if(i * 2u + 1u >= u_dynamicLightOffsetCount2i.y) {
|
||||
break;
|
||||
}
|
||||
|
||||
dlight = vec4(ivec4(ivec2(dlighti2.zw), ivec2(dlighti1.zw)) >> 16) * 0.0009765923;
|
||||
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
|
||||
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
|
||||
if(i * 2u + 2u >= u_dynamicLightOffsetCount2i.y) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
v_lightmap2f = vec2(max(p_lightMap2f.x, blockLight), p_lightMap2f.y);
|
||||
}
|
||||
|
@ -16,7 +16,9 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
|
||||
in vec4 v_position4f;
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_TEXTURE_ATTRIB
|
||||
in vec2 v_texture2f;
|
||||
@ -61,7 +63,7 @@ uniform float u_alphaTestRef1f;
|
||||
|
||||
#ifdef COMPILE_ENABLE_MC_LIGHTING
|
||||
uniform int u_lightsEnabled1i;
|
||||
uniform vec4 u_lightsDirections4fv[4];
|
||||
uniform vec4 u_lightsDirections4fv[2];
|
||||
uniform vec3 u_lightsAmbient3f;
|
||||
#endif
|
||||
|
||||
@ -88,15 +90,9 @@ uniform mat4 u_textureMat4f01;
|
||||
uniform vec2 u_textureAnisotropicFix;
|
||||
#endif
|
||||
|
||||
uniform mat4 u_inverseViewMatrix4f;
|
||||
|
||||
layout(std140) uniform u_chunkLightingData {
|
||||
mediump int u_dynamicLightCount1i;
|
||||
mediump int _paddingA_;
|
||||
mediump int _paddingB_;
|
||||
mediump int _paddingC_;
|
||||
mediump vec4 u_dynamicLightArray[12];
|
||||
};
|
||||
#ifdef COMPILE_ENABLE_LIGHTMAP
|
||||
in float v_dynamicLight1f;
|
||||
#endif
|
||||
|
||||
layout(location = 0) out vec4 output4f;
|
||||
|
||||
@ -151,17 +147,9 @@ void main() {
|
||||
#else
|
||||
float blockLight = u_textureCoords02.x;
|
||||
#endif
|
||||
vec4 dlight;
|
||||
if(u_dynamicLightCount1i > 0) {
|
||||
vec4 worldPosition4f = u_inverseViewMatrix4f * v_position4f;
|
||||
worldPosition4f.xyz /= worldPosition4f.w;
|
||||
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i;
|
||||
for(int i = 0; i < safeLightCount; ++i) {
|
||||
dlight = u_dynamicLightArray[i];
|
||||
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
|
||||
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
|
||||
}
|
||||
}
|
||||
|
||||
blockLight = max(blockLight, v_dynamicLight1f);
|
||||
|
||||
#ifdef COMPILE_LIGHTMAP_ATTRIB
|
||||
color *= texture(u_samplerLightmap, vec2(blockLight, v_lightmap2f.y));
|
||||
#else
|
||||
@ -179,16 +167,18 @@ void main() {
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_ENABLE_MC_LIGHTING
|
||||
#ifdef COMPILE_NORMAL_ATTRIB
|
||||
vec3 normal = v_normal3f;
|
||||
#else
|
||||
vec3 normal = u_uniformNormal3f;
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_ENABLE_MC_LIGHTING
|
||||
vec4 light;
|
||||
float diffuse = 0.0;
|
||||
for(int i = 0; i < u_lightsEnabled1i; ++i) {
|
||||
for(int i = 0; i < 2; ++i) {
|
||||
if(i >= u_lightsEnabled1i) {
|
||||
break;
|
||||
}
|
||||
light = u_lightsDirections4fv[i];
|
||||
diffuse += max(dot(light.xyz, normal), 0.0) * light.w;
|
||||
}
|
||||
|
@ -18,7 +18,13 @@
|
||||
|
||||
in vec3 a_position3f;
|
||||
|
||||
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
|
||||
#define _COMPILE_VARYING_POSITION
|
||||
#endif
|
||||
|
||||
#ifdef _COMPILE_VARYING_POSITION
|
||||
out vec4 v_position4f;
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_ENABLE_TEX_GEN
|
||||
out vec3 v_objectPosition3f;
|
||||
@ -46,16 +52,32 @@ out vec2 v_lightmap2f;
|
||||
uniform mat4 u_textureMat4f02;
|
||||
#endif
|
||||
|
||||
#ifdef COMPILE_ENABLE_LIGHTMAP
|
||||
out float v_dynamicLight1f;
|
||||
#endif
|
||||
|
||||
uniform mat4 u_modelviewMat4f;
|
||||
uniform mat4 u_projectionMat4f;
|
||||
uniform mat4 u_inverseViewMatrix4f;
|
||||
|
||||
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
|
||||
|
||||
layout(std140) uniform u_chunkLightingData {
|
||||
mediump uvec2 u_dynamicLightOffsetCount2i;
|
||||
mediump int _paddingA_;
|
||||
mediump int _paddingB_;
|
||||
mediump uvec4 u_dynamicLightArray[4];
|
||||
};
|
||||
|
||||
void main() {
|
||||
#ifdef COMPILE_ENABLE_TEX_GEN
|
||||
v_objectPosition3f = a_position3f;
|
||||
#endif
|
||||
|
||||
#ifndef _COMPILE_VARYING_POSITION
|
||||
vec4 v_position4f;
|
||||
#endif
|
||||
|
||||
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
|
||||
|
||||
#ifdef COMPILE_TEXTURE_ATTRIB
|
||||
@ -75,6 +97,42 @@ void main() {
|
||||
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
|
||||
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
|
||||
#endif
|
||||
|
||||
|
||||
gl_Position = u_projectionMat4f * v_position4f;
|
||||
|
||||
#ifdef COMPILE_ENABLE_LIGHTMAP
|
||||
float blockLight = 0.0;
|
||||
|
||||
vec4 dlight;
|
||||
uvec4 dlighti1, dlighti2;
|
||||
if(u_dynamicLightOffsetCount2i.y > 0u) {
|
||||
vec3 dlightOffset = vec3(ivec3(
|
||||
int(u_dynamicLightOffsetCount2i.x << 16),
|
||||
int(u_dynamicLightOffsetCount2i.x << 8),
|
||||
int(u_dynamicLightOffsetCount2i.x)
|
||||
) >> 24);
|
||||
vec4 worldPosition4f = u_inverseViewMatrix4f * v_position4f;
|
||||
worldPosition4f.xyz = worldPosition4f.xyz / worldPosition4f.w + dlightOffset;
|
||||
for(uint i = 0u; i < 4u; ++i) {
|
||||
dlighti1 = u_dynamicLightArray[i];
|
||||
dlighti2 = dlighti1 << 16;
|
||||
|
||||
dlight = vec4(ivec4(ivec2(dlighti2.xy), ivec2(dlighti1.xy)) >> 16) * 0.0009765923;
|
||||
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
|
||||
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
|
||||
if(i * 2u + 1u >= u_dynamicLightOffsetCount2i.y) {
|
||||
break;
|
||||
}
|
||||
|
||||
dlight = vec4(ivec4(ivec2(dlighti2.zw), ivec2(dlighti1.zw)) >> 16) * 0.0009765923;
|
||||
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
|
||||
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
|
||||
if(i * 2u + 2u >= u_dynamicLightOffsetCount2i.y) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
v_dynamicLight1f = blockLight;
|
||||
#endif
|
||||
}
|
||||
|
Reference in New Issue
Block a user