whs.terrain
Version:
Terrain component for WhitestormJS
1 lines • 11.3 kB
JavaScript
"use strict";function _classCallCheck(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,n){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?e:n}function _inherits(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not "+typeof n);e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),n&&(Object.setPrototypeOf?Object.setPrototypeOf(e,n):e.__proto__=n)}var _get=function e(n,t,a){null===n&&(n=Function.prototype);var r=Object.getOwnPropertyDescriptor(n,t);if(void 0===r){var o=Object.getPrototypeOf(n);return null===o?void 0:e(o,t,a)}if("value"in r)return r.value;var i=r.get;if(void 0!==i)return i.call(a)};THREE.ShaderTerrain={terrain:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableDiffuse1:{type:"i",value:0},enableDiffuse2:{type:"i",value:0},enableSpecular:{type:"i",value:0},enableReflection:{type:"i",value:0},tDiffuse1:{type:"t",value:null},tDiffuse2:{type:"t",value:null},tDetail:{type:"t",value:null},tNormal:{type:"t",value:null},tSpecular:{type:"t",value:null},tDisplacement:{type:"t",value:null},uNormalScale:{type:"f",value:1},uDisplacementBias:{type:"f",value:0},uDisplacementScale:{type:"f",value:1},diffuse:{type:"c",value:new THREE.Color(15658734)},specular:{type:"c",value:new THREE.Color(1118481)},shininess:{type:"f",value:30},opacity:{type:"f",value:1},uRepeatBase:{type:"v2",value:new THREE.Vector2(1,1)},uRepeatOverlay:{type:"v2",value:new THREE.Vector2(1,1)},uOffset:{type:"v2",value:new THREE.Vector2(0,0)}}]),fragmentShader:"\n uniform vec3 diffuse;\n uniform vec3 emissive;\n uniform float opacity;\n uniform vec3 ambientLightColor;\n varying vec3 vLightFront;\n #ifdef DOUBLE_SIDED\n varying vec3 vLightBack;\n uniform vec2 uRepeatOverlay;\n uniform vec2 uRepeatBase;\n uniform vec2 uOffset;\n uniform float uNormalScale;\n uniform sampler2D tNormal;\n #endif\n uniform sampler2D oceanTexture;\n uniform sampler2D sandyTexture;\n uniform sampler2D grassTexture;\n uniform sampler2D rockyTexture;\n uniform sampler2D snowyTexture;\n varying vec3 vTangent;\n varying vec3 vBinormal;\n varying vec3 vNormal;\n varying vec3 vViewPosition;\n "+[THREE.ShaderChunk.common,THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.alphamap_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.specularmap_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment].join("\n")+"\n varying vec2 vUv;\n varying float vAmount;\n void main() {\n // UVs.\n vec2 uvOverlay = uRepeatOverlay * vUv + uOffset;\n vec2 uvBase = uRepeatBase * vUv;\n vec3 specularTex = vec3( 1.0 );\n vec3 normalTex = texture2D( tNormal, uvOverlay ).xyz * 2.0 - 1.0;\n normalTex.xy *= uNormalScale;\n normalTex = normalize( normalTex );\n mat3 tsb = mat3( vTangent, vBinormal, vNormal );\n vec3 finalNormal = tsb * normalTex;\n vec3 normal = normalize( finalNormal );\n vec3 viewPosition = normalize( vViewPosition );\n vec3 shadowMask = vec3( 1.0 );\n vec3 outgoingLight = vec3( 0.0 );\n vec3 totalAmbientLight = ambientLightColor;\n vec4 diffuseColor = vec4(0.0);\n // Color by texture.\n vec4 water = (smoothstep(0.01, 0.25, vAmount)\n - smoothstep(0.24, 0.26, vAmount))\n * texture2D( oceanTexture, vUv * 10.0 );\n vec4 sandy = (smoothstep(0.24, 0.27, vAmount)\n - smoothstep(0.28, 0.31, vAmount))\n * texture2D( sandyTexture, vUv * 10.0 );\n vec4 grass = (smoothstep(0.28, 0.32, vAmount)\n - smoothstep(0.35, 0.40, vAmount))\n * texture2D( grassTexture, vUv * 20.0 );\n vec4 rocky = (smoothstep(0.30, 0.40, vAmount)\n - smoothstep(0.40, 0.70, vAmount))\n * texture2D( rockyTexture, vUv * 20.0 );\n vec4 snowy = (smoothstep(0.42, 0.45, vAmount))\n * texture2D( snowyTexture, vUv * 10.0 );\n diffuseColor = vec4(0.0, 0.0, 0.0, 1.0)\n + water + sandy + grass + rocky + snowy;\n "+[THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphamap_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.specularmap_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment].join("\n")+"\n #ifdef DOUBLE_SIDED\n if ( gl_FrontFacing )\n outgoingLight += diffuseColor.rgb * \n ( vLightFront * shadowMask + totalAmbientLight )\n + emissive;\n else\n outgoingLight += diffuseColor.rgb * \n ( vLightBack * shadowMask + totalAmbientLight )\n + emissive;\n #else\n outgoingLight += diffuseColor.rgb * \n ( vLightFront * shadowMask + totalAmbientLight )\n + emissive;\n #endif\n gl_FragColor = vec4( outgoingLight, diffuseColor.a );\n }\n ",vertexShader:"\n #define TERRAIN;\n varying vec3 vLightFront;\n #ifdef DOUBLE_SIDED\n varying vec3 vLightBack;\n #endif\n \n varying float vAmount;\n attribute vec4 tangent;\n uniform vec2 uRepeatBase;\n uniform sampler2D tNormal;\n #ifdef VERTEX_TEXTURES\n uniform sampler2D tDisplacement;\n uniform float uDisplacementScale;\n uniform float uDisplacementBias;\n #endif\n varying vec3 vTangent;\n varying vec3 vBinormal;\n varying vec3 vNormal;\n varying vec2 vUv;\n varying vec3 vViewPosition;\n "+[THREE.ShaderChunk.common,THREE.ShaderChunk.uv_pars_vertex,THREE.ShaderChunk.uv2_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,THREE.ShaderChunk.bsdfs,THREE.ShaderChunk.lights_pars].join("\n")+"\n void main() {\n "+[THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.beginnormal_vertex,THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,THREE.ShaderChunk.uv_vertex,THREE.ShaderChunk.uv2_vertex].join("\n")+"\n vNormal = normalize( normalMatrix * normal);\n // Tangent and binormal vectors.\n vTangent = normalize( normalMatrix * tangent.xyz );\n vBinormal = cross( vNormal, vTangent ) * tangent.w;\n vBinormal = normalize( vBinormal );\n // Texture coordinates.\n vUv = uv;\n vec2 uvBase = uv * uRepeatBase;\n // displacement mapping\n vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n mvPosition = modelViewMatrix * vec4( position, 1.0 );\n transformedNormal = normalize( normalMatrix * normal );\n gl_Position = projectionMatrix * mvPosition;\n vViewPosition = -mvPosition.xyz;\n vAmount = position.z * 0.005 + 0.1;\n "+[THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.shadowmap_vertex].join("\n")+"\n }\n ",side:THREE.DoubleSide,shading:THREE.SmoothShading}},WHS.Terrain=function(e){function n(e){_classCallCheck(this,n);var t=_possibleConstructorReturn(this,Object.getPrototypeOf(n).call(this,e,"terrain"));api.extend(e.geometry,{width:1,height:1,depth:1,map:!1});var a=document.createElement("canvas");if(a.setAttribute("width",e.geometry.width),a.setAttribute("height",e.geometry.height),a.getContext){var r=a.getContext("2d");r.drawImage(e.geometry.map,0,0)}var o=api.TextureLoader().load(WHS._settings.assets+"/textures/terrain/dirt-512.jpg");o.wrapS=o.wrapT=THREE.RepeatWrapping;var i=api.TextureLoader().load(WHS._settings.assets+"/textures/terrain/sand-512.jpg");i.wrapS=i.wrapT=THREE.RepeatWrapping;var s=api.TextureLoader().load(WHS._settings.assets+"/textures/terrain/grass-512.jpg");s.wrapS=s.wrapT=THREE.RepeatWrapping;var u=api.TextureLoader().load(WHS._settings.assets+"/textures/terrain/rock-512.jpg");u.wrapS=u.wrapT=THREE.RepeatWrapping;var l=api.TextureLoader().load(WHS._settings.assets+"/textures/terrain/snow-512.jpg");l.wrapS=l.wrapT=THREE.RepeatWrapping;var v=(THREE.NormalMapShader,256),m=256,p={minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBFormat},h=new THREE.WebGLRenderTarget(v,m,p);h.texture=api.TextureLoader().load(WHS._settings.assets+"/terrain/default_terrain.png");var E=new THREE.WebGLRenderTarget(v,m,p);E.texture=api.TextureLoader().load(WHS._settings.assets+"/terrain/NormalMap.png");var g=new THREE.WebGLRenderTarget(256,256,p);g.texture=api.TextureLoader().load(WHS._settings.assets+"/terrain/default_terrain.png");var f=THREE.ShaderTerrain.terrain,c=Object.assign(THREE.UniformsUtils.clone(f.uniforms),{oceanTexture:{type:"t",value:o},sandyTexture:{type:"t",value:i},grassTexture:{type:"t",value:s},rockyTexture:{type:"t",value:u},snowyTexture:{type:"t",value:l},fog:!0,lights:!0},THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.ambient,THREE.UniformsLib.shadowmap,{ambient:{type:"c",value:new THREE.Color(16777215)},emissive:{type:"c",value:new THREE.Color(0)},wrapRGB:{type:"v3",value:new THREE.Vector3(1,1,1)}});console.log(c),c.tDisplacement.value=h,c.spotShadowMap.value=[E],c.uDisplacementScale.value=100,c.uRepeatOverlay.value.set(6,6);var d=new THREE.ShaderMaterial({uniforms:c,vertexShader:f.vertexShader,fragmentShader:f.fragmentShader,lights:!0,fog:!0,side:THREE.DoubleSide,shading:THREE.SmoothShading}),T=new THREE.PlaneGeometry(256,256,255,255);T.verticesNeedUpdate=!0,t._rot.set(Math.PI/180*-90,0,0);for(var R=0,H=0,S=r.getImageData(0,0,256,256).data,_=0;255>=_;_++)for(var y=255;y>=0;y--)T.vertices[R].z=S[H]/255*100,H+=4,R++;return t.mesh=new Physijs.HeightfieldMesh(T,Physijs.createMaterial(d,.8,.1)),T.computeVertexNormals(),T.computeFaceNormals(),T.computeTangents(),t.mesh.updateMatrix(),t.mesh.castShadow=!0,t.mesh.receiveShadow=!0,_get(Object.getPrototypeOf(n.prototype),"build",t).call(t,"skip"),t}return _inherits(n,e),n}(WHS.Shape),WHS.init.prototype.Terrain=function(e){return new WHS.Terrain(e).addTo(this)};