1- import { sphere } from '@typegpu/sdf' ;
2- import { MarchParams , ShapeContext } from 'src/lib-ray-marching' ;
3- import tgpu , { type TgpuFnShell } from 'typegpu' ;
1+ import tgpu from 'typegpu' ;
42import * as d from 'typegpu/data' ;
53import { abs , floor , min , mix , mul , pow } from 'typegpu/std' ;
4+ import { sdSphere } from '@typegpu/sdf' ;
5+ import { MarchParams , ShapeContext } from 'src/lib-ray-marching' ;
66
77export const Material = d . struct ( {
88 albedo : d . vec3f ,
@@ -12,14 +12,11 @@ export const Material = d.struct({
1212
1313// const getTime = tgpu.accessor(d.f32);
1414
15- const sdfShell : TgpuFnShell < [ pos : d . Vec3f ] , d . F32 > = tgpu [ '~unstable' ] . fn (
16- [ d . vec3f ] ,
17- d . f32 ,
18- ) ;
15+ const sdfShell = tgpu . fn ( [ d . vec3f ] , d . f32 ) ;
1916
2017const objLeftBlob = sdfShell ( ( pos ) => {
2118 'kernel' ;
22- return sphere ( pos , d . vec3f ( - 0.3 , - 0.2 , 0 ) , 0.2 ) ;
19+ return sdSphere ( pos . sub ( d . vec3f ( - 0.3 , - 0.2 , 0 ) ) , 0.2 ) ;
2320} ) ;
2421
2522// ANIMATED LIGHT
@@ -29,78 +26,81 @@ const objLeftBlob = sdfShell((pos) => {
2926
3027const objCenterBlob = sdfShell ( ( pos ) => {
3128 'kernel' ;
32- return sphere ( pos , d . vec3f ( - 0.3 , 0.4 , 0.4 ) , 0.2 ) ;
29+ return sdSphere ( pos . sub ( d . vec3f ( - 0.3 , 0.4 , 0.4 ) ) , 0.2 ) ;
3330} ) ;
3431
3532const objRightBlob = sdfShell ( ( pos ) => {
3633 'kernel' ;
37- return sphere ( pos , d . vec3f ( 0.4 , 0.2 , 0 ) , 0.4 ) ;
34+ return sdSphere ( pos . sub ( d . vec3f ( 0.4 , 0.2 , 0 ) ) , 0.4 ) ;
3835} ) ;
3936
4037const objFloor = sdfShell ( ( pos ) => {
4138 'kernel' ;
4239 return pos . y + 0.3 ;
4340} ) ;
4441
45- const matFloor = tgpu [ '~unstable' ]
46- . fn ( [ d . vec3f , d . ptrFn ( Material ) ] ) ( ( pos , mtr ) => {
47- const uv = floor ( mul ( 5 , pos . xz ) ) ;
48- const c = 0.2 + 0.5 * ( ( uv . x + uv . y ) - 2.0 * floor ( ( uv . x + uv . y ) / 2.0 ) ) ;
49-
50- mtr . albedo = mix ( d . vec3f ( 1. , 1. , 1. ) , d . vec3f ( 0. , 0. , 0. ) , c ) ;
51- mtr . roughness = 0.9 ;
52- } )
53- . $name ( 'mat_floor' ) ;
42+ const matFloor = tgpu . fn ( [ d . vec3f , d . ptrFn ( Material ) ] ) ( ( pos , mtr ) => {
43+ const uv = floor ( mul ( 5 , pos . xz ) ) ;
44+ const c = 0.2 + 0.5 * ( uv . x + uv . y - 2.0 * floor ( ( uv . x + uv . y ) / 2.0 ) ) ;
45+
46+ mtr . albedo = mix ( d . vec3f ( 1 , 1 , 1 ) , d . vec3f ( 0 , 0 , 0 ) , c ) ;
47+ mtr . roughness = 0.9 ;
48+ } ) ;
5449
5550export const FAR = 100 ;
5651
5752export const worldSdf = sdfShell ( ( pos ) => {
5853 'kernel' ;
59- let min_dist = d . f32 ( FAR ) ;
54+ let minDist = d . f32 ( FAR ) ;
6055
61- min_dist = min ( min_dist , objLeftBlob ( pos ) ) ;
62- min_dist = min ( min_dist , objCenterBlob ( pos ) ) ;
63- min_dist = min ( min_dist , objRightBlob ( pos ) ) ;
64- min_dist = min ( min_dist , objFloor ( pos ) ) ;
56+ minDist = min ( minDist , objLeftBlob ( pos ) ) ;
57+ minDist = min ( minDist , objCenterBlob ( pos ) ) ;
58+ minDist = min ( minDist , objRightBlob ( pos ) ) ;
59+ minDist = min ( minDist , objFloor ( pos ) ) ;
6560
66- return min_dist ;
61+ return minDist ;
6762} ) ;
6863
6964// MATERIALS
7065
71- export const skyColor = tgpu [ '~unstable' ] . fn ( [ d . vec3f ] , d . vec3f ) ( ( dir ) => {
72- const t = pow ( min ( abs ( dir . y ) * 4 , 1. ) , 0.4 ) ;
66+ export const skyColor = tgpu . fn (
67+ [ d . vec3f ] ,
68+ d . vec3f ,
69+ ) ( ( dir ) => {
70+ const t = pow ( min ( abs ( dir . y ) * 4 , 1 ) , 0.4 ) ;
7371 return mix ( d . vec3f ( 0.7 , 0.7 , 0.75 ) , d . vec3f ( 0.35 , 0.4 , 0.6 ) , t ) ;
7472} ) ;
7573
76- export const worldMat = tgpu [ '~unstable' ]
77- . fn ( [ d . vec3f , ShapeContext , d . ptrFn ( Material ) ] ) ( ( pos , ctx , out ) => {
78- const sd = MarchParams . getSurfaceThreshold . value ( ctx ) ;
79- const d_left_blob = objLeftBlob ( pos ) ;
80- const d_center_blob = objCenterBlob ( pos ) ;
81- const d_right_blob = objRightBlob ( pos ) ;
82- const d_floor_blob = objFloor ( pos ) ;
83-
84- // defaults
85- out . emissive = false ;
86- out . roughness = 1 ;
87-
88- if ( d_left_blob <= sd ) {
89- // left blob
90- out . albedo = d . vec3f ( 1 , 0.5 , 0.2 ) ;
91- out . roughness = 0.95 ;
92- } else if ( d_center_blob <= sd ) {
93- // test light
94- out . albedo = mul ( 20 , d . vec3f ( 1 , 1 , 0.5 ) ) ;
95- out . emissive = true ;
96- } else if ( d_right_blob <= sd ) {
97- out . albedo = mul ( 0.9 , d . vec3f ( 0.5 , 0.5 , 0.6 ) ) ;
98- out . roughness = 0.1 ;
99- } else if ( d_floor_blob <= sd ) {
100- matFloor ( pos , out ) ;
101- } else {
102- // out.albedo = vec3f(0.5, 0.5, 0.2);
103- out . albedo = skyColor ( ctx . rayDir ) ;
104- }
105- } )
106- . $name ( 'world_mat' ) ;
74+ export const worldMat = tgpu . fn ( [ d . vec3f , ShapeContext , d . ptrFn ( Material ) ] ) ( (
75+ pos ,
76+ ctx ,
77+ out ,
78+ ) => {
79+ const sd = MarchParams . getSurfaceThreshold . value ( ctx ) ;
80+ const d_left_blob = objLeftBlob ( pos ) ;
81+ const d_center_blob = objCenterBlob ( pos ) ;
82+ const d_right_blob = objRightBlob ( pos ) ;
83+ const d_floor_blob = objFloor ( pos ) ;
84+
85+ // defaults
86+ out . emissive = false ;
87+ out . roughness = 1 ;
88+
89+ if ( d_left_blob <= sd ) {
90+ // left blob
91+ out . albedo = d . vec3f ( 1 , 0.5 , 0.2 ) ;
92+ out . roughness = 0.95 ;
93+ } else if ( d_center_blob <= sd ) {
94+ // test light
95+ out . albedo = mul ( 20 , d . vec3f ( 1 , 1 , 0.5 ) ) ;
96+ out . emissive = true ;
97+ } else if ( d_right_blob <= sd ) {
98+ out . albedo = mul ( 0.9 , d . vec3f ( 0.5 , 0.5 , 0.6 ) ) ;
99+ out . roughness = 0.1 ;
100+ } else if ( d_floor_blob <= sd ) {
101+ matFloor ( pos , out ) ;
102+ } else {
103+ // out.albedo = vec3f(0.5, 0.5, 0.2);
104+ out . albedo = skyColor ( ctx . rayDir ) ;
105+ }
106+ } ) ;
0 commit comments