Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
501 changes: 133 additions & 368 deletions examples/jsm/nodes/Nodes.js

Large diffs are not rendered by default.

49 changes: 38 additions & 11 deletions examples/jsm/nodes/accessors/BitangentNode.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import Node from '../core/Node.js';
import VaryingNode from '../core/VaryingNode.js';
import OperatorNode from '../math/OperatorNode.js';
import MathNode from '../math/MathNode.js';
import SplitNode from '../utils/SplitNode.js';
import NormalNode from './NormalNode.js';
import TangentNode from './TangentNode.js';
import Node, { addNodeClass } from '../core/Node.js';
import { varying } from '../core/VaryingNode.js';
import { normalize } from '../math/MathNode.js';
import { cameraViewMatrix } from './CameraNode.js';
import { normalGeometry, normalLocal, normalView, normalWorld, transformedNormalView } from './NormalNode.js';
import { tangentGeometry, tangentLocal, tangentView, tangentWorld, transformedTangentView } from './TangentNode.js';
import { nodeImmutable } from '../shadernode/ShaderNode.js';

class BitangentNode extends Node {

Expand All @@ -26,11 +26,29 @@ class BitangentNode extends Node {

const scope = this.scope;

const crossNormalTangent = new MathNode( MathNode.CROSS, new NormalNode( scope ), new TangentNode( scope ) );
const tangentW = new SplitNode( new TangentNode( TangentNode.GEOMETRY ), 'w' );
const vertexNode = new SplitNode( new OperatorNode( '*', crossNormalTangent, tangentW ), 'xyz' );
let crossNormalTangent;

const outputNode = new MathNode( MathNode.NORMALIZE, new VaryingNode( vertexNode ) );
if ( scope === BitangentNode.GEOMETRY ) {

crossNormalTangent = normalGeometry.cross( tangentGeometry );

} else if ( scope === BitangentNode.LOCAL ) {

crossNormalTangent = normalLocal.cross( tangentLocal );

} else if ( scope === BitangentNode.VIEW ) {

crossNormalTangent = normalView.cross( tangentView );

} else if ( scope === BitangentNode.WORLD ) {

crossNormalTangent = normalWorld.cross( tangentWorld );

}

const vertexNode = crossNormalTangent.mul( tangentGeometry.w ).xyz;

const outputNode = normalize( varying( vertexNode ) );

return outputNode.build( builder, this.getNodeType( builder ) );

Expand Down Expand Up @@ -60,3 +78,12 @@ BitangentNode.VIEW = 'view';
BitangentNode.WORLD = 'world';

export default BitangentNode;

export const bitangentGeometry = nodeImmutable( BitangentNode, BitangentNode.GEOMETRY );
export const bitangentLocal = nodeImmutable( BitangentNode, BitangentNode.LOCAL );
export const bitangentView = nodeImmutable( BitangentNode, BitangentNode.VIEW );
export const bitangentWorld = nodeImmutable( BitangentNode, BitangentNode.WORLD );
export const transformedBitangentView = normalize( transformedNormalView.cross( transformedTangentView ).mul( tangentGeometry.w ) );
export const transformedBitangentWorld = normalize( transformedBitangentView.transformDirection( cameraViewMatrix ) );

addNodeClass( BitangentNode );
6 changes: 6 additions & 0 deletions examples/jsm/nodes/accessors/BufferNode.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import UniformNode from '../core/UniformNode.js';
import { addNodeClass } from '../core/Node.js';
import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js';

class BufferNode extends UniformNode {

Expand All @@ -22,3 +24,7 @@ class BufferNode extends UniformNode {
}

export default BufferNode;

export const buffer = ( value, nodeOrType, count ) => nodeObject( new BufferNode( value, getConstNodeType( nodeOrType ), count ) );

addNodeClass( BufferNode );
10 changes: 10 additions & 0 deletions examples/jsm/nodes/accessors/CameraNode.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import Object3DNode from './Object3DNode.js';
import { addNodeClass } from '../core/Node.js';
import { nodeImmutable } from '../shadernode/ShaderNode.js';

class CameraNode extends Object3DNode {

Expand Down Expand Up @@ -65,3 +67,11 @@ class CameraNode extends Object3DNode {
CameraNode.PROJECTION_MATRIX = 'projectionMatrix';

export default CameraNode;

export const cameraProjectionMatrix = nodeImmutable( CameraNode, CameraNode.PROJECTION_MATRIX );
export const cameraViewMatrix = nodeImmutable( CameraNode, CameraNode.VIEW_MATRIX );
export const cameraNormalMatrix = nodeImmutable( CameraNode, CameraNode.NORMAL_MATRIX );
export const cameraWorldMatrix = nodeImmutable( CameraNode, CameraNode.WORLD_MATRIX );
export const cameraPosition = nodeImmutable( CameraNode, CameraNode.POSITION );

addNodeClass( CameraNode );
19 changes: 11 additions & 8 deletions examples/jsm/nodes/accessors/CubeTextureNode.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import TextureNode from './TextureNode.js';
import UniformNode from '../core/UniformNode.js';
import ReflectVectorNode from './ReflectVectorNode.js';

import { vec3, nodeObject } from '../shadernode/ShaderNodeBaseElements.js';

let defaultUV;
import { reflectVector } from './ReflectVectorNode.js';
import { addNodeClass } from '../core/Node.js';
import { addNodeElement, nodeProxy, vec3 } from '../shadernode/ShaderNode.js';

class CubeTextureNode extends TextureNode {

Expand All @@ -24,7 +22,7 @@ class CubeTextureNode extends TextureNode {

getDefaultUV() {

return defaultUV || ( defaultUV = new ReflectVectorNode() );
return reflectVector;

}

Expand Down Expand Up @@ -58,8 +56,7 @@ class CubeTextureNode extends TextureNode {

if ( propertyName === undefined ) {

const uvNodeObject = nodeObject( uvNode );
const cubeUV = vec3( uvNodeObject.x.negate(), uvNodeObject.yz );
const cubeUV = vec3( uvNode.x.negate(), uvNode.yz );
const uvSnippet = cubeUV.build( builder, 'vec3' );

const nodeVar = builder.getVarFromNode( this, 'vec4' );
Expand Down Expand Up @@ -96,3 +93,9 @@ class CubeTextureNode extends TextureNode {
}

export default CubeTextureNode;

export const cubeTexture = nodeProxy( CubeTextureNode );

addNodeElement( 'cubeTexture', cubeTexture );

addNodeClass( CubeTextureNode );
18 changes: 12 additions & 6 deletions examples/jsm/nodes/accessors/ExtendedMaterialNode.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import MaterialNode from './MaterialNode.js';
import NormalMapNode from '../display/NormalMapNode.js';
// @TODO: Is this needed? Can it be moved in MaterialNode?

import {
normalView, materialReference
} from '../shadernode/ShaderNodeElements.js';
import MaterialNode from './MaterialNode.js';
import { materialReference } from './MaterialReferenceNode.js';
import { normalView } from './NormalNode.js';
import { normalMap } from '../display/NormalMapNode.js';
import { addNodeClass } from '../core/Node.js';
import { nodeImmutable } from '../shadernode/ShaderNode.js';

class ExtendedMaterialNode extends MaterialNode {

Expand Down Expand Up @@ -37,7 +39,7 @@ class ExtendedMaterialNode extends MaterialNode {

if ( scope === ExtendedMaterialNode.NORMAL ) {

node = material.normalMap ? new NormalMapNode( this.getTexture( 'normalMap' ), materialReference( 'normalScale', 'vec2' ) ) : normalView;
node = material.normalMap ? normalMap( this.getTexture( 'normalMap' ), materialReference( 'normalScale', 'vec2' ) ) : normalView;

}

Expand All @@ -50,3 +52,7 @@ class ExtendedMaterialNode extends MaterialNode {
ExtendedMaterialNode.NORMAL = 'normal';

export default ExtendedMaterialNode;

export const materialNormal = nodeImmutable( ExtendedMaterialNode, ExtendedMaterialNode.NORMAL );

addNodeClass( ExtendedMaterialNode );
38 changes: 17 additions & 21 deletions examples/jsm/nodes/accessors/InstanceNode.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,10 @@
import Node from '../core/Node.js';
import {
vec3,
mat3,
mul,
assign,
buffer,
element,
dot,
div,
temp,
instanceIndex,
positionLocal,
normalLocal
} from '../shadernode/ShaderNodeBaseElements.js';
import Node, { addNodeClass } from '../core/Node.js';
import { instanceIndex } from '../core/InstanceIndexNode.js';
import { temp } from '../core/VarNode.js';
import { buffer } from './BufferNode.js';
import { normalLocal } from './NormalNode.js';
import { positionLocal } from './PositionNode.js';
import { nodeProxy, vec3, mat3 } from '../shadernode/ShaderNode.js';

class InstanceNode extends Node {

Expand All @@ -26,7 +18,7 @@ class InstanceNode extends Node {

const instanceBufferNode = buffer( instanceMesh.instanceMatrix.array, 'mat4', instanceMesh.count );

this.instanceMatrixNode = temp( element( instanceBufferNode, instanceIndex ) ); // @TODO: a possible caching issue here?
this.instanceMatrixNode = temp( instanceBufferNode.element( instanceIndex ) ); // @TODO: a possible caching issue here?

}

Expand All @@ -36,23 +28,27 @@ class InstanceNode extends Node {

// POSITION

const instancePosition = mul( instanceMatrixNode, positionLocal ).xyz;
const instancePosition = instanceMatrixNode.mul( positionLocal ).xyz;

// NORMAL

const m = mat3( instanceMatrixNode[ 0 ].xyz, instanceMatrixNode[ 1 ].xyz, instanceMatrixNode[ 2 ].xyz );

const transformedNormal = div( normalLocal, vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) ) );
const transformedNormal = normalLocal.div( vec3( m[ 0 ].dot( m[ 0 ] ), m[ 1 ].dot( m[ 1 ] ), m[ 2 ].dot( m[ 2 ] ) ) );

const instanceNormal = mul( m, transformedNormal ).xyz;
const instanceNormal = m.mul( transformedNormal ).xyz;

// ASSIGNS

assign( positionLocal, instancePosition ).build( builder );
assign( normalLocal, instanceNormal ).build( builder );
positionLocal.assign( instancePosition ).build( builder );
normalLocal.assign( instanceNormal ).build( builder );

}

}

export default InstanceNode;

export const instance = nodeProxy( InstanceNode );

addNodeClass( InstanceNode );
58 changes: 35 additions & 23 deletions examples/jsm/nodes/accessors/MaterialNode.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import Node from '../core/Node.js';
import UniformNode from '../core/UniformNode.js';
import UVNode from '../accessors/UVNode.js';
import ConstNode from '../core/ConstNode.js';
import OperatorNode from '../math/OperatorNode.js';
import JoinNode from '../utils/JoinNode.js';
import MaterialReferenceNode from './MaterialReferenceNode.js';
import SplitNode from '../utils/SplitNode.js';
import Node, { addNodeClass } from '../core/Node.js';
import { uniform } from '../core/UniformNode.js';
import { materialReference } from './MaterialReferenceNode.js';
import { uv } from './UVNode.js';
import { nodeImmutable, vec3 } from '../shadernode/ShaderNode.js';

class MaterialNode extends Node {

Expand Down Expand Up @@ -50,24 +47,24 @@ class MaterialNode extends Node {

//@TODO: Check if it can be cached by property name.

return new MaterialReferenceNode( property, 'float' );
return materialReference( property, 'float' );

}

getColor( property ) {

//@TODO: Check if it can be cached by property name.

return new MaterialReferenceNode( property, 'color' );
return materialReference( property, 'color' );

}

getTexture( property ) {

//@TODO: Check if it can be cached by property name.

const textureRefNode = new MaterialReferenceNode( property, 'texture' );
textureRefNode.node.uvNode = new MaterialNode( MaterialNode.UV );
const textureRefNode = materialReference( property, 'texture' );
textureRefNode.node.uvNode = materialUV;

return textureRefNode;

Expand All @@ -90,7 +87,7 @@ class MaterialNode extends Node {

if ( material.map && material.map.isTexture === true ) {

node = new OperatorNode( '*', colorNode, this.getTexture( 'map' ) );
node = colorNode.mul( this.getTexture( 'map' ) );

} else {

Expand All @@ -104,7 +101,7 @@ class MaterialNode extends Node {

if ( material.alphaMap && material.alphaMap.isTexture === true ) {

node = new OperatorNode( '*', opacityNode, this.getTexture( 'alphaMap' ) );
node = opacityNode.mul( this.getTexture( 'alphaMap' ) );

} else {

Expand All @@ -126,7 +123,7 @@ class MaterialNode extends Node {

if ( material.specularMap && material.specularMap.isTexture === true ) {

node = new OperatorNode( '*', reflectivityNode, new SplitNode( this.getTexture( 'specularMap' ), 'r' ) );
node = reflectivityNode.mul( this.getTexture( 'specularMap' ).r );

} else {

Expand All @@ -140,7 +137,7 @@ class MaterialNode extends Node {

if ( material.roughnessMap && material.roughnessMap.isTexture === true ) {

node = new OperatorNode( '*', roughnessNode, new SplitNode( this.getTexture( 'roughnessMap' ), 'g' ) );
node = roughnessNode.mul( this.getTexture( 'roughnessMap' ).g );

} else {

Expand All @@ -154,7 +151,7 @@ class MaterialNode extends Node {

if ( material.metalnessMap && material.metalnessMap.isTexture === true ) {

node = new OperatorNode( '*', metalnessNode, new SplitNode( this.getTexture( 'metalnessMap' ), 'b' ) );
node = metalnessNode.mul( this.getTexture( 'metalnessMap' ).b );

} else {

Expand All @@ -168,7 +165,7 @@ class MaterialNode extends Node {

if ( material.emissiveMap && material.emissiveMap.isTexture === true ) {

node = new OperatorNode( '*', emissiveNode, this.getTexture( 'emissiveMap' ) );
node = emissiveNode.mul( this.getTexture( 'emissiveMap' ) );

} else {

Expand All @@ -184,7 +181,6 @@ class MaterialNode extends Node {

// uv repeat and offset setting priorities

let uvNode;
let uvScaleMap =
material.map ||
material.specularMap ||
Expand Down Expand Up @@ -222,17 +218,19 @@ class MaterialNode extends Node {

}

uvNode = new OperatorNode( '*', new UniformNode( uvScaleMap.matrix ), new JoinNode( [ new UVNode(), new ConstNode( 1 ) ] ) );
node = uniform( uvScaleMap.matrix ).mul( vec3( uv(), 1 ) );

}
} else {

return uvNode || new UVNode();
node = uv();

}

} else {

const outputType = this.getNodeType( builder );

node = new MaterialReferenceNode( scope, outputType );
node = materialReference( scope, outputType );

}

Expand All @@ -255,3 +253,17 @@ MaterialNode.ROTATION = 'rotation';
MaterialNode.UV = 'uv';

export default MaterialNode;

export const materialUV = nodeImmutable( MaterialNode, MaterialNode.UV );
export const materialAlphaTest = nodeImmutable( MaterialNode, MaterialNode.ALPHA_TEST );
export const materialColor = nodeImmutable( MaterialNode, MaterialNode.COLOR );
export const materialShininess = nodeImmutable( MaterialNode, MaterialNode.SHININESS );
export const materialEmissive = nodeImmutable( MaterialNode, MaterialNode.EMISSIVE );
export const materialOpacity = nodeImmutable( MaterialNode, MaterialNode.OPACITY );
export const materialSpecularColor = nodeImmutable( MaterialNode, MaterialNode.SPECULAR_COLOR );
export const materialReflectivity = nodeImmutable( MaterialNode, MaterialNode.REFLECTIVITY );
export const materialRoughness = nodeImmutable( MaterialNode, MaterialNode.ROUGHNESS );
export const materialMetalness = nodeImmutable( MaterialNode, MaterialNode.METALNESS );
export const materialRotation = nodeImmutable( MaterialNode, MaterialNode.ROTATION );

addNodeClass( MaterialNode );
Loading