@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.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/assets.d.ts +104 -0
  4. package/dist/assets.js +213 -0
  5. package/dist/atmosphere-model.d.ts +96 -0
  6. package/dist/atmosphere-model.js +370 -0
  7. package/dist/atmosphere-nodes.d.ts +55 -0
  8. package/dist/atmosphere-nodes.js +780 -0
  9. package/dist/atmosphere-plugin.d.ts +5 -0
  10. package/dist/atmosphere-plugin.js +42 -0
  11. package/dist/atmosphere-shaders.d.ts +7 -0
  12. package/dist/atmosphere-shaders.js +595 -0
  13. package/dist/atmosphere-state.d.ts +72 -0
  14. package/dist/atmosphere-state.js +18 -0
  15. package/dist/atmosphere.d.ts +191 -0
  16. package/dist/atmosphere.js +950 -0
  17. package/dist/camera.d.ts +83 -0
  18. package/dist/camera.js +163 -0
  19. package/dist/clusters.d.ts +68 -0
  20. package/dist/clusters.js +288 -0
  21. package/dist/culling-shaders.d.ts +2 -0
  22. package/dist/culling-shaders.js +203 -0
  23. package/dist/culling.d.ts +84 -0
  24. package/dist/culling.js +498 -0
  25. package/dist/debug-shaders.d.ts +3 -0
  26. package/dist/debug-shaders.js +207 -0
  27. package/dist/debug-views.d.ts +60 -0
  28. package/dist/debug-views.js +197 -0
  29. package/dist/deferred-plugin.d.ts +5 -0
  30. package/dist/deferred-plugin.js +20 -0
  31. package/dist/deferred-shaders.d.ts +2 -0
  32. package/dist/deferred-shaders.js +151 -0
  33. package/dist/deferred.d.ts +22 -0
  34. package/dist/deferred.js +296 -0
  35. package/dist/deform.d.ts +80 -0
  36. package/dist/deform.js +213 -0
  37. package/dist/describe-plugin.d.ts +5 -0
  38. package/dist/describe-plugin.js +19 -0
  39. package/dist/display-nodes.d.ts +5 -0
  40. package/dist/display-nodes.js +189 -0
  41. package/dist/dynamic-resolution.d.ts +47 -0
  42. package/dist/dynamic-resolution.js +191 -0
  43. package/dist/environment-plugin.d.ts +6 -0
  44. package/dist/environment-plugin.js +44 -0
  45. package/dist/environment-shaders.d.ts +2 -0
  46. package/dist/environment-shaders.js +260 -0
  47. package/dist/environment-state.d.ts +71 -0
  48. package/dist/environment-state.js +144 -0
  49. package/dist/environment.d.ts +70 -0
  50. package/dist/environment.js +529 -0
  51. package/dist/forward.d.ts +123 -0
  52. package/dist/forward.js +1216 -0
  53. package/dist/fxaa.d.ts +2 -0
  54. package/dist/fxaa.js +65 -0
  55. package/dist/gizmo-font.d.ts +21 -0
  56. package/dist/gizmo-font.js +132 -0
  57. package/dist/gizmos-plugin.d.ts +5 -0
  58. package/dist/gizmos-plugin.js +34 -0
  59. package/dist/gizmos.d.ts +156 -0
  60. package/dist/gizmos.js +772 -0
  61. package/dist/gpu-assets.d.ts +114 -0
  62. package/dist/gpu-assets.js +494 -0
  63. package/dist/graph.d.ts +204 -0
  64. package/dist/graph.js +417 -0
  65. package/dist/index.d.ts +53 -0
  66. package/dist/index.js +540 -0
  67. package/dist/instances.d.ts +349 -0
  68. package/dist/instances.js +1335 -0
  69. package/dist/large-world.d.ts +13 -0
  70. package/dist/large-world.js +20 -0
  71. package/dist/lights.d.ts +160 -0
  72. package/dist/lights.js +468 -0
  73. package/dist/material-noise.d.ts +19 -0
  74. package/dist/material-noise.js +7 -0
  75. package/dist/material-pipelines.d.ts +46 -0
  76. package/dist/material-pipelines.js +166 -0
  77. package/dist/materials.d.ts +108 -0
  78. package/dist/materials.js +219 -0
  79. package/dist/noise.d.ts +76 -0
  80. package/dist/noise.js +286 -0
  81. package/dist/overlay-registry.d.ts +18 -0
  82. package/dist/overlay-registry.js +30 -0
  83. package/dist/overlays.d.ts +35 -0
  84. package/dist/overlays.js +344 -0
  85. package/dist/paths.d.ts +20 -0
  86. package/dist/paths.js +46 -0
  87. package/dist/picking-plugin.d.ts +2 -0
  88. package/dist/picking-plugin.js +20 -0
  89. package/dist/picking.d.ts +94 -0
  90. package/dist/picking.js +456 -0
  91. package/dist/pixel-perfect-plugin.d.ts +9 -0
  92. package/dist/pixel-perfect-plugin.js +135 -0
  93. package/dist/pixel-perfect.d.ts +27 -0
  94. package/dist/pixel-perfect.js +70 -0
  95. package/dist/plugin.d.ts +111 -0
  96. package/dist/plugin.js +182 -0
  97. package/dist/pool.d.ts +19 -0
  98. package/dist/pool.js +43 -0
  99. package/dist/post-common.d.ts +51 -0
  100. package/dist/post-common.js +148 -0
  101. package/dist/post-nodes.d.ts +39 -0
  102. package/dist/post-nodes.js +849 -0
  103. package/dist/post-plugin.d.ts +5 -0
  104. package/dist/post-plugin.js +26 -0
  105. package/dist/post-shaders.d.ts +8 -0
  106. package/dist/post-shaders.js +698 -0
  107. package/dist/post.d.ts +175 -0
  108. package/dist/post.js +453 -0
  109. package/dist/readback.d.ts +4 -0
  110. package/dist/readback.js +95 -0
  111. package/dist/render-scale.d.ts +53 -0
  112. package/dist/render-scale.js +63 -0
  113. package/dist/shaders.d.ts +122 -0
  114. package/dist/shaders.js +1168 -0
  115. package/dist/shadows.d.ts +119 -0
  116. package/dist/shadows.js +562 -0
  117. package/dist/skin-asset.d.ts +26 -0
  118. package/dist/skin-asset.js +25 -0
  119. package/dist/skinning-plugin.d.ts +5 -0
  120. package/dist/skinning-plugin.js +16 -0
  121. package/dist/skinning.d.ts +19 -0
  122. package/dist/skinning.js +343 -0
  123. package/dist/standard-fields.d.ts +67 -0
  124. package/dist/standard-fields.js +73 -0
  125. package/dist/standard.d.ts +7 -0
  126. package/dist/standard.js +37 -0
  127. package/dist/stats.d.ts +25 -0
  128. package/dist/stats.js +18 -0
  129. package/dist/target.d.ts +55 -0
  130. package/dist/target.js +70 -0
  131. package/dist/testing.d.ts +34 -0
  132. package/dist/testing.js +126 -0
  133. package/dist/timer.d.ts +28 -0
  134. package/dist/timer.js +136 -0
  135. package/dist/view.d.ts +117 -0
  136. package/dist/view.js +389 -0
  137. package/dist/visibility.d.ts +10 -0
  138. package/dist/visibility.js +84 -0
  139. package/package.json +49 -0
