@multiplekex/shallot 0.2.3 → 0.2.5

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 (42) hide show
  1. package/package.json +1 -1
  2. package/src/extras/arrows/index.ts +3 -3
  3. package/src/extras/caustic.ts +37 -0
  4. package/src/extras/gradient/index.ts +63 -69
  5. package/src/extras/index.ts +3 -0
  6. package/src/extras/lines/index.ts +3 -3
  7. package/src/extras/skylab/index.ts +314 -0
  8. package/src/extras/text/font.ts +69 -14
  9. package/src/extras/text/index.ts +15 -7
  10. package/src/extras/text/sdf.ts +13 -2
  11. package/src/extras/water.ts +64 -0
  12. package/src/standard/defaults.ts +2 -0
  13. package/src/standard/index.ts +2 -0
  14. package/src/standard/raster/index.ts +517 -0
  15. package/src/standard/{render → raytracing}/bvh/blas.ts +3 -3
  16. package/src/standard/{render → raytracing}/bvh/tlas.ts +3 -0
  17. package/src/standard/{render → raytracing}/depth.ts +9 -9
  18. package/src/standard/raytracing/index.ts +380 -0
  19. package/src/standard/{render → raytracing}/instance.ts +3 -0
  20. package/src/standard/raytracing/shaders.ts +815 -0
  21. package/src/standard/{render → raytracing}/triangle.ts +1 -1
  22. package/src/standard/render/camera.ts +88 -80
  23. package/src/standard/render/index.ts +68 -208
  24. package/src/standard/render/indirect.ts +9 -10
  25. package/src/standard/render/mesh/index.ts +35 -166
  26. package/src/standard/render/overlay.ts +4 -4
  27. package/src/standard/render/pass.ts +1 -1
  28. package/src/standard/render/postprocess.ts +75 -50
  29. package/src/standard/render/scene.ts +28 -16
  30. package/src/standard/render/surface/compile.ts +6 -8
  31. package/src/standard/render/surface/noise.ts +15 -2
  32. package/src/standard/render/surface/shaders.ts +257 -0
  33. package/src/standard/render/surface/structs.ts +13 -6
  34. package/src/standard/render/forward/index.ts +0 -259
  35. package/src/standard/render/forward/raster.ts +0 -228
  36. package/src/standard/render/shaders.ts +0 -484
  37. package/src/standard/render/surface/wgsl.ts +0 -573
  38. /package/src/standard/{render → raytracing}/bvh/radix.ts +0 -0
  39. /package/src/standard/{render → raytracing}/bvh/structs.ts +0 -0
  40. /package/src/standard/{render → raytracing}/bvh/traverse.ts +0 -0
  41. /package/src/standard/{render → raytracing}/intersection.ts +0 -0
  42. /package/src/standard/{render → raytracing}/ray.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 };
@@ -242,7 +242,23 @@ export interface SunParams {
242
242
  color: number;
243
243
  }
244
244
 
245
- const sceneBuffer = new ArrayBuffer(512);
245
+ export function getClearColor(eid: number): { r: number; g: number; b: number } {
246
+ const packed = Camera.clearColor[eid];
247
+ return {
248
+ r: ((packed >> 16) & 0xff) / 255,
249
+ g: ((packed >> 8) & 0xff) / 255,
250
+ b: (packed & 0xff) / 255,
251
+ };
252
+ }
253
+
254
+ export function hasSkyComponent(
255
+ state: { hasComponent(eid: number, c: object): boolean },
256
+ eid: number
257
+ ): boolean {
258
+ return state.hasComponent(eid, Sky);
259
+ }
260
+
261
+ const sceneBuffer = new ArrayBuffer(352);
246
262
  const scene = new Float32Array(sceneBuffer);
247
263
  const sceneU32 = new Uint32Array(sceneBuffer);
248
264
 
