Files
4.0/static/sdk/three/jsm/nodes/accessors/StorageBufferNode.js

82 lines
1.9 KiB
JavaScript
Raw Permalink Normal View History

import BufferNode from './BufferNode.js';
import { bufferAttribute } from './BufferAttributeNode.js';
import { addNodeClass } from '../core/Node.js';
import { nodeObject } from '../shadernode/ShaderNode.js';
import { varying } from '../core/VaryingNode.js';
import { storageElement } from '../utils/StorageArrayElementNode.js';
class StorageBufferNode extends BufferNode {
constructor( value, bufferType, bufferCount = 0 ) {
super( value, bufferType, bufferCount );
this.isStorageBufferNode = true;
this.bufferObject = false;
this._attribute = null;
this._varying = null;
if ( value.isStorageBufferAttribute !== true && value.isStorageInstancedBufferAttribute !== true ) {
// TOOD: Improve it, possibly adding a new property to the BufferAttribute to identify it as a storage buffer read-only attribute in Renderer
if ( value.isInstancedBufferAttribute ) value.isStorageInstancedBufferAttribute = true;
else value.isStorageBufferAttribute = true;
}
}
getInputType( /*builder*/ ) {
return 'storageBuffer';
}
element( indexNode ) {
return storageElement( this, indexNode );
}
setBufferObject( value ) {
this.bufferObject = value;
return this;
}
generate( builder ) {
if ( builder.isAvailable( 'storageBuffer' ) ) return super.generate( builder );
const nodeType = this.getNodeType( builder );
if ( this._attribute === null ) {
this._attribute = bufferAttribute( this.value );
this._varying = varying( this._attribute );
}
const output = this._varying.build( builder, nodeType );
builder.registerTransform( output, this._attribute );
return output;
}
}
export default StorageBufferNode;
export const storage = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ) );
export const storageObject = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ).setBufferObject( true ) );
addNodeClass( 'StorageBufferNode', StorageBufferNode );