node-ejs-renderer/node_modules/three/examples/jsm/nodes/utils/StorageArrayElementNode.js
2024-06-09 13:55:01 -04:00

92 lines
1.5 KiB
JavaScript

import { addNodeClass } from '../core/Node.js';
import { nodeProxy, addNodeElement } from '../shadernode/ShaderNode.js';
import ArrayElementNode from './ArrayElementNode.js';
class StorageArrayElementNode extends ArrayElementNode {
constructor( storageBufferNode, indexNode ) {
super( storageBufferNode, indexNode );
this.isStorageArrayElementNode = true;
}
set storageBufferNode( value ) {
this.node = value;
}
get storageBufferNode() {
return this.node;
}
setup( builder ) {
if ( builder.isAvailable( 'storageBuffer' ) === false ) {
if ( ! this.node.instanceIndex && this.node.bufferObject === true ) {
builder.setupPBO( this.node );
}
}
return super.setup( builder );
}
generate( builder, output ) {
let snippet;
const isAssignContext = builder.context.assign;
//
if ( builder.isAvailable( 'storageBuffer' ) === false ) {
const { node } = this;
if ( ! node.instanceIndex && this.node.bufferObject === true && isAssignContext !== true ) {
snippet = builder.generatePBO( this );
} else {
snippet = node.build( builder );
}
} else {
snippet = super.generate( builder );
}
if ( isAssignContext !== true ) {
const type = this.getNodeType( builder );
snippet = builder.format( snippet, type, output );
}
return snippet;
}
}
export default StorageArrayElementNode;
export const storageElement = nodeProxy( StorageArrayElementNode );
addNodeElement( 'storageElement', storageElement );
addNodeClass( 'StorageArrayElementNode', StorageArrayElementNode );