webgl_materials_nodes.html 29.3 KB
Newer Older
S
SUNAG 已提交
1 2 3
<!doctype html>
<html lang="en">
	<head>
S
SUNAG 已提交
4
		<title>WebGL NodeMaterial</title>
S
SUNAG 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<style>
			body {
				color: #fff;
				font-family:Monospace;
				font-size:13px;
				margin: 0px;
				text-align:center;
				overflow: hidden;
			}

			#info {
				color: #fff;
				position: absolute;
				top: 10px;
				width: 100%;
				text-align: center;
				display:block;
			}

			a { color: white }
		</style>
	</head>
	<body>

		<div id="container"></div>
		<div id="info">
			<a href="http://threejs.org" target="_blank">three.js</a> - Node-Based Material
		</div>

		<script src="../build/three.min.js"></script>
S
SUNAG 已提交
37

S
SUNAG 已提交
38 39 40
		<script src='js/geometries/TeapotBufferGeometry.js'></script>
		<script src="js/controls/OrbitControls.js"></script>
		<script src="js/libs/dat.gui.min.js"></script>
S
SUNAG 已提交
41 42

		<!-- NodeLibrary -->
S
SUNAG 已提交
43 44 45 46 47 48 49 50
		<script src="js/nodes/GLNode.js"></script>
		<script src="js/nodes/RawNode.js"></script>
		<script src="js/nodes/TempNode.js"></script>
		<script src="js/nodes/InputNode.js"></script>
		<script src="js/nodes/ConstNode.js"></script>
		<script src="js/nodes/FunctionNode.js"></script>
		<script src="js/nodes/FunctionCallNode.js"></script>
		<script src="js/nodes/BuilderNode.js"></script>
S
SUNAG 已提交
51
		<script src="js/nodes/NodeLib.js"></script>
S
SUNAG 已提交
52
		<script src="js/nodes/NodeMaterial.js"></script>
S
SUNAG 已提交
53

S
SUNAG 已提交
54
		<!-- Accessors -->
S
SUNAG 已提交
55 56 57 58 59 60
		<script src="js/nodes/accessors/PositionNode.js"></script>
		<script src="js/nodes/accessors/NormalNode.js"></script>
		<script src="js/nodes/accessors/UVNode.js"></script>
		<script src="js/nodes/accessors/ColorsNode.js"></script>
		<script src="js/nodes/accessors/CameraNode.js"></script>
		<script src="js/nodes/accessors/ReflectNode.js"></script>
S
SUNAG 已提交
61

S
SUNAG 已提交
62
		<!-- Inputs -->
S
SUNAG 已提交
63 64 65 66 67 68 69 70
		<script src="js/nodes/inputs/IntNode.js"></script>
		<script src="js/nodes/inputs/FloatNode.js"></script>
		<script src="js/nodes/inputs/ColorNode.js"></script>
		<script src="js/nodes/inputs/Vector2Node.js"></script>
		<script src="js/nodes/inputs/Vector3Node.js"></script>
		<script src="js/nodes/inputs/Vector4Node.js"></script>
		<script src="js/nodes/inputs/TextureNode.js"></script>
		<script src="js/nodes/inputs/CubeTextureNode.js"></script>
S
SUNAG 已提交
71

S
SUNAG 已提交
72
		<!-- Math -->
S
SUNAG 已提交
73 74 75 76
		<script src="js/nodes/math/Math1Node.js"></script>
		<script src="js/nodes/math/Math2Node.js"></script>
		<script src="js/nodes/math/Math3Node.js"></script>
		<script src="js/nodes/math/OperatorNode.js"></script>
S
SUNAG 已提交
77

S
SUNAG 已提交
78
		<!-- Utils -->
S
SUNAG 已提交
79 80
		<script src="js/nodes/utils/SwitchNode.js"></script>
		<script src="js/nodes/utils/JoinNode.js"></script>
S
SUNAG 已提交
81
		<script src="js/nodes/utils/TimerNode.js"></script>
S
SUNAG 已提交
82 83
		<script src="js/nodes/utils/RoughnessToBlinnExponentNode.js"></script>
		<script src="js/nodes/utils/VelocityNode.js"></script>
S
SUNAG 已提交
84 85

		<!-- Phong Material -->
S
SUNAG 已提交
86 87
		<script src="js/nodes/materials/PhongNode.js"></script>
		<script src="js/nodes/materials/PhongNodeMaterial.js"></script>
S
SUNAG 已提交
88 89

		<!-- Standard Material -->
S
SUNAG 已提交
90 91
		<script src="js/nodes/materials/StandardNode.js"></script>
		<script src="js/nodes/materials/StandardNodeMaterial.js"></script>
S
SUNAG 已提交
92

S
SUNAG 已提交
93 94 95 96 97 98 99 100 101
		<script>

		var container = document.getElementById( 'container' );

		var renderer, scene, camera, clock = new THREE.Clock(), fov = 50;
		var teapot, mesh;
		var controls;
		var move = false;
		var gui, guiElements = [];
S
SUNAG 已提交
102

S
SUNAG 已提交
103 104 105 106 107
		var param = { example: 'standard' };

		var brick = new THREE.TextureLoader().load( 'textures/brick_diffuse.jpg' );
		var grass = new THREE.TextureLoader().load( 'textures/terrain/grasslight-big.jpg' );
		var grassNormal = new THREE.TextureLoader().load( 'textures/terrain/grasslight-big-nm.jpg' );
S
SUNAG 已提交
108

S
SUNAG 已提交
109 110
		var decalDiffuse = new THREE.TextureLoader().load( 'textures/decal/decal-diffuse.png' );
		decalDiffuse.wrapS = decalDiffuse.wrapT = THREE.RepeatWrapping;
S
SUNAG 已提交
111

S
SUNAG 已提交
112 113
		var cloud = new THREE.TextureLoader().load( 'textures/lava/cloud.png' );
		cloud.wrapS = cloud.wrapT = THREE.RepeatWrapping;
S
SUNAG 已提交
114

S
SUNAG 已提交
115
		var cubemap = function() {
S
SUNAG 已提交
116

S
SUNAG 已提交
117 118 119 120 121 122 123
			var path = "textures/cube/Park2/";
			var format = '.jpg';
			var urls = [
					path + 'posx' + format, path + 'negx' + format,
					path + 'posy' + format, path + 'negy' + format,
					path + 'posz' + format, path + 'negz' + format
				];
S
SUNAG 已提交
124

S
SUNAG 已提交
125 126
			var textureCube = new THREE.CubeTextureLoader().load( urls );
			textureCube.format = THREE.RGBFormat;
S
SUNAG 已提交
127

S
SUNAG 已提交
128
			return textureCube;
S
SUNAG 已提交
129

S
SUNAG 已提交
130
		}();
S
SUNAG 已提交
131

S
SUNAG 已提交
132 133 134 135 136 137 138 139 140 141 142 143 144
		window.addEventListener( 'load', init );

		function init() {

			renderer = new THREE.WebGLRenderer( { antialias: true } );
			renderer.setPixelRatio( window.devicePixelRatio );
			renderer.setSize( window.innerWidth, window.innerHeight );
			container.appendChild( renderer.domElement );

			scene = new THREE.Scene();

			camera = new THREE.PerspectiveCamera( fov, window.innerWidth / window.innerHeight, 1, 1000 );
			camera.position.x = 50;
S
SUNAG 已提交
145
			camera.position.z = - 50;
S
SUNAG 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159
			camera.position.y = 30;
			camera.target = new THREE.Vector3();

			controls = new THREE.OrbitControls( camera, renderer.domElement );
			controls.minDistance = 50;
			controls.maxDistance = 200;

			scene.add( new THREE.AmbientLight( 0x464646 ) );

			var light = new THREE.DirectionalLight( 0xffddcc, 1 );
			light.position.set( 1, 0.75, 0.5 );
			scene.add( light );

			var light = new THREE.DirectionalLight( 0xccccff, 1 );
S
SUNAG 已提交
160
			light.position.set( - 1, 0.75, - 0.5 );
S
SUNAG 已提交
161 162 163
			scene.add( light );

			teapot = new THREE.TeapotBufferGeometry( 15, 18 );
S
SUNAG 已提交
164

S
SUNAG 已提交
165 166
			mesh = new THREE.Mesh( teapot );
			scene.add( mesh );
S
SUNAG 已提交
167

S
SUNAG 已提交
168 169 170
			window.addEventListener( 'resize', onWindowResize, false );

			updateMaterial();
S
SUNAG 已提交
171

S
SUNAG 已提交
172 173 174 175
			onWindowResize();
			animate();

		}
