lingo3d-react
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
169 lines (152 loc) • 7.73 kB
JavaScript
import { n as G, a as i, e as w, ae as J, aI as O, h as C, V as D, j as Q, aJ as X, aO as b, aP as P, aQ as K } from "./index-895cfa2f.mjs";
import "react";
import "react-dom";
class re extends G {
constructor(W, e = {}) {
super(W), this.isWater = !0;
const s = this, z = e.textureWidth !== void 0 ? e.textureWidth : 512, N = e.textureHeight !== void 0 ? e.textureHeight : 512, F = e.clipBias !== void 0 ? e.clipBias : 0, L = e.alpha !== void 0 ? e.alpha : 1, T = e.time !== void 0 ? e.time : 0, R = e.waterNormals !== void 0 ? e.waterNormals : null, j = e.sunDirection !== void 0 ? e.sunDirection : new i(0.70707, 0.70707, 0), U = new w(e.sunColor !== void 0 ? e.sunColor : 16777215), k = new w(e.waterColor !== void 0 ? e.waterColor : 8355711), S = e.eye !== void 0 ? e.eye : new i(0, 0, 0), V = e.distortionScale !== void 0 ? e.distortionScale : 20, A = e.side !== void 0 ? e.side : J, B = e.fog !== void 0 ? e.fog : !1, u = new O(), l = new i(), c = new i(), h = new i(), d = new C(), x = new i(0, 0, -1), n = new D(), f = new i(), p = new i(), v = new D(), g = new C(), t = new Q(), M = new X(z, N), y = {
uniforms: b.merge([
P.fog,
P.lights,
{
normalSampler: { value: null },
mirrorSampler: { value: null },
alpha: { value: 1 },
time: { value: 0 },
size: { value: 1 },
distortionScale: { value: 20 },
textureMatrix: { value: new C() },
sunColor: { value: new w(8355711) },
sunDirection: { value: new i(0.70707, 0.70707, 0) },
eye: { value: new i() },
waterColor: { value: new w(5592405) }
}
]),
vertexShader: (
/* glsl */
`
uniform mat4 textureMatrix;
uniform float time;
varying vec4 mirrorCoord;
varying vec4 worldPosition;
#include <common>
#include <fog_pars_vertex>
#include <shadowmap_pars_vertex>
#include <logdepthbuf_pars_vertex>
void main() {
mirrorCoord = modelMatrix * vec4( position, 1.0 );
worldPosition = mirrorCoord.xyzw;
mirrorCoord = textureMatrix * mirrorCoord;
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
gl_Position = projectionMatrix * mvPosition;
#include <beginnormal_vertex>
#include <defaultnormal_vertex>
#include <logdepthbuf_vertex>
#include <fog_vertex>
#include <shadowmap_vertex>
}`
),
fragmentShader: (
/* glsl */
`
uniform sampler2D mirrorSampler;
uniform float alpha;
uniform float time;
uniform float size;
uniform float distortionScale;
uniform sampler2D normalSampler;
uniform vec3 sunColor;
uniform vec3 sunDirection;
uniform vec3 eye;
uniform vec3 waterColor;
varying vec4 mirrorCoord;
varying vec4 worldPosition;
vec4 getNoise( vec2 uv ) {
vec2 uv0 = ( uv / 103.0 ) + vec2(time / 17.0, time / 29.0);
vec2 uv1 = uv / 107.0-vec2( time / -19.0, time / 31.0 );
vec2 uv2 = uv / vec2( 8907.0, 9803.0 ) + vec2( time / 101.0, time / 97.0 );
vec2 uv3 = uv / vec2( 1091.0, 1027.0 ) - vec2( time / 109.0, time / -113.0 );
vec4 noise = texture2D( normalSampler, uv0 ) +
texture2D( normalSampler, uv1 ) +
texture2D( normalSampler, uv2 ) +
texture2D( normalSampler, uv3 );
return noise * 0.5 - 1.0;
}
void sunLight( const vec3 surfaceNormal, const vec3 eyeDirection, float shiny, float spec, float diffuse, inout vec3 diffuseColor, inout vec3 specularColor ) {
vec3 reflection = normalize( reflect( -sunDirection, surfaceNormal ) );
float direction = max( 0.0, dot( eyeDirection, reflection ) );
specularColor += pow( direction, shiny ) * sunColor * spec;
diffuseColor += max( dot( sunDirection, surfaceNormal ), 0.0 ) * sunColor * diffuse;
}
#include <common>
#include <packing>
#include <bsdfs>
#include <fog_pars_fragment>
#include <logdepthbuf_pars_fragment>
#include <lights_pars_begin>
#include <shadowmap_pars_fragment>
#include <shadowmask_pars_fragment>
void main() {
#include <logdepthbuf_fragment>
vec4 noise = getNoise( worldPosition.xz * size );
vec3 surfaceNormal = normalize( noise.xzy * vec3( 1.5, 1.0, 1.5 ) );
vec3 diffuseLight = vec3(0.0);
vec3 specularLight = vec3(0.0);
vec3 worldToEye = eye-worldPosition.xyz;
vec3 eyeDirection = normalize( worldToEye );
sunLight( surfaceNormal, eyeDirection, 100.0, 2.0, 0.5, diffuseLight, specularLight );
float distance = length(worldToEye);
vec2 distortion = surfaceNormal.xz * ( 0.001 + 1.0 / distance ) * distortionScale;
vec3 reflectionSample = vec3( texture2D( mirrorSampler, mirrorCoord.xy / mirrorCoord.w + distortion ) );
float theta = max( dot( eyeDirection, surfaceNormal ), 0.0 );
float rf0 = 0.3;
float reflectance = rf0 + ( 1.0 - rf0 ) * pow( ( 1.0 - theta ), 5.0 );
vec3 scatter = max( 0.0, dot( surfaceNormal, eyeDirection ) ) * waterColor;
vec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ) * getShadowMask(), ( vec3( 0.1 ) + reflectionSample * 0.9 + reflectionSample * specularLight ), reflectance);
vec3 outgoingLight = albedo;
gl_FragColor = vec4( outgoingLight, alpha );
#include <tonemapping_fragment>
#include <fog_fragment>
}`
)
}, o = new K({
fragmentShader: y.fragmentShader,
vertexShader: y.vertexShader,
uniforms: b.clone(y.uniforms),
lights: !0,
side: A,
fog: B
});
o.uniforms.mirrorSampler.value = M.texture, o.uniforms.textureMatrix.value = g, o.uniforms.alpha.value = L, o.uniforms.time.value = T, o.uniforms.normalSampler.value = R, o.uniforms.sunColor.value = U, o.uniforms.waterColor.value = k, o.uniforms.sunDirection.value = j, o.uniforms.distortionScale.value = V, o.uniforms.eye.value = S, s.material = o, s.onBeforeRender = function(r, E, m) {
if (c.setFromMatrixPosition(s.matrixWorld), h.setFromMatrixPosition(m.matrixWorld), d.extractRotation(s.matrixWorld), l.set(0, 0, 1), l.applyMatrix4(d), f.subVectors(c, h), f.dot(l) > 0)
return;
f.reflect(l).negate(), f.add(c), d.extractRotation(m.matrixWorld), x.set(0, 0, -1), x.applyMatrix4(d), x.add(h), p.subVectors(c, x), p.reflect(l).negate(), p.add(c), t.position.copy(f), t.up.set(0, 1, 0), t.up.applyMatrix4(d), t.up.reflect(l), t.lookAt(p), t.far = m.far, t.updateMatrixWorld(), t.projectionMatrix.copy(m.projectionMatrix), g.set(
0.5,
0,
0,
0.5,
0,
0.5,
0,
0.5,
0,
0,
0.5,
0.5,
0,
0,
0,
1
), g.multiply(t.projectionMatrix), g.multiply(t.matrixWorldInverse), u.setFromNormalAndCoplanarPoint(l, c), u.applyMatrix4(t.matrixWorldInverse), n.set(u.normal.x, u.normal.y, u.normal.z, u.constant);
const a = t.projectionMatrix;
v.x = (Math.sign(n.x) + a.elements[8]) / a.elements[0], v.y = (Math.sign(n.y) + a.elements[9]) / a.elements[5], v.z = -1, v.w = (1 + a.elements[10]) / a.elements[14], n.multiplyScalar(2 / n.dot(v)), a.elements[2] = n.x, a.elements[6] = n.y, a.elements[10] = n.z + 1 - F, a.elements[14] = n.w, S.setFromMatrixPosition(m.matrixWorld);
const H = r.getRenderTarget(), I = r.xr.enabled, q = r.shadowMap.autoUpdate;
s.visible = !1, r.xr.enabled = !1, r.shadowMap.autoUpdate = !1, r.setRenderTarget(M), r.state.buffers.depth.setMask(!0), r.autoClear === !1 && r.clear(), r.render(E, t), s.visible = !0, r.xr.enabled = I, r.shadowMap.autoUpdate = q, r.setRenderTarget(H);
const _ = m.viewport;
_ !== void 0 && r.state.viewport(_);
};
}
}
export {
re as Water
};