@@ -0,0 +1,72 @@
1
+ import { type Entity, type ShardError } from '@aethervtt/shard-core';
2
+ import type { AtmosphereModel, Lut } from './atmosphere-model.js';
3
+ /** An atmosphere as the renderer tracks it: a component's, or a ProceduralSky camera's. */
4
+ export interface AtmosphereRecord {
5
+ /** The atmosphere's entity; for ProceduralSky, the camera's. */
6
+ entity: Entity;
7
+ /** A ProceduralSky (or DefaultEnvironment.sky) mapped onto an Earth atmosphere. */
8
+ wrapper: boolean;
9
+ model: AtmosphereModel;
10
+ /** Bumped when the parameters change (the LUTs are recomputed). */
11
+ version: number;
12
+ /** thickness ≤ 0 and the like: not drawn. */
13
+ problem: ShardError | undefined;
14
+ /** Center, relative to the floating origin (m). */
15
+ center: Float64Array;
16
+ /** The frame it was last seen (records unseen for a while are dropped). */
17
+ seen: number;
18
+ /** CPU LUTs for `atmosphere.sample` (built on first use, per version). */
19
+ cpu: {
20
+ version: number;
21
+ transmittance: Lut;
22
+ multiscatter: Lut;
23
+ } | undefined;
24
+ /** GPU LUT layer, and the version it holds (`atmosphere-nodes`). */
25
+ layer: number;
26
+ layerVersion: number;
27
+ }
28
+ /** The atmospheres a camera sees this frame. */
29
+ export interface CameraAtmosphere {
30
+ camera: Entity;
31
+ /** The atmosphere the camera is in, or else the nearest one on screen. */
32
+ primary: AtmosphereRecord | undefined;
33
+ inside: boolean;
34
+ /** Camera height above the primary's bottomRadius (m). */
35
+ altitude: number;
36
+ /** Composite order, far to near, primary last (at most 4). */
37
+ list: AtmosphereRecord[];
38
+ /** Camera relative to each listed atmosphere's center (km, xyz) and inside (w). */
39
+ origins: Float64Array;
40
+ /** Per directional light (as the light buffer orders them): transmittance rgb toward it. */
41
+ sunTransmittance: Float32Array;
42
+ /** The two brightest directional lights: light index, direction, illuminance, disk radius. */
43
+ suns: {
44
+ count: number;
45
+ index: Int32Array;
46
+ data: Float32Array;
47
+ };
48
+ /** Sky-view frame: up, azimuth 0 (toward the sun), azimuth 90°. */
49
+ frame: Float64Array;
50
+ /** Draw the sky (and the environment map behind it); -1: don't. */
51
+ background: number;
52
+ aerialPerspective: boolean;
53
+ skyViewSize: [number, number];
54
+ froxels: [number, number, number];
55
+ maxDistance: number;
56
+ /** Fog on this camera was ignored (render/fog-with-atmosphere). */
57
+ fogIgnored: boolean;
58
+ /** Changes when the IBL bake is out of date (atmosphere, altitude 2%, up and suns 0.25°). */
59
+ bakeKey: string;
60
+ /** Pixels across (radius) of each listed atmosphere's top sphere. */
61
+ pixels: Float64Array;
62
+ }
63
+ export declare class AtmosphereStore {
64
+ readonly records: Map<number, AtmosphereRecord>;
65
+ /** ProceduralSky wrappers, by camera. */
66
+ readonly wrappers: Map<number, AtmosphereRecord>;
67
+ readonly cameras: Map<number, CameraAtmosphere>;
68
+ frame: number;
69
+ /** Warnings and errors already logged, so each shows once. */
70
+ readonly logged: Set<string>;
71
+ }
72
+ export declare const Atmospheres: import("@aethervtt/shard-core").ResourceDef<AtmosphereStore>;
@@ -0,0 +1,18 @@
1
+ import { defineResource } from "@aethervtt/shard-core";
2
+ class AtmosphereStore {
3
+ records = /* @__PURE__ */ new Map();
4
+ /** ProceduralSky wrappers, by camera. */
5
+ wrappers = /* @__PURE__ */ new Map();
6
+ cameras = /* @__PURE__ */ new Map();
7
+ frame = 0;
8
+ /** Warnings and errors already logged, so each shows once. */
9
+ logged = /* @__PURE__ */ new Set();
10
+ }
11
+ const Atmospheres = defineResource("render/Atmospheres", {
12
+ description: "Atmospheres in the world and what each camera sees of them (spec 0044).",
13
+ init: () => new AtmosphereStore()
14
+ });
15
+ export {
16
+ AtmosphereStore,
17
+ Atmospheres
18
+ };
@@ -0,0 +1,191 @@
1
+ import { type Entity, type World } from '@aethervtt/shard-core';
2
+ import { type AppMethod } from '@aethervtt/shard-runtime';
3
+ import { type AtmosphereModel } from './atmosphere-model.js';
4
+ export declare const Atmosphere: import("@aethervtt/shard-core").ComponentDef<{
5
+ readonly bottomRadius: import("@aethervtt/shard-core").FieldType<number, "f64">;
6
+ readonly thickness: import("@aethervtt/shard-core").FieldType<number, "f32">;
7
+ readonly rayleighScattering: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32">;
8
+ readonly rayleighScale: import("@aethervtt/shard-core").FieldType<number, "f32">;
9
+ readonly mieScattering: import("@aethervtt/shard-core").FieldType<number, "f32">;
10
+ readonly mieAbsorption: import("@aethervtt/shard-core").FieldType<number, "f32">;
11
+ readonly mieScale: import("@aethervtt/shard-core").FieldType<number, "f32">;
12
+ readonly mieG: import("@aethervtt/shard-core").FieldType<number, "f32">;
13
+ readonly mieGOffset: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32">;
14
+ readonly absorption: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32">;
15
+ readonly absorptionCenter: import("@aethervtt/shard-core").FieldType<number, "f32">;
16
+ readonly absorptionWidth: import("@aethervtt/shard-core").FieldType<number, "f32">;
17
+ readonly groundAlbedo: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Color, "f32">;
18
+ readonly intensity: import("@aethervtt/shard-core").FieldType<number, "f32">;
19
+ readonly deckDepth: import("@aethervtt/shard-core").FieldType<number, "f32">;
20
+ }>;
21
+ export declare const AtmosphereSettings: import("@aethervtt/shard-core").ComponentDef<{
22
+ readonly aerialPerspective: import("@aethervtt/shard-core").FieldType<boolean, "u8">;
23
+ readonly skyViewSize: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec2, "f32">;
24
+ readonly froxels: import("@aethervtt/shard-core").FieldType<import("@aethervtt/shard-core").Vec3, "f32">;
25
+ readonly maxDistance: import("@aethervtt/shard-core").FieldType<number, "f32">;
26
+ }>;
27
+ export interface AtmosphereValue {
28
+ bottomRadius: number;
29
+ thickness: number;
30
+ rayleighScattering: [number, number, number];
31
+ rayleighScale: number;
32
+ mieScattering: number;
33
+ mieAbsorption: number;
34
+ mieScale: number;
35
+ mieG: number;
36
+ mieGOffset: [number, number, number];
37
+ absorption: [number, number, number];
38
+ absorptionCenter: number;
39
+ absorptionWidth: number;
40
+ groundAlbedo: [number, number, number, number];
41
+ intensity: number;
42
+ deckDepth: number;
43
+ }
44
+ /**
45
+ * Atmosphere presets: whole component values (bottomRadius 0: the planet's radius). Apply one with
46
+ * `world.set(e, Atmosphere, AtmospherePresets.mars)` or copy its values into a scene.
47
+ */
48
+ export declare const AtmospherePresets: {
49
+ readonly earth: AtmosphereValue;
50
+ /** Thin CO₂ and fine dust: butterscotch by day, a blue glow around the setting sun. */
51
+ readonly mars: {
52
+ readonly bottomRadius: number;
53
+ readonly intensity: number;
54
+ readonly deckDepth: number;
55
+ readonly thickness: 80000;
56
+ readonly rayleighScattering: [1.1e-7, 2.6e-7, 6.3e-7];
57
+ readonly rayleighScale: 11100;
58
+ readonly mieScattering: 0.00003;
59
+ readonly mieAbsorption: 0.000003;
60
+ readonly mieScale: 11000;
61
+ readonly mieG: 0.72;
62
+ readonly mieGOffset: [-0.15, 0, 0.2];
63
+ readonly absorption: [0.000003, 0.000008, 0.000016];
64
+ readonly absorptionCenter: 0;
65
+ readonly absorptionWidth: 44000;
66
+ readonly groundAlbedo: [0.45, 0.25, 0.15, 1];
67
+ };
68
+ /** A small world's thin air: a dark blue sky and faint haze. */
69
+ readonly thin: {
70
+ readonly bottomRadius: number;
71
+ readonly mieScale: number;
72
+ readonly mieG: number;
73
+ readonly mieGOffset: [number, number, number];
74
+ readonly absorptionCenter: number;
75
+ readonly absorptionWidth: number;
76
+ readonly groundAlbedo: [number, number, number, number];
77
+ readonly intensity: number;
78
+ readonly deckDepth: number;
79
+ readonly thickness: 30000;
80
+ readonly rayleighScattering: [0.00000145, 0.00000339, 0.00000828];
81
+ readonly rayleighScale: 5000;
82
+ readonly mieScattering: 4e-7;
83
+ readonly mieAbsorption: 4.4e-7;
84
+ readonly absorption: [0, 0, 0];
85
+ };
86
+ /** Dense aerosols: a pale sky and distant hills lost in haze a few km out. */
87
+ readonly 'thick-haze': {
88
+ readonly bottomRadius: number;
89
+ readonly thickness: number;
90
+ readonly rayleighScattering: [number, number, number];
91
+ readonly rayleighScale: number;
92
+ readonly mieGOffset: [number, number, number];
93
+ readonly absorption: [number, number, number];
94
+ readonly absorptionCenter: number;
95
+ readonly absorptionWidth: number;
96
+ readonly groundAlbedo: [number, number, number, number];
97
+ readonly intensity: number;
98
+ readonly deckDepth: number;
99
+ readonly mieScattering: 0.00008;
100
+ readonly mieAbsorption: 0.00002;
101
+ readonly mieScale: 3000;
102
+ readonly mieG: 0.7;
103
+ };
104
+ /** Red and blue scatter, green passes: a violet sky with green-gold sunsets. */
105
+ readonly 'alien-violet': {
106
+ readonly bottomRadius: number;
107
+ readonly thickness: number;
108
+ readonly rayleighScale: number;
109
+ readonly mieScattering: number;
110
+ readonly mieAbsorption: number;
111
+ readonly mieScale: number;
112
+ readonly mieG: number;
113
+ readonly mieGOffset: [number, number, number];
114
+ readonly absorption: [number, number, number];
115
+ readonly absorptionCenter: number;
116
+ readonly absorptionWidth: number;
117
+ readonly groundAlbedo: [number, number, number, number];
118
+ readonly intensity: number;
119
+ readonly deckDepth: number;
120
+ readonly rayleighScattering: [0.000026, 0.000006, 0.0000331];
121
+ };
122
+ /** Hydrogen and helium over a cloud deck: tall, weakly absorbing; raise absorption for Neptune. */
123
+ readonly 'gas-giant': {
124
+ readonly mieG: number;
125
+ readonly mieGOffset: [number, number, number];
126
+ readonly intensity: number;
127
+ readonly bottomRadius: 69911000;
128
+ readonly thickness: 2000000;
129
+ readonly rayleighScattering: [0.0000014, 0.0000033, 0.000008];
130
+ readonly rayleighScale: 27000;
131
+ readonly mieScattering: 0.000001;
132
+ readonly mieAbsorption: 2e-7;
133
+ readonly mieScale: 20000;
134
+ readonly absorption: [3e-7, 3e-8, 0];
135
+ readonly absorptionCenter: 0;
136
+ readonly absorptionWidth: 400000;
137
+ readonly groundAlbedo: [0.8, 0.7, 0.55, 1];
138
+ readonly deckDepth: 200000;
139
+ };
140
+ };
141
+ export type AtmospherePreset = keyof typeof AtmospherePresets;
142
+ export { type AtmosphereRecord, AtmosphereStore, Atmospheres, type CameraAtmosphere, } from './atmosphere-state.js';
143
+ /** The model of an atmosphere component's values (with bottomRadius already resolved), in km. */
144
+ export declare function atmosphereModel(value: AtmosphereValue, bottomRadius: number): AtmosphereModel;
145
+ /**
146
+ * Per camera: picks the primary atmosphere (the one it's in, or else the nearest on screen) and up
147
+ * to three secondaries (on screen, over 4 px), computes sunlight transmittance at the camera, and
148
+ * turns on the sky, the aerial-perspective pass, and the fog override.
149
+ */
150
+ export declare const selectAtmospheres: import("@aethervtt/shard-core").SystemDef<{
151
+ q: import("@aethervtt/shard-core").Query;
152
+ }>;
153
+ /**
154
+ * Transmittance (rgb) of the air between a point (world space, origin-relative m) and a sun, through
155
+ * an atmosphere: the factor the renderer applies to that sun's light at the camera. `sun` counts
156
+ * directional lights brightest first. Zero when the planet is in the way. Headless-safe.
157
+ */
158
+ export declare function sunTransmittanceAt(world: World, atmosphere: Entity, position: ArrayLike<number>, sun?: number): [number, number, number];
159
+ export interface AtmosphereSampleResult {
160
+ /** Sky radiance toward the direction (cd/m²), the ground's where the ray ends on it. */
161
+ radiance: [number, number, number];
162
+ luminance: number;
163
+ /** How much of what's behind (space, stars) shows through, per channel. */
164
+ transmittance: [number, number, number];
165
+ hitsGround: boolean;
166
+ /** Of the position above bottomRadius (m). */
167
+ altitude: number;
168
+ inside: boolean;
169
+ }
170
+ /** Sky radiance and transmittance from a position (world, m) toward a direction, on the CPU. */
171
+ export declare function sampleAtmosphere(world: World, atmosphere: Entity, position: ArrayLike<number>, direction: ArrayLike<number>): AtmosphereSampleResult;
172
+ /** GPU ms of a timed pass, if the profiler has it. */
173
+ type Timings = Record<string, {
174
+ avg: number;
175
+ }>;
176
+ /** The atmosphere section of `render.describe`. */
177
+ export declare function describeAtmospheres(world: World, timings?: Timings): {
178
+ views: Record<string, unknown>;
179
+ atmospheres: {
180
+ entity: number;
181
+ version: number;
182
+ problem: {
183
+ code: string;
184
+ message: string;
185
+ hint?: string;
186
+ path?: string;
187
+ details?: unknown[];
188
+ } | null;
189
+ }[];
190
+ } | undefined;
191
+ export declare const atmosphereMethods: AppMethod[];