@multiplekex/shallot 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/package.json +1 -1
  2. package/src/core/component.ts +1 -1
  3. package/src/core/index.ts +1 -13
  4. package/src/core/math.ts +186 -0
  5. package/src/core/state.ts +1 -1
  6. package/src/core/xml.ts +56 -41
  7. package/src/extras/arrows/index.ts +3 -3
  8. package/src/extras/caustic.ts +37 -0
  9. package/src/extras/gradient/index.ts +63 -69
  10. package/src/extras/index.ts +3 -0
  11. package/src/extras/lines/index.ts +3 -3
  12. package/src/extras/orbit/index.ts +1 -1
  13. package/src/extras/skylab/index.ts +314 -0
  14. package/src/extras/text/font.ts +69 -14
  15. package/src/extras/text/index.ts +17 -69
  16. package/src/extras/text/sdf.ts +13 -2
  17. package/src/extras/water/index.ts +119 -0
  18. package/src/standard/defaults.ts +2 -0
  19. package/src/standard/index.ts +2 -0
  20. package/src/standard/raster/batch.ts +149 -0
  21. package/src/standard/raster/forward.ts +832 -0
  22. package/src/standard/raster/index.ts +191 -0
  23. package/src/standard/raster/shadow.ts +408 -0
  24. package/src/standard/{render → raytracing}/bvh/blas.ts +336 -88
  25. package/src/standard/raytracing/bvh/radix.ts +473 -0
  26. package/src/standard/raytracing/bvh/refit.ts +711 -0
  27. package/src/standard/{render → raytracing}/bvh/structs.ts +0 -55
  28. package/src/standard/{render → raytracing}/bvh/tlas.ts +155 -140
  29. package/src/standard/{render → raytracing}/bvh/traverse.ts +72 -64
  30. package/src/standard/{render → raytracing}/depth.ts +9 -9
  31. package/src/standard/raytracing/index.ts +409 -0
  32. package/src/standard/{render → raytracing}/instance.ts +31 -16
  33. package/src/standard/{render → raytracing}/ray.ts +1 -1
  34. package/src/standard/raytracing/shaders.ts +798 -0
  35. package/src/standard/{render → raytracing}/triangle.ts +1 -1
  36. package/src/standard/render/camera.ts +96 -106
  37. package/src/standard/render/data.ts +1 -1
  38. package/src/standard/render/index.ts +136 -220
  39. package/src/standard/render/indirect.ts +9 -10
  40. package/src/standard/render/light.ts +2 -2
  41. package/src/standard/render/mesh.ts +404 -0
  42. package/src/standard/render/overlay.ts +8 -5
  43. package/src/standard/render/pass.ts +1 -1
  44. package/src/standard/render/postprocess.ts +263 -242
  45. package/src/standard/render/scene.ts +28 -16
  46. package/src/standard/render/surface/index.ts +81 -12
  47. package/src/standard/render/surface/shaders.ts +511 -0
  48. package/src/standard/render/surface/structs.ts +23 -6
  49. package/src/standard/tween/tween.ts +44 -115
  50. package/src/standard/render/bvh/radix.ts +0 -476
  51. package/src/standard/render/forward/index.ts +0 -259
  52. package/src/standard/render/forward/raster.ts +0 -228
  53. package/src/standard/render/mesh/box.ts +0 -20
  54. package/src/standard/render/mesh/index.ts +0 -446
  55. package/src/standard/render/mesh/plane.ts +0 -11
  56. package/src/standard/render/mesh/sphere.ts +0 -40
  57. package/src/standard/render/mesh/unified.ts +0 -96
  58. package/src/standard/render/shaders.ts +0 -484
  59. package/src/standard/render/surface/compile.ts +0 -67
  60. package/src/standard/render/surface/noise.ts +0 -45
  61. package/src/standard/render/surface/wgsl.ts +0 -573
  62. /package/src/standard/{render → raytracing}/intersection.ts +0 -0