S
SUNAG 已提交
176

S
SUNAG 已提交
177
		function clearGui() {
S
SUNAG 已提交
178 179 180

			if ( gui ) gui.destroy();

S
SUNAG 已提交
181
			gui = new dat.GUI();
S
SUNAG 已提交
182 183

			var example = gui.add( param, 'example', {
S
SUNAG 已提交
184 185 186
				'basic / standard (PBR)': 'standard',
				'basic / phong': 'phong',
				'basic / layers': 'layers',
S
SUNAG 已提交
187
				'basic / rim': 'rim',
S
SUNAG 已提交
188 189 190 191 192 193 194 195 196 197
				'adv / fresnel': 'fresnel',
				'adv / saturation': 'saturation',
				'adv / top-bottom': 'top-bottom',
				'adv / caustic': 'caustic',
				'adv / displace': 'displace',
				'adv / camera-depth': 'camera-depth',
				'adv / soft-body': 'soft-body',
				'adv / wave': 'wave',
				'misc / smoke' : 'smoke',
				'misc / firefly' : 'firefly'
S
SUNAG 已提交
198 199
			} ).onFinishChange( function() {

S
SUNAG 已提交
200
				updateMaterial();
S
SUNAG 已提交
201

S
SUNAG 已提交
202
			} );
S
SUNAG 已提交
203

S
SUNAG 已提交
204
			gui.open();
S
SUNAG 已提交
205

S
SUNAG 已提交
206
		}
S
SUNAG 已提交
207

