Setting the file. One moment.
Meshes · Frost Sequence Camera Orbit · heygen-com/hyperframes · Skills Docs
ContentsBack to the top of the page Three Mesh BVH LICENSE
source/src/motion/meshes.ts
source/src/motion/ meshes.ts
TypeScript · 126 lines · 4 KB
new
Map
<
string
,
Promise
<
THREE
.
BufferGeometry
[]>>();
8 async function database () {
9 return new Promise < IDBDatabase >(( resolve , reject ) => {
10 const q = indexedDB. open ( "frost-motion-meshes" , 1 );
11 q. onupgradeneeded = () => q.result. createObjectStore ( "meshes" );
12 q. onsuccess = () => resolve (q.result);
13 q. onerror = () => reject (q.error);
14 });
15 }
16 export function skeletonMeshes ( v : any , progress : ( s : string ) => void ) {
17 const key = JSON . stringify ([
18 "r13" ,
19 v.logoUrl,
20 v.headline1,
21 v.headline2,
22 v.fontWeight,
23 v.textWidth,
24 v.letterSpacing,
25 v.textLineHeight,
26 v.textDepth,
27 v.textBevel,
28 v.textCorner,
29 v.deformStrength,
30 v.deformScale,
31 v.deformSeed,
32 v.textMeshDetail,
33 v.logoMeshDetail,
34 D .shape.logo,
35 D .shape.size,
36 ]);
37 if (memory. has (key)) return memory. get (key) ! ;
38 const promise = ( async () => {
39 let db : IDBDatabase | undefined ;
40 try {
41 db = await database ();
42 const packed : any = await new Promise (( resolve , reject ) => {
43 const q = db ! . transaction ( "meshes" ). objectStore ( "meshes" ). get (key);
44 q. onsuccess = () => resolve (q.result);
45 q. onerror = () => reject (q.error);
46 });
47 if (packed) {
48 db. close ();
49 return packed. map (( p : any ) => {
50 const g = new THREE . BufferGeometry ();
51 g. setAttribute ( "position" , new THREE . BufferAttribute (p.position, 3 ));
52 g. setAttribute ( "normal" , new THREE . BufferAttribute (p.normal, 3 ));
53 g. computeBoundingBox ();
54 return g;
55 });
56 }
57 } catch {}
58 const P = D .shape.logo,
59 fontName =
60 String (v.fontWeight) === "400"
61 ? "Regular"
62 : String (v.fontWeight) === "700"
63 ? "Bold"
64 : "SemiBold" ;
65 const [ shapes , font ] = await Promise . all ([
66 loadLogoShapes (v.logoUrl, P ),
67 loadTypeface ( `assets/fonts/Geist-${ fontName }.ttf` ),
68 ]);
69 const geos = [ extrudeShapes (shapes, P , P .width)],
70 tp = {
71 ... P ,
72 depth: v.textDepth,
73 bevelThickness: v.textBevel,
74 bevelSize: v.textBevel * 0.8 ,
75 bevelOffset: 0 ,
76 cornerRadius: v.textCorner,
77 curveSegments: 10 ,
78 bevelSegments: 4 ,
79 };
80 for ( const text of [v.headline1, v.headline2]) {
81 const lines = String (text)
82 . split ( "|" )
83 . map (( s ) => s. trim ())
84 . filter (Boolean);
85 if ( ! lines. length ) lines. push ( " " );
86 const size =
87 v.textWidth / Math. max ( 0.001 , ... lines. map (( l ) => lineWidth (font, l, v.letterSpacing)));
88 geos. push (
89 extrudeShapes ( textShapes (font, lines, size, v.textLineHeight, v.letterSpacing), tp, size),
90 );
91 }
92 for ( let i = 0 ; i < 3 ; i ++ ) {
93 progress ( `Preparing ${ [ "logo" , "first headline" , "second headline" ][ i ] } mesh…` );
94 await new Promise (( r ) => setTimeout (r, 0 ));
95 const old = geos[i];
96 geos[i] = deformGeometry (
97 old,
98 { strength: v.deformStrength, scale: v.deformScale, seed: v.deformSeed },
99 P .creaseAngle,
100 i ? Number (v.textMeshDetail) : undefined ,
101 i ? undefined : Number (v.logoMeshDetail),
102 );
103 if (old !== geos[i]) old. dispose ();
104 geos[i]. scale ( D .shape.size, D .shape.size, D .shape.size);
105 }
106 if (db) {
107 try {
108 const tx = db. transaction ( "meshes" , "readwrite" );
109 tx. objectStore ( "meshes" ). put (
110 geos. map (( g ) => ({
111 position: g.attributes.position.array,
112 normal: g.attributes.normal.array,
113 })),
114 key,
115 );
116 tx. oncomplete = () => db ! . close ();
117 } catch {
118 db. close ();
119 }
120 }
121 return geos;
122 })();
123 memory. set (key, promise);
124 promise. catch (() => memory. delete (key));
125 return promise;
126 }