82 lines
1.9 KiB
JavaScript
82 lines
1.9 KiB
JavaScript
|
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 );
|