Setting the file. One moment.
Crack Planes · Frost Sequence Camera Orbit · heygen-com/hyperframes · Skills Docs
ContentsBack to the top of the page Three Mesh BVH LICENSE
(opens in a new tab)
source/src/ice/ CrackPlanes.ts
TypeScript · 94 lines · 3 KB
"../rewrite"
;
9 const {
10 Fn ,
11 vec3 ,
12 vec4 ,
13 float ,
14 uint ,
15 uniform ,
16 instanceIndex ,
17 uvec3 ,
18 ivec3 ,
19 texture3D ,
20 textureStore ,
21 dot ,
22 abs ,
23 } = tsl;
24 export class CrackPlanes {
25 private signature = "" ;
26 private entries : any [] = [];
27 constructor (
28 private renderer : THREE . WebGPURenderer ,
29 private bound : number ,
30 private seed : number ,
31 private res = 128 ,
32 ) {
33 for ( let j = 0 ; j < 2 ; j ++ ) {
34 const tex = new THREE . Storage3DTexture (res, res, res);
35 tex.type = THREE .FloatType;
36 tex.format = THREE .RGBAFormat;
37 tex.minFilter = tex.magFilter = THREE .NearestFilter;
38 const center = uniform ( new THREE . Vector3 ()),
39 extent = uniform ( 1 ),
40 coverage = uniform ( 0.5 ),
41 s = uniform (seed + j * 7 );
42 const kernel = Fn (() => {
43 const i = instanceIndex,
44 c = uvec3 (i. mod ( uint (res)), i. div ( uint (res)). mod ( uint (res)), i. div ( uint (res * res)));
45 const p = vec3 (c). add ( 0.5 ). div (res). sub ( 0.5 ). mul (extent. mul ( 2 )). add (center). toVar ();
46 const e = voronoiEdge (p, s, coverage). toVar ();
47 textureStore (tex, c, vec4 (e.xyz, dot (e.xyz, p). add (e.w))). toWriteOnly ();
48 })(). compute (res ** 3 , [ 64 ]);
49 this .entries. push ({ tex, center, extent, coverage, s, kernel });
50 }
51 this . update ();
52 }
53 update () {
54 const C = D .ice.cracks,
55 sig = JSON . stringify ([
56 C .largeScale,
57 C .fineScale,
58 C .warp,
59 C .coverage,
60 C .fineCoverage,
61 this .seed,
62 ]);
63 if (sig === this .signature) return ;
64 this .signature = sig;
65 const seedV = new THREE . Vector3 ( this .seed * 0.731 , this .seed * 0.137 , this .seed * 0.529 ),
66 ratio = C .fineScale / C .largeScale;
67 const e0 = this .entries[ 0 ],
68 e1 = this .entries[ 1 ];
69 e0.center.value. copy (seedV). multiplyScalar ( 0.37 );
70 e0.extent.value = this .bound * C .largeScale + Math. abs ( C .warp) * 2 + 0.1 ;
71 e0.coverage.value = C .coverage;
72 e1.center.value. copy (e0.center.value). multiplyScalar (ratio). add (seedV);
73 e1.extent.value = e0.extent.value * ratio;
74 e1.coverage.value = C .fineCoverage;
75 for ( const e of this .entries) this .renderer. compute (e.kernel);
76 rwMetrics.materialPlanes = {
77 res: this .res,
78 bytes: 2 * this .res ** 3 * 16 ,
79 builds: (rwMetrics.materialPlanes?.builds || 0 ) + 1 ,
80 };
81 }
82 sample ( p : any , fine = false ) {
83 const e = this .entries[ + fine],
84 uv = p. sub (e.center). div (e.extent. mul ( 2 )). add ( 0.5 );
85 const plane = texture3D (e.tex). sample (uv). level ( 0 ). toVar ();
86 return vec4 (plane.xyz, abs (plane.w. sub ( dot (plane.xyz, p))));
87 }
88 dispose () {
89 for ( const e of this .entries) {
90 e.tex. dispose ();
91 e.kernel. dispose ();
92 }
93 }
94 }