@certe/atmos-renderer 0.1.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 (204) hide show
  1. package/LICENCE +674 -0
  2. package/README.md +166 -0
  3. package/dist/bloom-pass.d.ts +29 -0
  4. package/dist/bloom-pass.d.ts.map +1 -0
  5. package/dist/bloom-pass.js +173 -0
  6. package/dist/bloom-pass.js.map +1 -0
  7. package/dist/bloom-shader.d.ts +9 -0
  8. package/dist/bloom-shader.d.ts.map +1 -0
  9. package/dist/bloom-shader.js +69 -0
  10. package/dist/bloom-shader.js.map +1 -0
  11. package/dist/bounds.d.ts +10 -0
  12. package/dist/bounds.d.ts.map +1 -0
  13. package/dist/bounds.js +37 -0
  14. package/dist/bounds.js.map +1 -0
  15. package/dist/camera.d.ts +31 -0
  16. package/dist/camera.d.ts.map +1 -0
  17. package/dist/camera.js +53 -0
  18. package/dist/camera.js.map +1 -0
  19. package/dist/depth-prepass.d.ts +24 -0
  20. package/dist/depth-prepass.d.ts.map +1 -0
  21. package/dist/depth-prepass.js +107 -0
  22. package/dist/depth-prepass.js.map +1 -0
  23. package/dist/directional-light.d.ts +23 -0
  24. package/dist/directional-light.d.ts.map +1 -0
  25. package/dist/directional-light.js +36 -0
  26. package/dist/directional-light.js.map +1 -0
  27. package/dist/frustum.d.ts +15 -0
  28. package/dist/frustum.d.ts.map +1 -0
  29. package/dist/frustum.js +51 -0
  30. package/dist/frustum.js.map +1 -0
  31. package/dist/fullscreen-quad.d.ts +8 -0
  32. package/dist/fullscreen-quad.d.ts.map +1 -0
  33. package/dist/fullscreen-quad.js +30 -0
  34. package/dist/fullscreen-quad.js.map +1 -0
  35. package/dist/geometry.d.ts +28 -0
  36. package/dist/geometry.d.ts.map +1 -0
  37. package/dist/geometry.js +245 -0
  38. package/dist/geometry.js.map +1 -0
  39. package/dist/grid-renderer.d.ts +10 -0
  40. package/dist/grid-renderer.d.ts.map +1 -0
  41. package/dist/grid-renderer.js +77 -0
  42. package/dist/grid-renderer.js.map +1 -0
  43. package/dist/grid-shader.d.ts +3 -0
  44. package/dist/grid-shader.d.ts.map +1 -0
  45. package/dist/grid-shader.js +89 -0
  46. package/dist/grid-shader.js.map +1 -0
  47. package/dist/index.d.ts +64 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +45 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/light.d.ts +59 -0
  52. package/dist/light.d.ts.map +1 -0
  53. package/dist/light.js +184 -0
  54. package/dist/light.js.map +1 -0
  55. package/dist/material-asset.d.ts +19 -0
  56. package/dist/material-asset.d.ts.map +1 -0
  57. package/dist/material-asset.js +30 -0
  58. package/dist/material-asset.js.map +1 -0
  59. package/dist/material.d.ts +50 -0
  60. package/dist/material.d.ts.map +1 -0
  61. package/dist/material.js +48 -0
  62. package/dist/material.js.map +1 -0
  63. package/dist/mesh-renderer.d.ts +43 -0
  64. package/dist/mesh-renderer.d.ts.map +1 -0
  65. package/dist/mesh-renderer.js +162 -0
  66. package/dist/mesh-renderer.js.map +1 -0
  67. package/dist/mesh.d.ts +16 -0
  68. package/dist/mesh.d.ts.map +1 -0
  69. package/dist/mesh.js +33 -0
  70. package/dist/mesh.js.map +1 -0
  71. package/dist/mipmap-generator.d.ts +7 -0
  72. package/dist/mipmap-generator.d.ts.map +1 -0
  73. package/dist/mipmap-generator.js +96 -0
  74. package/dist/mipmap-generator.js.map +1 -0
  75. package/dist/pbr-wgsl.d.ts +12 -0
  76. package/dist/pbr-wgsl.d.ts.map +1 -0
  77. package/dist/pbr-wgsl.js +159 -0
  78. package/dist/pbr-wgsl.js.map +1 -0
  79. package/dist/pipeline.d.ts +13 -0
  80. package/dist/pipeline.d.ts.map +1 -0
  81. package/dist/pipeline.js +77 -0
  82. package/dist/pipeline.js.map +1 -0
  83. package/dist/point-light.d.ts +16 -0
  84. package/dist/point-light.d.ts.map +1 -0
  85. package/dist/point-light.js +22 -0
  86. package/dist/point-light.js.map +1 -0
  87. package/dist/point-shadow-pass.d.ts +24 -0
  88. package/dist/point-shadow-pass.d.ts.map +1 -0
  89. package/dist/point-shadow-pass.js +192 -0
  90. package/dist/point-shadow-pass.js.map +1 -0
  91. package/dist/point-shadow-shader.d.ts +12 -0
  92. package/dist/point-shadow-shader.d.ts.map +1 -0
  93. package/dist/point-shadow-shader.js +52 -0
  94. package/dist/point-shadow-shader.js.map +1 -0
  95. package/dist/register-builtins.d.ts +2 -0
  96. package/dist/register-builtins.d.ts.map +1 -0
  97. package/dist/register-builtins.js +98 -0
  98. package/dist/register-builtins.js.map +1 -0
  99. package/dist/render-system.d.ts +99 -0
  100. package/dist/render-system.d.ts.map +1 -0
  101. package/dist/render-system.js +476 -0
  102. package/dist/render-system.js.map +1 -0
  103. package/dist/scene-depth.d.ts +36 -0
  104. package/dist/scene-depth.d.ts.map +1 -0
  105. package/dist/scene-depth.js +183 -0
  106. package/dist/scene-depth.js.map +1 -0
  107. package/dist/shader.d.ts +3 -0
  108. package/dist/shader.d.ts.map +1 -0
  109. package/dist/shader.js +144 -0
  110. package/dist/shader.js.map +1 -0
  111. package/dist/shadow-fragment-wgsl.d.ts +13 -0
  112. package/dist/shadow-fragment-wgsl.d.ts.map +1 -0
  113. package/dist/shadow-fragment-wgsl.js +205 -0
  114. package/dist/shadow-fragment-wgsl.js.map +1 -0
  115. package/dist/shadow-manager.d.ts +46 -0
  116. package/dist/shadow-manager.d.ts.map +1 -0
  117. package/dist/shadow-manager.js +259 -0
  118. package/dist/shadow-manager.js.map +1 -0
  119. package/dist/shadow-pass.d.ts +31 -0
  120. package/dist/shadow-pass.d.ts.map +1 -0
  121. package/dist/shadow-pass.js +135 -0
  122. package/dist/shadow-pass.js.map +1 -0
  123. package/dist/shadow-shader.d.ts +10 -0
  124. package/dist/shadow-shader.d.ts.map +1 -0
  125. package/dist/shadow-shader.js +24 -0
  126. package/dist/shadow-shader.js.map +1 -0
  127. package/dist/shadow-uniforms.d.ts +38 -0
  128. package/dist/shadow-uniforms.d.ts.map +1 -0
  129. package/dist/shadow-uniforms.js +97 -0
  130. package/dist/shadow-uniforms.js.map +1 -0
  131. package/dist/skinned-geometry.d.ts +14 -0
  132. package/dist/skinned-geometry.d.ts.map +1 -0
  133. package/dist/skinned-geometry.js +23 -0
  134. package/dist/skinned-geometry.js.map +1 -0
  135. package/dist/skinned-mesh-renderer.d.ts +54 -0
  136. package/dist/skinned-mesh-renderer.d.ts.map +1 -0
  137. package/dist/skinned-mesh-renderer.js +177 -0
  138. package/dist/skinned-mesh-renderer.js.map +1 -0
  139. package/dist/skinned-pipeline.d.ts +16 -0
  140. package/dist/skinned-pipeline.d.ts.map +1 -0
  141. package/dist/skinned-pipeline.js +112 -0
  142. package/dist/skinned-pipeline.js.map +1 -0
  143. package/dist/skinned-shader.d.ts +7 -0
  144. package/dist/skinned-shader.d.ts.map +1 -0
  145. package/dist/skinned-shader.js +52 -0
  146. package/dist/skinned-shader.js.map +1 -0
  147. package/dist/skinned-shadow-shader.d.ts +6 -0
  148. package/dist/skinned-shadow-shader.d.ts.map +1 -0
  149. package/dist/skinned-shadow-shader.js +31 -0
  150. package/dist/skinned-shadow-shader.js.map +1 -0
  151. package/dist/spot-light.d.ts +24 -0
  152. package/dist/spot-light.d.ts.map +1 -0
  153. package/dist/spot-light.js +41 -0
  154. package/dist/spot-light.js.map +1 -0
  155. package/dist/spot-shadow-pass.d.ts +36 -0
  156. package/dist/spot-shadow-pass.d.ts.map +1 -0
  157. package/dist/spot-shadow-pass.js +144 -0
  158. package/dist/spot-shadow-pass.js.map +1 -0
  159. package/dist/ssao-pass.d.ts +37 -0
  160. package/dist/ssao-pass.d.ts.map +1 -0
  161. package/dist/ssao-pass.js +208 -0
  162. package/dist/ssao-pass.js.map +1 -0
  163. package/dist/ssao-shader.d.ts +9 -0
  164. package/dist/ssao-shader.d.ts.map +1 -0
  165. package/dist/ssao-shader.js +120 -0
  166. package/dist/ssao-shader.js.map +1 -0
  167. package/dist/terrain-mesh-renderer.d.ts +39 -0
  168. package/dist/terrain-mesh-renderer.d.ts.map +1 -0
  169. package/dist/terrain-mesh-renderer.js +131 -0
  170. package/dist/terrain-mesh-renderer.js.map +1 -0
  171. package/dist/terrain-pipeline.d.ts +17 -0
  172. package/dist/terrain-pipeline.d.ts.map +1 -0
  173. package/dist/terrain-pipeline.js +70 -0
  174. package/dist/terrain-pipeline.js.map +1 -0
  175. package/dist/terrain-shader.d.ts +10 -0
  176. package/dist/terrain-shader.d.ts.map +1 -0
  177. package/dist/terrain-shader.js +154 -0
  178. package/dist/terrain-shader.js.map +1 -0
  179. package/dist/texture.d.ts +20 -0
  180. package/dist/texture.d.ts.map +1 -0
  181. package/dist/texture.js +87 -0
  182. package/dist/texture.js.map +1 -0
  183. package/dist/tonemap-pass.d.ts +22 -0
  184. package/dist/tonemap-pass.d.ts.map +1 -0
  185. package/dist/tonemap-pass.js +125 -0
  186. package/dist/tonemap-pass.js.map +1 -0
  187. package/dist/unlit-pipeline.d.ts +12 -0
  188. package/dist/unlit-pipeline.d.ts.map +1 -0
  189. package/dist/unlit-pipeline.js +59 -0
  190. package/dist/unlit-pipeline.js.map +1 -0
  191. package/dist/unlit-shader.d.ts +3 -0
  192. package/dist/unlit-shader.d.ts.map +1 -0
  193. package/dist/unlit-shader.js +33 -0
  194. package/dist/unlit-shader.js.map +1 -0
  195. package/dist/webgpu-device.d.ts +13 -0
  196. package/dist/webgpu-device.d.ts.map +1 -0
  197. package/dist/webgpu-device.js +70 -0
  198. package/dist/webgpu-device.js.map +1 -0
  199. package/dist/wireframe-pipeline.d.ts +7 -0
  200. package/dist/wireframe-pipeline.d.ts.map +1 -0
  201. package/dist/wireframe-pipeline.js +72 -0
  202. package/dist/wireframe-pipeline.js.map +1 -0
  203. package/package.json +28 -0
  204. package/src/index.ts +87 -0
