@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.
- package/package.json +1 -1
- package/src/core/component.ts +1 -1
- package/src/core/index.ts +1 -13
- package/src/core/math.ts +186 -0
- package/src/core/state.ts +1 -1
- package/src/core/xml.ts +56 -41
- package/src/extras/arrows/index.ts +3 -3
- package/src/extras/caustic.ts +37 -0
- package/src/extras/gradient/index.ts +63 -69
- package/src/extras/index.ts +3 -0
- package/src/extras/lines/index.ts +3 -3
- package/src/extras/orbit/index.ts +1 -1
- package/src/extras/skylab/index.ts +314 -0
- package/src/extras/text/font.ts +69 -14
- package/src/extras/text/index.ts +17 -69
- package/src/extras/text/sdf.ts +13 -2
- package/src/extras/water/index.ts +119 -0
- package/src/standard/defaults.ts +2 -0
- package/src/standard/index.ts +2 -0
- package/src/standard/raster/batch.ts +149 -0
- package/src/standard/raster/forward.ts +832 -0
- package/src/standard/raster/index.ts +191 -0
- package/src/standard/raster/shadow.ts +408 -0
- package/src/standard/{render → raytracing}/bvh/blas.ts +336 -88
- package/src/standard/raytracing/bvh/radix.ts +473 -0
- package/src/standard/raytracing/bvh/refit.ts +711 -0
- package/src/standard/{render → raytracing}/bvh/structs.ts +0 -55
- package/src/standard/{render → raytracing}/bvh/tlas.ts +155 -140
- package/src/standard/{render → raytracing}/bvh/traverse.ts +72 -64
- package/src/standard/{render → raytracing}/depth.ts +9 -9
- package/src/standard/raytracing/index.ts +409 -0
- package/src/standard/{render → raytracing}/instance.ts +31 -16
- package/src/standard/{render → raytracing}/ray.ts +1 -1
- package/src/standard/raytracing/shaders.ts +798 -0
- package/src/standard/{render → raytracing}/triangle.ts +1 -1
- package/src/standard/render/camera.ts +96 -106
- package/src/standard/render/data.ts +1 -1
- package/src/standard/render/index.ts +136 -220
- package/src/standard/render/indirect.ts +9 -10
- package/src/standard/render/light.ts +2 -2
- package/src/standard/render/mesh.ts +404 -0
- package/src/standard/render/overlay.ts +8 -5
- package/src/standard/render/pass.ts +1 -1
- package/src/standard/render/postprocess.ts +263 -242
- package/src/standard/render/scene.ts +28 -16
- package/src/standard/render/surface/index.ts +81 -12
- package/src/standard/render/surface/shaders.ts +511 -0
- package/src/standard/render/surface/structs.ts +23 -6
- package/src/standard/tween/tween.ts +44 -115
- package/src/standard/render/bvh/radix.ts +0 -476
- package/src/standard/render/forward/index.ts +0 -259
- package/src/standard/render/forward/raster.ts +0 -228
- package/src/standard/render/mesh/box.ts +0 -20
- package/src/standard/render/mesh/index.ts +0 -446
- package/src/standard/render/mesh/plane.ts +0 -11
- package/src/standard/render/mesh/sphere.ts +0 -40
- package/src/standard/render/mesh/unified.ts +0 -96
- package/src/standard/render/shaders.ts +0 -484
- package/src/standard/render/surface/compile.ts +0 -67
- package/src/standard/render/surface/noise.ts +0 -45
- package/src/standard/render/surface/wgsl.ts +0 -573
- /package/src/standard/{render → raytracing}/intersection.ts +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
197
|
+
interface HazeParams {
|
|
216
198
|
density: number;
|
|
217
199
|
color: number;
|
|
218
200
|
}
|
|
219
201
|
|
|
220
|
-
|
|
202
|
+
interface MoonParams {
|
|
221
203
|
phase: number;
|
|
222
204
|
glow: number;
|
|
223
205
|
azimuth: number;
|
|
224
206
|
elevation: number;
|
|
225
207
|
}
|
|
226
208
|
|
|
227
|
-
|
|
209
|
+
interface StarsParams {
|
|
228
210
|
intensity: number;
|
|
229
211
|
amount: number;
|
|
230
212
|
}
|
|
231
213
|
|
|
232
|
-
|
|
214
|
+
interface CloudsParams {
|
|
233
215
|
coverage: number;
|
|
234
216
|
density: number;
|
|
235
217
|
height: number;
|
|
236
218
|
color: number;
|
|
237
219
|
}
|
|
238
220
|
|
|
239
|
-
|
|
221
|
+
interface SunParams {
|
|
240
222
|
size: number;
|
|
241
223
|
glow: number;
|
|
242
224
|
color: number;
|
|
243
225
|
}
|
|
244
226
|
|
|
245
|
-
|
|
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
|
-
|
|
307
|
-
scene
|
|
308
|
-
|
|
309
|
-
scene
|
|
310
|
-
scene
|
|
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
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
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,
|
|
385
|
-
device.queue.writeBuffer(buffer, 176, scene, 44, 84);
|
|
375
|
+
device.queue.writeBuffer(buffer, 0, skyArrayBuffer);
|
|
386
376
|
}
|