|
44 | 44 |
|
45 | 45 | <script> |
46 | 46 |
|
47 | | - if ( ! Detector.webgl ) { |
48 | | - |
49 | | - Detector.addGetWebGLMessage(); |
50 | | - document.getElementById( 'container' ).innerHTML = ""; |
51 | | - |
52 | | - } |
| 47 | + if ( ! Detector.webgl ) Detector.addGetWebGLMessage(); |
53 | 48 |
|
54 | 49 | var container, stats; |
55 | 50 |
|
|
58 | 53 | var mesh, texture; |
59 | 54 |
|
60 | 55 | var worldWidth = 256, worldDepth = 256, |
61 | | - worldHalfWidth = worldWidth / 2, worldHalfDepth = worldDepth / 2; |
| 56 | + worldHalfWidth = worldWidth / 2, worldHalfDepth = worldDepth / 2; |
62 | 57 |
|
63 | 58 | var clock = new THREE.Clock(); |
64 | 59 |
|
|
73 | 68 | function init() { |
74 | 69 |
|
75 | 70 | container = document.getElementById( 'container' ); |
| 71 | + container.innerHTML = ""; |
76 | 72 |
|
77 | | - camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 20000 ); |
| 73 | + renderer = new THREE.WebGLRenderer( { antialias: true } ); |
| 74 | + renderer.setPixelRatio( window.devicePixelRatio ); |
| 75 | + renderer.setSize( window.innerWidth, window.innerHeight ); |
| 76 | + container.appendChild( renderer.domElement ); |
78 | 77 |
|
79 | 78 | scene = new THREE.Scene(); |
80 | 79 | scene.background = new THREE.Color( 0xbfd1e5 ); |
81 | 80 |
|
82 | | - controls = new THREE.OrbitControls(camera); |
83 | | - controls.target.set( 0.0, 100.0, 0.0 ); |
84 | | - controls.userPanSpeed = 100; |
| 81 | + camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 10, 20000 ); |
| 82 | + |
| 83 | + controls = new THREE.OrbitControls( camera, renderer.domElement ); |
| 84 | + controls.minDistance = 1000; |
| 85 | + controls.maxDistance = 10000; |
| 86 | + controls.maxPolarAngle = Math.PI / 2; |
| 87 | + |
| 88 | + // |
85 | 89 |
|
86 | 90 | var data = generateHeight( worldWidth, worldDepth ); |
87 | 91 |
|
88 | 92 | controls.target.y = data[ worldHalfWidth + worldHalfDepth * worldWidth ] + 500; |
89 | | - camera.position.y = controls.target.y + 2000; |
| 93 | + camera.position.y = controls.target.y + 2000; |
90 | 94 | camera.position.x = 2000; |
| 95 | + controls.update(); |
91 | 96 |
|
92 | 97 | var geometry = new THREE.PlaneBufferGeometry( 7500, 7500, worldWidth - 1, worldDepth - 1 ); |
93 | 98 | geometry.rotateX( - Math.PI / 2 ); |
|
100 | 105 |
|
101 | 106 | } |
102 | 107 |
|
103 | | - geometry.computeFaceNormals(); |
| 108 | + geometry.computeFaceNormals(); // needed for helper |
| 109 | + |
| 110 | + // |
104 | 111 |
|
105 | 112 | texture = new THREE.CanvasTexture( generateTexture( data, worldWidth, worldDepth ) ); |
106 | 113 | texture.wrapS = THREE.ClampToEdgeWrapping; |
|
115 | 122 | helper = new THREE.Mesh( geometry, new THREE.MeshNormalMaterial() ); |
116 | 123 | scene.add( helper ); |
117 | 124 |
|
118 | | - renderer = new THREE.WebGLRenderer( { antialias: true } ); |
119 | | - renderer.setPixelRatio( window.devicePixelRatio ); |
120 | | - renderer.setSize( window.innerWidth, window.innerHeight ); |
121 | | - |
122 | | - container.innerHTML = ""; |
123 | | - |
124 | | - container.appendChild( renderer.domElement ); |
125 | 125 | container.addEventListener( 'mousemove', onMouseMove, false ); |
126 | 126 |
|
127 | 127 | stats = new Stats(); |
|
145 | 145 | function generateHeight( width, height ) { |
146 | 146 |
|
147 | 147 | var size = width * height, data = new Uint8Array( size ), |
148 | | - perlin = new ImprovedNoise(), quality = 1, z = Math.random() * 100; |
| 148 | + perlin = new ImprovedNoise(), quality = 1, z = Math.random() * 100; |
149 | 149 |
|
150 | 150 | for ( var j = 0; j < 4; j ++ ) { |
151 | 151 |
|
152 | 152 | for ( var i = 0; i < size; i ++ ) { |
153 | 153 |
|
154 | | - var x = i % width, y = ~~ ( i / width ); |
| 154 | + var x = i % width, y = ~ ~ ( i / width ); |
155 | 155 | data[ i ] += Math.abs( perlin.noise( x / quality, y / quality, z ) * quality * 1.75 ); |
156 | 156 |
|
157 | 157 | } |
|
166 | 166 |
|
167 | 167 | function generateTexture( data, width, height ) { |
168 | 168 |
|
| 169 | + // bake lighting into texture |
| 170 | + |
169 | 171 | var canvas, canvasScaled, context, image, imageData, |
170 | | - level, diff, vector3, sun, shade; |
| 172 | + level, diff, vector3, sun, shade; |
171 | 173 |
|
172 | 174 | vector3 = new THREE.Vector3( 0, 0, 0 ); |
173 | 175 |
|
|
197 | 199 | imageData[ i ] = ( 96 + shade * 128 ) * ( 0.5 + data[ j ] * 0.007 ); |
198 | 200 | imageData[ i + 1 ] = ( 32 + shade * 96 ) * ( 0.5 + data[ j ] * 0.007 ); |
199 | 201 | imageData[ i + 2 ] = ( shade * 96 ) * ( 0.5 + data[ j ] * 0.007 ); |
| 202 | + |
200 | 203 | } |
201 | 204 |
|
202 | 205 | context.putImageData( image, 0, 0 ); |
|
216 | 219 |
|
217 | 220 | for ( var i = 0, l = imageData.length; i < l; i += 4 ) { |
218 | 221 |
|
219 | | - var v = ~~ ( Math.random() * 5 ); |
| 222 | + var v = ~ ~ ( Math.random() * 5 ); |
220 | 223 |
|
221 | 224 | imageData[ i ] += v; |
222 | 225 | imageData[ i + 1 ] += v; |
|
243 | 246 |
|
244 | 247 | function render() { |
245 | 248 |
|
246 | | - controls.update(); |
247 | 249 | renderer.render( scene, camera ); |
248 | 250 |
|
249 | 251 | } |
|
0 commit comments