Spaces:
Build error
Build error
/* | |
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | |
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | |
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
* POSSIBILITY OF SUCH DAMAGE. | |
* | |
*/ | |
EAGLER_IN(vec4, v_position4f) | |
EAGLER_IN(vec2, v_texture2f) | |
uniform vec4 u_color4f; | |
uniform vec4 u_colorBlendSrc4f; | |
uniform vec4 u_colorBlendAdd4f; | |
EAGLER_IN(vec4, v_color4f) | |
EAGLER_IN(vec3, v_normal3f) | |
EAGLER_IN(vec2, v_lightmap2f) | |
uniform sampler2D u_samplerTexture; | |
uniform vec2 u_textureCoords01; | |
uniform sampler2D u_samplerLightmap; | |
uniform vec2 u_textureCoords02; | |
uniform float u_alphaTestRef1f; | |
uniform int u_lightsEnabled1i; | |
uniform vec4 u_lightsDirections4fv[4]; | |
uniform vec3 u_lightsAmbient3f; | |
uniform vec3 u_uniformNormal3f; | |
uniform vec4 u_fogParameters4f; | |
uniform vec4 u_fogColor4f; | |
EAGLER_IN(vec3, v_objectPosition3f) | |
uniform ivec4 u_texGenPlane4i; | |
uniform vec4 u_texGenS4f; | |
uniform vec4 u_texGenT4f; | |
uniform vec4 u_texGenR4f; | |
uniform vec4 u_texGenQ4f; | |
uniform mat4 u_textureMat4f01; | |
uniform vec2 u_textureAnisotropicFix; | |
EAGLER_FRAG_OUT() | |
void main() { | |
vec4 color = v_color4f * u_color4f; | |
vec4 color = u_color4f; | |
vec4 tmpVec4 = vec4(v_objectPosition3f, 1.0); | |
vec4 texGenVector; | |
texGenVector.x = dot(u_texGenPlane4i.x == 1 ? v_position4f : tmpVec4, u_texGenS4f); | |
texGenVector.y = dot(u_texGenPlane4i.y == 1 ? v_position4f : tmpVec4, u_texGenT4f); | |
texGenVector.z = dot(u_texGenPlane4i.z == 1 ? v_position4f : tmpVec4, u_texGenR4f); | |
texGenVector.w = dot(u_texGenPlane4i.w == 1 ? v_position4f : tmpVec4, u_texGenQ4f); | |
texGenVector.xyz = mat4x3( | |
u_textureMat4f01[0].xyw, | |
u_textureMat4f01[1].xyw, | |
u_textureMat4f01[2].xyw, | |
u_textureMat4f01[3].xyw | |
) * texGenVector; | |
texGenVector.xy /= texGenVector.z; | |
texGenVector = u_textureMat4f01 * texGenVector; | |
texGenVector.xy /= texGenVector.w; | |
color *= EAGLER_TEXTURE_2D(u_samplerTexture, texGenVector.xy); | |
if(color.a < u_alphaTestRef1f) discard; | |
// d3d11 doesn't support GL_NEAREST upscaling with anisotropic | |
// filtering enabled, so it needs this stupid fix to 'work' | |
vec2 uv = floor(v_texture2f * u_textureAnisotropicFix) + 0.5; | |
color *= EAGLER_TEXTURE_2D(u_samplerTexture, uv / u_textureAnisotropicFix); | |
color *= EAGLER_TEXTURE_2D(u_samplerTexture, v_texture2f); | |
color *= EAGLER_TEXTURE_2D(u_samplerTexture, u_textureCoords01); | |
color *= EAGLER_TEXTURE_2D(u_samplerLightmap, v_lightmap2f); | |
color *= EAGLER_TEXTURE_2D(u_samplerLightmap, u_textureCoords02); | |
color = color * u_colorBlendSrc4f + u_colorBlendAdd4f; | |
if(color.a < u_alphaTestRef1f) discard; | |
vec3 normal = v_normal3f; | |
vec3 normal = u_uniformNormal3f; | |
float diffuse = 0.0; | |
vec4 light; | |
for(int i = 0; i < u_lightsEnabled1i; ++i) { | |
for(int i = 0; i < 4; ++i) { | |
light = u_lightsDirections4fv[i]; | |
diffuse += max(dot(light.xyz, normal), 0.0) * light.w; | |
if(i + 1 >= u_lightsEnabled1i) { | |
break; | |
} | |
} | |
color.rgb *= min(u_lightsAmbient3f + vec3(diffuse), 1.0); | |
vec3 fogPos = v_position4f.xyz / v_position4f.w; | |
float dist = length(fogPos); | |
float fogDensity = u_fogParameters4f.y; | |
float fogStart = u_fogParameters4f.z; | |
float fogEnd = u_fogParameters4f.w; | |
float f = u_fogParameters4f.x > 0.0 ? 1.0 - exp(-fogDensity * dist) : | |
(dist - fogStart) / (fogEnd - fogStart); | |
color.rgb = mix(color.rgb, u_fogColor4f.rgb, clamp(f, 0.0, 1.0) * u_fogColor4f.a); | |
EAGLER_FRAG_COLOR = color; | |
} | |