@aethervtt/shard-render 0.0.1
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/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/assets.d.ts +104 -0
- package/dist/assets.js +213 -0
- package/dist/atmosphere-model.d.ts +96 -0
- package/dist/atmosphere-model.js +370 -0
- package/dist/atmosphere-nodes.d.ts +55 -0
- package/dist/atmosphere-nodes.js +780 -0
- package/dist/atmosphere-plugin.d.ts +5 -0
- package/dist/atmosphere-plugin.js +42 -0
- package/dist/atmosphere-shaders.d.ts +7 -0
- package/dist/atmosphere-shaders.js +595 -0
- package/dist/atmosphere-state.d.ts +72 -0
- package/dist/atmosphere-state.js +18 -0
- package/dist/atmosphere.d.ts +191 -0
- package/dist/atmosphere.js +950 -0
- package/dist/camera.d.ts +83 -0
- package/dist/camera.js +163 -0
- package/dist/clusters.d.ts +68 -0
- package/dist/clusters.js +288 -0
- package/dist/culling-shaders.d.ts +2 -0
- package/dist/culling-shaders.js +203 -0
- package/dist/culling.d.ts +84 -0
- package/dist/culling.js +498 -0
- package/dist/debug-shaders.d.ts +3 -0
- package/dist/debug-shaders.js +207 -0
- package/dist/debug-views.d.ts +60 -0
- package/dist/debug-views.js +197 -0
- package/dist/deferred-plugin.d.ts +5 -0
- package/dist/deferred-plugin.js +20 -0
- package/dist/deferred-shaders.d.ts +2 -0
- package/dist/deferred-shaders.js +151 -0
- package/dist/deferred.d.ts +22 -0
- package/dist/deferred.js +296 -0
- package/dist/deform.d.ts +80 -0
- package/dist/deform.js +213 -0
- package/dist/describe-plugin.d.ts +5 -0
- package/dist/describe-plugin.js +19 -0
- package/dist/display-nodes.d.ts +5 -0
- package/dist/display-nodes.js +189 -0
- package/dist/dynamic-resolution.d.ts +47 -0
- package/dist/dynamic-resolution.js +191 -0
- package/dist/environment-plugin.d.ts +6 -0
- package/dist/environment-plugin.js +44 -0
- package/dist/environment-shaders.d.ts +2 -0
- package/dist/environment-shaders.js +260 -0
- package/dist/environment-state.d.ts +71 -0
- package/dist/environment-state.js +144 -0
- package/dist/environment.d.ts +70 -0
- package/dist/environment.js +529 -0
- package/dist/forward.d.ts +123 -0
- package/dist/forward.js +1216 -0
- package/dist/fxaa.d.ts +2 -0
- package/dist/fxaa.js +65 -0
- package/dist/gizmo-font.d.ts +21 -0
- package/dist/gizmo-font.js +132 -0
- package/dist/gizmos-plugin.d.ts +5 -0
- package/dist/gizmos-plugin.js +34 -0
- package/dist/gizmos.d.ts +156 -0
- package/dist/gizmos.js +772 -0
- package/dist/gpu-assets.d.ts +114 -0
- package/dist/gpu-assets.js +494 -0
- package/dist/graph.d.ts +204 -0
- package/dist/graph.js +417 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.js +540 -0
- package/dist/instances.d.ts +349 -0
- package/dist/instances.js +1335 -0
- package/dist/large-world.d.ts +13 -0
- package/dist/large-world.js +20 -0
- package/dist/lights.d.ts +160 -0
- package/dist/lights.js +468 -0
- package/dist/material-noise.d.ts +19 -0
- package/dist/material-noise.js +7 -0
- package/dist/material-pipelines.d.ts +46 -0
- package/dist/material-pipelines.js +166 -0
- package/dist/materials.d.ts +108 -0
- package/dist/materials.js +219 -0
- package/dist/noise.d.ts +76 -0
- package/dist/noise.js +286 -0
- package/dist/overlay-registry.d.ts +18 -0
- package/dist/overlay-registry.js +30 -0
- package/dist/overlays.d.ts +35 -0
- package/dist/overlays.js +344 -0
- package/dist/paths.d.ts +20 -0
- package/dist/paths.js +46 -0
- package/dist/picking-plugin.d.ts +2 -0
- package/dist/picking-plugin.js +20 -0
- package/dist/picking.d.ts +94 -0
- package/dist/picking.js +456 -0
- package/dist/pixel-perfect-plugin.d.ts +9 -0
- package/dist/pixel-perfect-plugin.js +135 -0
- package/dist/pixel-perfect.d.ts +27 -0
- package/dist/pixel-perfect.js +70 -0
- package/dist/plugin.d.ts +111 -0
- package/dist/plugin.js +182 -0
- package/dist/pool.d.ts +19 -0
- package/dist/pool.js +43 -0
- package/dist/post-common.d.ts +51 -0
- package/dist/post-common.js +148 -0
- package/dist/post-nodes.d.ts +39 -0
- package/dist/post-nodes.js +849 -0
- package/dist/post-plugin.d.ts +5 -0
- package/dist/post-plugin.js +26 -0
- package/dist/post-shaders.d.ts +8 -0
- package/dist/post-shaders.js +698 -0
- package/dist/post.d.ts +175 -0
- package/dist/post.js +453 -0
- package/dist/readback.d.ts +4 -0
- package/dist/readback.js +95 -0
- package/dist/render-scale.d.ts +53 -0
- package/dist/render-scale.js +63 -0
- package/dist/shaders.d.ts +122 -0
- package/dist/shaders.js +1168 -0
- package/dist/shadows.d.ts +119 -0
- package/dist/shadows.js +562 -0
- package/dist/skin-asset.d.ts +26 -0
- package/dist/skin-asset.js +25 -0
- package/dist/skinning-plugin.d.ts +5 -0
- package/dist/skinning-plugin.js +16 -0
- package/dist/skinning.d.ts +19 -0
- package/dist/skinning.js +343 -0
- package/dist/standard-fields.d.ts +67 -0
- package/dist/standard-fields.js +73 -0
- package/dist/standard.d.ts +7 -0
- package/dist/standard.js +37 -0
- package/dist/stats.d.ts +25 -0
- package/dist/stats.js +18 -0
- package/dist/target.d.ts +55 -0
- package/dist/target.js +70 -0
- package/dist/testing.d.ts +34 -0
- package/dist/testing.js +126 -0
- package/dist/timer.d.ts +28 -0
- package/dist/timer.js +136 -0
- package/dist/view.d.ts +117 -0
- package/dist/view.js +389 -0
- package/dist/visibility.d.ts +10 -0
- package/dist/visibility.js +84 -0
- package/package.json +49 -0
package/dist/readback.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const BYTES_PER_TEXEL = {
|
|
2
|
+
rgba8unorm: 4,
|
|
3
|
+
"rgba8unorm-srgb": 4,
|
|
4
|
+
bgra8unorm: 4,
|
|
5
|
+
"bgra8unorm-srgb": 4,
|
|
6
|
+
rgba16float: 8,
|
|
7
|
+
rgba32float: 16,
|
|
8
|
+
r32float: 4,
|
|
9
|
+
r32uint: 4,
|
|
10
|
+
rg16float: 4,
|
|
11
|
+
r16float: 2,
|
|
12
|
+
r8unorm: 1,
|
|
13
|
+
rg11b10ufloat: 4,
|
|
14
|
+
depth32float: 4
|
|
15
|
+
};
|
|
16
|
+
function halfToFloat(h) {
|
|
17
|
+
const s = h & 32768 ? -1 : 1;
|
|
18
|
+
const e = h >> 10 & 31;
|
|
19
|
+
const f = h & 1023;
|
|
20
|
+
if (e === 0) return s * 2 ** -14 * (f / 1024);
|
|
21
|
+
if (e === 31) return f ? Number.NaN : s * Number.POSITIVE_INFINITY;
|
|
22
|
+
return s * 2 ** (e - 15) * (1 + f / 1024);
|
|
23
|
+
}
|
|
24
|
+
function toFloats(src, format, count, out, o) {
|
|
25
|
+
switch (format) {
|
|
26
|
+
case "rgba16float": {
|
|
27
|
+
const h = new Uint16Array(src, 0, count * 4);
|
|
28
|
+
for (let i = 0; i < count * 4; i++) out[o + i] = halfToFloat(h[i]);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
case "rg16float": {
|
|
32
|
+
const h = new Uint16Array(src, 0, count * 2);
|
|
33
|
+
for (let i = 0; i < count; i++) {
|
|
34
|
+
out[o + i * 4] = halfToFloat(h[i * 2]);
|
|
35
|
+
out[o + i * 4 + 1] = halfToFloat(h[i * 2 + 1]);
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
case "r16float": {
|
|
40
|
+
const h = new Uint16Array(src, 0, count);
|
|
41
|
+
for (let i = 0; i < count; i++) out[o + i * 4] = halfToFloat(h[i]);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
case "rgba32float":
|
|
45
|
+
out.set(new Float32Array(src, 0, count * 4), o);
|
|
46
|
+
return;
|
|
47
|
+
case "r32float":
|
|
48
|
+
case "depth32float": {
|
|
49
|
+
const f = new Float32Array(src, 0, count);
|
|
50
|
+
for (let i = 0; i < count; i++) out[o + i * 4] = f[i];
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
case "r32uint": {
|
|
54
|
+
const u = new Uint32Array(src, 0, count);
|
|
55
|
+
for (let i = 0; i < count; i++) out[o + i * 4] = u[i];
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
case "r8unorm": {
|
|
59
|
+
const b = new Uint8Array(src, 0, count);
|
|
60
|
+
for (let i = 0; i < count; i++) out[o + i * 4] = b[i] / 255;
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
case "rg11b10ufloat": {
|
|
64
|
+
const u = new Uint32Array(src, 0, count);
|
|
65
|
+
for (let i = 0; i < count; i++) {
|
|
66
|
+
const v = u[i];
|
|
67
|
+
out[o + i * 4] = small(v & 2047, 6);
|
|
68
|
+
out[o + i * 4 + 1] = small(v >>> 11 & 2047, 6);
|
|
69
|
+
out[o + i * 4 + 2] = small(v >>> 22 & 1023, 5);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
default: {
|
|
74
|
+
const b = new Uint8Array(src, 0, count * 4);
|
|
75
|
+
const bgra = format.startsWith("bgra");
|
|
76
|
+
for (let i = 0; i < count; i++) {
|
|
77
|
+
out[o + i * 4] = b[i * 4 + (bgra ? 2 : 0)] / 255;
|
|
78
|
+
out[o + i * 4 + 1] = b[i * 4 + 1] / 255;
|
|
79
|
+
out[o + i * 4 + 2] = b[i * 4 + (bgra ? 0 : 2)] / 255;
|
|
80
|
+
out[o + i * 4 + 3] = b[i * 4 + 3] / 255;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function small(v, mantissaBits) {
|
|
86
|
+
const e = v >>> mantissaBits;
|
|
87
|
+
const m = v & (1 << mantissaBits) - 1;
|
|
88
|
+
if (e === 0) return 2 ** -14 * (m / (1 << mantissaBits));
|
|
89
|
+
if (e === 31) return m ? Number.NaN : Number.POSITIVE_INFINITY;
|
|
90
|
+
return 2 ** (e - 15) * (1 + m / (1 << mantissaBits));
|
|
91
|
+
}
|
|
92
|
+
export {
|
|
93
|
+
BYTES_PER_TEXEL,
|
|
94
|
+
toFloats
|
|
95
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type World } from '@aethervtt/shard-core';
|
|
2
|
+
export interface RenderScaleValue {
|
|
3
|
+
/** auto: the controller moves `scale` to hold the frame budget. fixed: `scale` stays as set. */
|
|
4
|
+
mode: 'auto' | 'fixed';
|
|
5
|
+
/** Render resolution as a fraction of the window's backing size. The controller writes it. */
|
|
6
|
+
scale: number;
|
|
7
|
+
/** Bounds for auto mode. */
|
|
8
|
+
min: number;
|
|
9
|
+
max: number;
|
|
10
|
+
/**
|
|
11
|
+
* Frame budget auto mode holds, in ms. 0 (the default): one refresh of the display
|
|
12
|
+
* (DisplayRate), so a 120 Hz screen gets 8.3 ms, but never faster than `maxHz`.
|
|
13
|
+
*/
|
|
14
|
+
targetMs: number;
|
|
15
|
+
/** With targetMs 0: the fastest refresh rate worth holding; above it, frames get this budget. */
|
|
16
|
+
maxHz: number;
|
|
17
|
+
/** The budget auto mode is holding now, in ms. Read-only. */
|
|
18
|
+
budgetMs: number;
|
|
19
|
+
/** Contrast-adaptive sharpening of the upscale, 0–1. */
|
|
20
|
+
sharpen: number;
|
|
21
|
+
/** Window cameras the scale applied to last frame. Read-only. */
|
|
22
|
+
windowViews: number;
|
|
23
|
+
/** What auto mode measures: GPU frame time, the frame interval, or nothing. Read-only. */
|
|
24
|
+
signal: 'gpu' | 'frame' | 'none';
|
|
25
|
+
/** The smoothed measurement, in ms. Read-only. */
|
|
26
|
+
measuredMs: number;
|
|
27
|
+
}
|
|
28
|
+
export declare const RenderScale: import("@aethervtt/shard-core").ResourceDef<RenderScaleValue>;
|
|
29
|
+
/** Scales snap to this (1 / STEPS), so the texture pool sees few sizes. */
|
|
30
|
+
export declare const SCALE_STEP = 0.05;
|
|
31
|
+
export declare const STEPS = 20;
|
|
32
|
+
export declare const LOWEST = 0.25;
|
|
33
|
+
export declare const HIGHEST = 2;
|
|
34
|
+
/** A size at a render scale, in whole pixels. Scales outside 0.25–2 are clamped. */
|
|
35
|
+
export declare function scaledSize(size: number, scale: number): number;
|
|
36
|
+
/** The renderScale section of `render.describe`. */
|
|
37
|
+
export declare function describeRenderScale(world: World): {
|
|
38
|
+
mode: "auto" | "fixed";
|
|
39
|
+
scale: number;
|
|
40
|
+
min: number;
|
|
41
|
+
max: number;
|
|
42
|
+
targetMs: number;
|
|
43
|
+
maxHz: number;
|
|
44
|
+
budgetMs: number;
|
|
45
|
+
displayHz: number | undefined;
|
|
46
|
+
sharpen: number;
|
|
47
|
+
signal: "frame" | "gpu" | "none";
|
|
48
|
+
measuredMs: number | undefined;
|
|
49
|
+
views: Record<string, {
|
|
50
|
+
render: [number, number];
|
|
51
|
+
display: [number, number];
|
|
52
|
+
}>;
|
|
53
|
+
} | undefined;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { defineResource } from "@aethervtt/shard-core";
|
|
2
|
+
import { DisplayRate } from "@aethervtt/shard-runtime";
|
|
3
|
+
import { Views } from "./plugin.js";
|
|
4
|
+
const RenderScale = defineResource("render/RenderScale", {
|
|
5
|
+
description: "Render resolution of window cameras (0051): the scene renders at scale \xD7 the window size and is upscaled, UI stays native. auto moves the scale between min and max to hold the frame budget: targetMs, or one display refresh (DisplayRate) when it is 0.",
|
|
6
|
+
init: () => ({
|
|
7
|
+
mode: "auto",
|
|
8
|
+
scale: 1,
|
|
9
|
+
min: 0.5,
|
|
10
|
+
max: 1,
|
|
11
|
+
targetMs: 0,
|
|
12
|
+
maxHz: 144,
|
|
13
|
+
budgetMs: 1e3 / 60,
|
|
14
|
+
sharpen: 0.25,
|
|
15
|
+
windowViews: 0,
|
|
16
|
+
signal: "none",
|
|
17
|
+
measuredMs: 0
|
|
18
|
+
})
|
|
19
|
+
});
|
|
20
|
+
const SCALE_STEP = 0.05;
|
|
21
|
+
const STEPS = 20;
|
|
22
|
+
const LOWEST = 0.25;
|
|
23
|
+
const HIGHEST = 2;
|
|
24
|
+
const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
|
|
25
|
+
function scaledSize(size, scale) {
|
|
26
|
+
return Math.max(1, Math.round(size * clamp(scale, LOWEST, HIGHEST)));
|
|
27
|
+
}
|
|
28
|
+
function describeRenderScale(world) {
|
|
29
|
+
const s = world.tryResource(RenderScale);
|
|
30
|
+
if (!s) return void 0;
|
|
31
|
+
const views = {};
|
|
32
|
+
for (const v of world.resource(Views).list) {
|
|
33
|
+
const cam = v.data.camera;
|
|
34
|
+
if (!cam || !v.target.renderScale) continue;
|
|
35
|
+
views[v.name] = {
|
|
36
|
+
render: [cam.width, cam.height],
|
|
37
|
+
display: [cam.displayWidth, cam.displayHeight]
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
mode: s.mode,
|
|
42
|
+
scale: s.scale,
|
|
43
|
+
min: s.min,
|
|
44
|
+
max: s.max,
|
|
45
|
+
targetMs: s.targetMs,
|
|
46
|
+
maxHz: s.maxHz,
|
|
47
|
+
budgetMs: Math.round(s.budgetMs * 100) / 100,
|
|
48
|
+
displayHz: world.tryResource(DisplayRate)?.hz,
|
|
49
|
+
sharpen: s.sharpen,
|
|
50
|
+
signal: s.signal,
|
|
51
|
+
measuredMs: s.signal === "none" ? void 0 : Math.round(s.measuredMs * 100) / 100,
|
|
52
|
+
views
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
HIGHEST,
|
|
57
|
+
LOWEST,
|
|
58
|
+
RenderScale,
|
|
59
|
+
SCALE_STEP,
|
|
60
|
+
STEPS,
|
|
61
|
+
describeRenderScale,
|
|
62
|
+
scaledSize
|
|
63
|
+
};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { type ShaderLibrary } from '@aethervtt/shard-shader';
|
|
2
|
+
/** Per-view uniforms. A schema, so the WGSL struct and the CPU packing come from one place. */
|
|
3
|
+
export declare const ViewUniform: import("@aethervtt/shard-core").ComponentDef<{
|
|
4
|
+
readonly viewProj: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
5
|
+
readonly view: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
6
|
+
readonly invViewProj: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
7
|
+
readonly cameraPosition: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec3> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32">);
|
|
8
|
+
/** Scene luminance to pre-exposed HDR: what the HDR target stores. */
|
|
9
|
+
readonly exposure: import("@aethervtt/shard-core").FieldType<number, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<number> | undefined) => import("@aethervtt/shard-core").FieldType<number, "f32">);
|
|
10
|
+
/** width, height, 1/width, 1/height. */
|
|
11
|
+
readonly viewport: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec4> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32">);
|
|
12
|
+
/** Cluster slices: near, far, slices / ln(far / near), debug mode (1 clusters, 2 cascades). */
|
|
13
|
+
readonly clusterParams: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec4> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32">);
|
|
14
|
+
/** Ambient luminance (cd/m²), linear color. */
|
|
15
|
+
readonly ambient: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec3> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32">);
|
|
16
|
+
/** Environment: intensity (cd/m² per unit), cos and sin of its rotation, enabled (w). */
|
|
17
|
+
readonly envParams: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec4> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32">);
|
|
18
|
+
/** viewProj without the TAA jitter, this frame and last (motion vectors). */
|
|
19
|
+
readonly viewProjNoJitter: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
20
|
+
readonly prevViewProj: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
21
|
+
/** TAA jitter in pixels (xy), frames rendered (z). */
|
|
22
|
+
readonly jitter: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec4> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32">);
|
|
23
|
+
/**
|
|
24
|
+
* Per directional light (column i): the atmosphere's transmittance (rgb) between the camera and
|
|
25
|
+
* that sun, applied to its light (spec 0044). All ones without an atmosphere.
|
|
26
|
+
*/
|
|
27
|
+
readonly sunTransmittance: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
28
|
+
}>;
|
|
29
|
+
export declare const viewLayout: import("@aethervtt/shard-shader").WgslLayout<{
|
|
30
|
+
readonly viewProj: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
31
|
+
readonly view: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
32
|
+
readonly invViewProj: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
33
|
+
readonly cameraPosition: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec3> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32">);
|
|
34
|
+
/** Scene luminance to pre-exposed HDR: what the HDR target stores. */
|
|
35
|
+
readonly exposure: import("@aethervtt/shard-core").FieldType<number, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<number> | undefined) => import("@aethervtt/shard-core").FieldType<number, "f32">);
|
|
36
|
+
/** width, height, 1/width, 1/height. */
|
|
37
|
+
readonly viewport: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec4> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32">);
|
|
38
|
+
/** Cluster slices: near, far, slices / ln(far / near), debug mode (1 clusters, 2 cascades). */
|
|
39
|
+
readonly clusterParams: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec4> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32">);
|
|
40
|
+
/** Ambient luminance (cd/m²), linear color. */
|
|
41
|
+
readonly ambient: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec3> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32">);
|
|
42
|
+
/** Environment: intensity (cd/m² per unit), cos and sin of its rotation, enabled (w). */
|
|
43
|
+
readonly envParams: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec4> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32">);
|
|
44
|
+
/** viewProj without the TAA jitter, this frame and last (motion vectors). */
|
|
45
|
+
readonly viewProjNoJitter: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
46
|
+
readonly prevViewProj: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
47
|
+
/** TAA jitter in pixels (xy), frames rendered (z). */
|
|
48
|
+
readonly jitter: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<import("@aethervtt/shard-core").Vec4> | undefined) => import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec4, "f32">);
|
|
49
|
+
/**
|
|
50
|
+
* Per directional light (column i): the atmosphere's transmittance (rgb) between the camera and
|
|
51
|
+
* that sun, applied to its light (spec 0044). All ones without an atmosphere.
|
|
52
|
+
*/
|
|
53
|
+
readonly sunTransmittance: import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32"> & ((options?: import("@aethervtt/shard-core").FieldOptions<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]> | undefined) => import("@aethervtt/shard-core").FieldType<[number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], "f32">);
|
|
54
|
+
}>;
|
|
55
|
+
export declare const materialLayout: import("@aethervtt/shard-shader").WgslLayout<{
|
|
56
|
+
baseColor: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Color, "f32">;
|
|
57
|
+
metallic: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
58
|
+
roughness: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
59
|
+
emissive: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Color, "f32">;
|
|
60
|
+
emissiveLuminance: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
61
|
+
doubleSided: import("@aethervtt/shard-core").FieldType<boolean, "u8">;
|
|
62
|
+
alphaMode: import("@aethervtt/shard-core").FieldType<"additive" | "alpha" | "mask" | "opaque" | "premultiplied", "u8">;
|
|
63
|
+
alphaCutoff: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
64
|
+
normalScale: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
65
|
+
occlusionStrength: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
66
|
+
baseColorTexture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").InferFields<{
|
|
67
|
+
texture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").AssetRef<"Texture"> | null, "object">;
|
|
68
|
+
uv: import("@aethervtt/shard-core").FieldType<number, "u8">;
|
|
69
|
+
offset: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
70
|
+
scale: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
71
|
+
rotation: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
72
|
+
wrap: import("@aethervtt/shard-core").FieldType<"clamp" | "mirror" | "repeat", "u8">;
|
|
73
|
+
filter: import("@aethervtt/shard-core").FieldType<"linear" | "nearest", "u8">;
|
|
74
|
+
}>, "object">;
|
|
75
|
+
metallicRoughnessTexture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").InferFields<{
|
|
76
|
+
texture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").AssetRef<"Texture"> | null, "object">;
|
|
77
|
+
uv: import("@aethervtt/shard-core").FieldType<number, "u8">;
|
|
78
|
+
offset: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
79
|
+
scale: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
80
|
+
rotation: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
81
|
+
wrap: import("@aethervtt/shard-core").FieldType<"clamp" | "mirror" | "repeat", "u8">;
|
|
82
|
+
filter: import("@aethervtt/shard-core").FieldType<"linear" | "nearest", "u8">;
|
|
83
|
+
}>, "object">;
|
|
84
|
+
normalTexture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").InferFields<{
|
|
85
|
+
texture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").AssetRef<"Texture"> | null, "object">;
|
|
86
|
+
uv: import("@aethervtt/shard-core").FieldType<number, "u8">;
|
|
87
|
+
offset: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
88
|
+
scale: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
89
|
+
rotation: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
90
|
+
wrap: import("@aethervtt/shard-core").FieldType<"clamp" | "mirror" | "repeat", "u8">;
|
|
91
|
+
filter: import("@aethervtt/shard-core").FieldType<"linear" | "nearest", "u8">;
|
|
92
|
+
}>, "object">;
|
|
93
|
+
occlusionTexture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").InferFields<{
|
|
94
|
+
texture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").AssetRef<"Texture"> | null, "object">;
|
|
95
|
+
uv: import("@aethervtt/shard-core").FieldType<number, "u8">;
|
|
96
|
+
offset: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
97
|
+
scale: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
98
|
+
rotation: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
99
|
+
wrap: import("@aethervtt/shard-core").FieldType<"clamp" | "mirror" | "repeat", "u8">;
|
|
100
|
+
filter: import("@aethervtt/shard-core").FieldType<"linear" | "nearest", "u8">;
|
|
101
|
+
}>, "object">;
|
|
102
|
+
emissiveTexture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").InferFields<{
|
|
103
|
+
texture: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").AssetRef<"Texture"> | null, "object">;
|
|
104
|
+
uv: import("@aethervtt/shard-core").FieldType<number, "u8">;
|
|
105
|
+
offset: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
106
|
+
scale: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
|
|
107
|
+
rotation: import("@aethervtt/shard-core").FieldType<number, "f32">;
|
|
108
|
+
wrap: import("@aethervtt/shard-core").FieldType<"clamp" | "mirror" | "repeat", "u8">;
|
|
109
|
+
filter: import("@aethervtt/shard-core").FieldType<"linear" | "nearest", "u8">;
|
|
110
|
+
}>, "object">;
|
|
111
|
+
}>;
|
|
112
|
+
/**
|
|
113
|
+
* Engine shader modules. Shading is split in two, so every path can reuse every material: the
|
|
114
|
+
* surface stage (`shard::pbr::material`, hook `pbr_input`) produces a `PbrInput`; the lighting stage
|
|
115
|
+
* (`shard::pbr::lighting`) is the only code that evaluates lights. Views render pre-exposed HDR
|
|
116
|
+
* (radiance × exposure); the tonemap pass turns it into display values.
|
|
117
|
+
*/
|
|
118
|
+
export declare const ENGINE_SHADERS: Record<string, string>;
|
|
119
|
+
/** Registers a group of engine WGSL modules. Each render feature registers its own. */
|
|
120
|
+
export declare function registerShaders(library: ShaderLibrary, modules: Record<string, string>): void;
|
|
121
|
+
/** Core render's WGSL. Features (atmosphere, post, deferred, ...) register theirs in their plugins. */
|
|
122
|
+
export declare function registerEngineShaders(library: ShaderLibrary): void;
|