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
2 changes: 1 addition & 1 deletion examples/jsm/materials/LDrawConditionalLineNodeMaterial.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class LDrawConditionalLineMaterial extends NodeMaterial {

varyingProperty( 'float', 'discardFlag' ).assign( discardFlag );

return modelViewProjection();
return modelViewProjection;

} )();

Expand Down
2 changes: 1 addition & 1 deletion examples/jsm/objects/SkyMesh.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ class SkyMesh extends Mesh {

// position

const position = modelViewProjection();
const position = modelViewProjection;
position.z.assign( position.w ); // set z to camera.far

return position;
Expand Down
6 changes: 3 additions & 3 deletions examples/jsm/tsl/display/SMAANode.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ class SMAANode extends TempNode {
varyingProperty( 'vec4', 'vOffset1' ).assign( vOffset1 );
varyingProperty( 'vec4', 'vOffset2' ).assign( vOffset2 );

return modelViewProjection();
return modelViewProjection;

} );

Expand Down Expand Up @@ -405,7 +405,7 @@ class SMAANode extends TempNode {
varyingProperty( 'vec4', 'vOffset1' ).assign( vOffset1 );
varyingProperty( 'vec4', 'vOffset2' ).assign( vOffset2 );

return modelViewProjection();
return modelViewProjection;

} );

Expand Down Expand Up @@ -507,7 +507,7 @@ class SMAANode extends TempNode {
//varyingProperty( 'vec4', 'vOffset0' ).assign( vOffset0 );
varyingProperty( 'vec4', 'vOffset1' ).assign( vOffset1 );

return modelViewProjection();
return modelViewProjection;

} );

Expand Down
Binary file modified examples/screenshots/webgpu_instance_sprites.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified examples/screenshots/webgpu_tsl_galaxy.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions src/Three.TSL.js
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,8 @@ export const grayscale = TSL.grayscale;
export const greaterThan = TSL.greaterThan;
export const greaterThanEqual = TSL.greaterThanEqual;
export const hash = TSL.hash;
export const highPrecisionModelNormalViewMatrix = TSL.highPrecisionModelNormalViewMatrix;
export const highPrecisionModelViewMatrix = TSL.highPrecisionModelViewMatrix;
export const highpModelNormalViewMatrix = TSL.highpModelNormalViewMatrix;
export const highpModelViewMatrix = TSL.highpModelViewMatrix;
export const hue = TSL.hue;
export const instance = TSL.instance;
export const instanceIndex = TSL.instanceIndex;
Expand Down Expand Up @@ -223,6 +223,7 @@ export const log2 = TSL.log2;
export const logarithmicDepthToViewZ = TSL.logarithmicDepthToViewZ;
export const loop = TSL.loop;
export const luminance = TSL.luminance;
export const mediumpModelViewMatrix = TSL.mediumpModelViewMatrix;
export const mat2 = TSL.mat2;
export const mat3 = TSL.mat3;
export const mat4 = TSL.mat4;
Expand Down
34 changes: 23 additions & 11 deletions src/materials/nodes/NodeMaterial.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { cameraFar, cameraNear } from '../../nodes/accessors/Camera.js';
import { clipping, clippingAlpha, hardwareClipping } from '../../nodes/accessors/ClippingNode.js';
import NodeMaterialObserver from './manager/NodeMaterialObserver.js';
import getAlphaHashThreshold from '../../nodes/functions/material/getAlphaHashThreshold.js';
import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';