@@ -256,13 +272,7 @@ export function uploadCamera(
256
272
  shadowSamples: number = 1,
257
273
  reflectionDepth: number = 0,
258
274
  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
275
+ instanceCount: number = 0
266
276
  ): void {
267
277
  const aspect = width / height;
268
278
  const proj =
@@ -273,114 +283,112 @@ export function uploadCamera(
273
283
  const view = invert(world);
274
284
  const viewProj = multiply(proj, view);
275
285
 
276
- // viewProj (0-63)
277
286
  scene.set(viewProj, 0);
278
- // world (64-127)
279
287
  scene.set(world, 16);
280
288
 
281
- // clearColor (176-191) - note: 128-175 is light uniforms, written separately
282
289
  const clearColorPacked = Camera.clearColor[eid];
283
290
  scene[44] = ((clearColorPacked >> 16) & 0xff) / 255;
284
291
  scene[45] = ((clearColorPacked >> 8) & 0xff) / 255;
285
292
  scene[46] = (clearColorPacked & 0xff) / 255;
286
293
  scene[47] = 1.0;
287
294
 
288
- // cameraMode, cameraSize, viewport (192-207)
289
295
  scene[48] = Camera.mode[eid];
290
296
  scene[49] = Camera.size[eid];
291
297
  scene[50] = width;
292
298
  scene[51] = height;
293
299
 
294
- // fov, near, far, shadowSoftness (208-223)
295
300
  scene[52] = Camera.fov[eid];
296
301
  scene[53] = Camera.near[eid];
297
302
  scene[54] = Camera.far[eid];
298
303
  scene[55] = shadowSoftness;
299
304
 
300
- // shadowSamples, reflectionDepth, refractionDepth, instanceCount (224-239)
301
305
  sceneU32[56] = shadowSamples;
302
306
  sceneU32[57] = reflectionDepth;
303
307
  sceneU32[58] = refractionDepth;
304
308
  sceneU32[59] = instanceCount;
305
309
 
306
- // hazeDensity (240-255)
307
- scene[60] = haze?.density ?? 0;
308
- scene[61] = 0;
309
- scene[62] = 0;
310
- scene[63] = 0;
310
+ const planes = extractFrustumPlanes(viewProj);
311
+ scene.set(planes, 64);
312
+
313
+ device.queue.writeBuffer(buffer, 0, scene, 0, 32);
314
+ device.queue.writeBuffer(buffer, 176, scene, 44, 44);
315
+ }
316
+
317
+ const skyArrayBuffer = new ArrayBuffer(176);
318
+ const skyF32 = new Float32Array(skyArrayBuffer);
319
+
320
+ export function uploadSky(
321
+ device: GPUDevice,
322
+ buffer: GPUBuffer,
323
+ haze?: HazeParams,
324
+ sky?: SkyParams,
325
+ moon?: MoonParams,
326
+ stars?: StarsParams,
327
+ clouds?: CloudsParams,
328
+ sun?: SunParams
329
+ ): void {
330
+ skyF32[0] = haze?.density ?? 0;
331
+ skyF32[1] = 0;
332
+ skyF32[2] = 0;
333
+ skyF32[3] = 0;
311
334
 
312
- // hazeColor (256-271)
313
335
  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;
336
+ skyF32[4] = ((hazeColorPacked >> 16) & 0xff) / 255;
337
+ skyF32[5] = ((hazeColorPacked >> 8) & 0xff) / 255;
338
+ skyF32[6] = (hazeColorPacked & 0xff) / 255;
339
+ skyF32[7] = 1.0;
318
340
 
319
- // skyZenith (272-287)
320
341
  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;
342
+ skyF32[8] = ((zenithPacked >> 16) & 0xff) / 255;
343
+ skyF32[9] = ((zenithPacked >> 8) & 0xff) / 255;
344
+ skyF32[10] = (zenithPacked & 0xff) / 255;
345
+ skyF32[11] = sky ? 1.0 : 0.0;
325
346
 
326
- // skyHorizon (288-303)
327
347
  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;
332
-
333
- // frustumPlanes (304-399)
334
- const planes = extractFrustumPlanes(viewProj);
335
- scene.set(planes, 76);
348
+ skyF32[12] = ((horizonPacked >> 16) & 0xff) / 255;
349
+ skyF32[13] = ((horizonPacked >> 8) & 0xff) / 255;
350
+ skyF32[14] = (horizonPacked & 0xff) / 255;
351
+ skyF32[15] = 1.0;
336
352
 
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;
353
+ skyF32[16] = moon?.phase ?? 0.5;
354
+ skyF32[17] = moon?.glow ?? 0.3;
355
+ skyF32[18] = moon ? 1.0 : 0.0;
356
+ skyF32[19] = 0.0;
342
357
 
343
- // moonDirection (416-431)
344
358
  const moonAzimuth = ((moon?.azimuth ?? 45) * Math.PI) / 180;
345
359
  const moonElevation = ((moon?.elevation ?? 30) * Math.PI) / 180;
346
360
  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)
361
+ skyF32[20] = Math.sin(moonAzimuth) * moonCosEl;
362
+ skyF32[21] = Math.sin(moonElevation);
363
+ skyF32[22] = Math.cos(moonAzimuth) * moonCosEl;
364
+ skyF32[23] = 0.0;
365
+
366
+ skyF32[24] = stars?.intensity ?? 0.8;
367
+ skyF32[25] = stars?.amount ?? 0.5;
368
+ skyF32[26] = stars ? 1.0 : 0.0;
369
+ skyF32[27] = 0.0;
370
+
371
+ skyF32[28] = clouds?.coverage ?? 0;
372
+ skyF32[29] = clouds?.density ?? 0;
373
+ skyF32[30] = clouds?.height ?? 0;
374
+ skyF32[31] = clouds ? 1.0 : 0.0;
375
+
365
376
  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)
377
+ skyF32[32] = ((cloudColorPacked >> 16) & 0xff) / 255;
378
+ skyF32[33] = ((cloudColorPacked >> 8) & 0xff) / 255;
379
+ skyF32[34] = (cloudColorPacked & 0xff) / 255;
380
+ skyF32[35] = 0.0;
381
+
382
+ skyF32[36] = sun?.size ?? 1.0;
383
+ skyF32[37] = sun?.glow ?? 0.5;
384
+ skyF32[38] = sun && sun.color !== 0 ? 1.0 : 0.0;
385
+ skyF32[39] = 0.0;
386
+
378
387
  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;
388
+ skyF32[40] = ((sunColorPacked >> 16) & 0xff) / 255;
389
+ skyF32[41] = ((sunColorPacked >> 8) & 0xff) / 255;
390
+ skyF32[42] = (sunColorPacked & 0xff) / 255;
391
+ skyF32[43] = 0.0;
383
392
 
384
- device.queue.writeBuffer(buffer, 0, scene, 0, 32);
385
- device.queue.writeBuffer(buffer, 176, scene, 44, 84);
393
+ device.queue.writeBuffer(buffer, 0, skyArrayBuffer);
386
394
  }