@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.
- package/LICENCE +674 -0
- package/README.md +166 -0
- package/dist/bloom-pass.d.ts +29 -0
- package/dist/bloom-pass.d.ts.map +1 -0
- package/dist/bloom-pass.js +173 -0
- package/dist/bloom-pass.js.map +1 -0
- package/dist/bloom-shader.d.ts +9 -0
- package/dist/bloom-shader.d.ts.map +1 -0
- package/dist/bloom-shader.js +69 -0
- package/dist/bloom-shader.js.map +1 -0
- package/dist/bounds.d.ts +10 -0
- package/dist/bounds.d.ts.map +1 -0
- package/dist/bounds.js +37 -0
- package/dist/bounds.js.map +1 -0
- package/dist/camera.d.ts +31 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +53 -0
- package/dist/camera.js.map +1 -0
- package/dist/depth-prepass.d.ts +24 -0
- package/dist/depth-prepass.d.ts.map +1 -0
- package/dist/depth-prepass.js +107 -0
- package/dist/depth-prepass.js.map +1 -0
- package/dist/directional-light.d.ts +23 -0
- package/dist/directional-light.d.ts.map +1 -0
- package/dist/directional-light.js +36 -0
- package/dist/directional-light.js.map +1 -0
- package/dist/frustum.d.ts +15 -0
- package/dist/frustum.d.ts.map +1 -0
- package/dist/frustum.js +51 -0
- package/dist/frustum.js.map +1 -0
- package/dist/fullscreen-quad.d.ts +8 -0
- package/dist/fullscreen-quad.d.ts.map +1 -0
- package/dist/fullscreen-quad.js +30 -0
- package/dist/fullscreen-quad.js.map +1 -0
- package/dist/geometry.d.ts +28 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +245 -0
- package/dist/geometry.js.map +1 -0
- package/dist/grid-renderer.d.ts +10 -0
- package/dist/grid-renderer.d.ts.map +1 -0
- package/dist/grid-renderer.js +77 -0
- package/dist/grid-renderer.js.map +1 -0
- package/dist/grid-shader.d.ts +3 -0
- package/dist/grid-shader.d.ts.map +1 -0
- package/dist/grid-shader.js +89 -0
- package/dist/grid-shader.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/light.d.ts +59 -0
- package/dist/light.d.ts.map +1 -0
- package/dist/light.js +184 -0
- package/dist/light.js.map +1 -0
- package/dist/material-asset.d.ts +19 -0
- package/dist/material-asset.d.ts.map +1 -0
- package/dist/material-asset.js +30 -0
- package/dist/material-asset.js.map +1 -0
- package/dist/material.d.ts +50 -0
- package/dist/material.d.ts.map +1 -0
- package/dist/material.js +48 -0
- package/dist/material.js.map +1 -0
- package/dist/mesh-renderer.d.ts +43 -0
- package/dist/mesh-renderer.d.ts.map +1 -0
- package/dist/mesh-renderer.js +162 -0
- package/dist/mesh-renderer.js.map +1 -0
- package/dist/mesh.d.ts +16 -0
- package/dist/mesh.d.ts.map +1 -0
- package/dist/mesh.js +33 -0
- package/dist/mesh.js.map +1 -0
- package/dist/mipmap-generator.d.ts +7 -0
- package/dist/mipmap-generator.d.ts.map +1 -0
- package/dist/mipmap-generator.js +96 -0
- package/dist/mipmap-generator.js.map +1 -0
- package/dist/pbr-wgsl.d.ts +12 -0
- package/dist/pbr-wgsl.d.ts.map +1 -0
- package/dist/pbr-wgsl.js +159 -0
- package/dist/pbr-wgsl.js.map +1 -0
- package/dist/pipeline.d.ts +13 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +77 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/point-light.d.ts +16 -0
- package/dist/point-light.d.ts.map +1 -0
- package/dist/point-light.js +22 -0
- package/dist/point-light.js.map +1 -0
- package/dist/point-shadow-pass.d.ts +24 -0
- package/dist/point-shadow-pass.d.ts.map +1 -0
- package/dist/point-shadow-pass.js +192 -0
- package/dist/point-shadow-pass.js.map +1 -0
- package/dist/point-shadow-shader.d.ts +12 -0
- package/dist/point-shadow-shader.d.ts.map +1 -0
- package/dist/point-shadow-shader.js +52 -0
- package/dist/point-shadow-shader.js.map +1 -0
- package/dist/register-builtins.d.ts +2 -0
- package/dist/register-builtins.d.ts.map +1 -0
- package/dist/register-builtins.js +98 -0
- package/dist/register-builtins.js.map +1 -0
- package/dist/render-system.d.ts +99 -0
- package/dist/render-system.d.ts.map +1 -0
- package/dist/render-system.js +476 -0
- package/dist/render-system.js.map +1 -0
- package/dist/scene-depth.d.ts +36 -0
- package/dist/scene-depth.d.ts.map +1 -0
- package/dist/scene-depth.js +183 -0
- package/dist/scene-depth.js.map +1 -0
- package/dist/shader.d.ts +3 -0
- package/dist/shader.d.ts.map +1 -0
- package/dist/shader.js +144 -0
- package/dist/shader.js.map +1 -0
- package/dist/shadow-fragment-wgsl.d.ts +13 -0
- package/dist/shadow-fragment-wgsl.d.ts.map +1 -0
- package/dist/shadow-fragment-wgsl.js +205 -0
- package/dist/shadow-fragment-wgsl.js.map +1 -0
- package/dist/shadow-manager.d.ts +46 -0
- package/dist/shadow-manager.d.ts.map +1 -0
- package/dist/shadow-manager.js +259 -0
- package/dist/shadow-manager.js.map +1 -0
- package/dist/shadow-pass.d.ts +31 -0
- package/dist/shadow-pass.d.ts.map +1 -0
- package/dist/shadow-pass.js +135 -0
- package/dist/shadow-pass.js.map +1 -0
- package/dist/shadow-shader.d.ts +10 -0
- package/dist/shadow-shader.d.ts.map +1 -0
- package/dist/shadow-shader.js +24 -0
- package/dist/shadow-shader.js.map +1 -0
- package/dist/shadow-uniforms.d.ts +38 -0
- package/dist/shadow-uniforms.d.ts.map +1 -0
- package/dist/shadow-uniforms.js +97 -0
- package/dist/shadow-uniforms.js.map +1 -0
- package/dist/skinned-geometry.d.ts +14 -0
- package/dist/skinned-geometry.d.ts.map +1 -0
- package/dist/skinned-geometry.js +23 -0
- package/dist/skinned-geometry.js.map +1 -0
- package/dist/skinned-mesh-renderer.d.ts +54 -0
- package/dist/skinned-mesh-renderer.d.ts.map +1 -0
- package/dist/skinned-mesh-renderer.js +177 -0
- package/dist/skinned-mesh-renderer.js.map +1 -0
- package/dist/skinned-pipeline.d.ts +16 -0
- package/dist/skinned-pipeline.d.ts.map +1 -0
- package/dist/skinned-pipeline.js +112 -0
- package/dist/skinned-pipeline.js.map +1 -0
- package/dist/skinned-shader.d.ts +7 -0
- package/dist/skinned-shader.d.ts.map +1 -0
- package/dist/skinned-shader.js +52 -0
- package/dist/skinned-shader.js.map +1 -0
- package/dist/skinned-shadow-shader.d.ts +6 -0
- package/dist/skinned-shadow-shader.d.ts.map +1 -0
- package/dist/skinned-shadow-shader.js +31 -0
- package/dist/skinned-shadow-shader.js.map +1 -0
- package/dist/spot-light.d.ts +24 -0
- package/dist/spot-light.d.ts.map +1 -0
- package/dist/spot-light.js +41 -0
- package/dist/spot-light.js.map +1 -0
- package/dist/spot-shadow-pass.d.ts +36 -0
- package/dist/spot-shadow-pass.d.ts.map +1 -0
- package/dist/spot-shadow-pass.js +144 -0
- package/dist/spot-shadow-pass.js.map +1 -0
- package/dist/ssao-pass.d.ts +37 -0
- package/dist/ssao-pass.d.ts.map +1 -0
- package/dist/ssao-pass.js +208 -0
- package/dist/ssao-pass.js.map +1 -0
- package/dist/ssao-shader.d.ts +9 -0
- package/dist/ssao-shader.d.ts.map +1 -0
- package/dist/ssao-shader.js +120 -0
- package/dist/ssao-shader.js.map +1 -0
- package/dist/terrain-mesh-renderer.d.ts +39 -0
- package/dist/terrain-mesh-renderer.d.ts.map +1 -0
- package/dist/terrain-mesh-renderer.js +131 -0
- package/dist/terrain-mesh-renderer.js.map +1 -0
- package/dist/terrain-pipeline.d.ts +17 -0
- package/dist/terrain-pipeline.d.ts.map +1 -0
- package/dist/terrain-pipeline.js +70 -0
- package/dist/terrain-pipeline.js.map +1 -0
- package/dist/terrain-shader.d.ts +10 -0
- package/dist/terrain-shader.d.ts.map +1 -0
- package/dist/terrain-shader.js +154 -0
- package/dist/terrain-shader.js.map +1 -0
- package/dist/texture.d.ts +20 -0
- package/dist/texture.d.ts.map +1 -0
- package/dist/texture.js +87 -0
- package/dist/texture.js.map +1 -0
- package/dist/tonemap-pass.d.ts +22 -0
- package/dist/tonemap-pass.d.ts.map +1 -0
- package/dist/tonemap-pass.js +125 -0
- package/dist/tonemap-pass.js.map +1 -0
- package/dist/unlit-pipeline.d.ts +12 -0
- package/dist/unlit-pipeline.d.ts.map +1 -0
- package/dist/unlit-pipeline.js +59 -0
- package/dist/unlit-pipeline.js.map +1 -0
- package/dist/unlit-shader.d.ts +3 -0
- package/dist/unlit-shader.d.ts.map +1 -0
- package/dist/unlit-shader.js +33 -0
- package/dist/unlit-shader.js.map +1 -0
- package/dist/webgpu-device.d.ts +13 -0
- package/dist/webgpu-device.d.ts.map +1 -0
- package/dist/webgpu-device.js +70 -0
- package/dist/webgpu-device.js.map +1 -0
- package/dist/wireframe-pipeline.d.ts +7 -0
- package/dist/wireframe-pipeline.d.ts.map +1 -0
- package/dist/wireframe-pipeline.js +72 -0
- package/dist/wireframe-pipeline.js.map +1 -0
- package/package.json +28 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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":"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"}
|
package/dist/light.d.ts
ADDED
|
@@ -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
|