11import tgpu , { type TgpuFn } from 'typegpu' ;
22import * as d from 'typegpu/data' ;
3+ import * as std from 'typegpu/std' ;
34import { ShapeContext } from './types.ts' ;
45
5- const sampleSdfShell = tgpu [ '~unstable' ] . fn ( [ d . vec3f ] , d . f32 ) ;
66type SampleSdf = TgpuFn < [ d . Vec3f ] , d . F32 > ;
77
8- const defaultGetSurfaceThreshold = tgpu [ '~unstable' ] . fn (
9- [ ShapeContext ] ,
10- d . f32 ,
11- ) ( ( _ctx ) => 0.001 ) ;
8+ const defaultGetSurfaceThreshold = tgpu [ '~unstable' ] . fn ( [ ShapeContext ] , d . f32 ) (
9+ ( _ctx ) => 0.001 ,
10+ ) ;
1211
1312export const MarchParams = {
1413 maxSteps : tgpu [ '~unstable' ] . slot ( 500 ) ,
@@ -31,54 +30,55 @@ export const march = tgpu['~unstable'].fn([
3130 d . ptrFn ( ShapeContext ) ,
3231 d . u32 ,
3332 d . ptrFn ( MarchResult ) ,
34- ] ) `( ctx: ptr<function, ShapeContext>, limit: u32 , out: ptr<function, MarchResult>) {
35- var pos = (* ctx) .rayPos;
36- var prev_dist = -1. ;
37- var min_dist: f32 = MarchParams.farPlane;
33+ ] ) ( ( ctx , limit , out ) => {
34+ let pos = d . vec3f ( ctx . rayPos ) ;
35+ let prev_dist = d . f32 ( - 1 ) ;
36+ let min_dist = d . f32 ( MarchParams . farPlane . value ) ;
3837
39- var step = 0u ;
40- var progress = 0. ;
38+ let step = d . u32 ( 0 ) ;
39+ let progress = d . f32 ( 0 ) ;
4140
4241 for ( ; step <= limit ; step ++ ) {
43- pos = (* ctx) .rayPos + (* ctx) .rayDir * progress;
44- min_dist = MarchParams.sampleSdf(pos);
42+ pos = std . add ( ctx . rayPos , std . mul ( ctx . rayDir , progress ) ) ;
43+ min_dist = MarchParams . sampleSdf . value ( pos ) ;
4544
4645 // Inside volume?
4746 if ( min_dist <= 0. ) {
4847 // No need to check more objects.
4948 break ;
5049 }
5150
52- if (min_dist < MarchParams.getSurfaceThreshold(*ctx) && min_dist < prev_dist) {
51+ if (
52+ min_dist < MarchParams . getSurfaceThreshold . value ( ctx ) &&
53+ min_dist < prev_dist
54+ ) {
5355 // No need to check more objects.
5456 break ;
5557 }
5658
5759 // march forward safely
5860 progress += min_dist ;
59- (* ctx) .rayDistance += min_dist;
61+ ctx . rayDistance += min_dist ;
6062
61- if (progress > MarchParams.farPlane) {
63+ if ( progress > MarchParams . farPlane . value ) {
6264 // Stop checking.
6365 break ;
6466 }
6567
6668 prev_dist = min_dist ;
6769 }
6870
69- (* out) .position = pos;
71+ out . position = pos ;
7072
7173 // Not near surface or distance rising?
72- if (min_dist > MarchParams.getSurfaceThreshold(*ctx) * 2. || min_dist > prev_dist) {
74+ if (
75+ min_dist > MarchParams . getSurfaceThreshold . value ( ctx ) * 2. ||
76+ min_dist > prev_dist
77+ ) {
7378 // Sky
74- (* out) .steps = MarchParams.maxSteps + 1u ;
79+ out . steps = MarchParams . maxSteps . value + 1 ;
7580 return ;
7681 }
7782
78- (*out).steps = step;
79- }
80- ` . $uses ( {
81- ShapeContext,
82- MarchResult,
83- MarchParams,
83+ out . steps = step ;
8484} ) ;
0 commit comments