Răsfoiți Sursa

add NormalNode

sunag 4 ani în urmă
părinte
comite
d95eb36d71
1 a modificat fișierele cu 84 adăugiri și 0 ștergeri
  1. 84 0
      examples/jsm/renderers/nodes/accessors/NormalNode.js

+ 84 - 0
examples/jsm/renderers/nodes/accessors/NormalNode.js

@@ -0,0 +1,84 @@
+import Node from '../core/Node.js';
+import AttributeNode from '../core/AttributeNode.js';
+import VaryNode from '../core/VaryNode.js';
+import ModelNode from '../accessors/ModelNode.js';
+import CameraNode from '../accessors/CameraNode.js';
+import OperatorNode from '../math/OperatorNode.js';
+import MathNode from '../math/MathNode.js';
+
+class NormalNode extends Node {
+
+	static VIEW = 'view';
+	static LOCAL = 'local';
+	static WORLD = 'world';
+
+	constructor( scope = NormalNode.VIEW ) {
+
+		super( 'vec3' );
+
+		this.scope = scope;
+
+	}
+
+	generate( builder, output ) {
+
+		const type = this.getType( builder );
+		const nodeData = builder.getDataFromNode( this, builder.shaderStage );
+		const scope = this.scope;
+
+		let localNormalNode = nodeData.localNormalNode;
+
+		if ( localNormalNode === undefined ) {
+
+			localNormalNode = new AttributeNode( 'normal', 'vec3' );
+
+			nodeData.localNormalNode = localNormalNode;
+
+		}
+
+		let outputNode = localNormalNode;
+
+		if ( scope === NormalNode.VIEW ) {
+
+			let viewNormalNode = nodeData.viewNormalNode;
+
+			if ( viewNormalNode === undefined ) {
+
+				const unnormalizedWNNode = new OperatorNode( '*', new ModelNode( ModelNode.NORMAL ), localNormalNode );
+				const vertexNormalNode = new MathNode( MathNode.NORMALIZE, unnormalizedWNNode );
+
+				viewNormalNode = new MathNode( MathNode.NORMALIZE, new VaryNode( vertexNormalNode ) );
+
+				nodeData.viewNormalNode = viewNormalNode;
+
+			}
+
+			outputNode = viewNormalNode;
+
+		} else if ( scope === NormalNode.WORLD ) {
+
+			let worldNormalNode = nodeData.worldNormalNode;
+
+			if ( worldNormalNode === undefined ) {
+
+				const vertexNormalNode = new MathNode( MathNode.INVERSE_TRANSFORM_DIRETION, new NormalNode( NormalNode.VIEW ), new CameraNode( CameraNode.VIEW ) );
+
+				worldNormalNode = new VaryNode( vertexNormalNode );
+
+				nodeData.worldNormalNode = worldNormalNode;
+
+			}
+
+			outputNode = worldNormalNode;
+
+		}
+
+		const normalSnipped = outputNode.build( builder, type );
+
+		return builder.format( normalSnipped, type, output );
+
+	}
+
+}
+
+export default NormalNode;