class NodeMaterial extends Material {

Expand Down Expand Up @@ -100,6 +101,7 @@ class NodeMaterial extends Material {
setup( builder ) {

builder.context.setupNormal = () => this.setupNormal( builder );
builder.context.setupPositionView = () => this.setupPositionView( builder );

const renderer = builder.renderer;
const renderTarget = renderer.getRenderTarget();
Expand All @@ -108,7 +110,9 @@ class NodeMaterial extends Material {

builder.addStack();

builder.stack.outputNode = this.vertexNode || this.setupPosition( builder );
const vertexNode = this.vertexNode || this.setupVertex( builder );

builder.stack.outputNode = vertexNode;

this.setupHardwareClipping( builder );

Expand Down Expand Up @@ -307,14 +311,27 @@ class NodeMaterial extends Material {

}

setupPosition( builder ) {
setupPositionView() {

return modelViewMatrix.mul( positionLocal ).xyz;

}

const { object } = builder;
const geometry = object.geometry;
setupVertex( builder ) {

builder.addStack();

// Vertex
this.setupPosition( builder );

builder.context.vertex = builder.removeStack();

return modelViewProjection;

}

setupPosition( builder ) {

const { object, geometry } = builder;

if ( geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color ) {

Expand Down Expand Up @@ -356,12 +373,7 @@ class NodeMaterial extends Material {

}

const mvp = modelViewProjection();

builder.context.vertex = builder.removeStack();
builder.context.mvp = mvp;

return mvp;
return positionLocal;

}

Expand Down
24 changes: 9 additions & 15 deletions src/materials/nodes/SpriteNodeMaterial.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import NodeMaterial from './NodeMaterial.js';
import { cameraProjectionMatrix } from '../../nodes/accessors/Camera.js';
import { materialRotation } from '../../nodes/accessors/MaterialNode.js';
import { modelViewMatrix, modelWorldMatrix } from '../../nodes/accessors/ModelNode.js';
import { positionLocal } from '../../nodes/accessors/Position.js';
import { positionGeometry, positionLocal } from '../../nodes/accessors/Position.js';
import { rotate } from '../../nodes/utils/RotateNode.js';
import { float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
import { float, vec2, vec4 } from '../../nodes/tsl/TSLBase.js';

import { SpriteMaterial } from '../SpriteMaterial.js';
import { reference } from '../../nodes/accessors/ReferenceBaseNode.js';
Expand Down Expand Up @@ -38,17 +38,17 @@ class SpriteNodeMaterial extends NodeMaterial {

}

setupPosition( { object, camera, context } ) {
setupPositionView( builder ) {

const { object, camera } = builder;

const sizeAttenuation = this.sizeAttenuation;

// < VERTEX STAGE >

const { positionNode, rotationNode, scaleNode } = this;

const vertex = positionLocal;
const { rotationNode, scaleNode } = this;

let mvPosition = modelViewMatrix.mul( vec3( positionNode || 0 ) );
const mvPosition = modelViewMatrix.mul( positionLocal );

let scale = vec2( modelWorldMatrix[ 0 ].xyz.length(), modelWorldMatrix[ 1 ].xyz.length() );

Expand All @@ -74,7 +74,7 @@ class SpriteNodeMaterial extends NodeMaterial {

}

let alignedPosition = vertex.xy;
let alignedPosition = positionGeometry.xy;

if ( object.center && object.center.isVector2 === true ) {

Expand All @@ -90,13 +90,7 @@ class SpriteNodeMaterial extends NodeMaterial {

const rotatedPosition = rotate( alignedPosition, rotation );

mvPosition = vec4( mvPosition.xy.add( rotatedPosition ), mvPosition.zw );

const modelViewProjection = cameraProjectionMatrix.mul( mvPosition );

context.vertex = vertex;

return modelViewProjection;
return vec4( mvPosition.xy.add( rotatedPosition ), mvPosition.zw );

}

Expand Down
1 change: 0 additions & 1 deletion src/nodes/Nodes.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ export { default as MaterialReferenceNode } from './accessors/MaterialReferenceN
export { default as RendererReferenceNode } from './accessors/RendererReferenceNode.js';
export { default as MorphNode } from './accessors/MorphNode.js';
export { default as ModelNode } from './accessors/ModelNode.js';
export { default as ModelViewProjectionNode } from './accessors/ModelViewProjectionNode.js';
export { default as Object3DNode } from './accessors/Object3DNode.js';
export { default as PointUVNode } from './accessors/PointUVNode.js';
export { default as ReferenceNode } from './accessors/ReferenceNode.js';
Expand Down
21 changes: 16 additions & 5 deletions src/nodes/accessors/ModelNode.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,20 @@ export const modelScale = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.SCAL
export const modelViewPosition = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.VIEW_POSITION );
export const modelNormalMatrix = /*@__PURE__*/ uniform( new Matrix3() ).onObjectUpdate( ( { object }, self ) => self.value.getNormalMatrix( object.matrixWorld ) );
export const modelWorldMatrixInverse = /*@__PURE__*/ uniform( new Matrix4() ).onObjectUpdate( ( { object }, self ) => self.value.copy( object.matrixWorld ).invert() );
export const modelViewMatrix = /*@__PURE__*/ cameraViewMatrix.mul( modelWorldMatrix ).toVar( 'modelViewMatrix' );

export const highPrecisionModelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {
export const modelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {

return builder.renderer.nodes.modelViewMatrix || mediumpModelViewMatrix;

} ).once() )().toVar( 'modelViewMatrix' );

// GPU Precision

export const mediumpModelViewMatrix = /*@__PURE__*/ cameraViewMatrix.mul( modelWorldMatrix );

// CPU Precision

export const highpModelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {

builder.context.isHighPrecisionModelViewMatrix = true;

Expand All @@ -51,9 +62,9 @@ export const highPrecisionModelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {

} );

} ).once() )().toVar( 'highPrecisionModelViewMatrix' );
} ).once() )().toVar( 'highpModelViewMatrix' );

export const highPrecisionModelNormalViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {
export const highpModelNormalViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {

const isHighPrecisionModelViewMatrix = builder.context.isHighPrecisionModelViewMatrix;

Expand All @@ -69,4 +80,4 @@ export const highPrecisionModelNormalViewMatrix = /*@__PURE__*/ ( Fn( ( builder

} );

} ).once() )().toVar( 'highPrecisionModelNormalMatrix' );
} ).once() )().toVar( 'highpModelNormalViewMatrix' );
42 changes: 2 additions & 40 deletions src/nodes/accessors/ModelViewProjectionNode.js
Original file line number Diff line number Diff line change
@@ -1,42 +1,4 @@
import TempNode from '../core/TempNode.js';
import { cameraProjectionMatrix } from './Camera.js';
import { positionLocal } from './Position.js';
import { nodeProxy, varying } from '../tsl/TSLBase.js';
import { modelViewMatrix } from './ModelNode.js';
import { positionView } from './Position.js';

