Spaces:
Running
Running
/** | |
* @author sunag / http://www.sunag.com.br/ | |
*/ | |
import { TempNode } from '../core/TempNode.js'; | |
import { NodeLib } from '../core/NodeLib.js'; | |
function PositionNode( scope ) { | |
TempNode.call( this, 'v3' ); | |
this.scope = scope || PositionNode.LOCAL; | |
} | |
PositionNode.LOCAL = 'local'; | |
PositionNode.WORLD = 'world'; | |
PositionNode.VIEW = 'view'; | |
PositionNode.PROJECTION = 'projection'; | |
PositionNode.prototype = Object.create( TempNode.prototype ); | |
PositionNode.prototype.constructor = PositionNode; | |
PositionNode.prototype.nodeType = "Position"; | |
PositionNode.prototype.getType = function ( ) { | |
switch ( this.scope ) { | |
case PositionNode.PROJECTION: | |
return 'v4'; | |
} | |
return this.type; | |
}; | |
PositionNode.prototype.getShared = function ( builder ) { | |
switch ( this.scope ) { | |
case PositionNode.LOCAL: | |
case PositionNode.WORLD: | |
return false; | |
} | |
return true; | |
}; | |
PositionNode.prototype.generate = function ( builder, output ) { | |
var result; | |
switch ( this.scope ) { | |
case PositionNode.LOCAL: | |
builder.requires.position = true; | |
result = builder.isShader( 'vertex' ) ? 'transformed' : 'vPosition'; | |
break; | |
case PositionNode.WORLD: | |
builder.requires.worldPosition = true; | |
result = 'vWPosition'; | |
break; | |
case PositionNode.VIEW: | |
result = builder.isShader( 'vertex' ) ? '-mvPosition.xyz' : 'vViewPosition'; | |
break; | |
case PositionNode.PROJECTION: | |
result = builder.isShader( 'vertex' ) ? '( projectionMatrix * modelViewMatrix * vec4( position, 1.0 ) )' : 'vec4( 0.0 )'; | |
break; | |
} | |
return builder.format( result, this.getType( builder ), output ); | |
}; | |
PositionNode.prototype.copy = function ( source ) { | |
TempNode.prototype.copy.call( this, source ); | |
this.scope = source.scope; | |
}; | |
PositionNode.prototype.toJSON = function ( meta ) { | |
var data = this.getJSONNode( meta ); | |
if ( ! data ) { | |
data = this.createJSONNode( meta ); | |
data.scope = this.scope; | |
} | |
return data; | |
}; | |
NodeLib.addKeyword( 'position', function () { | |
return new PositionNode(); | |
} ); | |
NodeLib.addKeyword( 'worldPosition', function () { | |
return new PositionNode( PositionNode.WORLD ); | |
} ); | |
NodeLib.addKeyword( 'viewPosition', function () { | |
return new PositionNode( NormalNode.VIEW ); | |
} ); | |
export { PositionNode }; | |