From 51404a5b0d6bafb77fa4eb4f7d25ceedfc9aab1d Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Thu, 16 Apr 2015 14:32:16 -0400 Subject: [PATCH 01/10] Add lights property to shader material --- support/client/lib/vwf/model/threejs.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index 2c16019b8..4ef8e5fa6 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -1655,6 +1655,10 @@ define( [ "module", eval( this.updateFunction ); } } + if ( propertyName === "lights" ) { + value = propertyValue; + threeObject.lights = value; + } } } if ( node.isUniformObject ) { From eb1902fa0658c1053e23a4dbb34264d1ea809aab Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Tue, 21 Apr 2015 15:04:21 -0400 Subject: [PATCH 02/10] Allow properties to be stored on material for use in updateFunction --- support/client/lib/vwf/model/threejs.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index 4ef8e5fa6..a8a37922b 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -1608,7 +1608,7 @@ define( [ "module", } } } - if ( threeObject instanceof THREE.Material ) { + if ( threeObject instanceof THREE.Material && !( threeObject instanceof THREE.ShaderMaterial ) ) { value = setMaterialProperty( threeObject, propertyName, propertyValue ); @@ -1639,25 +1639,23 @@ define( [ "module", if ( propertyName === "uniforms" ) { value = propertyValue; threeObject.uniforms = value; - } - if ( propertyName === "vertexShader" ) { + } else if ( propertyName === "vertexShader" ) { value = propertyValue; threeObject.vertexShader = value; - } - if ( propertyName === "fragmentShader" ) { + } else if ( propertyName === "fragmentShader" ) { value = propertyValue; threeObject.fragmentShader = value; - } - if ( propertyName === "updateFunction" ) { + } else if ( propertyName === "updateFunction" ) { value = propertyValue; threeObject.updateFunction = value; threeObject.update = function() { eval( this.updateFunction ); } - } - if ( propertyName === "lights" ) { + } else if ( propertyName === "lights" ) { value = propertyValue; threeObject.lights = value; + } else if ( !threeObject.hasOwnProperty( propertyName ) ) { + threeObject[ propertyName ] = propertyValue; } } } From 5bf2e9a33ca14da26655c5a6d7936818ae92bc56 Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Wed, 22 Apr 2015 15:34:13 -0400 Subject: [PATCH 03/10] Store custom properties on material object --- support/client/lib/vwf/model/threejs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index a8a37922b..f24268992 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -1654,7 +1654,7 @@ define( [ "module", } else if ( propertyName === "lights" ) { value = propertyValue; threeObject.lights = value; - } else if ( !threeObject.hasOwnProperty( propertyName ) ) { + } else { threeObject[ propertyName ] = propertyValue; } } From 4e4d4bd53fa5167c9087f7e2dd3da2944d99d314 Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Thu, 23 Apr 2015 20:02:36 -0400 Subject: [PATCH 04/10] Fix uniform generation with shader material components --- support/client/lib/vwf/model/threejs.js | 49 +++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index f24268992..054c4e354 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -1635,9 +1635,20 @@ define( [ "module", if ( threeObject instanceof THREE.ShaderMaterial ) { if ( utility.validObject( propertyValue ) ) { - if ( propertyName === "uniforms" ) { - value = propertyValue; + // Copy uniforms to prevent uniforms being shared across shaders + var names = Object.keys( propertyValue ); + var uniforms = {}; + for ( var i = 0; i < names.length; i++ ) { + var type, value; + type = propertyValue[ names[ i ] ].type; + value = propertyValue[ names[ i ] ].value; + uniforms[ names[ i ] ] = { + "type": type, + "value": getUniformValueByType( type, value ) + } + } + value = uniforms; threeObject.uniforms = value; } else if ( propertyName === "vertexShader" ) { value = propertyValue; @@ -1654,7 +1665,10 @@ define( [ "module", } else if ( propertyName === "lights" ) { value = propertyValue; threeObject.lights = value; - } else { + } else if ( threeObject.uniforms.hasOwnProperty( propertyName ) ) { + var type = threeObject.uniforms[ propertyName ].type; + setUniformProperty( threeObject.uniforms, propertyName, type, propertyValue ); + } else if ( propertyName.indexOf("_") === 0 ) { threeObject[ propertyName ] = propertyValue; } } @@ -5552,6 +5566,35 @@ define( [ "module", } } + function getUniformValueByType( type, value ) { + var result = value; + switch ( type ) { + case 'i': + result = Number( value ); + break + case 'f': + result = parseFloat( value ); + break; + case 'c': + result = new THREE.Color( value ); + break; + case 'v2': + result = new THREE.Vector2( value[0], value[1] ); + break; + case 'v3': + result = new THREE.Vector3( value[0], value[1], value[2] ); + break; + case 'v4': + result = new THREE.Vector4( value[0], value[1], value[2], value[3] ); + break; + case 't': + if ( value ) { + result = loadTexture( undefined, value ); + } + break; + } + return result; + } function decompress(dataencoded) { blobsfound = 0; From efebe0892a056aed59454a7aec8c1fffa2097f72 Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Mon, 27 Apr 2015 14:01:52 -0400 Subject: [PATCH 05/10] Texture arrays and texture wrapping to shader materials --- support/client/lib/vwf/model/threejs.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index 054c4e354..fece1aa69 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -5563,6 +5563,13 @@ define( [ "module", obj[ prop ].src = value; obj[ prop ].value = loadTexture( undefined, value ); break; + case 'tv': + var textureArray = []; + for ( var i = 0; i < value.length; i++ ) { + textureArray.push( loadTexture( undefined, value[ i ] ) ); + } + obj[ prop ].value = textureArray; + break; } } @@ -5592,6 +5599,12 @@ define( [ "module", result = loadTexture( undefined, value ); } break; + case 'tv': + result = []; + for ( var i = 0; i < value.length; i++ ) { + result.push( loadTexture( undefined, value[ i ] ) ); + } + break; } return result; } @@ -5611,6 +5624,7 @@ define( [ "module", var txt = undefined; var url = undefined; var mapping = undefined; + var wrapTexture = false; var onLoad = function( texture ) { if ( mat ) { mat.map = texture; @@ -5629,6 +5643,7 @@ define( [ "module", } else { url = def.url; mapping = def.mapping; + wrapTexture = Boolean( def.wrapTexture ); } if ( mat === undefined ) { @@ -5641,6 +5656,10 @@ define( [ "module", txt = THREE.ImageUtils.loadTexture( url, mapping, onLoad, onError ); } + if ( wrapTexture ) { + txt.wrapS = txt.wrapT = THREE.RepeatWrapping; + } + return txt; } From ddbdda4731a7a701395cab31258ab19c233a76e7 Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Fri, 15 May 2015 18:43:42 -0400 Subject: [PATCH 06/10] Added ability to set defines in shaders --- support/client/lib/vwf/model/threejs.js | 41 ++++++++++++++++++- .../vwf.example.com/shaderMaterial.vwf.yaml | 15 ++++++- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index fece1aa69..2cc2a5fb9 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -677,7 +677,7 @@ define( [ "module", objectDef[ prop ] = propertyValue[ prop ]; break; } - } + } } node.threeObject = createMaterial( objectDef ); @@ -1650,6 +1650,13 @@ define( [ "module", } value = uniforms; threeObject.uniforms = value; + } else if ( propertyName === "defines" ) { + var names = Object.keys( propertyValue ); + var defines = {}; + for ( var i = 0; i < names.length; i++ ) { + defines[ names[ i ] ] = propertyValue[ names[ i ] ]; + } + threeObject.defines = defines; } else if ( propertyName === "vertexShader" ) { value = propertyValue; threeObject.vertexShader = value; @@ -1668,8 +1675,14 @@ define( [ "module", } else if ( threeObject.uniforms.hasOwnProperty( propertyName ) ) { var type = threeObject.uniforms[ propertyName ].type; setUniformProperty( threeObject.uniforms, propertyName, type, propertyValue ); + // ----------- + // TODO: Defines are constants within the shader, do they need to be set in this way? + // } else if ( threeObject.defines.hasOwnProperty( propertyName ) ) { + // value = propertyValue; + // threeObject.defines[ propertyName ] = value; } else if ( propertyName.indexOf("_") === 0 ) { - threeObject[ propertyName ] = propertyValue; + value = propertyValue; + threeObject[ propertyName ] = value; } } } @@ -2258,6 +2271,13 @@ define( [ "module", } return value; } + if ( propertyName === "defines" ) { + value = {}; + for ( var def in threeObject.defines ) { + value[ def ] = threeObject.defines[ def ]; + } + return value; + } if ( propertyName === "vertexShader" ) { value = threeObject.vertexShader; return value; @@ -5570,6 +5590,15 @@ define( [ "module", } obj[ prop ].value = textureArray; break; + case 'v2v': + var vectorArray = []; + var vector; + for ( var i = 0; i < value.length; i++ ) { + vector = value[ i ]; + vectorArray.push( new THREE.Vector2( vector[0], vector[1] ) ); + } + obj[ prop ].value = vectorArray; + break; } } @@ -5605,6 +5634,14 @@ define( [ "module", result.push( loadTexture( undefined, value[ i ] ) ); } break; + case 'v2v': + result = []; + var vector; + for ( var i = 0; i < value.length; i++ ) { + vector = value[ i ]; + result.push( new THREE.Vector2( vector[0], vector[1] ) ); + } + break; } return result; } diff --git a/support/proxy/vwf.example.com/shaderMaterial.vwf.yaml b/support/proxy/vwf.example.com/shaderMaterial.vwf.yaml index 9fbe2914f..5924817b4 100644 --- a/support/proxy/vwf.example.com/shaderMaterial.vwf.yaml +++ b/support/proxy/vwf.example.com/shaderMaterial.vwf.yaml @@ -6,6 +6,11 @@ properties: ## @name shaderMaterial.vwf#uniforms ## @property uniforms: + ## defines + ## + ## @name shaderMaterial.vwf#defines + ## @property + defines: ## Vertex Shader ## ## @name shaderMaterial.vwf#vertexShader @@ -21,4 +26,12 @@ properties: ## @name shaderMaterial.vwf#updateFunction ## @property updateFunction: - \ No newline at end of file +methods: + setDefine: + parameters: + - name + - value + body: | + var defines = this.defines; + defines[ name ] = value; + this.defines = defines; From 998adea9fb69092b3d09c94d785785c3d9934be0 Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Sun, 17 May 2015 13:49:07 -0400 Subject: [PATCH 07/10] Update shader material when defines are modified --- support/client/lib/vwf/model/threejs.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index 2cc2a5fb9..abe3ad6c8 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -1657,6 +1657,7 @@ define( [ "module", defines[ names[ i ] ] = propertyValue[ names[ i ] ]; } threeObject.defines = defines; + threeObject.needsUpdate = true; } else if ( propertyName === "vertexShader" ) { value = propertyValue; threeObject.vertexShader = value; @@ -5599,6 +5600,13 @@ define( [ "module", } obj[ prop ].value = vectorArray; break; + case 'iv1': + var intArray = []; + for ( var i = 0; i < value.length; i++ ) { + intArray.push( Number( value[ i ] ) ); + } + obj[ prop ].value = intArray; + break; } } From 8dce1f3c81d3c441da66a7d138035f6f78ddc124 Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Fri, 5 Jun 2015 13:18:19 -0400 Subject: [PATCH 08/10] Add ability to use a 2d canvas as a texture in shader materials --- support/client/lib/vwf/model/threejs.js | 48 +++++++++++++++++-- .../vwf.example.com/shaderMaterial.vwf.yaml | 3 ++ 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index abe3ad6c8..61c5606ba 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -2631,6 +2631,16 @@ define( [ "module", callingMethod: function( nodeID, methodName, parameters /* [, parameter1, parameter2, ... ] */ ) { // TODO: parameters + var node = this.state.nodes[ nodeID ]; + if ( !node ) { + node = this.state.scenes[ nodeID ]; + } + + var threeObject; + if ( node ) { + threeObject = node.threeObject || node.threeScene; + } + if ( methodName === "raycast" ) { var origin, direction, near, far, recursive, objectIDs; @@ -2740,6 +2750,20 @@ define( [ "module", } + if ( threeObject instanceof THREE.ShaderMaterial ) { + if ( methodName === "updateTexture" ) { + var textureName = parameters[ 0 ]; + var texture = threeObject.uniforms[ textureName ]; + if ( texture ) { + texture.value.needsUpdate = true; + threeObject.needsUpdate = true; + } else { + this.logger.warnx( nodeID + ".updateTexture", "Texture \"" + + textureName + "\" not found!" ); + } + } + } + return undefined; }, @@ -5684,14 +5708,21 @@ define( [ "module", //console.log( [ "loadTexture: ", JSON.stringify( def ) ] ); if ( utility.isString( def ) ) { - url = def; + url = def; } else { - url = def.url; + if ( def.canvasID ) { + var canvas = document.getElementById( def.canvasID ); + url = canvas; + } else { + url = def.url; + } mapping = def.mapping; wrapTexture = Boolean( def.wrapTexture ); } - if ( mat === undefined ) { + if ( url instanceof HTMLElement && url.nodeName === "CANVAS" ) { + txt = new THREE.Texture( url ); + } else if ( mat === undefined ) { if ( mapping === undefined ) { txt = THREE.ImageUtils.loadTexture( url ); } else { @@ -5701,6 +5732,13 @@ define( [ "module", txt = THREE.ImageUtils.loadTexture( url, mapping, onLoad, onError ); } + if ( def instanceof Object ) { + var keys = Object.keys( def ); + for ( var i = 0; i < keys.length; i++ ) { + setTextureProperty( txt, keys[ i ], def[ keys[ i ] ], true ); + } + } + if ( wrapTexture ) { txt.wrapS = txt.wrapT = THREE.RepeatWrapping; } @@ -5934,7 +5972,7 @@ define( [ "module", return value; } - function setTextureProperty( texture, propertyName, propertyValue ) { + function setTextureProperty( texture, propertyName, propertyValue, suppressUpdate ) { var value = propertyValue; if ( texture === undefined ) { @@ -6116,7 +6154,7 @@ define( [ "module", } - if ( value !== undefined ) { + if ( value !== undefined && !suppressUpdate ) { texture.needsUpdate = true; } diff --git a/support/proxy/vwf.example.com/shaderMaterial.vwf.yaml b/support/proxy/vwf.example.com/shaderMaterial.vwf.yaml index 5924817b4..2d9c2e2e6 100644 --- a/support/proxy/vwf.example.com/shaderMaterial.vwf.yaml +++ b/support/proxy/vwf.example.com/shaderMaterial.vwf.yaml @@ -35,3 +35,6 @@ methods: var defines = this.defines; defines[ name ] = value; this.defines = defines; + updateTexture: + parameters: + - textureName \ No newline at end of file From abaa7830fdb451f7b409fed633daa2645bac5de8 Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Fri, 31 Jul 2015 18:20:20 -0400 Subject: [PATCH 09/10] Add fog define toggle for shader materials --- support/client/lib/vwf/model/threejs.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index 61c5606ba..f61658cdc 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -1673,6 +1673,9 @@ define( [ "module", } else if ( propertyName === "lights" ) { value = propertyValue; threeObject.lights = value; + } else if ( propertyName === "fog" ) { + value = propertyValue; + threeObject.fog = value; } else if ( threeObject.uniforms.hasOwnProperty( propertyName ) ) { var type = threeObject.uniforms[ propertyName ].type; setUniformProperty( threeObject.uniforms, propertyName, type, propertyValue ); From 6186cfbe7482904f3f8c348635649549eff69bb5 Mon Sep 17 00:00:00 2001 From: Brett Swift Date: Wed, 14 Oct 2015 13:46:02 -0400 Subject: [PATCH 10/10] Reset internal array when uniform length changes --- support/client/lib/vwf/model/threejs.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/support/client/lib/vwf/model/threejs.js b/support/client/lib/vwf/model/threejs.js index f61658cdc..652fd94cf 100644 --- a/support/client/lib/vwf/model/threejs.js +++ b/support/client/lib/vwf/model/threejs.js @@ -5626,6 +5626,9 @@ define( [ "module", vectorArray.push( new THREE.Vector2( vector[0], vector[1] ) ); } obj[ prop ].value = vectorArray; + if ( obj[ prop ]._array && obj[ prop ]._array.length !== vectorArray.length * 2 ) { + obj[ prop ]._array = undefined; + } break; case 'iv1': var intArray = [];