@@ -24,10 +24,10 @@ const bounce = TSL.uniform(0.8);
2424const friction = TSL . uniform ( 0.99 ) ;
2525const size = TSL . uniform ( 0.12 ) ;
2626const clickPosition = TSL . uniform ( new THREE . Vector3 ( ) ) ;
27- const gravityUniform = fromTSL ( gravity , { type : d . f32 } ) ;
28- const bounceUniform = fromTSL ( bounce , { type : d . f32 } ) ;
29- const frictionUniform = fromTSL ( friction , { type : d . f32 } ) ;
30- const clickPositionUniform = fromTSL ( clickPosition , { type : d . vec3f } ) ;
27+ const gravityAccessor = fromTSL ( gravity , { type : d . f32 } ) ;
28+ const bounceAccessor = fromTSL ( bounce , { type : d . f32 } ) ;
29+ const frictionAccessor = fromTSL ( friction , { type : d . f32 } ) ;
30+ const clickPositionAccessor = fromTSL ( clickPosition , { type : d . vec3f } ) ;
3131
3232const camera = new THREE . PerspectiveCamera (
3333 50 ,
@@ -46,56 +46,60 @@ const separation = 0.2;
4646const amount = Math . sqrt ( particleCount ) ;
4747const offset = amount / 2 ;
4848
49- const instanceIndex = fromTSL ( TSL . instanceIndex , { type : d . u32 } ) ;
50- const positionsBuffer = fromTSL ( positions , { type : d . arrayOf ( d . vec3f ) } ) ;
51- const colorsBuffer = fromTSL ( colors , { type : d . arrayOf ( d . vec3f ) } ) ;
49+ const instanceIndexAccessor = fromTSL ( TSL . instanceIndex , { type : d . u32 } ) ;
50+ const positionsAccessor = fromTSL ( positions , { type : d . arrayOf ( d . vec3f ) } ) ;
51+ const colorsAccessor = fromTSL ( colors , { type : d . arrayOf ( d . vec3f ) } ) ;
5252
5353const computeInit = toTSL ( ( ) => {
5454 'use gpu' ;
55- const instanceIdx = instanceIndex . $ ;
56- const position = positionsBuffer . $ [ instanceIdx ] ;
57- const color = colorsBuffer . $ [ instanceIdx ] ;
55+ const instanceIdx = instanceIndexAccessor . $ ;
56+ const position = positionsAccessor . $ [ instanceIdx ] ;
57+ const color = colorsAccessor . $ [ instanceIdx ] ;
5858
5959 const x = instanceIdx % d . u32 ( amount ) ;
6060 const z = instanceIdx / amount ;
6161
6262 position . x = ( offset - d . f32 ( x ) ) * separation ;
6363 position . z = ( offset - d . f32 ( z ) ) * separation ;
64- positionsBuffer . $ [ instanceIdx ] = d . vec3f ( position ) ;
64+ positionsAccessor . $ [ instanceIdx ] = d . vec3f ( position ) ;
6565
6666 randf . seed ( d . f32 ( instanceIdx / amount ) ) ;
6767 color . x = randf . sample ( ) ;
6868 randf . seed ( d . f32 ( instanceIdx / amount ) + 2 ) ;
6969 color . y = randf . sample ( ) ;
70- colorsBuffer . $ [ instanceIdx ] = d . vec3f ( color ) ;
70+ colorsAccessor . $ [ instanceIdx ] = d . vec3f ( color ) ;
7171} ) . compute ( particleCount ) . setName ( 'Init Particles TypeGPU' ) ;
7272renderer . compute ( computeInit ) ;
7373
74- const velocitiesBuffer = fromTSL ( velocities , { type : d . arrayOf ( d . vec3f ) } ) ;
75- const computeParticles = toTSL ( ( ) => {
74+ const velocitiesAccessor = fromTSL ( velocities , { type : d . arrayOf ( d . vec3f ) } ) ;
75+ const computeAccessor = toTSL ( ( ) => {
7676 'use gpu' ;
77- const instanceIdx = instanceIndex . $ ;
78- let position = positionsBuffer . $ [ instanceIdx ] ;
79- let velocity = velocitiesBuffer . $ [ instanceIdx ] ;
77+ const instanceIdx = instanceIndexAccessor . $ ;
78+ let position = positionsAccessor . $ [ instanceIdx ] ;
79+ let velocity = velocitiesAccessor . $ [ instanceIdx ] ;
8080
81- velocity = velocity . add ( d . vec3f ( 0 , gravityUniform . $ , 0 ) ) ;
81+ velocity = velocity . add ( d . vec3f ( 0 , gravityAccessor . $ , 0 ) ) ;
8282 position = position . add ( velocity ) ;
83- velocity = velocity . mul ( frictionUniform . $ ) ;
83+ velocity = velocity . mul ( frictionAccessor . $ ) ;
8484
8585 if ( position . y < 0 ) {
8686 position . y = 0 ;
87- velocity . y = - velocity . y * bounceUniform . $ ;
87+ velocity . y = - velocity . y * bounceAccessor . $ ;
8888 velocity = velocity . mul ( d . vec3f ( 0.9 , 1 , 0.9 ) ) ;
8989 }
9090
91- positionsBuffer . $ [ instanceIdx ] = d . vec3f ( position ) ;
92- velocitiesBuffer . $ [ instanceIdx ] = d . vec3f ( velocity ) ;
91+ positionsAccessor . $ [ instanceIdx ] = d . vec3f ( position ) ;
92+ velocitiesAccessor . $ [ instanceIdx ] = d . vec3f ( velocity ) ;
9393} ) . compute ( particleCount ) . setName ( 'Update Particles TypeGPU' ) ;
9494
9595const material = new THREE . SpriteNodeMaterial ( ) ;
9696material . colorNode = toTSL ( ( ) => {
9797 'use gpu' ;
98- return d . vec4f ( uv ( ) . $ . mul ( colorsBuffer . $ [ instanceIndex . $ ] . xy ) , 0 , 1 ) ;
98+ return d . vec4f (
99+ uv ( ) . $ . mul ( colorsAccessor . $ [ instanceIndexAccessor . $ ] . xy ) ,
100+ 0 ,
101+ 1 ,
102+ ) ;
99103} ) ;
100104material . positionNode = positions . toAttribute ( ) ;
101105material . scaleNode = size ;
@@ -125,20 +129,20 @@ const pointer = new THREE.Vector2();
125129
126130const computeHit = toTSL ( ( ) => {
127131 'use gpu' ;
128- const instanceIdx = instanceIndex . $ ;
129- const position = positionsBuffer . $ [ instanceIdx ] ;
130- let velocity = velocitiesBuffer . $ [ instanceIdx ] ;
132+ const instanceIdx = instanceIndexAccessor . $ ;
133+ const position = positionsAccessor . $ [ instanceIdx ] ;
134+ let velocity = velocitiesAccessor . $ [ instanceIdx ] ;
131135
132- const dist = std . distance ( position , clickPositionUniform . $ ) ;
133- const dir = std . normalize ( position . sub ( clickPositionUniform . $ ) ) ;
136+ const dist = std . distance ( position , clickPositionAccessor . $ ) ;
137+ const dir = std . normalize ( position . sub ( clickPositionAccessor . $ ) ) ;
134138 const distArea = std . max ( 0 , 3 - dist ) ;
135139
136140 const power = distArea * 0.01 ;
137141 randf . seed ( d . f32 ( instanceIdx / amount ) ) ;
138142 const relativePower = power * ( 1.5 * randf . sample ( ) + 0.5 ) ;
139143
140144 velocity = velocity . add ( dir . mul ( relativePower ) ) ;
141- velocitiesBuffer . $ [ instanceIdx ] = d . vec3f ( velocity ) ;
145+ velocitiesAccessor . $ [ instanceIdx ] = d . vec3f ( velocity ) ;
142146} ) . compute ( particleCount ) . setName ( 'Hit Particles TypeGPU' ) ;
143147
144148function onMove ( event : PointerEvent ) {
@@ -195,7 +199,7 @@ resizeObserver.observe(canvas);
195199const animate = ( ) => {
196200 cameraControls . update ( ) ;
197201
198- renderer . compute ( computeParticles ) ;
202+ renderer . compute ( computeAccessor ) ;
199203 renderer . render ( scene , camera ) ;
200204} ;
201205
0 commit comments