|
18 | 18 | import * as THREE from '../build/three.module.js'; |
19 | 19 |
|
20 | 20 | import Stats from './jsm/libs/stats.module.js'; |
| 21 | + import { GUI } from './jsm/libs/dat.gui.module.js'; |
21 | 22 |
|
22 | 23 | import { OrbitControls } from './jsm/controls/OrbitControls.js'; |
23 | 24 | import { GLTFLoader } from './jsm/loaders/GLTFLoader.js'; |
|
26 | 27 |
|
27 | 28 | var materialShader; |
28 | 29 |
|
| 30 | + var params = { |
| 31 | + |
| 32 | + wavesInYDimension: true |
| 33 | + |
| 34 | + }; |
| 35 | + |
29 | 36 | init(); |
30 | 37 | animate(); |
31 | 38 |
|
|
41 | 48 |
|
42 | 49 | shader.uniforms.time = { value: 0 }; |
43 | 50 |
|
| 51 | + var dimension = params.wavesInYDimension ? 'y' : 'z'; |
| 52 | + |
44 | 53 | shader.vertexShader = 'uniform float time;\n' + shader.vertexShader; |
45 | 54 | shader.vertexShader = shader.vertexShader.replace( |
46 | 55 | '#include <begin_vertex>', |
47 | 56 | [ |
48 | | - 'float theta = sin( time + position.y ) / 2.0;', |
49 | | - 'float c = cos( theta );', |
50 | | - 'float s = sin( theta );', |
51 | | - 'mat3 m = mat3( c, 0, s, 0, 1, 0, -s, 0, c );', |
52 | | - 'vec3 transformed = vec3( position ) * m;', |
53 | | - 'vNormal = vNormal * m;' |
| 57 | + `float theta = sin( time + position.${ dimension } ) / 2.0; |
| 58 | + float c = cos( theta ); |
| 59 | + float s = sin( theta ); |
| 60 | + mat3 m = mat3( c, 0, s, 0, 1, 0, -s, 0, c ); |
| 61 | + vec3 transformed = vec3( position ) * m; |
| 62 | + vNormal = vNormal * m;` |
54 | 63 | ].join( '\n' ) |
55 | 64 | ); |
56 | 65 |
|
57 | 66 | materialShader = shader; |
58 | 67 |
|
59 | 68 | }; |
60 | 69 |
|
| 70 | + material.customProgramCacheKey = function() { |
| 71 | + |
| 72 | + return params.wavesInYDimension ? '1' : '0'; |
| 73 | + |
| 74 | + }; |
| 75 | + |
61 | 76 | var loader = new GLTFLoader(); |
62 | 77 | loader.load( 'models/gltf/LeePerrySmith/LeePerrySmith.glb', function ( gltf ) { |
63 | 78 |
|
|
79 | 94 |
|
80 | 95 | stats = new Stats(); |
81 | 96 | document.body.appendChild( stats.dom ); |
| 97 | + |
| 98 | + var gui = new GUI(); |
| 99 | + gui.add( params, 'wavesInYDimension' ).onChange( function() { |
| 100 | + |
| 101 | + material.needsUpdate = true; |
| 102 | + |
| 103 | + }); |
82 | 104 |
|
83 | 105 | // EVENTS |
84 | 106 |
|
|
0 commit comments