|
@@ -105,7 +105,12 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
|
|
|
this.uniformsGroup = {};
|
|
|
|
|
|
- this.builtins = new Set();
|
|
|
+ this.builtins = {
|
|
|
+ vertex: new Map(),
|
|
|
+ fragment: new Map(),
|
|
|
+ compute: new Map(),
|
|
|
+ attribute: new Map()
|
|
|
+ };
|
|
|
|
|
|
}
|
|
|
|
|
@@ -364,14 +369,42 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
|
|
|
}
|
|
|
|
|
|
- getInstanceIndex( shaderStage = this.shaderStage ) {
|
|
|
+ getBuiltin( name, property, type, shaderStage = this.shaderStage ) {
|
|
|
|
|
|
- this.builtins.add( 'instance_index' );
|
|
|
+ const map = this.builtins[ shaderStage ];
|
|
|
+
|
|
|
+ if ( map.has( name ) === false ) {
|
|
|
+
|
|
|
+ map.set( name, {
|
|
|
+ name,
|
|
|
+ property,
|
|
|
+ type
|
|
|
+ } );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return property;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ getInstanceIndex() {
|
|
|
+
|
|
|
+ if ( this.shaderStage === 'vertex' ) {
|
|
|
+
|
|
|
+ return this.getBuiltin( 'instance_index', 'instanceIndex', 'u32', 'attribute' );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
return 'instanceIndex';
|
|
|
|
|
|
}
|
|
|
|
|
|
+ getFrontFacing() {
|
|
|
+
|
|
|
+ return this.getBuiltin( 'front_facing', 'isFront', 'bool' );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
getAttributes( shaderStage ) {
|
|
|
|
|
|
const snippets = [];
|
|
@@ -380,11 +413,13 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
|
|
|
if ( shaderStage === 'compute' ) {
|
|
|
|
|
|
- snippets.push( `@builtin( global_invocation_id ) id : vec3<u32>` );
|
|
|
+ this.getBuiltin( 'global_invocation_id', 'id', 'vec3<u32>', 'attribute' );
|
|
|
|
|
|
- } else if ( this.builtins.has( 'instance_index' ) ) {
|
|
|
+ }
|
|
|
|
|
|
- snippets.push( `@builtin( instance_index ) instanceIndex : u32` );
|
|
|
+ for ( const { name, property, type } of this.builtins.attribute.values() ) {
|
|
|
+
|
|
|
+ snippets.push( `@builtin( ${name} ) ${property} : ${type}` );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -433,7 +468,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
|
|
|
if ( shaderStage === 'vertex' ) {
|
|
|
|
|
|
- snippets.push( '@builtin( position ) Vertex: vec4<f32>' );
|
|
|
+ this.getBuiltin( 'position', 'Vertex', 'vec4<f32>', 'vertex' );
|
|
|
|
|
|
const varys = this.varys;
|
|
|
|
|
@@ -459,6 +494,12 @@ class WebGPUNodeBuilder extends NodeBuilder {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ for ( const { name, property, type } of this.builtins[ shaderStage ].values() ) {
|
|
|
+
|
|
|
+ snippets.push( `@builtin( ${name} ) ${property} : ${type}` );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
const code = snippets.join( ',\n\t' );
|
|
|
|
|
|
return shaderStage === 'vertex' ? this._getWGSLStruct( 'NodeVarysStruct', '\t' + code ) : code;
|