class ModelViewProjectionNode extends TempNode {

static get type() {

return 'ModelViewProjectionNode';

}

constructor( positionNode = null ) {

super( 'vec4' );

this.positionNode = positionNode;

}

setup( builder ) {

if ( builder.shaderStage === 'fragment' ) {

return varying( builder.context.mvp );

}

const position = this.positionNode || positionLocal;
const viewMatrix = builder.renderer.nodes.modelViewMatrix || modelViewMatrix;

return cameraProjectionMatrix.mul( viewMatrix ).mul( position );

}

}

export default ModelViewProjectionNode;

export const modelViewProjection = /*@__PURE__*/ nodeProxy( ModelViewProjectionNode );
export const modelViewProjection = /*@__PURE__*/ cameraProjectionMatrix.mul( positionView ).varying( 'v_modelViewProjection' );
9 changes: 7 additions & 2 deletions src/nodes/accessors/Position.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { attribute } from '../core/AttributeNode.js';
import { modelWorldMatrix, modelViewMatrix } from './ModelNode.js';
import { Fn } from '../tsl/TSLCore.js';
import { modelWorldMatrix } from './ModelNode.js';

/** @module Position **/

Expand Down Expand Up @@ -44,7 +45,11 @@ export const positionWorldDirection = /*@__PURE__*/ positionLocal.transformDirec
*
* @type {VaryingNode<vec3>}
*/
export const positionView = /*@__PURE__*/ modelViewMatrix.mul( positionLocal ).xyz.varying( 'v_positionView' ).context( { needsPositionReassign: true } );
export const positionView = /*@__PURE__*/ ( Fn( ( builder ) => {

return builder.context.setupPositionView();

}, 'vec3' ).once() )().varying( 'v_positionView' ).context( { needsPositionReassign: true } );

/**
* TSL object that represents the position view direction of the current rendered object.
Expand Down
2 changes: 1 addition & 1 deletion src/renderers/common/Background.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class Background extends DataMap {
getTextureLevel: () => backgroundBlurriness
} );

let viewProj = modelViewProjection();
let viewProj = modelViewProjection;
viewProj = viewProj.setZ( viewProj.w );

const nodeMaterial = new NodeMaterial();
Expand Down
Loading