S
SUNAG 已提交
208
		function addGui( name, value, callback, isColor, min, max ) {
S
SUNAG 已提交
209

S
SUNAG 已提交
210
			var node;
S
SUNAG 已提交
211 212 213 214 215 216 217 218 219

			param[ name ] = value;

			if ( isColor ) {

				node = gui.addColor( param, name ).onChange( function() {

					callback( param[ name ] );

S
SUNAG 已提交
220
				} );
S
SUNAG 已提交
221

S
SUNAG 已提交
222 223 224 225 226 227 228 229 230
			}
			else if (typeof value == 'object') {

				node = gui.add( param, name, value ).onChange( function() {

					callback( param[ name ] );

				} );

S
SUNAG 已提交
231 232
			}
			else {
S
SUNAG 已提交
233 234 235 236 237

				node = gui.add( param, name, min, max ).onChange( function() {

					callback( param[ name ] );

S
SUNAG 已提交
238
				} );
S
SUNAG 已提交
239

S
SUNAG 已提交
240
			}
S
SUNAG 已提交
241

S
SUNAG 已提交
242
			return node;
S
SUNAG 已提交
243

S
SUNAG 已提交
244 245 246
		}

		function updateMaterial() {
S
SUNAG 已提交
247

S
SUNAG 已提交
248
			move = false;
S
SUNAG 已提交
249 250 251

			if ( mesh.material ) mesh.material.dispose();

S
SUNAG 已提交
252
			var name = param.example;
S
SUNAG 已提交
253 254
			var mtl;

S
SUNAG 已提交
255
			clearGui();
S
SUNAG 已提交
256 257 258

			switch ( name ) {

S
SUNAG 已提交
259
				case 'phong':
S
SUNAG 已提交
260

S
SUNAG 已提交
261
					// MATERIAL
S
SUNAG 已提交
262

S
SUNAG 已提交
263
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
264

S
SUNAG 已提交
265 266 267 268 269 270 271 272 273 274 275
					//mtl.color = // albedo color
					//mtl.alpha = // opacity (0 at 1)
					//mtl.specular = // specular color
					//mtl.shininess = // shininess (float)
					//mtl.normal = // normalmap
					//mtl.normalScale = // normalmap scale
					//mtl.emissive = // emissive color
					//mtl.ambient = // ambient color
					//mtl.shadow = // shadowmap
					//mtl.ao = // ambient occlusion
					//mtl.environment = // reflection map (CubeMap recommended)
276
					//mtl.environmentIntensity = // environment intensity
S
SUNAG 已提交
277
					//mtl.transform = // vertex transformation
S
SUNAG 已提交
278 279 280 281 282 283 284

					var mask = new THREE.SwitchNode( new THREE.TextureNode( decalDiffuse ), 'w' );

					mtl.color = new THREE.TextureNode( grass );
					mtl.specular = new THREE.FloatNode( .5 );
					mtl.shininess = new THREE.FloatNode( 15 );
					mtl.environment = new THREE.CubeTextureNode( cubemap );
285
					mtl.environmentIntensity = mask;
S
SUNAG 已提交
286 287 288
					mtl.normal = new THREE.TextureNode( grassNormal );
					mtl.normalScale = new THREE.Math1Node( mask, THREE.Math1Node.INVERT );

S
SUNAG 已提交
289
					break;
S
SUNAG 已提交
290

S
SUNAG 已提交
291
				case 'standard':
S
SUNAG 已提交
292

S
SUNAG 已提交
293
					// MATERIAL
S
SUNAG 已提交
294

S
SUNAG 已提交
295
					mtl = new THREE.StandardNodeMaterial();
S
SUNAG 已提交
296

S
SUNAG 已提交
297 298 299 300 301 302 303 304 305 306 307
					//mtl.color = // albedo color
					//mtl.alpha = // opacity (0 at 1)
					//mtl.roughness = // roughness (float)
					//mtl.metalness = // metalness (float)
					//mtl.normal = // normalmap
					//mtl.normalScale = // normalmap scale
					//mtl.emissive = // emissive color
					//mtl.ambient = // ambient color
					//mtl.shadow = // shadowmap
					//mtl.ao = // ambient occlusion
					//mtl.environment = // reflection map (CubeMap recommended)
308
					//mtl.environmentIntensity = // environment intensity
S
SUNAG 已提交
309
					//mtl.transform = // vertex transformation
S
SUNAG 已提交
310 311 312 313 314 315 316 317 318 319

					var mask = new THREE.SwitchNode( new THREE.TextureNode( decalDiffuse ), 'w' );

					var normalScale = new THREE.FloatNode( .3 );

					var roughnessA = new THREE.FloatNode( .5 );
					var metalnessA = new THREE.FloatNode( .5 );

					var roughnessB = new THREE.FloatNode( 0 );
					var metalnessB = new THREE.FloatNode( 1 );
S
SUNAG 已提交
320

S
SUNAG 已提交
321
					var roughness = new THREE.Math3Node(
S
SUNAG 已提交
322 323 324
						roughnessA,
						roughnessB,
						mask,
S
SUNAG 已提交
325
						THREE.Math3Node.MIX
S
SUNAG 已提交
326 327
					);

S
SUNAG 已提交
328
					var metalness = new THREE.Math3Node(
S
SUNAG 已提交
329 330 331
						metalnessA,
						metalnessB,
						mask,
S
SUNAG 已提交
332
						THREE.Math3Node.MIX
S
SUNAG 已提交
333
					);
S
SUNAG 已提交
334

S
SUNAG 已提交
335 336
					var normalMask = new THREE.OperatorNode(
						new THREE.Math1Node( mask, THREE.Math1Node.INVERT ),
S
SUNAG 已提交
337
						normalScale,
S
SUNAG 已提交
338
						THREE.OperatorNode.MUL
S
SUNAG 已提交
339
					);
S
SUNAG 已提交
340 341

					mtl.color = new THREE.ColorNode( 0xFFFFFF );
S
SUNAG 已提交
342 343
					mtl.roughness = roughness;
					mtl.metalness = metalness;
S
SUNAG 已提交
344 345
					mtl.environment = new THREE.CubeTextureNode( cubemap );
					mtl.normal = new THREE.TextureNode( grassNormal );
S
SUNAG 已提交
346
					mtl.normalScale = normalMask;
S
SUNAG 已提交
347

S
SUNAG 已提交
348
					// GUI
S
SUNAG 已提交
349

S
SUNAG 已提交
350
					addGui( 'color', mtl.color.value.getHex(), function( val ) {
S
SUNAG 已提交
351

S
SUNAG 已提交
352
						mtl.color.value.setHex( val );
S
SUNAG 已提交
353

S
SUNAG 已提交
354
					}, true );
S
SUNAG 已提交
355

S
SUNAG 已提交
356
					addGui( 'roughnessA', roughnessA.number, function( val ) {
S
SUNAG 已提交
357

S
SUNAG 已提交
358 359 360
						 roughnessA.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
361

S
SUNAG 已提交
362
					addGui( 'metalnessA', metalnessA.number, function( val ) {
S
SUNAG 已提交
363

S
SUNAG 已提交
364 365 366
						metalnessA.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
367

S
SUNAG 已提交
368
					addGui( 'roughnessB', roughnessB.number, function( val ) {
S
SUNAG 已提交
369

S
SUNAG 已提交
370 371 372
						 roughnessB.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
373

S
SUNAG 已提交
374
					addGui( 'metalnessB', metalnessB.number, function( val ) {
S
SUNAG 已提交
375

S
SUNAG 已提交
376 377 378
						metalnessB.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
379

S
SUNAG 已提交
380
					addGui( 'normalScale', normalScale.number, function( val ) {
S
SUNAG 已提交
381

S
SUNAG 已提交
382 383 384
						normalScale.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
385

S
SUNAG 已提交
386
					break;
S
SUNAG 已提交
387

S
SUNAG 已提交
388
				case 'wave':
S
SUNAG 已提交
389

S
SUNAG 已提交
390
					// MATERIAL
S
SUNAG 已提交
391

S
SUNAG 已提交
392
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
393

S
SUNAG 已提交
394
					var time = new THREE.TimerNode();
S
SUNAG 已提交
395 396 397 398 399 400
					var speed = new THREE.FloatNode( 5 );
					var scale = new THREE.FloatNode( 1 );
					var worldScale = new THREE.FloatNode( .4 );
					var colorA = new THREE.ColorNode( 0xFFFFFF );
					var colorB = new THREE.ColorNode( 0x0054df );

S
SUNAG 已提交
401
					var uv = new THREE.UVNode();
S
SUNAG 已提交
402

S
SUNAG 已提交
403
					var timeScale = new THREE.OperatorNode(
S
SUNAG 已提交
404 405
						time,
						speed,
S
SUNAG 已提交
406
						THREE.OperatorNode.MUL
S
SUNAG 已提交
407
					);
S
SUNAG 已提交
408

S
SUNAG 已提交
409 410
					var worldScl = new THREE.OperatorNode(
						new THREE.PositionNode(),
S
SUNAG 已提交
411
						worldScale,
S
SUNAG 已提交
412
						THREE.OperatorNode.MUL
S
SUNAG 已提交
413
					);
S
SUNAG 已提交
414

S
SUNAG 已提交
415
					var posContinuous = new THREE.OperatorNode(
S
SUNAG 已提交
416 417
						worldScl,
						timeScale,
S
SUNAG 已提交
418
						THREE.OperatorNode.ADD
S
SUNAG 已提交
419
					);
S
SUNAG 已提交
420 421 422 423

					var wave = new THREE.Math1Node( posContinuous, THREE.Math1Node.SIN );
					wave = new THREE.SwitchNode( wave, 'x' );

S
SUNAG 已提交
424
					var waveScale = new THREE.OperatorNode(
S
SUNAG 已提交
425 426
						wave,
						scale,
S
SUNAG 已提交
427
						THREE.OperatorNode.MUL
S
SUNAG 已提交
428
					);
S
SUNAG 已提交
429

S
SUNAG 已提交
430 431
					var displaceY = new THREE.JoinNode(
						new THREE.FloatNode(),
S
SUNAG 已提交
432
						waveScale,
S
SUNAG 已提交
433
						new THREE.FloatNode()
S
SUNAG 已提交
434
					);
S
SUNAG 已提交
435

S
SUNAG 已提交
436 437
					var displace = new THREE.OperatorNode(
						new THREE.NormalNode(),
S
SUNAG 已提交
438
						displaceY,
S
SUNAG 已提交
439
						THREE.OperatorNode.MUL
S
SUNAG 已提交
440
					);
S
SUNAG 已提交
441

S
SUNAG 已提交
442 443
					var blend = new THREE.OperatorNode(
						new THREE.PositionNode(),
S
SUNAG 已提交
444
						displaceY,
S
SUNAG 已提交
445
						THREE.OperatorNode.ADD
S
SUNAG 已提交
446
					);
S
SUNAG 已提交
447

S
SUNAG 已提交
448
					var color = new THREE.Math3Node(
S
SUNAG 已提交
449 450 451
						colorB,
						colorA,
						wave,
S
SUNAG 已提交
452
						THREE.Math3Node.MIX
S
SUNAG 已提交
453
					);
S
SUNAG 已提交
454

S
SUNAG 已提交
455 456 457
					mtl.color = color;
					mtl.transform = blend;

S
SUNAG 已提交
458
					// GUI
S
SUNAG 已提交
459

S
SUNAG 已提交
460
					addGui( 'speed', speed.number, function( val ) {
S
SUNAG 已提交
461

S
SUNAG 已提交
462 463 464
						speed.number = val;

					}, false, 0, 10 );
S
SUNAG 已提交
465

S
SUNAG 已提交
466
					addGui( 'scale', scale.number, function( val ) {
S
SUNAG 已提交
467

S
SUNAG 已提交
468 469 470
						scale.number = val;

					}, false, 0, 3 );
S
SUNAG 已提交
471

S
SUNAG 已提交
472
					addGui( 'worldScale', worldScale.number, function( val ) {
S
SUNAG 已提交
473

S
SUNAG 已提交
474 475 476
						worldScale.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
477

S
SUNAG 已提交
478
					addGui( 'colorA', colorA.value.getHex(), function( val ) {
S
SUNAG 已提交
479

S
SUNAG 已提交
480
						colorA.value.setHex( val );
S
SUNAG 已提交
481

S
SUNAG 已提交
482
					}, true );
S
SUNAG 已提交
483

S
SUNAG 已提交
484
					addGui( 'colorB', colorB.value.getHex(), function( val ) {
S
SUNAG 已提交
485

S
SUNAG 已提交
486
						colorB.value.setHex( val );
S
SUNAG 已提交
487

S
SUNAG 已提交
488
					}, true );
S
SUNAG 已提交
489

S
SUNAG 已提交
490
					addGui( 'useNormals', false, function( val ) {
S
SUNAG 已提交
491

S
SUNAG 已提交
492
						blend.b = val ? displace : displaceY;
S
SUNAG 已提交
493

S
SUNAG 已提交
494
						mtl.build();
S
SUNAG 已提交
495

S
SUNAG 已提交
496
					} );
S
SUNAG 已提交
497

S
SUNAG 已提交
498
					break;
S
SUNAG 已提交
499

S
SUNAG 已提交
500
				case 'rim':
S
SUNAG 已提交
501

S
SUNAG 已提交
502
					// MATERIAL
S
SUNAG 已提交
503

S
SUNAG 已提交
504
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
505

S
SUNAG 已提交
506
					var intensity = 1.3;
S
SUNAG 已提交
507 508 509
					var power = new THREE.FloatNode( 3 );
					var color = new THREE.ColorNode( 0xFFFFFF );

S
SUNAG 已提交
510
					var viewZ = new THREE.Math2Node(
S
SUNAG 已提交
511 512
						new THREE.NormalNode( THREE.NormalNode.VIEW ),
						new THREE.Vector3Node( 0, 0, - intensity ),
S
SUNAG 已提交
513
						THREE.Math2Node.DOT
S
SUNAG 已提交
514
					);
S
SUNAG 已提交
515

S
SUNAG 已提交
516
					var rim = new THREE.OperatorNode(
S
SUNAG 已提交
517
						viewZ,
S
SUNAG 已提交
518
						new THREE.FloatNode( intensity ),
S
SUNAG 已提交
519
						THREE.OperatorNode.ADD
S
SUNAG 已提交
520
					);
S
SUNAG 已提交
521

S
SUNAG 已提交
522
					var rimPower = new THREE.Math2Node(
S
SUNAG 已提交
523 524
						rim,
						power,
S
SUNAG 已提交
525
						THREE.Math2Node.POW
S
SUNAG 已提交
526
					);
S
SUNAG 已提交
527

S
SUNAG 已提交
528
					var rimColor = new THREE.OperatorNode(
S
SUNAG 已提交
529 530
						rimPower,
						color,
S
SUNAG 已提交
531
						THREE.OperatorNode.MUL
S
SUNAG 已提交
532
					);
S
SUNAG 已提交
533 534 535 536

					mtl.color = new THREE.ColorNode( 0x111111 );
					mtl.emissive = rimColor;

S
SUNAG 已提交
537
					// GUI
S
SUNAG 已提交
538

S
SUNAG 已提交
539
					addGui( 'color', color.value.getHex(), function( val ) {
S
SUNAG 已提交
540

S
SUNAG 已提交
541
						color.value.setHex( val );
S
SUNAG 已提交
542

S
SUNAG 已提交
543
					}, true );
S
SUNAG 已提交
544

S
SUNAG 已提交
545
					addGui( 'intensity', intensity, function( val ) {
S
SUNAG 已提交
546

S
SUNAG 已提交
547
						intensity = val;
S
SUNAG 已提交
548 549

						viewZ.b.z = - intensity;
S
SUNAG 已提交
550
						rim.b.number = intensity;
S
SUNAG 已提交
551 552


S
SUNAG 已提交
553
					}, false, 0, 3 );
S
SUNAG 已提交
554

S
SUNAG 已提交
555
					addGui( 'power', power.number, function( val ) {
S
SUNAG 已提交
556

S
SUNAG 已提交
557
						power.number = val;
S
SUNAG 已提交
558

S
SUNAG 已提交
559
					}, false, 0, 6 );
S
SUNAG 已提交
560

S
SUNAG 已提交
561
					addGui( 'xray', false, function( val ) {
S
SUNAG 已提交
562 563 564 565 566

						if ( val ) {

							mtl.emissive = color;
							mtl.alpha = rimPower;
S
SUNAG 已提交
567 568
							mtl.blending = THREE.AdditiveBlending;
							mtl.depthWrite = false;
S
SUNAG 已提交
569

S
SUNAG 已提交
570 571
						}
						else {
S
SUNAG 已提交
572 573

							mtl.emissive = rimColor;
S
SUNAG 已提交
574 575 576
							mtl.alpha = null;
							mtl.blending = THREE.NormalBlending;
							mtl.depthWrite = true;
S
SUNAG 已提交
577

S
SUNAG 已提交
578
						}
S
SUNAG 已提交
579

S
SUNAG 已提交
580
						mtl.build();
S
SUNAG 已提交
581

S
SUNAG 已提交
582
					} );
S
SUNAG 已提交
583

S
SUNAG 已提交
584
					break;
S
SUNAG 已提交
585

S
SUNAG 已提交
586
				case 'fresnel':
S
SUNAG 已提交
587

S
SUNAG 已提交
588
					// MATERIAL
S
SUNAG 已提交
589

S
SUNAG 已提交
590
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
591 592 593 594 595

					var reflectance = new THREE.FloatNode( 1.3 );
					var power = new THREE.FloatNode( 1 );
					var color = new THREE.CubeTextureNode( cubemap );

S
SUNAG 已提交
596
					var viewZ = new THREE.Math2Node(
S
SUNAG 已提交
597 598
						new THREE.NormalNode( THREE.NormalNode.VIEW ),
						new THREE.Vector3Node( 0, 0, - 1 ),
S
SUNAG 已提交
599
						THREE.Math2Node.DOT
S
SUNAG 已提交
600
					);
S
SUNAG 已提交
601

S
SUNAG 已提交
602
					var theta = new THREE.OperatorNode(
S
SUNAG 已提交
603
						viewZ,
S
SUNAG 已提交
604
						new THREE.FloatNode( 1 ),
S
SUNAG 已提交
605
						THREE.OperatorNode.ADD
S
SUNAG 已提交
606
					);
S
SUNAG 已提交
607

S
SUNAG 已提交
608
					var thetaPower = new THREE.Math2Node(
S
SUNAG 已提交
609 610
						theta,
						power,
S
SUNAG 已提交
611
						THREE.Math2Node.POW
S
SUNAG 已提交
612
					);
S
SUNAG 已提交
613

S
SUNAG 已提交
614
					var fresnel = new THREE.OperatorNode(
S
SUNAG 已提交
615 616
						reflectance,
						thetaPower,
S
SUNAG 已提交
617
						THREE.OperatorNode.MUL
S
SUNAG 已提交
618
					);
S
SUNAG 已提交
619 620

					mtl.color = new THREE.ColorNode( 0x3399FF );
S
SUNAG 已提交
621
					mtl.environment = color;
S
SUNAG 已提交
622
					mtl.environmentAlpha = new THREE.Math1Node( fresnel, THREE.Math1Node.SAT );
S
SUNAG 已提交
623

S
SUNAG 已提交
624
					// GUI
S
SUNAG 已提交
625

S
SUNAG 已提交
626
					addGui( 'reflectance', reflectance.number, function( val ) {
S
SUNAG 已提交
627

S
SUNAG 已提交
628 629 630
						reflectance.number = val;

					}, false, 0, 3 );
S
SUNAG 已提交
631

S
SUNAG 已提交
632
					addGui( 'power', power.number, function( val ) {
S
SUNAG 已提交
633

S
SUNAG 已提交
634 635 636
						power.number = val;

					}, false, 0, 5 );
S
SUNAG 已提交
637

S
SUNAG 已提交
638
					break;
S
SUNAG 已提交
639

S
SUNAG 已提交
640
				case 'layers':
S
SUNAG 已提交
641

S
SUNAG 已提交
642
					// MATERIAL
S
SUNAG 已提交
643

S
SUNAG 已提交
644
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
645 646 647 648 649 650

					var tex1 = new THREE.TextureNode( grass );
					var tex2 = new THREE.TextureNode( brick );

					var offset = new THREE.FloatNode( 0 );
					var scale = new THREE.FloatNode( 1 );
S
SUNAG 已提交
651
					var uv = new THREE.UVNode();
S
SUNAG 已提交
652

S
SUNAG 已提交
653
					var uvOffset = new THREE.OperatorNode(
S
SUNAG 已提交
654 655
						offset,
						uv,
S
SUNAG 已提交
656
						THREE.OperatorNode.ADD
S
SUNAG 已提交
657
					);
S
SUNAG 已提交
658

S
SUNAG 已提交
659
					var uvScale = new THREE.OperatorNode(
S
SUNAG 已提交
660 661
						uvOffset,
						scale,
S
SUNAG 已提交
662
						THREE.OperatorNode.MUL
S
SUNAG 已提交
663
					);
S
SUNAG 已提交
664 665 666 667

					var mask = new THREE.TextureNode( decalDiffuse, uvScale );
					var maskAlphaChannel = new THREE.SwitchNode( mask, 'w' );

S
SUNAG 已提交
668
					var blend = new THREE.Math3Node(
S
SUNAG 已提交
669 670 671
						tex1,
						tex2,
						maskAlphaChannel,
S
SUNAG 已提交
672
						THREE.Math3Node.MIX
S
SUNAG 已提交
673
					);
S
SUNAG 已提交
674

S
SUNAG 已提交
675
					mtl.color = blend;
S
SUNAG 已提交
676

S
SUNAG 已提交
677
					// GUI
S
SUNAG 已提交
678

S
SUNAG 已提交
679
					addGui( 'offset', offset.number, function( val ) {
S
SUNAG 已提交
680

S
SUNAG 已提交
681 682 683
						offset.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
684

S
SUNAG 已提交
685
					addGui( 'scale', scale.number, function( val ) {
S
SUNAG 已提交
686

S
SUNAG 已提交
687 688 689
						scale.number = val;

					}, false, 0, 10 );
S
SUNAG 已提交
690

S
SUNAG 已提交
691
					break;
S
SUNAG 已提交
692

S
SUNAG 已提交
693
				case 'saturation':
S
SUNAG 已提交
694

S
SUNAG 已提交
695
					// MATERIAL
S
SUNAG 已提交
696

S
SUNAG 已提交
697
					mtl = new THREE.StandardNodeMaterial();
S
SUNAG 已提交
698 699 700 701 702

					var tex = new THREE.TextureNode( brick );
					var sat = new THREE.FloatNode( 0 );

					var satrgb = new THREE.FunctionNode( [
S
SUNAG 已提交
703 704 705 706 707
					"vec3 satrgb(vec3 rgb, float adjustment) {",
						//"const vec3 W = vec3(0.2125, 0.7154, 0.0721);", // LUMA
						"vec3 intensity = vec3(dot(rgb, LUMA));",
						"return mix(intensity, rgb, adjustment);",
					"}"
S
SUNAG 已提交
708 709 710
					].join( "\n" ) );

					var saturation = new THREE.FunctionCallNode( satrgb );
S
SUNAG 已提交
711 712
					saturation.inputs.rgb = tex;
					saturation.inputs.adjustment = sat;
S
SUNAG 已提交
713

S
SUNAG 已提交
714
					// or try
S
SUNAG 已提交
715

S
SUNAG 已提交
716 717
					//saturation.inputs[0] = tex;
					//saturation.inputs[1] = sat;
S
SUNAG 已提交
718

S
SUNAG 已提交
719
					mtl.color = saturation;
S
SUNAG 已提交
720 721
					mtl.environment = new THREE.CubeTextureNode( cubemap ); // optional

S
SUNAG 已提交
722
					// GUI
S
SUNAG 已提交
723

S
SUNAG 已提交
724
					addGui( 'saturation', sat.number, function( val ) {
S
SUNAG 已提交
725

S
SUNAG 已提交
726 727 728
						sat.number = val;

					}, false, 0, 2 );
S
SUNAG 已提交
729

S
SUNAG 已提交
730
					break;
S
SUNAG 已提交
731

S
SUNAG 已提交
732
				case 'top-bottom':
S
SUNAG 已提交
733

S
SUNAG 已提交
734
					// MATERIAL
S
SUNAG 已提交
735

S
SUNAG 已提交
736
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
737 738 739 740

					var top = new THREE.TextureNode( grass );
					var bottom = new THREE.TextureNode( brick );

S
SUNAG 已提交
741
					var normal = new THREE.NormalNode( THREE.NormalNode.WORLD );
S
SUNAG 已提交
742 743 744 745 746
					var normalY = new THREE.SwitchNode( normal, 'y' );

					var hard = new THREE.FloatNode( 9 );
					var offset = new THREE.FloatNode( - 2.5 );

S
SUNAG 已提交
747
					var hardClamp = new THREE.OperatorNode(
S
SUNAG 已提交
748 749
						normalY,
						hard,
S
SUNAG 已提交
750
						THREE.OperatorNode.MUL
S
SUNAG 已提交
751
					);
S
SUNAG 已提交
752

S
SUNAG 已提交
753
					var offsetClamp = new THREE.OperatorNode(
S
SUNAG 已提交
754 755
						hardClamp,
						offset,
S
SUNAG 已提交
756
						THREE.OperatorNode.ADD
S
SUNAG 已提交
757
					);
S
SUNAG 已提交
758

S
SUNAG 已提交
759
					var clamp0at1 = new THREE.Math1Node( offsetClamp, THREE.Math1Node.SAT );
S
SUNAG 已提交
760 761 762

					var blend = new THREE.Math3Node( top, bottom, clamp0at1, THREE.Math3Node.MIX );

S
SUNAG 已提交
763
					mtl.color = blend;
S
SUNAG 已提交
764

S
SUNAG 已提交
765
					// GUI
S
SUNAG 已提交
766

S
SUNAG 已提交
767
					addGui( 'hard', hard.number, function( val ) {
S
SUNAG 已提交
768

S
SUNAG 已提交
769 770 771
						hard.number = val;

					}, false, 0, 20 );
S
SUNAG 已提交
772

S
SUNAG 已提交
773
					addGui( 'offset', offset.number, function( val ) {
S
SUNAG 已提交
774

S
SUNAG 已提交
775 776
						offset.number = val;

S
SUNAG 已提交
777 778
					}, false, - 10, 10 );

S
SUNAG 已提交
779
					break;
S
SUNAG 已提交
780

S
SUNAG 已提交
781
				case 'displace':
S
SUNAG 已提交
782

S
SUNAG 已提交
783
					// MATERIAL
S
SUNAG 已提交
784

S
SUNAG 已提交
785
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
786

S
SUNAG 已提交
787
					var time = new THREE.TimerNode();
S
SUNAG 已提交
788 789 790 791 792
					var scale = new THREE.FloatNode( 2 );
					var speed = new THREE.FloatNode( .2 );
					var colorA = new THREE.ColorNode( 0xFFFFFF );
					var colorB = new THREE.ColorNode( 0x0054df );

S
SUNAG 已提交
793
					var uv = new THREE.UVNode();
S
SUNAG 已提交
794

S
SUNAG 已提交
795
					var timeScl = new THREE.OperatorNode(
S
SUNAG 已提交
796 797
						time,
						speed,
S
SUNAG 已提交
798
						THREE.OperatorNode.MUL
S
SUNAG 已提交
799
					);
S
SUNAG 已提交
800

S
SUNAG 已提交
801
					var displaceOffset = new THREE.OperatorNode(
S
SUNAG 已提交
802 803
						timeScl,
						uv,
S
SUNAG 已提交
804
						THREE.OperatorNode.ADD
S
SUNAG 已提交
805
					);
S
SUNAG 已提交
806 807 808 809

					var tex = new THREE.TextureNode( cloud, displaceOffset );
					var texArea = new THREE.SwitchNode( tex, 'w' );

S
SUNAG 已提交
810 811
					var displace = new THREE.OperatorNode(
						new THREE.NormalNode(),
S
SUNAG 已提交
812
						texArea,
S
SUNAG 已提交
813
						THREE.OperatorNode.MUL
S
SUNAG 已提交
814
					);
S
SUNAG 已提交
815

S
SUNAG 已提交
816
					var displaceScale = new THREE.OperatorNode(
S
SUNAG 已提交
817 818
						displace,
						scale,
S
SUNAG 已提交
819
						THREE.OperatorNode.MUL
S
SUNAG 已提交
820
					);
S
SUNAG 已提交
821

S
SUNAG 已提交
822 823
					var blend = new THREE.OperatorNode(
						new THREE.PositionNode(),
S
SUNAG 已提交
824
						displaceScale,
S
SUNAG 已提交
825
						THREE.OperatorNode.ADD
S
SUNAG 已提交
826
					);
S
SUNAG 已提交
827

S
SUNAG 已提交
828
					var color = new THREE.Math3Node(
S
SUNAG 已提交
829 830 831
						colorB,
						colorA,
						texArea,
S
SUNAG 已提交
832
						THREE.Math3Node.MIX
S
SUNAG 已提交
833
					);
S
SUNAG 已提交
834 835

					mtl.color = mtl.specular = new THREE.ColorNode( 0 );
S
SUNAG 已提交
836 837
					mtl.emissive = color;
					mtl.transform = blend;
S
SUNAG 已提交
838

S
SUNAG 已提交
839
					// GUI
S
SUNAG 已提交
840

S
SUNAG 已提交
841
					addGui( 'speed', speed.number, function( val ) {
S
SUNAG 已提交
842

S
SUNAG 已提交
843 844 845
						speed.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
846

S
SUNAG 已提交
847
					addGui( 'scale', scale.number, function( val ) {
S
SUNAG 已提交
848

S
SUNAG 已提交
849 850 851
						scale.number = val;

					}, false, 0, 10 );
S
SUNAG 已提交
852

S
SUNAG 已提交
853
					addGui( 'colorA', colorA.value.getHex(), function( val ) {
S
SUNAG 已提交
854

S
SUNAG 已提交
855
						colorA.value.setHex( val );
S
SUNAG 已提交
856

S
SUNAG 已提交
857
					}, true );
S
SUNAG 已提交
858

S
SUNAG 已提交
859
					addGui( 'colorB', colorB.value.getHex(), function( val ) {
S
SUNAG 已提交
860

S
SUNAG 已提交
861
						colorB.value.setHex( val );
S
SUNAG 已提交
862

S
SUNAG 已提交
863
					}, true );
S
SUNAG 已提交
864

S
SUNAG 已提交
865
					break;
S
SUNAG 已提交
866

S
SUNAG 已提交
867
				case 'smoke':
S
SUNAG 已提交
868

S
SUNAG 已提交
869
					// MATERIAL
S
SUNAG 已提交
870

S
SUNAG 已提交
871
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
872

S
SUNAG 已提交
873
					var time = new THREE.TimerNode();
S
SUNAG 已提交
874
					var uv = new THREE.UVNode();
S
SUNAG 已提交
875

S
SUNAG 已提交
876
					var timeSpeedA = new THREE.OperatorNode(
S
SUNAG 已提交
877
						time,
S
SUNAG 已提交
878
						new THREE.Vector2Node( 0.3, 0.1 ),
S
SUNAG 已提交
879
						THREE.OperatorNode.MUL
S
SUNAG 已提交
880
					);
S
SUNAG 已提交
881

S
SUNAG 已提交
882
					var timeSpeedB = new THREE.OperatorNode(
S
SUNAG 已提交
883
						time,
S
SUNAG 已提交
884
						new THREE.Vector2Node( 0.15, 0.4 ),
S
SUNAG 已提交
885
						THREE.OperatorNode.MUL
S
SUNAG 已提交
886
					);
S
SUNAG 已提交
887

S
SUNAG 已提交
888
					var uvOffsetA = new THREE.OperatorNode(
S
SUNAG 已提交
889 890
						timeSpeedA,
						uv,
S
SUNAG 已提交
891
						THREE.OperatorNode.ADD
S
SUNAG 已提交
892
					);
S
SUNAG 已提交
893

S
SUNAG 已提交
894
					var uvOffsetB = new THREE.OperatorNode(
S
SUNAG 已提交
895 896
						timeSpeedB,
						uv,
S
SUNAG 已提交
897
						THREE.OperatorNode.ADD
S
SUNAG 已提交
898
					);
S
SUNAG 已提交
899 900 901 902

					var cloudA = new THREE.TextureNode( cloud, uvOffsetA );
					var cloudB = new THREE.TextureNode( cloud, uvOffsetB );

S
SUNAG 已提交
903
					var clouds = new THREE.OperatorNode(
S
SUNAG 已提交
904 905
						cloudA,
						cloudB,
S
SUNAG 已提交
906
						THREE.OperatorNode.ADD
S
SUNAG 已提交
907
					);
S
SUNAG 已提交
908 909

					mtl.environment = new THREE.ColorNode( 0xFFFFFF );
S
SUNAG 已提交
910
					mtl.alpha = clouds;
S
SUNAG 已提交
911

S
SUNAG 已提交
912
					// GUI
S
SUNAG 已提交
913

S
SUNAG 已提交
914
					addGui( 'color', mtl.environment.value.getHex(), function( val ) {
S
SUNAG 已提交
915

S
SUNAG 已提交
916 917 918
						mtl.environment.value.setHex( val );

					}, true );
S
SUNAG 已提交
919

S
SUNAG 已提交
920
					break;
S
SUNAG 已提交
921

S
SUNAG 已提交
922
				case 'camera-depth':
S
SUNAG 已提交
923

S
SUNAG 已提交
924
					// MATERIAL
S
SUNAG 已提交
925 926 927 928

					var colorA = new THREE.ColorNode( 0xFFFFFF );
					var colorB = new THREE.ColorNode( 0x0054df );

S
SUNAG 已提交
929
					var depth = new THREE.CameraNode( THREE.CameraNode.DEPTH );
S
SUNAG 已提交
930 931
					depth.near.number = 1;
					depth.far.number = 200;
S
SUNAG 已提交
932

S
SUNAG 已提交
933
					var colors = new THREE.Math3Node(
S
SUNAG 已提交
934 935 936
						colorB,
						colorA,
						depth,
S
SUNAG 已提交
937
						THREE.Math3Node.MIX
S
SUNAG 已提交
938
					);
S
SUNAG 已提交
939

S
SUNAG 已提交
940
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
941
					mtl.color = colors;
S
SUNAG 已提交
942

S
SUNAG 已提交
943
					// GUI
S
SUNAG 已提交
944

S
SUNAG 已提交
945
					addGui( 'near', depth.near.number, function( val ) {
S
SUNAG 已提交
946

S
SUNAG 已提交
947 948 949
						depth.near.number = val;

					}, false, 1, 1200 );
S
SUNAG 已提交
950

S
SUNAG 已提交
951
					addGui( 'far', depth.far.number, function( val ) {
S
SUNAG 已提交
952

S
SUNAG 已提交
953 954 955
						depth.far.number = val;

					}, false, 1, 1200 );
S
SUNAG 已提交
956

S
SUNAG 已提交
957
					addGui( 'nearColor', colorA.value.getHex(), function( val ) {
S
SUNAG 已提交
958

S
SUNAG 已提交
959
						colorA.value.setHex( val );
S
SUNAG 已提交
960

S
SUNAG 已提交
961
					}, true );
S
SUNAG 已提交
962

S
SUNAG 已提交
963
					addGui( 'farColor', colorB.value.getHex(), function( val ) {
S
SUNAG 已提交
964

S
SUNAG 已提交
965
						colorB.value.setHex( val );
S
SUNAG 已提交
966

S
SUNAG 已提交
967
					}, true );
S
SUNAG 已提交
968

S
SUNAG 已提交
969
					break;
S
SUNAG 已提交
970

S
SUNAG 已提交
971
				case 'caustic':
S
SUNAG 已提交
972

S
SUNAG 已提交
973
					// MATERIAL
S
SUNAG 已提交
974

S
SUNAG 已提交
975
					mtl = new THREE.StandardNodeMaterial();
S
SUNAG 已提交
976 977

					var hash2 = new THREE.FunctionNode( [
S
SUNAG 已提交
978 979 980
					"vec2 hash2(vec2 p) {",
						"return fract(sin(vec2(dot(p, vec2(123.4, 748.6)), dot(p, vec2(547.3, 659.3))))*5232.85324);",
					"}"
S
SUNAG 已提交
981 982 983
					].join( "\n" ) );

					var voronoi = new THREE.FunctionNode( [
S
SUNAG 已提交
984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004
					// Based off of iq's described here: http://www.iquilezles.org/www/articles/voronoili
					"float voronoi(vec2 p, in float time) {",
						"vec2 n = floor(p);",
						"vec2 f = fract(p);",
						"float md = 5.0;",
						"vec2 m = vec2(0.0);",
						"for (int i = -1; i <= 1; i++) {",
							"for (int j = -1; j <= 1; j++) {",
								"vec2 g = vec2(i, j);",
								"vec2 o = hash2(n + g);",
								"o = 0.5 + 0.5 * sin(time + 5.038 * o);",
								"vec2 r = g + o - f;",
								"float d = dot(r, r);",
								"if (d < md) {",
									"md = d;",
									"m = n+g+o;",
								"}",
							"}",
						"}",
						"return md;",
					"}"
S
SUNAG 已提交
1005 1006 1007
					].join( "\n" ), [ hash2 ] ); // define hash2 as dependencies

					var voronoiLayers = new THREE.FunctionNode( [
S
SUNAG 已提交
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
					// based on https://www.shadertoy.com/view/4tXSDf
					"float voronoiLayers(vec2 p, in float time) {",
						"float v = 0.0;",
						"float a = 0.4;",
						"for (int i = 0; i < 3; i++) {",
							"v += voronoi(p, time) * a;",
							"p *= 2.0;",
							"a *= 0.5;",
						"}",
						"return v;",
					"}"
S
SUNAG 已提交
1019
					].join( "\n" ), [ voronoi ] ); // define voronoi as dependencies
S
SUNAG 已提交
1020

S
SUNAG 已提交
1021
					var time = new THREE.TimerNode();
S
SUNAG 已提交
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
					var timeScale = new THREE.FloatNode( 2 );

					var alpha = new THREE.FloatNode( 1 );
					var scale = new THREE.FloatNode( .1 );
					var intensity = new THREE.FloatNode( 1.5 );

					var color = new THREE.ColorNode( 0xFFFFFF );
					var colorA = new THREE.ColorNode( 0xFFFFFF );
					var colorB = new THREE.ColorNode( 0x0054df );

S
SUNAG 已提交
1032
					var worldPos = new THREE.PositionNode( THREE.PositionNode.WORLD );
S
SUNAG 已提交
1033 1034
					var worldPosTop = new THREE.SwitchNode( worldPos, 'xz' );

S
SUNAG 已提交
1035
					var worldNormal = new THREE.NormalNode( THREE.NormalNode.WORLD );
S
SUNAG 已提交
1036

S
SUNAG 已提交
1037
					var mask = new THREE.SwitchNode( worldNormal, 'y' );
S
SUNAG 已提交
1038

S
SUNAG 已提交
1039
					// clamp0at1
S
SUNAG 已提交
1040
					mask = new THREE.Math1Node( mask, THREE.Math1Node.SAT );
S
SUNAG 已提交
1041

S
SUNAG 已提交
1042
					var timeOffset = new THREE.OperatorNode(
S
SUNAG 已提交
1043 1044
						time,
						timeScale,
S
SUNAG 已提交
1045
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1046 1047
					);

S
SUNAG 已提交
1048
					var uvPos = new THREE.OperatorNode(
S
SUNAG 已提交
1049 1050
						worldPosTop,
						scale,
S
SUNAG 已提交
1051
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1052 1053 1054
					);

					var voronoi = new THREE.FunctionCallNode( voronoiLayers );
S
SUNAG 已提交
1055 1056
					voronoi.inputs.p = uvPos;
					voronoi.inputs.time = timeOffset;
S
SUNAG 已提交
1057

S
SUNAG 已提交
1058
					var maskCaustic = new THREE.OperatorNode(
S
SUNAG 已提交
1059 1060
						alpha,
						mask,
S
SUNAG 已提交
1061
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1062 1063
					);

S
SUNAG 已提交
1064
					var voronoiIntensity = new THREE.OperatorNode(
S
SUNAG 已提交
1065 1066
						voronoi,
						intensity,
S
SUNAG 已提交
1067
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1068 1069
					);

S
SUNAG 已提交
1070
					var voronoiColors = new THREE.Math3Node(
S
SUNAG 已提交
1071 1072
						colorB,
						colorA,
S
SUNAG 已提交
1073 1074
						new THREE.Math1Node( voronoiIntensity, THREE.Math1Node.SAT ), // mix needs clamp
						THREE.Math3Node.MIX
S
SUNAG 已提交
1075
					);
S
SUNAG 已提交
1076

S
SUNAG 已提交
1077
					var caustic = new THREE.Math3Node(
S
SUNAG 已提交
1078 1079 1080
						color,
						voronoiColors,
						maskCaustic,
S
SUNAG 已提交
1081
						THREE.Math3Node.MIX
S
SUNAG 已提交
1082
					);
S
SUNAG 已提交
1083

S
SUNAG 已提交
1084
					var causticLights = new THREE.OperatorNode(
S
SUNAG 已提交
1085 1086
						voronoiIntensity,
						maskCaustic,
S
SUNAG 已提交
1087
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1088
					);
S
SUNAG 已提交
1089

S
SUNAG 已提交
1090 1091
					mtl.color = caustic;
					mtl.ambient = causticLights;
S
SUNAG 已提交
1092

S
SUNAG 已提交
1093
					// GUI
S
SUNAG 已提交
1094

S
SUNAG 已提交
1095
					addGui( 'timeScale', timeScale.number, function( val ) {
S
SUNAG 已提交
1096

S
SUNAG 已提交
1097 1098 1099
						timeScale.number = val;

					}, false, 0, 5 );
S
SUNAG 已提交
1100

S
SUNAG 已提交
1101
					addGui( 'intensity', intensity.number, function( val ) {
S
SUNAG 已提交
1102

S
SUNAG 已提交
1103 1104 1105
						intensity.number = val;

					}, false, 0, 3 );
S
SUNAG 已提交
1106

S
SUNAG 已提交
1107
					addGui( 'scale', scale.number, function( val ) {
S
SUNAG 已提交
1108

S
SUNAG 已提交
1109 1110 1111
						scale.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
1112

S
SUNAG 已提交
1113
					addGui( 'alpha', alpha.number, function( val ) {
S
SUNAG 已提交
1114

S
SUNAG 已提交
1115 1116 1117
						alpha.number = val;

					}, false, 0, 1 );
S
SUNAG 已提交
1118

S
SUNAG 已提交
1119
					addGui( 'color', color.value.getHex(), function( val ) {
S
SUNAG 已提交
1120

S
SUNAG 已提交
1121
						color.value.setHex( val );
S
SUNAG 已提交
1122

S
SUNAG 已提交
1123
					}, true );
S
SUNAG 已提交
1124

S
SUNAG 已提交
1125
					addGui( 'colorA', colorA.value.getHex(), function( val ) {
S
SUNAG 已提交
1126

S
SUNAG 已提交
1127
						colorA.value.setHex( val );
S
SUNAG 已提交
1128

S
SUNAG 已提交
1129
					}, true );
S
SUNAG 已提交
1130

S
SUNAG 已提交
1131
					addGui( 'colorB', colorB.value.getHex(), function( val ) {
S
SUNAG 已提交
1132

S
SUNAG 已提交
1133
						colorB.value.setHex( val );
S
SUNAG 已提交
1134

S
SUNAG 已提交
1135
					}, true );
S
SUNAG 已提交
1136

S
SUNAG 已提交
1137
					break;
S
SUNAG 已提交
1138

S
SUNAG 已提交
1139
				case 'soft-body':
S
SUNAG 已提交
1140

S
SUNAG 已提交
1141
					// MATERIAL
S
SUNAG 已提交
1142

S
SUNAG 已提交
1143
					move = true;
S
SUNAG 已提交
1144

S
SUNAG 已提交
1145
					mtl = new THREE.StandardNodeMaterial();
S
SUNAG 已提交
1146 1147 1148 1149 1150

					var scale = new THREE.FloatNode( 2 );
					var colorA = new THREE.ColorNode( 0xFF6633 );
					var colorB = new THREE.ColorNode( 0x3366FF );

S
SUNAG 已提交
1151
					var pos = new THREE.PositionNode();
S
SUNAG 已提交
1152 1153 1154 1155
					var posNorm = new THREE.Math1Node( pos, THREE.Math1Node.NORMALIZE );

					var mask = new THREE.SwitchNode( posNorm, 'y' );

S
SUNAG 已提交
1156
					var velocity = new THREE.VelocityNode( mesh, {
S
SUNAG 已提交
1157 1158 1159
						type: 'elastic',
						spring: .8,
						friction: .9
S
SUNAG 已提交
1160
					} );
S
SUNAG 已提交
1161

S
SUNAG 已提交
1162
					var velocityArea = new THREE.OperatorNode(
S
SUNAG 已提交
1163 1164
						mask,
						scale,
S
SUNAG 已提交
1165
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1166
					);
S
SUNAG 已提交
1167

S
SUNAG 已提交
1168
					var softVelocity = new THREE.OperatorNode(
S
SUNAG 已提交
1169 1170
						velocity,
						velocityArea,
S
SUNAG 已提交
1171
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1172
					);
S
SUNAG 已提交
1173

S
SUNAG 已提交
1174 1175
					var softPosition = new THREE.OperatorNode(
						new THREE.PositionNode(),
S
SUNAG 已提交
1176
						softVelocity,
S
SUNAG 已提交
1177
						THREE.OperatorNode.ADD
S
SUNAG 已提交
1178
					);
S
SUNAG 已提交
1179

S
SUNAG 已提交
1180
					var colors = new THREE.Math3Node(
S
SUNAG 已提交
1181 1182 1183
						colorB,
						colorA,
						mask,
S
SUNAG 已提交
1184
						THREE.Math3Node.MIX
S
SUNAG 已提交
1185
					);
S
SUNAG 已提交
1186

S
SUNAG 已提交
1187 1188
					mtl.color = colors;
					mtl.transform = softPosition;
S
SUNAG 已提交
1189

S
SUNAG 已提交
1190
					// GUI
S
SUNAG 已提交
1191

S
SUNAG 已提交
1192
					addGui( 'spring', velocity.params.spring, function( val ) {
S
SUNAG 已提交
1193

S
SUNAG 已提交
1194 1195 1196
						velocity.params.spring = val;

					}, false, 0, .9 );
S
SUNAG 已提交
1197

S
SUNAG 已提交
1198
					addGui( 'friction', velocity.params.friction, function( val ) {
S
SUNAG 已提交
1199

S
SUNAG 已提交
1200 1201 1202
						velocity.params.friction = val;

					}, false, 0, .9 );
S
SUNAG 已提交
1203

S
SUNAG 已提交
1204
					addGui( 'scale', scale.number, function( val ) {
S
SUNAG 已提交
1205

S
SUNAG 已提交
1206 1207 1208
						scale.number = val;

					}, false, 0, 3 );
S
SUNAG 已提交
1209

S
SUNAG 已提交
1210
					addGui( 'softBody', colorA.value.getHex(), function( val ) {
S
SUNAG 已提交
1211

S
SUNAG 已提交
1212
						colorA.value.setHex( val );
S
SUNAG 已提交
1213

S
SUNAG 已提交
1214
					}, true );
S
SUNAG 已提交
1215

S
SUNAG 已提交
1216
					addGui( 'hardBody', colorB.value.getHex(), function( val ) {
S
SUNAG 已提交
1217

S
SUNAG 已提交
1218
						colorB.value.setHex( val );
S
SUNAG 已提交
1219

S
SUNAG 已提交
1220
					}, true );
S
SUNAG 已提交
1221

S
SUNAG 已提交
1222
					break;
S
SUNAG 已提交
1223

S
SUNAG 已提交
1224
				case 'firefly':
S
SUNAG 已提交
1225

S
SUNAG 已提交
1226
					// MATERIAL
S
SUNAG 已提交
1227

S
SUNAG 已提交
1228
					mtl = new THREE.PhongNodeMaterial();
S
SUNAG 已提交
1229

S
SUNAG 已提交
1230
					var time = new THREE.TimerNode();
S
SUNAG 已提交
1231 1232 1233 1234
					var speed = new THREE.FloatNode( .5 );

					var color = new THREE.ColorNode( 0x98ff00 );

S
SUNAG 已提交
1235
					var timeSpeed = new THREE.OperatorNode(
S
SUNAG 已提交
1236 1237
						time,
						speed,
S
SUNAG 已提交
1238
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1239
					);
S
SUNAG 已提交
1240

S
SUNAG 已提交
1241
					var sinCycleInSecs = new THREE.OperatorNode(
S
SUNAG 已提交
1242
						timeSpeed,
S
SUNAG 已提交
1243 1244
						new THREE.ConstNode( THREE.ConstNode.PI2 ),
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1245
					);
S
SUNAG 已提交
1246 1247 1248

					var cycle = new THREE.Math1Node( sinCycleInSecs, THREE.Math1Node.SIN );

S
SUNAG 已提交
1249
					var cycleColor = new THREE.OperatorNode(
S
SUNAG 已提交
1250 1251
						cycle,
						color,
S
SUNAG 已提交
1252
						THREE.OperatorNode.MUL
S
SUNAG 已提交
1253
					);
S
SUNAG 已提交
1254 1255 1256 1257

					var cos = new THREE.Math1Node( cycleColor, THREE.Math1Node.SIN );

					mtl.color = new THREE.ColorNode( 0 );
S
SUNAG 已提交
1258
					mtl.emissive = cos;
S
SUNAG 已提交
1259

S
SUNAG 已提交
1260
					// GUI
S
SUNAG 已提交
1261

S
SUNAG 已提交
1262
					addGui( 'speed', speed.number, function( val ) {
S
SUNAG 已提交
1263

S
SUNAG 已提交
1264 1265 1266
						speed.number = val;

					}, false, 0, 3 );
S
SUNAG 已提交
1267

S
SUNAG 已提交
1268 1269
					break;
			}
S
SUNAG 已提交
1270

S
SUNAG 已提交
1271 1272
			// build shader
			mtl.build();
S
SUNAG 已提交
1273

S
SUNAG 已提交
1274 1275
			// set material
			mesh.material = mtl;
S
SUNAG 已提交
1276

S
SUNAG 已提交
1277
		}
S
SUNAG 已提交
1278

S
SUNAG 已提交
1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290
		function onWindowResize() {

			camera.aspect = window.innerWidth / window.innerHeight;
			camera.updateProjectionMatrix();

			renderer.setSize( window.innerWidth, window.innerHeight );

		}

		function animate() {

			var delta = clock.getDelta();
S
SUNAG 已提交
1291 1292 1293

			if ( move ) {

S
SUNAG 已提交
1294
				var time = Date.now() * 0.005;
S
SUNAG 已提交
1295

S
SUNAG 已提交
1296 1297
				mesh.position.z = Math.cos( time ) * 10;
				mesh.position.y = Math.sin( time ) * 10;
S
SUNAG 已提交
1298

S
SUNAG 已提交
1299 1300
			}
			else {
S
SUNAG 已提交
1301

S
SUNAG 已提交
1302
				mesh.position.z = mesh.position.y = 0;
S
SUNAG 已提交
1303

S
SUNAG 已提交
1304
			}
S
SUNAG 已提交
1305

S
SUNAG 已提交
1306
			//mesh.rotation.z += .01;
S
SUNAG 已提交
1307

S
SUNAG 已提交
1308 1309
			// update material animation and/or gpu calcs (pre-renderer)
			mesh.material.updateAnimation( delta );
S
SUNAG 已提交
1310

S
SUNAG 已提交
1311
			renderer.render( scene, camera );
S
SUNAG 已提交
1312

S
SUNAG 已提交
1313 1314 1315 1316 1317 1318 1319 1320
			requestAnimationFrame( animate );

		}

		</script>

	</body>
</html>