Skip to content

Commit 025b563

Browse files
authored
WebGPURenderer: Uniform Group (#27134)
* Renderer: UniformGroup * cleanup
1 parent e8ff761 commit 025b563

20 files changed

+357
-76
lines changed

examples/jsm/nodes/Nodes.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export { default as ParameterNode, parameter } from './core/ParameterNode.js';
3030
export { default as PropertyNode, property, output, diffuseColor, roughness, metalness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, specularColor, shininess, dashSize, gapSize, pointWidth } from './core/PropertyNode.js';
3131
export { default as StackNode, stack } from './core/StackNode.js';
3232
export { default as TempNode } from './core/TempNode.js';
33+
export { default as UniformGroupNode, uniformGroup, objectGroup, renderGroup, frameGroup } from './core/UniformGroupNode.js';
3334
export { default as UniformNode, uniform } from './core/UniformNode.js';
3435
export { default as VaryingNode, varying } from './core/VaryingNode.js';
3536
export { default as OutputStructNode, outputStruct } from './core/OutputStructNode.js';

examples/jsm/nodes/accessors/CameraNode.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
import Object3DNode from './Object3DNode.js';
22
import { addNodeClass } from '../core/Node.js';
33
import { label } from '../core/ContextNode.js';
4+
import { NodeUpdateType } from '../core/constants.js';
5+
//import { sharedUniformGroup } from '../core/UniformGroupNode.js';
46
import { nodeImmutable } from '../shadernode/ShaderNode.js';
57

8+
//const cameraGroup = sharedUniformGroup( 'camera' );
9+
610
class CameraNode extends Object3DNode {
711

812
constructor( scope = CameraNode.POSITION ) {
913

1014
super( scope );
1115

16+
this.updateType = NodeUpdateType.RENDER;
17+
18+
//this._uniformNode.groupNode = cameraGroup;
19+
1220
}
1321

1422
getNodeType( builder ) {
@@ -35,6 +43,8 @@ class CameraNode extends Object3DNode {
3543
const uniformNode = this._uniformNode;
3644
const scope = this.scope;
3745

46+
//cameraGroup.needsUpdate = true;
47+
3848
if ( scope === CameraNode.VIEW_MATRIX ) {
3949

4050
uniformNode.value = camera.matrixWorldInverse;

examples/jsm/nodes/accessors/MaterialReferenceNode.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import ReferenceNode from './ReferenceNode.js';
2-
import { NodeUpdateType } from '../core/constants.js';
2+
//import { renderGroup } from '../core/UniformGroupNode.js';
3+
//import { NodeUpdateType } from '../core/constants.js';
34
import { addNodeClass } from '../core/Node.js';
45
import { nodeObject } from '../shadernode/ShaderNode.js';
56

@@ -11,10 +12,18 @@ class MaterialReferenceNode extends ReferenceNode {
1112

1213
this.material = material;
1314

14-
this.updateType = NodeUpdateType.RENDER;
15+
//this.updateType = NodeUpdateType.RENDER;
1516

1617
}
1718

19+
/*setNodeType( node ) {
20+
21+
super.setNodeType( node );
22+
23+
this.node.groupNode = renderGroup;
24+
25+
}*/
26+
1827
updateReference( frame ) {
1928

2029
this.reference = this.material !== null ? this.material : frame.material;

examples/jsm/nodes/accessors/ModelNode.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class ModelNode extends Object3DNode {
2323
export default ModelNode;
2424

2525
export const modelDirection = nodeImmutable( ModelNode, ModelNode.DIRECTION );
26-
export const modelViewMatrix = nodeImmutable( ModelNode, ModelNode.VIEW_MATRIX ).temp( 'ModelViewMatrix' );
26+
export const modelViewMatrix = nodeImmutable( ModelNode, ModelNode.VIEW_MATRIX ).label( 'modelViewMatrix' ).temp( 'ModelViewMatrix' );
2727
export const modelNormalMatrix = nodeImmutable( ModelNode, ModelNode.NORMAL_MATRIX );
2828
export const modelWorldMatrix = nodeImmutable( ModelNode, ModelNode.WORLD_MATRIX );
2929
export const modelPosition = nodeImmutable( ModelNode, ModelNode.POSITION );

examples/jsm/nodes/core/NodeBuilder.js

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ import { getCurrentStack, setCurrentStack } from '../shadernode/ShaderNode.js';
2222
import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
2323

2424
import CubeRenderTarget from '../../renderers/common/CubeRenderTarget.js';
25+
import ChainMap from '../../renderers/common/ChainMap.js';
26+
27+
const uniformsGroupCache = new ChainMap();
2528

2629
const typeFromLength = new Map( [
2730
[ 2, 'vec2' ],
@@ -128,6 +131,41 @@ class NodeBuilder {
128131

129132
}
130133

134+
_getSharedBindings( bindings ) {
135+
136+
const shared = [];
137+
138+
for ( const binding of bindings ) {
139+
140+
if ( binding.shared === true ) {
141+
142+
// nodes is the chainmap key
143+
const nodes = binding.getNodes();
144+
145+
let sharedBinding = uniformsGroupCache.get( nodes );
146+
147+
if ( sharedBinding === undefined ) {
148+
149+
uniformsGroupCache.set( nodes, binding );
150+
151+
sharedBinding = binding;
152+
153+
}
154+
155+
shared.push( sharedBinding );
156+
157+
} else {
158+
159+
shared.push( binding );
160+
161+
}
162+
163+
}
164+
165+
return shared;
166+
167+
}
168+
131169
getBindings() {
132170

133171
let bindingsArray = this.bindingsArray;
@@ -136,7 +174,7 @@ class NodeBuilder {
136174

137175
const bindings = this.bindings;
138176

139-
this.bindingsArray = bindingsArray = ( this.material !== null ) ? [ ...bindings.vertex, ...bindings.fragment ] : bindings.compute;
177+
this.bindingsArray = bindingsArray = this._getSharedBindings( ( this.material !== null ) ? [ ...bindings.vertex, ...bindings.fragment ] : bindings.compute );
140178

141179
}
142180

examples/jsm/nodes/core/NodeFrame.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ class NodeFrame {
4747
const updateType = node.getUpdateBeforeType();
4848
const reference = node.updateReference( this );
4949

50-
const { frameMap, renderMap } = this._getMaps( this.updateBeforeMap, reference );
51-
5250
if ( updateType === NodeUpdateType.FRAME ) {
5351

52+
const { frameMap } = this._getMaps( this.updateBeforeMap, reference );
53+
5454
if ( frameMap.get( node ) !== this.frameId ) {
5555

5656
frameMap.set( node, this.frameId );
@@ -61,10 +61,11 @@ class NodeFrame {
6161

6262
} else if ( updateType === NodeUpdateType.RENDER ) {
6363

64-
if ( renderMap.get( node ) !== this.renderId || frameMap.get( node ) !== this.frameId ) {
64+
const { renderMap } = this._getMaps( this.updateBeforeMap, reference );
65+
66+
if ( renderMap.get( node ) !== this.renderId ) {
6567

6668
renderMap.set( node, this.renderId );
67-
frameMap.set( node, this.frameId );
6869

6970
node.updateBefore( this );
7071

@@ -83,10 +84,10 @@ class NodeFrame {
8384
const updateType = node.getUpdateType();
8485
const reference = node.updateReference( this );
8586

86-
const { frameMap, renderMap } = this._getMaps( this.updateMap, reference );
87-
8887
if ( updateType === NodeUpdateType.FRAME ) {
8988

89+
const { frameMap } = this._getMaps( this.updateMap, reference );
90+
9091
if ( frameMap.get( node ) !== this.frameId ) {
9192

9293
frameMap.set( node, this.frameId );
@@ -97,10 +98,11 @@ class NodeFrame {
9798

9899
} else if ( updateType === NodeUpdateType.RENDER ) {
99100

100-
if ( renderMap.get( node ) !== this.renderId || frameMap.get( node ) !== this.frameId ) {
101+
const { renderMap } = this._getMaps( this.updateMap, reference );
102+
103+
if ( renderMap.get( node ) !== this.renderId ) {
101104

102105
renderMap.set( node, this.renderId );
103-
frameMap.set( node, this.frameId );
104106

105107
node.update( this );
106108

examples/jsm/nodes/core/NodeUniform.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ class NodeUniform {
2323

2424
}
2525

26+
get id() {
27+
28+
return this.node.id;
29+
30+
}
31+
32+
get groupNode() {
33+
34+
return this.node.groupNode;
35+
36+
}
37+
2638
}
2739

2840
export default NodeUniform;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class UniformGroup {
2+
3+
constructor( name ) {
4+
5+
this.name = name;
6+
7+
this.isUniformGroup = true;
8+
9+
}
10+
11+
}
12+
13+
export default UniformGroup;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import Node from './Node.js';
2+
import { addNodeClass } from './Node.js';
3+
4+
class UniformGroupNode extends Node {
5+
6+
constructor( name, shared = false ) {
7+
8+
super( 'string' );
9+
10+
this.name = name;
11+
this.version = 0;
12+
13+
this.shared = shared;
14+
15+
this.isUniformGroup = true;
16+
17+
}
18+
19+
set needsUpdate( value ) {
20+
21+
if ( value === true ) this.version ++;
22+
23+
}
24+
25+
}
26+
27+
export const uniformGroup = ( name ) => new UniformGroupNode( name );
28+
export const sharedUniformGroup = ( name ) => new UniformGroupNode( name, true );
29+
30+
export const frameGroup = sharedUniformGroup( 'frame' );
31+
export const renderGroup = sharedUniformGroup( 'render' );
32+
export const objectGroup = uniformGroup( 'object' );
33+
34+
export default UniformGroupNode;
35+
36+
addNodeClass( 'UniformGroupNode', UniformGroupNode );

examples/jsm/nodes/core/UniformNode.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import InputNode from './InputNode.js';
2+
import { objectGroup } from './UniformGroupNode.js';
23
import { addNodeClass } from './Node.js';
34
import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js';
45

@@ -10,6 +11,22 @@ class UniformNode extends InputNode {
1011

1112
this.isUniformNode = true;
1213

14+
this.groupNode = objectGroup;
15+
16+
}
17+
18+
setGroup( group ) {
19+
20+
this.groupNode = group;
21+
22+
return this;
23+
24+
}
25+
26+
getGroup() {
27+
28+
return this.groupNode;
29+
1330
}
1431

1532
getUniformHash( builder ) {

0 commit comments

Comments
 (0)