|
@@ -1,106 +1,14 @@
|
|
-import Node, { addNodeClass } from '../core/Node.js';
|
|
|
|
import { attribute } from '../core/AttributeNode.js';
|
|
import { attribute } from '../core/AttributeNode.js';
|
|
import { varying } from '../core/VaryingNode.js';
|
|
import { varying } from '../core/VaryingNode.js';
|
|
import { property } from '../core/PropertyNode.js';
|
|
import { property } from '../core/PropertyNode.js';
|
|
-import { normalize } from '../math/MathNode.js';
|
|
|
|
import { cameraViewMatrix } from './CameraNode.js';
|
|
import { cameraViewMatrix } from './CameraNode.js';
|
|
import { modelNormalMatrix } from './ModelNode.js';
|
|
import { modelNormalMatrix } from './ModelNode.js';
|
|
-import { nodeImmutable, vec3 } from '../shadernode/ShaderNode.js';
|
|
|
|
-
|
|
|
|
-class NormalNode extends Node {
|
|
|
|
-
|
|
|
|
- constructor( scope = NormalNode.LOCAL ) {
|
|
|
|
-
|
|
|
|
- super( 'vec3' );
|
|
|
|
-
|
|
|
|
- this.scope = scope;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- isGlobal() {
|
|
|
|
-
|
|
|
|
- return true;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- getHash( /*builder*/ ) {
|
|
|
|
-
|
|
|
|
- return `normal-${this.scope}`;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- generate( builder ) {
|
|
|
|
-
|
|
|
|
- const scope = this.scope;
|
|
|
|
-
|
|
|
|
- let outputNode = null;
|
|
|
|
-
|
|
|
|
- if ( scope === NormalNode.GEOMETRY ) {
|
|
|
|
-
|
|
|
|
- const geometryAttribute = builder.hasGeometryAttribute( 'normal' );
|
|
|
|
-
|
|
|
|
- if ( geometryAttribute === false ) {
|
|
|
|
-
|
|
|
|
- outputNode = vec3( 0, 1, 0 );
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- outputNode = attribute( 'normal', 'vec3' );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- } else if ( scope === NormalNode.LOCAL ) {
|
|
|
|
-
|
|
|
|
- outputNode = varying( normalGeometry );
|
|
|
|
-
|
|
|
|
- } else if ( scope === NormalNode.VIEW ) {
|
|
|
|
-
|
|
|
|
- const vertexNode = modelNormalMatrix.mul( normalLocal );
|
|
|
|
- outputNode = normalize( varying( vertexNode ) );
|
|
|
|
-
|
|
|
|
- } else if ( scope === NormalNode.WORLD ) {
|
|
|
|
-
|
|
|
|
- // To use inverseTransformDirection only inverse the param order like this: cameraViewMatrix.transformDirection( normalView )
|
|
|
|
- const vertexNode = normalView.transformDirection( cameraViewMatrix );
|
|
|
|
- outputNode = normalize( varying( vertexNode ) );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return outputNode.build( builder, this.getNodeType( builder ) );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- serialize( data ) {
|
|
|
|
-
|
|
|
|
- super.serialize( data );
|
|
|
|
-
|
|
|
|
- data.scope = this.scope;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- deserialize( data ) {
|
|
|
|
-
|
|
|
|
- super.deserialize( data );
|
|
|
|
-
|
|
|
|
- this.scope = data.scope;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-NormalNode.GEOMETRY = 'geometry';
|
|
|
|
-NormalNode.LOCAL = 'local';
|
|
|
|
-NormalNode.VIEW = 'view';
|
|
|
|
-NormalNode.WORLD = 'world';
|
|
|
|
-
|
|
|
|
-export default NormalNode;
|
|
|
|
-
|
|
|
|
-export const normalGeometry = nodeImmutable( NormalNode, NormalNode.GEOMETRY );
|
|
|
|
-export const normalLocal = nodeImmutable( NormalNode, NormalNode.LOCAL ).temp( 'Normal' );
|
|
|
|
-export const normalView = nodeImmutable( NormalNode, NormalNode.VIEW );
|
|
|
|
-export const normalWorld = nodeImmutable( NormalNode, NormalNode.WORLD );
|
|
|
|
-export const transformedNormalView = property( 'vec3', 'TransformedNormalView' );
|
|
|
|
-export const transformedNormalWorld = transformedNormalView.transformDirection( cameraViewMatrix ).normalize();
|
|
|
|
-export const transformedClearcoatNormalView = property( 'vec3', 'TransformedClearcoatNormalView' );
|
|
|
|
-
|
|
|
|
-addNodeClass( 'NormalNode', NormalNode );
|
|
|
|
|
|
+import { vec3 } from '../shadernode/ShaderNode.js';
|
|
|
|
+
|
|
|
|
+export const normalGeometry = /*#__PURE__*/ attribute( 'normal', 'vec3', vec3( 0, 1, 0 ) );
|
|
|
|
+export const normalLocal = /*#__PURE__*/ varying( normalGeometry ).toVar( 'normalLocal' );
|
|
|
|
+export const normalView = /*#__PURE__*/ varying( modelNormalMatrix.mul( normalLocal ), 'normalView' ).normalize();
|
|
|
|
+export const normalWorld = /*#__PURE__*/ varying( normalView.transformDirection( cameraViewMatrix ), 'normalWorld' ).normalize();
|
|
|
|
+export const transformedNormalView = /*#__PURE__*/ property( 'vec3', 'transformedNormalView' );
|
|
|
|
+export const transformedNormalWorld = /*#__PURE__*/ transformedNormalView.transformDirection( cameraViewMatrix ).normalize();
|
|
|
|
+export const transformedClearcoatNormalView = /*#__PURE__*/ property( 'vec3', 'transformedClearcoatNormalView' );
|