|
@@ -9,12 +9,13 @@ function NormalNode( scope ) {
|
|
|
|
|
|
TempNode.call( this, 'v3' );
|
|
|
|
|
|
- this.scope = scope || NormalNode.LOCAL;
|
|
|
+ this.scope = scope || NormalNode.VIEW;
|
|
|
|
|
|
}
|
|
|
|
|
|
NormalNode.LOCAL = 'local';
|
|
|
NormalNode.WORLD = 'world';
|
|
|
+NormalNode.VIEW = 'view';
|
|
|
|
|
|
NormalNode.prototype = Object.create( TempNode.prototype );
|
|
|
NormalNode.prototype.constructor = NormalNode;
|
|
@@ -34,22 +35,40 @@ NormalNode.prototype.generate = function ( builder, output ) {
|
|
|
|
|
|
switch ( this.scope ) {
|
|
|
|
|
|
- case NormalNode.LOCAL:
|
|
|
+ case NormalNode.VIEW:
|
|
|
|
|
|
- if ( builder.isShader( 'vertex' ) ) result = 'objectNormal';
|
|
|
+ if ( builder.isShader( 'vertex' ) ) result = 'transformedNormal';
|
|
|
else result = 'geometryNormal';
|
|
|
|
|
|
break;
|
|
|
|
|
|
+ case NormalNode.LOCAL:
|
|
|
+
|
|
|
+ if ( builder.isShader( 'vertex' ) ) {
|
|
|
+
|
|
|
+ result = 'objectNormal';
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ builder.requires.normal = true;
|
|
|
+
|
|
|
+ result = 'vObjectNormal';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
case NormalNode.WORLD:
|
|
|
|
|
|
if ( builder.isShader( 'vertex' ) ) {
|
|
|
|
|
|
- result = '( modelMatrix * vec4( objectNormal, 0.0 ) ).xyz';
|
|
|
+ result = 'inverseTransformDirection( transformedNormal, viewMatrix ).xyz';
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- result = 'inverseTransformDirection( normal, viewMatrix )';
|
|
|
+ builder.requires.worldNormal = true;
|
|
|
+
|
|
|
+ result = 'vWNormal';
|
|
|
|
|
|
}
|
|
|
|
|
@@ -89,7 +108,13 @@ NormalNode.prototype.toJSON = function ( meta ) {
|
|
|
|
|
|
NodeLib.addKeyword( 'viewNormal', function () {
|
|
|
|
|
|
- return new NormalNode();
|
|
|
+ return new NormalNode( NormalNode.VIEW );
|
|
|
+
|
|
|
+} );
|
|
|
+
|
|
|
+NodeLib.addKeyword( 'localNormal', function () {
|
|
|
+
|
|
|
+ return new NormalNode( NormalNode.NORMAL );
|
|
|
|
|
|
} );
|
|
|
|