@@ -1,4 +1,4 @@
1
- import type { MeshData } from "./mesh";
1
+ import type { MeshData } from "../render/mesh";
2
2
  import type { Vec3, Triangle } from "./bvh/structs";
3
3
 
4
4
  export type { Triangle };
@@ -1,11 +1,7 @@
1
1
  import { setTraits } from "../../core/component";
2
2
  import { perspective, orthographic, multiply, invert, extractFrustumPlanes } from "../../core/math";
3
3
  import { WorldTransform } from "../transforms";
4
-
5
- export const RenderMode = {
6
- Raster: 0,
7
- Raytracing: 1,
8
- } as const;
4
+ import { SCENE_UNIFORM_SIZE, SKY_UNIFORM_SIZE } from "./scene";
9
5
 
10
6
  export const CameraMode = {
11
7
  Perspective: 0,
@@ -18,7 +14,6 @@ export const Camera = {
18
14
  far: [] as number[],
19
15
  active: [] as number[],
20
16
  clearColor: [] as number[],
21
- renderMode: [] as number[],
22
17
  mode: [] as number[],
23
18
  size: [] as number[],
24
19
  };
@@ -30,7 +25,6 @@ setTraits(Camera, {
30
25
  far: 1000,
31
26
  active: 1,
32
27
  clearColor: 0x1a1a1a,
33
- renderMode: RenderMode.Raster,
34
28
  mode: CameraMode.Perspective,
35
29
  size: 5,
36
30
  }),
@@ -46,8 +40,6 @@ setTraits(Tonemap, {
46
40
 
47
41
  export const FXAA = {};
48
42
 
49
- export const Raytracing = {};
50
-
51
43
  export const Vignette = {
52
44
  strength: [] as number[],
53
45
  inner: [] as number[],
@@ -80,17 +72,7 @@ setTraits(Quantize, {
80
72
  defaults: () => ({ bands: 8 }),
81
73
  });
82
74
 
83
- export const Shadows = {
84
- softness: [] as number[],
85
- samples: [] as number[],
86
- };
87
-
88
- setTraits(Shadows, {
89
- defaults: () => ({
90
- softness: 0.5,
91
- samples: 1,
92
- }),
93
- });
75
+ export const Shadows = {};
94
76
 
95
77
  export const Reflections = {
96
78
  depth: [] as number[],
@@ -199,7 +181,7 @@ setTraits(Viewport, {
199
181
  defaults: () => ({ width: 0, height: 0 }),
200
182
  });
201
183
 
202
- export interface SkyParams {
184
+ interface SkyParams {
203
185
  zenith: number;
204
186
  horizon: number;
205
187
  }
@@ -212,37 +194,53 @@ export function unpackColor(packed: number): { r: number; g: number; b: number }
212
194
  };
213
195
  }
214
196
 
215
- export interface HazeParams {
197
+ interface HazeParams {
216
198
  density: number;
217
199
  color: number;
218
200
  }
219
201
 
220
- export interface MoonParams {
202
+ interface MoonParams {
221
203
  phase: number;
222
204
  glow: number;
223
205
  azimuth: number;
224
206
  elevation: number;
225
207
  }
226
208
 
227
- export interface StarsParams {
209
+ interface StarsParams {
228
210
  intensity: number;
229
211
  amount: number;
230
212
  }
231
213
 
232
- export interface CloudsParams {
214
+ interface CloudsParams {
233
215
  coverage: number;
234
216
  density: number;
235
217
  height: number;
236
218
  color: number;
237
219
  }
238
220
 
239
- export interface SunParams {
221
+ interface SunParams {
240
222
  size: number;
241
223
  glow: number;
242
224
  color: number;
243
225
  }
244
226
 
245
- const sceneBuffer = new ArrayBuffer(512);
227
+ export function getClearColor(eid: number): { r: number; g: number; b: number } {
228
+ const packed = Camera.clearColor[eid];
229
+ return {
230
+ r: ((packed >> 16) & 0xff) / 255,
231
+ g: ((packed >> 8) & 0xff) / 255,
232
+ b: (packed & 0xff) / 255,
233
+ };
234
+ }
235
+
236
+ export function hasSkyComponent(
237
+ state: { hasComponent(eid: number, c: object): boolean },
238
+ eid: number
239
+ ): boolean {
240
+ return state.hasComponent(eid, Sky);
241
+ }
242
+
243
+ const sceneBuffer = new ArrayBuffer(SCENE_UNIFORM_SIZE);
246
244
  const scene = new Float32Array(sceneBuffer);
247
245
  const sceneU32 = new Uint32Array(sceneBuffer);
248
246
 
@@ -256,13 +254,7 @@ export function uploadCamera(
256
254
  shadowSamples: number = 1,
257
255
  reflectionDepth: number = 0,
258
256
  refractionDepth: number = 0,
259
- instanceCount: number = 0,
260
- haze?: HazeParams,
261
- sky?: SkyParams,
262
- moon?: MoonParams,
263
- stars?: StarsParams,
264
- clouds?: CloudsParams,
265
- sun?: SunParams
257
+ instanceCount: number = 0
266
258
  ): void {
267
259
  const aspect = width / height;
268
260
  const proj =
@@ -273,114 +265,112 @@ export function uploadCamera(
273
265
  const view = invert(world);
274
266
  const viewProj = multiply(proj, view);
275
267
 
276
- // viewProj (0-63)
277
268
  scene.set(viewProj, 0);
278
- // world (64-127)
279
269
  scene.set(world, 16);
280
270
 
281
- // clearColor (176-191) - note: 128-175 is light uniforms, written separately
282
271
  const clearColorPacked = Camera.clearColor[eid];
283
272
  scene[44] = ((clearColorPacked >> 16) & 0xff) / 255;
284
273
  scene[45] = ((clearColorPacked >> 8) & 0xff) / 255;
285
274
  scene[46] = (clearColorPacked & 0xff) / 255;
286
275
  scene[47] = 1.0;
287
276
 
288
- // cameraMode, cameraSize, viewport (192-207)
289
277
  scene[48] = Camera.mode[eid];
290
278
  scene[49] = Camera.size[eid];
291
279
  scene[50] = width;
292
280
  scene[51] = height;
293
281
 
294
- // fov, near, far, shadowSoftness (208-223)
295
282
  scene[52] = Camera.fov[eid];
296
283
  scene[53] = Camera.near[eid];
297
284
  scene[54] = Camera.far[eid];
298
285
  scene[55] = shadowSoftness;
299
286
 
300
- // shadowSamples, reflectionDepth, refractionDepth, instanceCount (224-239)
301
287
  sceneU32[56] = shadowSamples;
302
288
  sceneU32[57] = reflectionDepth;
303
289
  sceneU32[58] = refractionDepth;
304
290
  sceneU32[59] = instanceCount;
305
291
 
306
- // hazeDensity (240-255)
307
- scene[60] = haze?.density ?? 0;
308
- scene[61] = 0;
309
- scene[62] = 0;
310
- scene[63] = 0;
292
+ const planes = extractFrustumPlanes(viewProj);
293
+ scene.set(planes, 64);
294
+
295
+ device.queue.writeBuffer(buffer, 0, scene, 0, 32);
296
+ device.queue.writeBuffer(buffer, 176, scene, 44, 44);
297
+ }
298
+
299
+ const skyArrayBuffer = new ArrayBuffer(SKY_UNIFORM_SIZE);
300
+ const skyF32 = new Float32Array(skyArrayBuffer);
301
+
302
+ export function uploadSky(
303
+ device: GPUDevice,
304
+ buffer: GPUBuffer,
305
+ haze?: HazeParams,
306
+ sky?: SkyParams,
307
+ moon?: MoonParams,
308
+ stars?: StarsParams,
309
+ clouds?: CloudsParams,
310
+ sun?: SunParams
311
+ ): void {
312
+ skyF32[0] = haze?.density ?? 0;
313
+ skyF32[1] = 0;
314
+ skyF32[2] = 0;
315
+ skyF32[3] = 0;
311
316
 
312
- // hazeColor (256-271)
313
317
  const hazeColorPacked = haze?.color ?? 0x8090b0;
314
- scene[64] = ((hazeColorPacked >> 16) & 0xff) / 255;
315
- scene[65] = ((hazeColorPacked >> 8) & 0xff) / 255;
316
- scene[66] = (hazeColorPacked & 0xff) / 255;
317
- scene[67] = 1.0;
318
+ skyF32[4] = ((hazeColorPacked >> 16) & 0xff) / 255;
319
+ skyF32[5] = ((hazeColorPacked >> 8) & 0xff) / 255;
320
+ skyF32[6] = (hazeColorPacked & 0xff) / 255;
321
+ skyF32[7] = 1.0;
318
322
 
319
- // skyZenith (272-287)
320
323
  const zenithPacked = sky?.zenith ?? 0;
321
- scene[68] = ((zenithPacked >> 16) & 0xff) / 255;
322
- scene[69] = ((zenithPacked >> 8) & 0xff) / 255;
323
- scene[70] = (zenithPacked & 0xff) / 255;
324
- scene[71] = sky ? 1.0 : 0.0;
324
+ skyF32[8] = ((zenithPacked >> 16) & 0xff) / 255;
325
+ skyF32[9] = ((zenithPacked >> 8) & 0xff) / 255;
326
+ skyF32[10] = (zenithPacked & 0xff) / 255;
327
+ skyF32[11] = sky ? 1.0 : 0.0;
325
328
 
326
- // skyHorizon (288-303)
327
329
  const horizonPacked = sky?.horizon ?? 0;
328
- scene[72] = ((horizonPacked >> 16) & 0xff) / 255;
329
- scene[73] = ((horizonPacked >> 8) & 0xff) / 255;
330
- scene[74] = (horizonPacked & 0xff) / 255;
331
- scene[75] = 1.0;
330
+ skyF32[12] = ((horizonPacked >> 16) & 0xff) / 255;
331
+ skyF32[13] = ((horizonPacked >> 8) & 0xff) / 255;
332
+ skyF32[14] = (horizonPacked & 0xff) / 255;
333
+ skyF32[15] = 1.0;
332
334
 
333
- // frustumPlanes (304-399)
334
- const planes = extractFrustumPlanes(viewProj);
335
- scene.set(planes, 76);
336
-
337
- // moonParams (400-415)
338
- scene[100] = moon?.phase ?? 0.5;
339
- scene[101] = moon?.glow ?? 0.3;
340
- scene[102] = moon ? 1.0 : 0.0;
341
- scene[103] = 0.0;
335
+ skyF32[16] = moon?.phase ?? 0.5;
336
+ skyF32[17] = moon?.glow ?? 0.3;
337
+ skyF32[18] = moon ? 1.0 : 0.0;
338
+ skyF32[19] = 0.0;
342
339
 
343
- // moonDirection (416-431)
344
340
  const moonAzimuth = ((moon?.azimuth ?? 45) * Math.PI) / 180;
345
341
  const moonElevation = ((moon?.elevation ?? 30) * Math.PI) / 180;
346
342
  const moonCosEl = Math.cos(moonElevation);
347
- scene[104] = Math.sin(moonAzimuth) * moonCosEl;
348
- scene[105] = Math.sin(moonElevation);
349
- scene[106] = Math.cos(moonAzimuth) * moonCosEl;
350
- scene[107] = 0.0;
351
-
352
- // starParams (432-447)
353
- scene[108] = stars?.intensity ?? 0.8;
354
- scene[109] = stars?.amount ?? 0.5;
355
- scene[110] = stars ? 1.0 : 0.0;
356
- scene[111] = 0.0;
357
-
358
- // cloudParams (448-463)
359
- scene[112] = clouds?.coverage ?? 0;
360
- scene[113] = clouds?.density ?? 0;
361
- scene[114] = clouds?.height ?? 0;
362
- scene[115] = clouds ? 1.0 : 0.0;
363
-
364
- // cloudColor (464-479)
343
+ skyF32[20] = Math.sin(moonAzimuth) * moonCosEl;
344
+ skyF32[21] = Math.sin(moonElevation);
345
+ skyF32[22] = Math.cos(moonAzimuth) * moonCosEl;
346
+ skyF32[23] = 0.0;
347
+
348
+ skyF32[24] = stars?.intensity ?? 0.8;
349
+ skyF32[25] = stars?.amount ?? 0.5;
350
+ skyF32[26] = stars ? 1.0 : 0.0;
351
+ skyF32[27] = 0.0;
352
+
353
+ skyF32[28] = clouds?.coverage ?? 0;
354
+ skyF32[29] = clouds?.density ?? 0;
355
+ skyF32[30] = clouds?.height ?? 0;
356
+ skyF32[31] = clouds ? 1.0 : 0.0;
357
+
365
358
  const cloudColorPacked = clouds?.color ?? 0xffffff;
366
- scene[116] = ((cloudColorPacked >> 16) & 0xff) / 255;
367
- scene[117] = ((cloudColorPacked >> 8) & 0xff) / 255;
368
- scene[118] = (cloudColorPacked & 0xff) / 255;
369
- scene[119] = 0.0;
370
-
371
- // sunParams (480-495)
372
- scene[120] = sun?.size ?? 1.0;
373
- scene[121] = sun?.glow ?? 0.5;
374
- scene[122] = sun && sun.color !== 0 ? 1.0 : 0.0;
375
- scene[123] = 0.0;
376
-
377
- // sunVisualColor (496-511)
359
+ skyF32[32] = ((cloudColorPacked >> 16) & 0xff) / 255;
360
+ skyF32[33] = ((cloudColorPacked >> 8) & 0xff) / 255;
361
+ skyF32[34] = (cloudColorPacked & 0xff) / 255;
362
+ skyF32[35] = 0.0;
363
+
364
+ skyF32[36] = sun?.size ?? 1.0;
365
+ skyF32[37] = sun?.glow ?? 0.5;
366
+ skyF32[38] = sun && sun.color !== 0 ? 1.0 : 0.0;
367
+ skyF32[39] = 0.0;
368
+
378
369
  const sunColorPacked = sun?.color ?? 0xffffff;
379
- scene[124] = ((sunColorPacked >> 16) & 0xff) / 255;
380
- scene[125] = ((sunColorPacked >> 8) & 0xff) / 255;
381
- scene[126] = (sunColorPacked & 0xff) / 255;
382
- scene[127] = 0.0;
370
+ skyF32[40] = ((sunColorPacked >> 16) & 0xff) / 255;
371
+ skyF32[41] = ((sunColorPacked >> 8) & 0xff) / 255;
372
+ skyF32[42] = (sunColorPacked & 0xff) / 255;
373
+ skyF32[43] = 0.0;
383
374
 
384
- device.queue.writeBuffer(buffer, 0, scene, 0, 32);
385
- device.queue.writeBuffer(buffer, 176, scene, 44, 84);
375
+ device.queue.writeBuffer(buffer, 0, skyArrayBuffer);
386
376
  }
@@ -38,7 +38,7 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
38
38
  }
39
39
  `;
40
40
 
41
- export interface DataConfig {
41
+ interface DataConfig {
42
42
  colors: GPUBuffer;
43
43
  pbr: GPUBuffer;
44
44
  emission: GPUBuffer;