@@ -0,0 +1,77 @@
1
+ import { GRID_VERTEX_SHADER, GRID_FRAGMENT_SHADER } from './grid-shader.js';
2
+ import { MSAA_SAMPLE_COUNT, HDR_FORMAT } from './pipeline.js';
3
+ /** Uniform layout: viewProjection(64) + cameraPos(12) + pad(4) = 80 bytes */
4
+ const UNIFORM_SIZE = 80;
5
+ export class GridRenderer {
6
+ _pipeline;
7
+ _uniformBuffer;
8
+ _bindGroup;
9
+ _uniformData = new Float32Array(UNIFORM_SIZE / 4);
10
+ constructor(device, _format) {
11
+ const bindGroupLayout = device.createBindGroupLayout({
12
+ entries: [
13
+ {
14
+ binding: 0,
15
+ visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,
16
+ buffer: { type: 'uniform' },
17
+ },
18
+ ],
19
+ });
20
+ const pipelineLayout = device.createPipelineLayout({
21
+ bindGroupLayouts: [bindGroupLayout],
22
+ });
23
+ const vertModule = device.createShaderModule({ code: GRID_VERTEX_SHADER });
24
+ const fragModule = device.createShaderModule({ code: GRID_FRAGMENT_SHADER });
25
+ this._pipeline = device.createRenderPipeline({
26
+ layout: pipelineLayout,
27
+ vertex: {
28
+ module: vertModule,
29
+ entryPoint: 'vs',
30
+ },
31
+ fragment: {
32
+ module: fragModule,
33
+ entryPoint: 'fs',
34
+ targets: [
35
+ {
36
+ format: HDR_FORMAT,
37
+ blend: {
38
+ color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },
39
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
40
+ },
41
+ },
42
+ ],
43
+ },
44
+ multisample: { count: MSAA_SAMPLE_COUNT },
45
+ primitive: { topology: 'triangle-list' },
46
+ depthStencil: {
47
+ format: 'depth24plus',
48
+ depthWriteEnabled: false,
49
+ depthCompare: 'less-equal',
50
+ },
51
+ });
52
+ this._uniformBuffer = device.createBuffer({
53
+ size: UNIFORM_SIZE,
54
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
55
+ });
56
+ this._bindGroup = device.createBindGroup({
57
+ layout: bindGroupLayout,
58
+ entries: [{ binding: 0, resource: { buffer: this._uniformBuffer } }],
59
+ });
60
+ }
61
+ render(pass, device, viewProjection, cameraPos) {
62
+ // Write uniforms: VP matrix (16 floats) + cameraPos (3 floats) + 1 pad
63
+ this._uniformData.set(viewProjection, 0);
64
+ this._uniformData[16] = cameraPos[0];
65
+ this._uniformData[17] = cameraPos[1];
66
+ this._uniformData[18] = cameraPos[2];
67
+ this._uniformData[19] = 0; // padding
68
+ device.queue.writeBuffer(this._uniformBuffer, 0, this._uniformData);
69
+ pass.setPipeline(this._pipeline);
70
+ pass.setBindGroup(0, this._bindGroup);
71
+ pass.draw(6); // 2 triangles, 6 vertices
72
+ }
73
+ destroy() {
74
+ this._uniformBuffer.destroy();
75
+ }
76
+ }
77
+ //# sourceMappingURL=grid-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-renderer.js","sourceRoot":"","sources":["../src/grid-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const GRID_VERTEX_SHADER = "\nstruct Uniforms {\n viewProjection: mat4x4<f32>,\n cameraPos: vec3<f32>,\n};\n@group(0) @binding(0) var<uniform> u: Uniforms;\n\nstruct VOut {\n @builtin(position) position: vec4<f32>,\n @location(0) worldPos: vec3<f32>,\n};\n\n// Full-screen XZ quad, large enough for visible grid\nconst EXTENT = 500.0;\nconst positions = array<vec2<f32>, 6>(\n vec2<f32>(-1, -1), vec2<f32>(1, -1), vec2<f32>(1, 1),\n vec2<f32>(-1, -1), vec2<f32>(1, 1), vec2<f32>(-1, 1),\n);\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VOut {\n let p = positions[vi];\n let worldPos = vec3<f32>(u.cameraPos.x + p.x * EXTENT, 0.0, u.cameraPos.z + p.y * EXTENT);\n var out: VOut;\n out.position = u.viewProjection * vec4<f32>(worldPos, 1.0);\n out.worldPos = worldPos;\n return out;\n}\n";
2
+ export declare const GRID_FRAGMENT_SHADER = "\nstruct Uniforms {\n viewProjection: mat4x4<f32>,\n cameraPos: vec3<f32>,\n};\n@group(0) @binding(0) var<uniform> u: Uniforms;\n\nstruct FIn {\n @location(0) worldPos: vec3<f32>,\n};\n\nfn gridLine(coord: f32, scale: f32) -> f32 {\n let d = fract(coord / scale + 0.5) - 0.5;\n let deriv = fwidth(coord / scale);\n return 1.0 - smoothstep(-deriv, deriv, abs(d) - deriv);\n}\n\n@fragment fn fs(input: FIn) -> @location(0) vec4<f32> {\n let dist = length(input.worldPos.xz - u.cameraPos.xz);\n\n // Minor grid (1m)\n let minorX = gridLine(input.worldPos.x, 1.0);\n let minorZ = gridLine(input.worldPos.z, 1.0);\n let minor = max(minorX, minorZ);\n\n // Major grid (10m)\n let majorX = gridLine(input.worldPos.x, 10.0);\n let majorZ = gridLine(input.worldPos.z, 10.0);\n let major = max(majorX, majorZ);\n\n // Axis lines (each uses its own fwidth for correct perspective scaling)\n let xAxisWidth = fwidth(input.worldPos.z) * 1.5;\n let xAxis = 1.0 - smoothstep(0.0, xAxisWidth, abs(input.worldPos.z));\n let zAxisWidth = fwidth(input.worldPos.x) * 1.5;\n let zAxis = 1.0 - smoothstep(0.0, zAxisWidth, abs(input.worldPos.x));\n\n // Base grid color\n var color = vec3<f32>(0.3, 0.3, 0.3);\n var alpha = minor * 0.15 + major * 0.25;\n\n // X-axis = red, Z-axis = blue\n if (xAxis > 0.01) {\n color = mix(color, vec3<f32>(0.8, 0.2, 0.2), xAxis);\n alpha = max(alpha, xAxis * 0.8);\n }\n if (zAxis > 0.01) {\n color = mix(color, vec3<f32>(0.2, 0.2, 0.8), zAxis);\n alpha = max(alpha, zAxis * 0.8);\n }\n\n // Fade with distance\n let fadeStart = 50.0;\n let fadeEnd = 200.0;\n let fade = 1.0 - smoothstep(fadeStart, fadeEnd, dist);\n alpha *= fade;\n\n if (alpha < 0.001) { discard; }\n return vec4<f32>(color, alpha);\n}\n";
3
+ //# sourceMappingURL=grid-shader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-shader.d.ts","sourceRoot":"","sources":["../src/grid-shader.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,6wBA2B9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,0uDA2DhC,CAAC"}
@@ -0,0 +1,89 @@
1
+ export const GRID_VERTEX_SHADER = /* wgsl */ `
2
+ struct Uniforms {
3
+ viewProjection: mat4x4<f32>,
4
+ cameraPos: vec3<f32>,
5
+ };
6
+ @group(0) @binding(0) var<uniform> u: Uniforms;
7
+
8
+ struct VOut {
9
+ @builtin(position) position: vec4<f32>,
10
+ @location(0) worldPos: vec3<f32>,
11
+ };
12
+
13
+ // Full-screen XZ quad, large enough for visible grid
14
+ const EXTENT = 500.0;
15
+ const positions = array<vec2<f32>, 6>(
16
+ vec2<f32>(-1, -1), vec2<f32>(1, -1), vec2<f32>(1, 1),
17
+ vec2<f32>(-1, -1), vec2<f32>(1, 1), vec2<f32>(-1, 1),
18
+ );
19
+
20
+ @vertex fn vs(@builtin(vertex_index) vi: u32) -> VOut {
21
+ let p = positions[vi];
22
+ let worldPos = vec3<f32>(u.cameraPos.x + p.x * EXTENT, 0.0, u.cameraPos.z + p.y * EXTENT);
23
+ var out: VOut;
24
+ out.position = u.viewProjection * vec4<f32>(worldPos, 1.0);
25
+ out.worldPos = worldPos;
26
+ return out;
27
+ }
28
+ `;
29
+ export const GRID_FRAGMENT_SHADER = /* wgsl */ `
30
+ struct Uniforms {
31
+ viewProjection: mat4x4<f32>,
32
+ cameraPos: vec3<f32>,
33
+ };
34
+ @group(0) @binding(0) var<uniform> u: Uniforms;
35
+
36
+ struct FIn {
37
+ @location(0) worldPos: vec3<f32>,
38
+ };
39
+
40
+ fn gridLine(coord: f32, scale: f32) -> f32 {
41
+ let d = fract(coord / scale + 0.5) - 0.5;
42
+ let deriv = fwidth(coord / scale);
43
+ return 1.0 - smoothstep(-deriv, deriv, abs(d) - deriv);
44
+ }
45
+
46
+ @fragment fn fs(input: FIn) -> @location(0) vec4<f32> {
47
+ let dist = length(input.worldPos.xz - u.cameraPos.xz);
48
+
49
+ // Minor grid (1m)
50
+ let minorX = gridLine(input.worldPos.x, 1.0);
51
+ let minorZ = gridLine(input.worldPos.z, 1.0);
52
+ let minor = max(minorX, minorZ);
53
+
54
+ // Major grid (10m)
55
+ let majorX = gridLine(input.worldPos.x, 10.0);
56
+ let majorZ = gridLine(input.worldPos.z, 10.0);
57
+ let major = max(majorX, majorZ);
58
+
59
+ // Axis lines (each uses its own fwidth for correct perspective scaling)
60
+ let xAxisWidth = fwidth(input.worldPos.z) * 1.5;
61
+ let xAxis = 1.0 - smoothstep(0.0, xAxisWidth, abs(input.worldPos.z));
62
+ let zAxisWidth = fwidth(input.worldPos.x) * 1.5;
63
+ let zAxis = 1.0 - smoothstep(0.0, zAxisWidth, abs(input.worldPos.x));
64
+
65
+ // Base grid color
66
+ var color = vec3<f32>(0.3, 0.3, 0.3);
67
+ var alpha = minor * 0.15 + major * 0.25;
68
+
69
+ // X-axis = red, Z-axis = blue
70
+ if (xAxis > 0.01) {
71
+ color = mix(color, vec3<f32>(0.8, 0.2, 0.2), xAxis);
72
+ alpha = max(alpha, xAxis * 0.8);
73
+ }
74
+ if (zAxis > 0.01) {
75
+ color = mix(color, vec3<f32>(0.2, 0.2, 0.8), zAxis);
76
+ alpha = max(alpha, zAxis * 0.8);
77
+ }
78
+
79
+ // Fade with distance
80
+ let fadeStart = 50.0;
81
+ let fadeEnd = 200.0;
82
+ let fade = 1.0 - smoothstep(fadeStart, fadeEnd, dist);
83
+ alpha *= fade;
84
+
85
+ if (alpha < 0.001) { discard; }
86
+ return vec4<f32>(color, alpha);
87
+ }
88
+ `;
89
+ //# sourceMappingURL=grid-shader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-shader.js","sourceRoot":"","sources":["../src/grid-shader.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B5C,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2D9C,CAAC"}
@@ -0,0 +1,64 @@
1
+ export { initWebGPU, resizeGPU } from './webgpu-device.js';
2
+ export type { GPUContext } from './webgpu-device.js';
3
+ export { VERTEX_SHADER, FRAGMENT_SHADER } from './shader.js';
4
+ export { createRenderPipeline, HDR_FORMAT, MSAA_SAMPLE_COUNT } from './pipeline.js';
5
+ export type { PipelineResources } from './pipeline.js';
6
+ export { createMesh } from './mesh.js';
7
+ export type { Mesh } from './mesh.js';
8
+ export { createCubeGeometry, createPlaneGeometry, createSphereGeometry, createCylinderGeometry, VERTEX_STRIDE_FLOATS, VERTEX_STRIDE_BYTES, } from './geometry.js';
9
+ export type { GeometryData } from './geometry.js';
10
+ export { createMaterial, writeMaterialUniforms, MATERIAL_UNIFORM_SIZE } from './material.js';
11
+ export type { Material, MaterialParams } from './material.js';
12
+ export { createDirectionalLight, writeSceneUniforms, SCENE_UNIFORM_SIZE, collectSceneLights } from './light.js';
13
+ export type { LightSettings, SceneLightData, FogSettings } from './light.js';
14
+ export { DirectionalLight } from './directional-light.js';
15
+ export { PointLight } from './point-light.js';
16
+ export { SpotLight } from './spot-light.js';
17
+ export { MeshRenderer } from './mesh-renderer.js';
18
+ export type { MeshRendererContext } from './mesh-renderer.js';
19
+ export { Camera } from './camera.js';
20
+ export type { ScreenToWorldProvider } from './camera.js';
21
+ export { SceneDepthPass } from './scene-depth.js';
22
+ export { RenderSystem, createDefaultCamera } from './render-system.js';
23
+ export type { CameraSettings, OverlayCallback } from './render-system.js';
24
+ export { registerRendererBuiltins } from './register-builtins.js';
25
+ export { createDefaultMaterialAsset, serializeMaterialAsset, deserializeMaterialAsset, } from './material-asset.js';
26
+ export type { ShaderType, MaterialAssetData } from './material-asset.js';
27
+ export { computeBoundingSphere } from './bounds.js';
28
+ export type { BoundingSphere } from './bounds.js';
29
+ export { createUnlitPipeline } from './unlit-pipeline.js';
30
+ export type { UnlitPipelineResources, UnlitPipelineOptions } from './unlit-pipeline.js';
31
+ export { GridRenderer } from './grid-renderer.js';
32
+ export { createTextureFromRGBA, decodeImageToRGBA, getWhiteFallbackTexture, getFlatNormalFallback, getDefaultMetallicRoughnessFallback, } from './texture.js';
33
+ export type { GPUTextureHandle } from './texture.js';
34
+ export { extractFrustumPlanes, isSphereInFrustum } from './frustum.js';
35
+ export type { FrustumPlanes } from './frustum.js';
36
+ export { DirectionalShadowPass, DirectionalShadowPassPair } from './shadow-pass.js';
37
+ export { PointShadowPass } from './point-shadow-pass.js';
38
+ export { SpotShadowPass } from './spot-shadow-pass.js';
39
+ export { SHADOW_UNIFORM_SIZE, MAX_DIR_SHADOW_SLOTS, MAX_POINT_SHADOW_SLOTS, MAX_SPOT_SHADOW_SLOTS, SHADOW_SLOT_NONE, createShadowBindGroupLayout, } from './shadow-uniforms.js';
40
+ export { ShadowManager } from './shadow-manager.js';
41
+ export type { ShadowManagerResult } from './shadow-manager.js';
42
+ export { SHADOW_FRAGMENT_WGSL } from './shadow-fragment-wgsl.js';
43
+ export { SHADOW_VERTEX_SHADER } from './shadow-shader.js';
44
+ export { POINT_SHADOW_SHADER } from './point-shadow-shader.js';
45
+ export { generateMipmaps } from './mipmap-generator.js';
46
+ export { BloomPass } from './bloom-pass.js';
47
+ export { TonemapPass } from './tonemap-pass.js';
48
+ export { DepthPrepass } from './depth-prepass.js';
49
+ export { SSAOPass } from './ssao-pass.js';
50
+ export { drawFullscreenTriangle, FULLSCREEN_VERTEX_SHADER } from './fullscreen-quad.js';
51
+ export { createWireframePipeline } from './wireframe-pipeline.js';
52
+ export type { WireframePipelineResources } from './wireframe-pipeline.js';
53
+ export { SKINNED_VERTEX_STRIDE_FLOATS, SKINNED_VERTEX_STRIDE_BYTES, SKINNED_VERTEX_BUFFER_LAYOUT } from './skinned-geometry.js';
54
+ export { SKINNED_VERTEX_SHADER } from './skinned-shader.js';
55
+ export { SKINNED_SHADOW_VERTEX_SHADER } from './skinned-shadow-shader.js';
56
+ export { createSkinnedPBRPipeline } from './skinned-pipeline.js';
57
+ export type { SkinnedPipelineResources } from './skinned-pipeline.js';
58
+ export { SkinnedMeshRenderer } from './skinned-mesh-renderer.js';
59
+ export type { SkinnedRendererContext } from './skinned-mesh-renderer.js';
60
+ export { createTerrainPipeline, TERRAIN_VERTEX_STRIDE_FLOATS, TERRAIN_VERTEX_STRIDE_BYTES } from './terrain-pipeline.js';
61
+ export type { TerrainPipelineResources } from './terrain-pipeline.js';
62
+ export { TerrainMeshRenderer } from './terrain-mesh-renderer.js';
63
+ export { TERRAIN_VERTEX_SHADER, TERRAIN_FRAGMENT_SHADER } from './terrain-shader.js';
64
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ export { initWebGPU, resizeGPU } from './webgpu-device.js';
2
+ export { VERTEX_SHADER, FRAGMENT_SHADER } from './shader.js';
3
+ export { createRenderPipeline, HDR_FORMAT, MSAA_SAMPLE_COUNT } from './pipeline.js';
4
+ export { createMesh } from './mesh.js';
5
+ export { createCubeGeometry, createPlaneGeometry, createSphereGeometry, createCylinderGeometry, VERTEX_STRIDE_FLOATS, VERTEX_STRIDE_BYTES, } from './geometry.js';
6
+ export { createMaterial, writeMaterialUniforms, MATERIAL_UNIFORM_SIZE } from './material.js';
7
+ export { createDirectionalLight, writeSceneUniforms, SCENE_UNIFORM_SIZE, collectSceneLights } from './light.js';
8
+ export { DirectionalLight } from './directional-light.js';
9
+ export { PointLight } from './point-light.js';
10
+ export { SpotLight } from './spot-light.js';
11
+ export { MeshRenderer } from './mesh-renderer.js';
12
+ export { Camera } from './camera.js';
13
+ export { SceneDepthPass } from './scene-depth.js';
14
+ export { RenderSystem, createDefaultCamera } from './render-system.js';
15
+ export { registerRendererBuiltins } from './register-builtins.js';
16
+ export { createDefaultMaterialAsset, serializeMaterialAsset, deserializeMaterialAsset, } from './material-asset.js';
17
+ export { computeBoundingSphere } from './bounds.js';
18
+ export { createUnlitPipeline } from './unlit-pipeline.js';
19
+ export { GridRenderer } from './grid-renderer.js';
20
+ export { createTextureFromRGBA, decodeImageToRGBA, getWhiteFallbackTexture, getFlatNormalFallback, getDefaultMetallicRoughnessFallback, } from './texture.js';
21
+ export { extractFrustumPlanes, isSphereInFrustum } from './frustum.js';
22
+ export { DirectionalShadowPass, DirectionalShadowPassPair } from './shadow-pass.js';
23
+ export { PointShadowPass } from './point-shadow-pass.js';
24
+ export { SpotShadowPass } from './spot-shadow-pass.js';
25
+ export { SHADOW_UNIFORM_SIZE, MAX_DIR_SHADOW_SLOTS, MAX_POINT_SHADOW_SLOTS, MAX_SPOT_SHADOW_SLOTS, SHADOW_SLOT_NONE, createShadowBindGroupLayout, } from './shadow-uniforms.js';
26
+ export { ShadowManager } from './shadow-manager.js';
27
+ export { SHADOW_FRAGMENT_WGSL } from './shadow-fragment-wgsl.js';
28
+ export { SHADOW_VERTEX_SHADER } from './shadow-shader.js';
29
+ export { POINT_SHADOW_SHADER } from './point-shadow-shader.js';
30
+ export { generateMipmaps } from './mipmap-generator.js';
31
+ export { BloomPass } from './bloom-pass.js';
32
+ export { TonemapPass } from './tonemap-pass.js';
33
+ export { DepthPrepass } from './depth-prepass.js';
34
+ export { SSAOPass } from './ssao-pass.js';
35
+ export { drawFullscreenTriangle, FULLSCREEN_VERTEX_SHADER } from './fullscreen-quad.js';
36
+ export { createWireframePipeline } from './wireframe-pipeline.js';
37
+ export { SKINNED_VERTEX_STRIDE_FLOATS, SKINNED_VERTEX_STRIDE_BYTES, SKINNED_VERTEX_BUFFER_LAYOUT } from './skinned-geometry.js';
38
+ export { SKINNED_VERTEX_SHADER } from './skinned-shader.js';
39
+ export { SKINNED_SHADOW_VERTEX_SHADER } from './skinned-shadow-shader.js';
40
+ export { createSkinnedPBRPipeline } from './skinned-pipeline.js';
41
+ export { SkinnedMeshRenderer } from './skinned-mesh-renderer.js';
42
+ export { createTerrainPipeline, TERRAIN_VERTEX_STRIDE_FLOATS, TERRAIN_VERTEX_STRIDE_BYTES } from './terrain-pipeline.js';
43
+ export { TerrainMeshRenderer } from './terrain-mesh-renderer.js';
44
+ export { TERRAIN_VERTEX_SHADER, TERRAIN_FRAGMENT_SHADER } from './terrain-shader.js';
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE7F,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,mCAAmC,GACpC,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAChI,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEzH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type { Scene } from '@certe/atmos-core';
2
+ import { DirectionalLight } from './directional-light.js';
3
+ import { PointLight } from './point-light.js';
4
+ import { SpotLight } from './spot-light.js';
5
+ export declare const MAX_DIR_LIGHTS = 4;
6
+ export declare const MAX_POINT_LIGHTS = 4;
7
+ export declare const MAX_SPOT_LIGHTS = 4;
8
+ /**
9
+ * GPU layout (592 bytes):
10
+ * cameraPos: vec4<f32> 16
11
+ * numDirLights: u32, numPointLights: u32,
12
+ * numSpotLights: u32, pad 16
13
+ * dirLights: array<DirLight, 4> (32 each) 128
14
+ * pointLights: array<PointLight, 4> (32 each) 128
15
+ * spotLights: array<SpotLight, 4> (64 each) 256
16
+ * fogEnabled: u32, fogMode: u32, fogDensity, fogStart 16
17
+ * fogEnd, _pad, _pad2, _pad3 16 (align fogColor to 16)
18
+ * fogColor: vec4<f32> 16
19
+ */
20
+ export declare const SCENE_UNIFORM_SIZE = 592;
21
+ export interface FogSettings {
22
+ enabled: boolean;
23
+ mode: 'linear' | 'exponential';
24
+ density: number;
25
+ start: number;
26
+ end: number;
27
+ color: Float32Array;
28
+ }
29
+ export interface LightSettings {
30
+ direction: Float32Array;
31
+ color: Float32Array;
32
+ intensity: number;
33
+ }
34
+ export declare function createDirectionalLight(direction?: [number, number, number], color?: [number, number, number], intensity?: number): LightSettings;
35
+ export interface SceneLightData {
36
+ dirCount: number;
37
+ pointCount: number;
38
+ spotCount: number;
39
+ /** 4 × (dirX, dirY, dirZ, 0, colR, colG, colB, intensity) = 32 floats */
40
+ dirLights: Float32Array;
41
+ /** 4 × (posX, posY, posZ, range, colR, colG, colB, intensity) = 32 floats */
42
+ pointLights: Float32Array;
43
+ /** 4 × (posX, posY, posZ, range, dirX, dirY, dirZ, outerCos,
44
+ * colR, colG, colB, intensity, innerCos, pad, pad, pad) = 64 floats */
45
+ spotLights: Float32Array;
46
+ /** Component references for shadow pass selection (up to MAX per type). */
47
+ dirComponents: DirectionalLight[];
48
+ pointComponents: PointLight[];
49
+ spotComponents: SpotLight[];
50
+ }
51
+ /** Gather DirectionalLight, PointLight, and SpotLight components from the scene. */
52
+ export declare function collectSceneLights(scene: Scene): SceneLightData;
53
+ /**
54
+ * Write scene uniforms into a Float32Array for GPU upload.
55
+ * Uses the new multi-light layout when SceneLightData is provided,
56
+ * or falls back to single-light LightSettings for backwards compat.
57
+ */
58
+ export declare function writeSceneUniforms(out: Float32Array, cameraPos: Float32Array, sceneLights?: SceneLightData, fallback?: LightSettings, fog?: FogSettings): void;
59
+ //# sourceMappingURL=light.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light.d.ts","sourceRoot":"","sources":["../src/light.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,YAAY,CAAC;IACxB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChC,SAAS,CAAC,EAAE,MAAM,GACjB,aAAa,CAUf;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,SAAS,EAAE,YAAY,CAAC;IACxB,6EAA6E;IAC7E,WAAW,EAAE,YAAY,CAAC;IAC1B;iFAC6E;IAC7E,UAAU,EAAE,YAAY,CAAC;IACzB,2EAA2E;IAC3E,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,cAAc,EAAE,SAAS,EAAE,CAAC;CAC7B;AAcD,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,cAAc,CA4E/D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,YAAY,EACvB,WAAW,CAAC,EAAE,cAAc,EAC5B,QAAQ,CAAC,EAAE,aAAa,EACxB,GAAG,CAAC,EAAE,WAAW,GAChB,IAAI,CAmEN"}
package/dist/light.js ADDED
@@ -0,0 +1,184 @@
1
+ import { DirectionalLight } from './directional-light.js';
2
+ import { PointLight } from './point-light.js';
3
+ import { SpotLight } from './spot-light.js';
4
+ export const MAX_DIR_LIGHTS = 4;
5
+ export const MAX_POINT_LIGHTS = 4;
6
+ export const MAX_SPOT_LIGHTS = 4;
7
+ /**
8
+ * GPU layout (592 bytes):
9
+ * cameraPos: vec4<f32> 16
10
+ * numDirLights: u32, numPointLights: u32,
11
+ * numSpotLights: u32, pad 16
12
+ * dirLights: array<DirLight, 4> (32 each) 128
13
+ * pointLights: array<PointLight, 4> (32 each) 128
14
+ * spotLights: array<SpotLight, 4> (64 each) 256
15
+ * fogEnabled: u32, fogMode: u32, fogDensity, fogStart 16
16
+ * fogEnd, _pad, _pad2, _pad3 16 (align fogColor to 16)
17
+ * fogColor: vec4<f32> 16
18
+ */
19
+ export const SCENE_UNIFORM_SIZE = 592;
20
+ export function createDirectionalLight(direction, color, intensity) {
21
+ const dir = direction ?? [-0.5, -1.0, -0.3];
22
+ const len = Math.sqrt(dir[0] * dir[0] + dir[1] * dir[1] + dir[2] * dir[2]);
23
+ const inv = len > 0 ? 1 / len : 0;
24
+ return {
25
+ direction: new Float32Array([dir[0] * inv, dir[1] * inv, dir[2] * inv, 0]),
26
+ color: new Float32Array(color ?? [1, 1, 1]),
27
+ intensity: intensity ?? 1.0,
28
+ };
29
+ }
30
+ // Scratch arrays for collecting light data
31
+ const _dirBuf = new Float32Array(MAX_DIR_LIGHTS * 8);
32
+ const _pointBuf = new Float32Array(MAX_POINT_LIGHTS * 8);
33
+ const _spotBuf = new Float32Array(MAX_SPOT_LIGHTS * 16);
34
+ const _dirScratch = new Float32Array(3);
35
+ const _posScratch = new Float32Array(3);
36
+ const _spotDirScratch = new Float32Array(3);
37
+ const _spotPosScratch = new Float32Array(3);
38
+ const _dirComps = [];
39
+ const _pointComps = [];
40
+ const _spotComps = [];
41
+ /** Gather DirectionalLight, PointLight, and SpotLight components from the scene. */
42
+ export function collectSceneLights(scene) {
43
+ let dirCount = 0;
44
+ let pointCount = 0;
45
+ let spotCount = 0;
46
+ _dirComps.length = 0;
47
+ _pointComps.length = 0;
48
+ _spotComps.length = 0;
49
+ for (const obj of scene.getAllObjects()) {
50
+ if (dirCount < MAX_DIR_LIGHTS) {
51
+ const dl = obj.getComponent(DirectionalLight);
52
+ if (dl && dl.enabled) {
53
+ dl.getWorldDirection(_dirScratch);
54
+ const off = dirCount * 8;
55
+ _dirBuf[off] = _dirScratch[0];
56
+ _dirBuf[off + 1] = _dirScratch[1];
57
+ _dirBuf[off + 2] = _dirScratch[2];
58
+ _dirBuf[off + 3] = 0;
59
+ _dirBuf[off + 4] = dl.color[0];
60
+ _dirBuf[off + 5] = dl.color[1];
61
+ _dirBuf[off + 6] = dl.color[2];
62
+ _dirBuf[off + 7] = dl.intensity;
63
+ _dirComps.push(dl);
64
+ dirCount++;
65
+ }
66
+ }
67
+ if (pointCount < MAX_POINT_LIGHTS) {
68
+ const pl = obj.getComponent(PointLight);
69
+ if (pl && pl.enabled) {
70
+ pl.getWorldPosition(_posScratch);
71
+ const off = pointCount * 8;
72
+ _pointBuf[off] = _posScratch[0];
73
+ _pointBuf[off + 1] = _posScratch[1];
74
+ _pointBuf[off + 2] = _posScratch[2];
75
+ _pointBuf[off + 3] = pl.range;
76
+ _pointBuf[off + 4] = pl.color[0];
77
+ _pointBuf[off + 5] = pl.color[1];
78
+ _pointBuf[off + 6] = pl.color[2];
79
+ _pointBuf[off + 7] = pl.intensity;
80
+ _pointComps.push(pl);
81
+ pointCount++;
82
+ }
83
+ }
84
+ if (spotCount < MAX_SPOT_LIGHTS) {
85
+ const sl = obj.getComponent(SpotLight);
86
+ if (sl && sl.enabled) {
87
+ sl.getWorldPosition(_spotPosScratch);
88
+ sl.getWorldDirection(_spotDirScratch);
89
+ const off = spotCount * 16;
90
+ _spotBuf[off] = _spotPosScratch[0];
91
+ _spotBuf[off + 1] = _spotPosScratch[1];
92
+ _spotBuf[off + 2] = _spotPosScratch[2];
93
+ _spotBuf[off + 3] = sl.range;
94
+ _spotBuf[off + 4] = _spotDirScratch[0];
95
+ _spotBuf[off + 5] = _spotDirScratch[1];
96
+ _spotBuf[off + 6] = _spotDirScratch[2];
97
+ _spotBuf[off + 7] = Math.cos(sl.outerAngle);
98
+ _spotBuf[off + 8] = sl.color[0];
99
+ _spotBuf[off + 9] = sl.color[1];
100
+ _spotBuf[off + 10] = sl.color[2];
101
+ _spotBuf[off + 11] = sl.intensity;
102
+ _spotBuf[off + 12] = Math.cos(sl.innerAngle);
103
+ _spotBuf[off + 13] = 0;
104
+ _spotBuf[off + 14] = 0;
105
+ _spotBuf[off + 15] = 0;
106
+ _spotComps.push(sl);
107
+ spotCount++;
108
+ }
109
+ }
110
+ }
111
+ return {
112
+ dirCount, pointCount, spotCount,
113
+ dirLights: _dirBuf, pointLights: _pointBuf, spotLights: _spotBuf,
114
+ dirComponents: _dirComps, pointComponents: _pointComps, spotComponents: _spotComps,
115
+ };
116
+ }
117
+ /**
118
+ * Write scene uniforms into a Float32Array for GPU upload.
119
+ * Uses the new multi-light layout when SceneLightData is provided,
120
+ * or falls back to single-light LightSettings for backwards compat.
121
+ */
122
+ export function writeSceneUniforms(out, cameraPos, sceneLights, fallback, fog) {
123
+ // Zero everything first
124
+ out.fill(0);
125
+ // cameraPos (vec4, w=0) — offset 0
126
+ out[0] = cameraPos[0];
127
+ out[1] = cameraPos[1];
128
+ out[2] = cameraPos[2];
129
+ out[3] = 0;
130
+ if (sceneLights && (sceneLights.dirCount > 0 || sceneLights.pointCount > 0 || sceneLights.spotCount > 0)) {
131
+ // Counts — offset 4 (as uint32 view): numDir, numPoint, numSpot
132
+ const u32 = new Uint32Array(out.buffer, out.byteOffset + 16, 3);
133
+ u32[0] = sceneLights.dirCount;
134
+ u32[1] = sceneLights.pointCount;
135
+ u32[2] = sceneLights.spotCount;
136
+ // Dir lights — offset 8 (float index) = byte 32
137
+ const dirFloatOffset = 8;
138
+ for (let i = 0; i < sceneLights.dirCount * 8; i++) {
139
+ out[dirFloatOffset + i] = sceneLights.dirLights[i];
140
+ }
141
+ // Point lights — offset 8 + 32 = 40 (float index) = byte 160
142
+ const pointFloatOffset = dirFloatOffset + MAX_DIR_LIGHTS * 8;
143
+ for (let i = 0; i < sceneLights.pointCount * 8; i++) {
144
+ out[pointFloatOffset + i] = sceneLights.pointLights[i];
145
+ }
146
+ // Spot lights — offset 40 + 32 = 72 (float index) = byte 288
147
+ const spotFloatOffset = pointFloatOffset + MAX_POINT_LIGHTS * 8;
148
+ for (let i = 0; i < sceneLights.spotCount * 16; i++) {
149
+ out[spotFloatOffset + i] = sceneLights.spotLights[i];
150
+ }
151
+ }
152
+ else if (fallback) {
153
+ // Single directional light fallback
154
+ const u32 = new Uint32Array(out.buffer, out.byteOffset + 16, 3);
155
+ u32[0] = 1;
156
+ u32[1] = 0;
157
+ u32[2] = 0;
158
+ const dirFloatOffset = 8;
159
+ out[dirFloatOffset] = fallback.direction[0];
160
+ out[dirFloatOffset + 1] = fallback.direction[1];
161
+ out[dirFloatOffset + 2] = fallback.direction[2];
162
+ out[dirFloatOffset + 3] = 0;
163
+ out[dirFloatOffset + 4] = fallback.color[0];
164
+ out[dirFloatOffset + 5] = fallback.color[1];
165
+ out[dirFloatOffset + 6] = fallback.color[2];
166
+ out[dirFloatOffset + 7] = fallback.intensity;
167
+ }
168
+ // Fog data — float offset 136 (byte 544)
169
+ // fogColor is vec4<f32> which requires 16-byte alignment → starts at byte 576 (float idx 144)
170
+ if (fog) {
171
+ const fogU32 = new Uint32Array(out.buffer, out.byteOffset + 544, 2);
172
+ fogU32[0] = fog.enabled ? 1 : 0;
173
+ fogU32[1] = fog.mode === 'exponential' ? 1 : 0;
174
+ out[138] = fog.density;
175
+ out[139] = fog.start;
176
+ out[140] = fog.end;
177
+ // float indices 141-143 are padding for vec4 alignment
178
+ out[144] = fog.color[0];
179
+ out[145] = fog.color[1];
180
+ out[146] = fog.color[2];
181
+ out[147] = 0; // pad
182
+ }
183
+ }
184
+ //# sourceMappingURL=light.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light.js","sourceRoot":"","sources":["../src/light.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type ShaderType = 'pbr' | 'unlit';
2
+ export interface MaterialAssetData {
3
+ name: string;
4
+ shader: ShaderType;
5
+ albedo: [number, number, number, number];
6
+ metallic: number;
7
+ roughness: number;
8
+ albedoTexture?: string;
9
+ emissive?: [number, number, number];
10
+ emissiveIntensity?: number;
11
+ normalTexture?: string;
12
+ metallicRoughnessTexture?: string;
13
+ texTilingX?: number;
14
+ texTilingY?: number;
15
+ }
16
+ export declare function createDefaultMaterialAsset(name: string): MaterialAssetData;
17
+ export declare function serializeMaterialAsset(data: MaterialAssetData): string;
18
+ export declare function deserializeMaterialAsset(json: string): MaterialAssetData;
19
+ //# sourceMappingURL=material-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-asset.d.ts","sourceRoot":"","sources":["../src/material-asset.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAQ1E;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAEtE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAgBxE"}
@@ -0,0 +1,30 @@
1
+ export function createDefaultMaterialAsset(name) {
2
+ return {
3
+ name,
4
+ shader: 'pbr',
5
+ albedo: [0.7, 0.7, 0.7, 1],
6
+ metallic: 0,
7
+ roughness: 0.5,
8
+ };
9
+ }
10
+ export function serializeMaterialAsset(data) {
11
+ return JSON.stringify(data, null, 2);
12
+ }
13
+ export function deserializeMaterialAsset(json) {
14
+ const raw = JSON.parse(json);
15
+ return {
16
+ name: raw['name'] ?? 'Unnamed',
17
+ shader: raw['shader'] ?? 'pbr',
18
+ albedo: raw['albedo'] ?? [1, 1, 1, 1],
19
+ metallic: raw['metallic'] ?? 0,
20
+ roughness: raw['roughness'] ?? 0.5,
21
+ albedoTexture: raw['albedoTexture'] ?? undefined,
22
+ emissive: raw['emissive'] ?? undefined,
23
+ emissiveIntensity: raw['emissiveIntensity'] ?? undefined,
24
+ normalTexture: raw['normalTexture'] ?? undefined,
25
+ metallicRoughnessTexture: raw['metallicRoughnessTexture'] ?? undefined,
26
+ texTilingX: raw['texTilingX'] ?? undefined,
27
+ texTilingY: raw['texTilingY'] ?? undefined,
28
+ };
29
+ }
30
+ //# sourceMappingURL=material-asset.js.map