소스 검색

Nodes: Add StorageArrayElementNode (#27673)

sunag 1 년 전
부모
커밋
f3721a5a5a
3개의 변경된 파일61개의 추가작업 그리고 0개의 파일을 삭제
  1. 1 0
      examples/jsm/nodes/Nodes.js
  2. 7 0
      examples/jsm/nodes/accessors/StorageBufferNode.js
  3. 53 0
      examples/jsm/nodes/utils/StorageArrayElementNode.js

+ 1 - 0
examples/jsm/nodes/Nodes.js

@@ -68,6 +68,7 @@ export { default as SetNode } from './utils/SetNode.js';
 export { default as SpecularMIPLevelNode, specularMIPLevel } from './utils/SpecularMIPLevelNode.js';
 export { default as SplitNode } from './utils/SplitNode.js';
 export { default as SpriteSheetUVNode, spritesheetUV } from './utils/SpriteSheetUVNode.js';
+export { default as StorageArrayElementNode } from './utils/StorageArrayElementNode.js';
 export { default as TimerNode, timerLocal, timerGlobal, timerDelta, frameId } from './utils/TimerNode.js';
 export { default as TriplanarTexturesNode, triplanarTextures, triplanarTexture } from './utils/TriplanarTexturesNode.js';
 export { default as ReflectorNode, reflector } from './utils/ReflectorNode.js';

+ 7 - 0
examples/jsm/nodes/accessors/StorageBufferNode.js

@@ -3,6 +3,7 @@ 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 {
 
@@ -23,6 +24,12 @@ class StorageBufferNode extends BufferNode {
 
 	}
 
+	element( indexNode ) {
+
+		return storageElement( this, indexNode );
+
+	}
+
 	generate( builder ) {
 
 		if ( builder.isAvailable( 'storageBuffer' ) ) return super.generate( builder );

+ 53 - 0
examples/jsm/nodes/utils/StorageArrayElementNode.js

@@ -0,0 +1,53 @@
+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;
+
+	}
+
+	generate( builder ) {
+
+		let snippet;
+
+		if ( builder.isAvailable( 'storageBuffer' ) === false ) {
+
+			snippet = this.node.build( builder );
+
+		} else {
+
+			snippet = super.generate( builder );
+
+		}
+
+		return snippet;
+
+	}
+
+}
+
+export default StorageArrayElementNode;
+
+export const storageElement = nodeProxy( StorageArrayElementNode );
+
+addNodeElement( 'storageElement', storageElement );
+
+addNodeClass( 'StorageArrayElementNode', StorageArrayElementNode );