@aura3d/rendering 1.4.4 → 1.5.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/dist/CascadedShadowMaps.d.ts +9 -1
- package/dist/CascadedShadowMaps.d.ts.map +1 -1
- package/dist/CascadedShadowMaps.js +68 -0
- package/dist/CascadedShadowMaps.js.map +1 -1
- package/dist/ClusteredForwardLighting.d.ts +28 -0
- package/dist/ClusteredForwardLighting.d.ts.map +1 -0
- package/dist/ClusteredForwardLighting.js +156 -0
- package/dist/ClusteredForwardLighting.js.map +1 -0
- package/dist/DepthPass.d.ts +14 -1
- package/dist/DepthPass.d.ts.map +1 -1
- package/dist/DepthPass.js +19 -4
- package/dist/DepthPass.js.map +1 -1
- package/dist/EnvironmentMapResources.d.ts +59 -1
- package/dist/EnvironmentMapResources.d.ts.map +1 -1
- package/dist/EnvironmentMapResources.js +140 -100
- package/dist/EnvironmentMapResources.js.map +1 -1
- package/dist/EnvironmentPlatform.d.ts +3 -2
- package/dist/EnvironmentPlatform.d.ts.map +1 -1
- package/dist/EnvironmentPlatform.js +99 -44
- package/dist/EnvironmentPlatform.js.map +1 -1
- package/dist/ForwardPass.d.ts +37 -0
- package/dist/ForwardPass.d.ts.map +1 -1
- package/dist/ForwardPass.js +234 -7
- package/dist/ForwardPass.js.map +1 -1
- package/dist/Geometry.d.ts +19 -0
- package/dist/Geometry.d.ts.map +1 -1
- package/dist/Geometry.js +64 -0
- package/dist/Geometry.js.map +1 -1
- package/dist/IBL.d.ts.map +1 -1
- package/dist/IBL.js +0 -1
- package/dist/IBL.js.map +1 -1
- package/dist/LightCollector.d.ts +5 -1
- package/dist/LightCollector.d.ts.map +1 -1
- package/dist/LightCollector.js +16 -3
- package/dist/LightCollector.js.map +1 -1
- package/dist/LightUniforms.d.ts +26 -1
- package/dist/LightUniforms.d.ts.map +1 -1
- package/dist/LightUniforms.js +140 -8
- package/dist/LightUniforms.js.map +1 -1
- package/dist/LightingRig.d.ts +77 -0
- package/dist/LightingRig.d.ts.map +1 -1
- package/dist/LightingRig.js +100 -11
- package/dist/LightingRig.js.map +1 -1
- package/dist/MeshConsolidation.d.ts +63 -0
- package/dist/MeshConsolidation.d.ts.map +1 -0
- package/dist/MeshConsolidation.js +251 -0
- package/dist/MeshConsolidation.js.map +1 -0
- package/dist/PMREM.d.ts +13 -1
- package/dist/PMREM.d.ts.map +1 -1
- package/dist/PMREM.js +18 -4
- package/dist/PMREM.js.map +1 -1
- package/dist/PostProcessPass.d.ts +24 -2
- package/dist/PostProcessPass.d.ts.map +1 -1
- package/dist/PostProcessPass.js +136 -18
- package/dist/PostProcessPass.js.map +1 -1
- package/dist/PrimitiveSubmissionAudit.d.ts +195 -0
- package/dist/PrimitiveSubmissionAudit.d.ts.map +1 -0
- package/dist/PrimitiveSubmissionAudit.js +280 -0
- package/dist/PrimitiveSubmissionAudit.js.map +1 -0
- package/dist/ProductTurntableFixtures.d.ts.map +1 -1
- package/dist/ProductTurntableFixtures.js +93 -13
- package/dist/ProductTurntableFixtures.js.map +1 -1
- package/dist/ReflectionProbe.d.ts +59 -0
- package/dist/ReflectionProbe.d.ts.map +1 -1
- package/dist/ReflectionProbe.js +224 -0
- package/dist/ReflectionProbe.js.map +1 -1
- package/dist/ReflectionSurfaces.d.ts +4 -2
- package/dist/ReflectionSurfaces.d.ts.map +1 -1
- package/dist/ReflectionSurfaces.js +13 -8
- package/dist/ReflectionSurfaces.js.map +1 -1
- package/dist/RenderBackend.d.ts +1 -1
- package/dist/RenderBackend.d.ts.map +1 -1
- package/dist/RenderBackend.js +5 -1
- package/dist/RenderBackend.js.map +1 -1
- package/dist/RenderDevice.d.ts +13 -2
- package/dist/RenderDevice.d.ts.map +1 -1
- package/dist/RenderDevice.js +5 -2
- package/dist/RenderDevice.js.map +1 -1
- package/dist/Renderer.d.ts +41 -1
- package/dist/Renderer.d.ts.map +1 -1
- package/dist/Renderer.js +406 -61
- package/dist/Renderer.js.map +1 -1
- package/dist/RendererPostprocessPlan.d.ts +10 -3
- package/dist/RendererPostprocessPlan.d.ts.map +1 -1
- package/dist/RendererPostprocessPlan.js +25 -5
- package/dist/RendererPostprocessPlan.js.map +1 -1
- package/dist/RendererVisualPipelineReport.d.ts +3 -2
- package/dist/RendererVisualPipelineReport.d.ts.map +1 -1
- package/dist/RendererVisualPipelineReport.js +2 -0
- package/dist/RendererVisualPipelineReport.js.map +1 -1
- package/dist/ScreenSpaceLineMaterial.d.ts +34 -0
- package/dist/ScreenSpaceLineMaterial.d.ts.map +1 -0
- package/dist/ScreenSpaceLineMaterial.js +93 -0
- package/dist/ScreenSpaceLineMaterial.js.map +1 -0
- package/dist/ShaderChunks.d.ts +7 -0
- package/dist/ShaderChunks.d.ts.map +1 -1
- package/dist/ShaderChunks.js +137 -0
- package/dist/ShaderChunks.js.map +1 -1
- package/dist/ShaderLibrary.d.ts +17 -0
- package/dist/ShaderLibrary.d.ts.map +1 -1
- package/dist/ShaderLibrary.js +940 -98
- package/dist/ShaderLibrary.js.map +1 -1
- package/dist/ShadowPass.d.ts +10 -0
- package/dist/ShadowPass.d.ts.map +1 -1
- package/dist/ShadowPass.js +8 -1
- package/dist/ShadowPass.js.map +1 -1
- package/dist/SkinnedLitMaterial.d.ts +6 -0
- package/dist/SkinnedLitMaterial.d.ts.map +1 -1
- package/dist/SkinnedLitMaterial.js +22 -8
- package/dist/SkinnedLitMaterial.js.map +1 -1
- package/dist/SkinnedUnlitMaterial.d.ts +8 -0
- package/dist/SkinnedUnlitMaterial.d.ts.map +1 -1
- package/dist/SkinnedUnlitMaterial.js +26 -9
- package/dist/SkinnedUnlitMaterial.js.map +1 -1
- package/dist/SpecularPrefilter.d.ts +42 -0
- package/dist/SpecularPrefilter.d.ts.map +1 -0
- package/dist/SpecularPrefilter.js +480 -0
- package/dist/SpecularPrefilter.js.map +1 -0
- package/dist/TerrainFixtures.d.ts +24 -0
- package/dist/TerrainFixtures.d.ts.map +1 -1
- package/dist/TerrainFixtures.js +96 -0
- package/dist/TerrainFixtures.js.map +1 -1
- package/dist/Texture.d.ts +7 -0
- package/dist/Texture.d.ts.map +1 -1
- package/dist/Texture.js +9 -0
- package/dist/Texture.js.map +1 -1
- package/dist/VertexFormat.d.ts +34 -1
- package/dist/VertexFormat.d.ts.map +1 -1
- package/dist/VertexFormat.js +61 -0
- package/dist/VertexFormat.js.map +1 -1
- package/dist/WebGL2Device.d.ts +48 -0
- package/dist/WebGL2Device.d.ts.map +1 -1
- package/dist/WebGL2Device.js +1298 -44
- package/dist/WebGL2Device.js.map +1 -1
- package/dist/WebGPUDevice.d.ts +7 -2
- package/dist/WebGPUDevice.d.ts.map +1 -1
- package/dist/WebGPUDevice.js +111 -17
- package/dist/WebGPUDevice.js.map +1 -1
- package/dist/WebGPUSkinningLimits.d.ts +14 -0
- package/dist/WebGPUSkinningLimits.d.ts.map +1 -0
- package/dist/WebGPUSkinningLimits.js +14 -0
- package/dist/WebGPUSkinningLimits.js.map +1 -0
- package/dist/cartoon/CartoonMaterialStyle.d.ts +19 -0
- package/dist/cartoon/CartoonMaterialStyle.d.ts.map +1 -0
- package/dist/cartoon/CartoonMaterialStyle.js +13 -0
- package/dist/cartoon/CartoonMaterialStyle.js.map +1 -0
- package/dist/cartoon/CartoonRenderPreset.d.ts +36 -0
- package/dist/cartoon/CartoonRenderPreset.d.ts.map +1 -0
- package/dist/cartoon/CartoonRenderPreset.js +23 -0
- package/dist/cartoon/CartoonRenderPreset.js.map +1 -0
- package/dist/cartoon/CartoonToonMaterial.d.ts +130 -0
- package/dist/cartoon/CartoonToonMaterial.d.ts.map +1 -0
- package/dist/cartoon/CartoonToonMaterial.js +303 -0
- package/dist/cartoon/CartoonToonMaterial.js.map +1 -0
- package/dist/cartoon/CartoonVisualQuality.d.ts +28 -0
- package/dist/cartoon/CartoonVisualQuality.d.ts.map +1 -0
- package/dist/cartoon/CartoonVisualQuality.js +39 -0
- package/dist/cartoon/CartoonVisualQuality.js.map +1 -0
- package/dist/cartoon/applyCartoonRenderPreset.d.ts +79 -0
- package/dist/cartoon/applyCartoonRenderPreset.d.ts.map +1 -0
- package/dist/cartoon/applyCartoonRenderPreset.js +88 -0
- package/dist/cartoon/applyCartoonRenderPreset.js.map +1 -0
- package/dist/cartoon/index.d.ts +6 -0
- package/dist/cartoon/index.d.ts.map +1 -0
- package/dist/cartoon/index.js +6 -0
- package/dist/cartoon/index.js.map +1 -0
- package/dist/index.d.ts +26 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -9
- package/dist/index.js.map +1 -1
- package/dist/postprocess/NativeLdrEffectLuts.d.ts +93 -0
- package/dist/postprocess/NativeLdrEffectLuts.d.ts.map +1 -0
- package/dist/postprocess/NativeLdrEffectLuts.js +202 -0
- package/dist/postprocess/NativeLdrEffectLuts.js.map +1 -0
- package/dist/production-runtime/PBRHDRPipeline.d.ts.map +1 -1
- package/dist/production-runtime/PBRHDRPipeline.js +3 -0
- package/dist/production-runtime/PBRHDRPipeline.js.map +1 -1
- package/dist/production-runtime/ProductionRendererTypes.d.ts +1 -0
- package/dist/production-runtime/ProductionRendererTypes.d.ts.map +1 -1
- package/dist/production-runtime/ProductionRendererTypes.js.map +1 -1
- package/dist/production-runtime/ProductionWebGL2Renderer.d.ts.map +1 -1
- package/dist/production-runtime/ProductionWebGL2Renderer.js +5 -3
- package/dist/production-runtime/ProductionWebGL2Renderer.js.map +1 -1
- package/dist/production-runtime/ProductionWebGPURenderer.d.ts.map +1 -1
- package/dist/production-runtime/ProductionWebGPURenderer.js +9 -5
- package/dist/production-runtime/ProductionWebGPURenderer.js.map +1 -1
- package/dist/production-runtime/TransmissionBackdropCapture.d.ts +5 -0
- package/dist/production-runtime/TransmissionBackdropCapture.d.ts.map +1 -1
- package/dist/production-runtime/TransmissionBackdropCapture.js +40 -0
- package/dist/production-runtime/TransmissionBackdropCapture.js.map +1 -1
- package/dist/production-runtime/environment/HDRLoader.d.ts +6 -0
- package/dist/production-runtime/environment/HDRLoader.d.ts.map +1 -1
- package/dist/production-runtime/environment/HDRLoader.js +19 -0
- package/dist/production-runtime/environment/HDRLoader.js.map +1 -1
- package/dist/production-runtime/index.d.ts +3 -1
- package/dist/production-runtime/index.d.ts.map +1 -1
- package/dist/production-runtime/index.js +1 -0
- package/dist/production-runtime/index.js.map +1 -1
- package/package.json +3 -3
package/dist/ForwardPass.d.ts
CHANGED
|
@@ -39,7 +39,33 @@ export type RenderMaterial = Material | MaterialInstance;
|
|
|
39
39
|
export interface SkinningPaletteBinding {
|
|
40
40
|
readonly jointCount: number;
|
|
41
41
|
readonly matrices: Float32Array;
|
|
42
|
+
/**
|
|
43
|
+
* Second influence set for eight-influence skinning. Only meaningful when the
|
|
44
|
+
* geometry carries `joints1`/`weights1` attributes and the material uses an
|
|
45
|
+
* eight-influence shader.
|
|
46
|
+
*/
|
|
47
|
+
readonly extraInfluences?: boolean;
|
|
42
48
|
}
|
|
49
|
+
/** Which GPU path carried the joint palette for a submission. */
|
|
50
|
+
export type SkinningPalettePath = "uniform-array" | "data-texture";
|
|
51
|
+
export interface SkinningPaletteDiagnostics {
|
|
52
|
+
readonly submissions: number;
|
|
53
|
+
readonly jointsUploaded: number;
|
|
54
|
+
readonly maxJointCount: number;
|
|
55
|
+
readonly uniformArraySubmissions: number;
|
|
56
|
+
readonly dataTextureSubmissions: number;
|
|
57
|
+
readonly eightInfluenceSubmissions: number;
|
|
58
|
+
readonly maxUniformJoints: number;
|
|
59
|
+
}
|
|
60
|
+
/** Joints addressable through the uniform-array palette. Re-exported for shaders. */
|
|
61
|
+
export declare const MAX_UNIFORM_SKINNING_JOINTS = 96;
|
|
62
|
+
/**
|
|
63
|
+
* Upper bound on joints per skin, using the data-texture palette path.
|
|
64
|
+
*
|
|
65
|
+
* Chosen to stay well inside a 1024-wide RGBA32F texture (1024 joints = 4096 texels =
|
|
66
|
+
* a 1024x4 texture) while covering rigs far beyond anything the uniform path allows.
|
|
67
|
+
*/
|
|
68
|
+
export declare const MAX_SKINNING_JOINTS = 1024;
|
|
43
69
|
export declare const MAX_GPU_MORPH_VERTICES = 64;
|
|
44
70
|
export declare const MAX_GPU_MORPH_TARGETS = 4;
|
|
45
71
|
export declare const MAX_GPU_INSTANCES = 64;
|
|
@@ -51,6 +77,8 @@ export interface ForwardPassOptions {
|
|
|
51
77
|
readonly inputColorResource?: string;
|
|
52
78
|
readonly shadowMap?: ForwardShadowMapOptions;
|
|
53
79
|
readonly cameraPosition?: readonly [number, number, number];
|
|
80
|
+
readonly cameraViewMatrix?: Float32Array | readonly number[];
|
|
81
|
+
readonly cameraViewProjectionMatrix?: Float32Array | readonly number[];
|
|
54
82
|
readonly outputColorSpace?: "linear" | "srgb";
|
|
55
83
|
readonly shaderLibrary?: ShaderLibrary;
|
|
56
84
|
}
|
|
@@ -95,6 +123,13 @@ export interface ForwardShadowMapOptions {
|
|
|
95
123
|
readonly texelSize?: readonly [number, number];
|
|
96
124
|
readonly filterKernel?: ShadowFilterKernel;
|
|
97
125
|
readonly pointLight?: ForwardPointShadowMapOptions;
|
|
126
|
+
readonly cascades?: readonly ForwardShadowCascadeOptions[];
|
|
127
|
+
}
|
|
128
|
+
export interface ForwardShadowCascadeOptions {
|
|
129
|
+
readonly index: number;
|
|
130
|
+
readonly near: number;
|
|
131
|
+
readonly far: number;
|
|
132
|
+
readonly shadowMap: Omit<ForwardShadowMapOptions, "cascades">;
|
|
98
133
|
}
|
|
99
134
|
export interface ForwardPointShadowMapOptions {
|
|
100
135
|
readonly texture: TextureBinding;
|
|
@@ -114,10 +149,12 @@ export declare class ForwardPass extends BaseRenderPass {
|
|
|
114
149
|
private readonly materialBinding;
|
|
115
150
|
private readonly shaderLibrary;
|
|
116
151
|
private readonly skinningPaletteUploads;
|
|
152
|
+
private clusteredLighting;
|
|
117
153
|
constructor(options: ForwardPassOptions);
|
|
118
154
|
execute(context: RenderPassContext): void;
|
|
119
155
|
private drawItem;
|
|
120
156
|
private applyLightUniforms;
|
|
121
157
|
private getShader;
|
|
122
158
|
}
|
|
159
|
+
export declare function selectForwardShadowMap(shadowMap: ForwardShadowMapOptions | undefined, item: RenderItem, cameraViewMatrix?: Float32Array | readonly number[], cameraPosition?: readonly [number, number, number]): ForwardShadowMapOptions | undefined;
|
|
123
160
|
//# sourceMappingURL=ForwardPass.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForwardPass.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/ForwardPass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ForwardPass.d.ts","sourceRoot":"","sources":["../../../../packages/rendering/src/ForwardPass.ts"],"names":[],"mappings":"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"}
|
package/dist/ForwardPass.js
CHANGED
|
@@ -8,12 +8,26 @@ import { applyMorphTargets } from "./MorphTarget.js";
|
|
|
8
8
|
import { RenderDeviceError } from "./RenderDevice.js";
|
|
9
9
|
import { RenderPipeline } from "./RenderPipeline.js";
|
|
10
10
|
import { BaseRenderPass } from "./RenderPass.js";
|
|
11
|
+
import { MAX_UNIFORM_SKINNING_JOINTS as SHADER_MAX_UNIFORM_SKINNING_JOINTS } from "./ShaderChunks.js";
|
|
11
12
|
import { ShaderModule } from "./ShaderModule.js";
|
|
12
13
|
import { createDefaultShaderLibrary } from "./ShaderLibrary.js";
|
|
13
14
|
import { createShadowFilterKernel } from "./ShadowMap.js";
|
|
15
|
+
import { Sampler } from "./Sampler.js";
|
|
16
|
+
import { Texture } from "./Texture.js";
|
|
14
17
|
import { TextureBinding } from "./TextureBinding.js";
|
|
15
18
|
import { UnlitMaterial } from "./UnlitMaterial.js";
|
|
16
19
|
import { sortRenderQueueItems } from "./performance/RenderItemSorting.js";
|
|
20
|
+
import { createClusteredForwardLighting } from "./ClusteredForwardLighting.js";
|
|
21
|
+
/** Joints addressable through the uniform-array palette. Re-exported for shaders. */
|
|
22
|
+
export const MAX_UNIFORM_SKINNING_JOINTS = SHADER_MAX_UNIFORM_SKINNING_JOINTS;
|
|
23
|
+
/**
|
|
24
|
+
* Upper bound on joints per skin, using the data-texture palette path.
|
|
25
|
+
*
|
|
26
|
+
* Chosen to stay well inside a 1024-wide RGBA32F texture (1024 joints = 4096 texels =
|
|
27
|
+
* a 1024x4 texture) while covering rigs far beyond anything the uniform path allows.
|
|
28
|
+
*/
|
|
29
|
+
export const MAX_SKINNING_JOINTS = 1024;
|
|
30
|
+
const SKINNING_PALETTE_TEXTURE_MAX_WIDTH = 1024;
|
|
17
31
|
export const MAX_GPU_MORPH_VERTICES = 64;
|
|
18
32
|
export const MAX_GPU_MORPH_TARGETS = 4;
|
|
19
33
|
export const MAX_GPU_INSTANCES = 64;
|
|
@@ -31,6 +45,7 @@ export class ForwardPass extends BaseRenderPass {
|
|
|
31
45
|
materialBinding = new MaterialBinding();
|
|
32
46
|
shaderLibrary;
|
|
33
47
|
skinningPaletteUploads = new SkinningPaletteUploadManager();
|
|
48
|
+
clusteredLighting = null;
|
|
34
49
|
constructor(options) {
|
|
35
50
|
super("forward", options.inputColorResource ? [options.inputColorResource] : [], ["color"]);
|
|
36
51
|
this.options = options;
|
|
@@ -38,8 +53,17 @@ export class ForwardPass extends BaseRenderPass {
|
|
|
38
53
|
}
|
|
39
54
|
execute(context) {
|
|
40
55
|
this.skinningPaletteUploads.beginFrame();
|
|
41
|
-
|
|
42
|
-
this.
|
|
56
|
+
this.clusteredLighting = (this.options.lights?.length ?? 0) > 16
|
|
57
|
+
? createClusteredForwardLighting(this.options.lights ?? [], context.width, context.height, this.options.cameraViewProjectionMatrix)
|
|
58
|
+
: null;
|
|
59
|
+
try {
|
|
60
|
+
for (const item of sortForwardRenderItems(this.options.items, this.options.cameraPosition)) {
|
|
61
|
+
this.drawItem(context.device, item);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
this.clusteredLighting?.dispose();
|
|
66
|
+
this.clusteredLighting = null;
|
|
43
67
|
}
|
|
44
68
|
}
|
|
45
69
|
drawItem(device, item) {
|
|
@@ -67,9 +91,10 @@ export class ForwardPass extends BaseRenderPass {
|
|
|
67
91
|
}
|
|
68
92
|
const binding = this.materialBinding.bind(material, shader);
|
|
69
93
|
const uniforms = new Map(binding.uniforms);
|
|
94
|
+
applyClusteredLightingUniforms(this.clusteredLighting, shader, uniforms);
|
|
70
95
|
applyEnvironmentLightingUniforms(this.options.environmentLighting, item, shader, uniforms);
|
|
71
96
|
applyEnvironmentFogUniforms(this.options.environmentFog, item, shader, uniforms);
|
|
72
|
-
applyForwardShadowMapUniforms(this.options.shadowMap, item, shader, uniforms);
|
|
97
|
+
applyForwardShadowMapUniforms(selectForwardShadowMap(this.options.shadowMap, item, this.options.cameraViewMatrix, this.options.cameraPosition), item, shader, uniforms);
|
|
73
98
|
applyOutputColorSpaceUniform(this.options.outputColorSpace ?? "srgb", item, shader, uniforms);
|
|
74
99
|
applyCameraUniforms(this.options.cameraPosition, item, shader, uniforms);
|
|
75
100
|
applyAlphaCutoffUniform(item, shader, uniforms);
|
|
@@ -153,13 +178,42 @@ class SkinningPaletteUploadManager {
|
|
|
153
178
|
submissions = 0;
|
|
154
179
|
jointsUploaded = 0;
|
|
155
180
|
maxJointCount = 0;
|
|
181
|
+
uniformArraySubmissions = 0;
|
|
182
|
+
dataTextureSubmissions = 0;
|
|
183
|
+
eightInfluenceSubmissions = 0;
|
|
156
184
|
beginFrame() {
|
|
157
185
|
this.submissions = 0;
|
|
158
186
|
this.jointsUploaded = 0;
|
|
159
187
|
this.maxJointCount = 0;
|
|
188
|
+
this.uniformArraySubmissions = 0;
|
|
189
|
+
this.dataTextureSubmissions = 0;
|
|
190
|
+
this.eightInfluenceSubmissions = 0;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Which palette paths this frame actually used. Published rather than inferred so a
|
|
194
|
+
* claim about data-texture or eight-influence skinning rests on observed submissions.
|
|
195
|
+
*/
|
|
196
|
+
diagnostics() {
|
|
197
|
+
return {
|
|
198
|
+
submissions: this.submissions,
|
|
199
|
+
jointsUploaded: this.jointsUploaded,
|
|
200
|
+
maxJointCount: this.maxJointCount,
|
|
201
|
+
uniformArraySubmissions: this.uniformArraySubmissions,
|
|
202
|
+
dataTextureSubmissions: this.dataTextureSubmissions,
|
|
203
|
+
eightInfluenceSubmissions: this.eightInfluenceSubmissions,
|
|
204
|
+
maxUniformJoints: MAX_UNIFORM_SKINNING_JOINTS
|
|
205
|
+
};
|
|
160
206
|
}
|
|
161
207
|
bind(item, skinning, material, shader, uniforms) {
|
|
162
|
-
applySkinningUniforms(skinning, material, shader, uniforms);
|
|
208
|
+
const path = applySkinningUniforms(skinning, material, shader, uniforms);
|
|
209
|
+
if (path === "data-texture")
|
|
210
|
+
this.dataTextureSubmissions += 1;
|
|
211
|
+
else
|
|
212
|
+
this.uniformArraySubmissions += 1;
|
|
213
|
+
const eightInfluence = item.geometry.vertexBuffer.format.hasAttribute("joints1")
|
|
214
|
+
&& item.geometry.vertexBuffer.format.hasAttribute("weights1");
|
|
215
|
+
if (eightInfluence)
|
|
216
|
+
this.eightInfluenceSubmissions += 1;
|
|
163
217
|
const validatedJointCounts = SkinningPaletteUploadManager.validatedGeometryJointCounts.get(item.geometry) ?? new Set();
|
|
164
218
|
if (!validatedJointCounts.has(skinning.jointCount)) {
|
|
165
219
|
validateSkinningGeometryContract(item, skinning);
|
|
@@ -457,6 +511,37 @@ function invertMat4(matrix) {
|
|
|
457
511
|
(a20 * b03 - a21 * b01 + a22 * b00) * invDet
|
|
458
512
|
];
|
|
459
513
|
}
|
|
514
|
+
export function selectForwardShadowMap(shadowMap, item, cameraViewMatrix, cameraPosition) {
|
|
515
|
+
const cascades = shadowMap?.cascades;
|
|
516
|
+
if (!shadowMap || !cascades || cascades.length === 0)
|
|
517
|
+
return shadowMap;
|
|
518
|
+
const center = renderItemWorldCenter(item);
|
|
519
|
+
const depth = cameraViewMatrix && cameraViewMatrix.length >= 16
|
|
520
|
+
? Math.max(0, -(cameraViewMatrix[2] * center[0]
|
|
521
|
+
+ cameraViewMatrix[6] * center[1]
|
|
522
|
+
+ cameraViewMatrix[10] * center[2]
|
|
523
|
+
+ cameraViewMatrix[14]))
|
|
524
|
+
: cameraPosition
|
|
525
|
+
? Math.hypot(center[0] - cameraPosition[0], center[1] - cameraPosition[1], center[2] - cameraPosition[2])
|
|
526
|
+
: cascades[0].near;
|
|
527
|
+
const selected = cascades.find((cascade) => depth <= cascade.far) ?? cascades[cascades.length - 1];
|
|
528
|
+
return selected.shadowMap;
|
|
529
|
+
}
|
|
530
|
+
function renderItemWorldCenter(item) {
|
|
531
|
+
const local = item.boundingBoxCenter ?? [
|
|
532
|
+
(item.geometry.bounds.min[0] + item.geometry.bounds.max[0]) / 2,
|
|
533
|
+
(item.geometry.bounds.min[1] + item.geometry.bounds.max[1]) / 2,
|
|
534
|
+
(item.geometry.bounds.min[2] + item.geometry.bounds.max[2]) / 2
|
|
535
|
+
];
|
|
536
|
+
const matrix = item.modelMatrix;
|
|
537
|
+
if (!matrix || matrix.length < 16)
|
|
538
|
+
return local;
|
|
539
|
+
return [
|
|
540
|
+
matrix[0] * local[0] + matrix[4] * local[1] + matrix[8] * local[2] + matrix[12],
|
|
541
|
+
matrix[1] * local[0] + matrix[5] * local[1] + matrix[9] * local[2] + matrix[13],
|
|
542
|
+
matrix[2] * local[0] + matrix[6] * local[1] + matrix[10] * local[2] + matrix[14]
|
|
543
|
+
];
|
|
544
|
+
}
|
|
460
545
|
function applyForwardShadowMapUniforms(shadowMap, item, shader, uniforms) {
|
|
461
546
|
const requiredUniforms = [
|
|
462
547
|
"u_shadowMapTexture",
|
|
@@ -535,6 +620,33 @@ function applyForwardShadowMapUniforms(shadowMap, item, shader, uniforms) {
|
|
|
535
620
|
uniforms.set("u_shadowPcfSampleCount", filterKernel.samples.length);
|
|
536
621
|
uniforms.set("u_shadowPcfSamples", pcfSamples);
|
|
537
622
|
}
|
|
623
|
+
function applyClusteredLightingUniforms(clustered, shader, uniforms) {
|
|
624
|
+
const required = [
|
|
625
|
+
"u_clusteredLightEnabled",
|
|
626
|
+
"u_clusterGridSize",
|
|
627
|
+
"u_clusterViewportSize",
|
|
628
|
+
"u_clusterLightData",
|
|
629
|
+
"u_clusterLightIndices"
|
|
630
|
+
];
|
|
631
|
+
if (!required.every((name) => shader.reflection.uniforms.has(name)))
|
|
632
|
+
return;
|
|
633
|
+
if (!clustered) {
|
|
634
|
+
uniforms.set("u_clusteredLightEnabled", 0);
|
|
635
|
+
uniforms.set("u_clusterGridSize", [1, 1]);
|
|
636
|
+
uniforms.set("u_clusterViewportSize", [1, 1]);
|
|
637
|
+
uniforms.set("u_clusterLightData", new TextureBinding({ name: "u_clusterLightData", required: false }));
|
|
638
|
+
uniforms.set("u_clusterLightIndices", new TextureBinding({ name: "u_clusterLightIndices", required: false }));
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
uniforms.set("u_clusteredLightEnabled", 1);
|
|
642
|
+
uniforms.set("u_clusterGridSize", [clustered.diagnostics.gridWidth, clustered.diagnostics.gridHeight]);
|
|
643
|
+
uniforms.set("u_clusterViewportSize", [
|
|
644
|
+
clustered.diagnostics.viewportWidth,
|
|
645
|
+
clustered.diagnostics.viewportHeight
|
|
646
|
+
]);
|
|
647
|
+
uniforms.set("u_clusterLightData", clustered.lightData);
|
|
648
|
+
uniforms.set("u_clusterLightIndices", clustered.lightIndices);
|
|
649
|
+
}
|
|
538
650
|
function applyForwardPointShadowMapUniforms(pointShadowMap, item, shader, uniforms) {
|
|
539
651
|
const requiredUniforms = [
|
|
540
652
|
"u_pointShadowMapTexture",
|
|
@@ -1242,9 +1354,11 @@ function applySkinningUniforms(skinning, material, shader, uniforms) {
|
|
|
1242
1354
|
material: material.name
|
|
1243
1355
|
});
|
|
1244
1356
|
}
|
|
1245
|
-
if (!Number.isInteger(skinning.jointCount) || skinning.jointCount <= 0 || skinning.jointCount >
|
|
1246
|
-
throw new RenderDeviceError(
|
|
1247
|
-
jointCount: skinning.jointCount
|
|
1357
|
+
if (!Number.isInteger(skinning.jointCount) || skinning.jointCount <= 0 || skinning.jointCount > MAX_SKINNING_JOINTS) {
|
|
1358
|
+
throw new RenderDeviceError(`Skinning jointCount must be an integer in [1, ${MAX_SKINNING_JOINTS}]`, "INVALID_SKINNING_PALETTE", {
|
|
1359
|
+
jointCount: skinning.jointCount,
|
|
1360
|
+
maxUniformJoints: MAX_UNIFORM_SKINNING_JOINTS,
|
|
1361
|
+
maxJoints: MAX_SKINNING_JOINTS
|
|
1248
1362
|
});
|
|
1249
1363
|
}
|
|
1250
1364
|
if (skinning.matrices.length !== skinning.jointCount * 16) {
|
|
@@ -1259,7 +1373,68 @@ function applySkinningUniforms(skinning, material, shader, uniforms) {
|
|
|
1259
1373
|
});
|
|
1260
1374
|
}
|
|
1261
1375
|
uniforms.set("u_jointCount", skinning.jointCount);
|
|
1376
|
+
// Over the uniform-array limit the palette travels as an RGBA32F data texture, four
|
|
1377
|
+
// texels per matrix. A mat4 uniform costs four vec4 slots, so a uniform array cannot
|
|
1378
|
+
// be grown far enough for large rigs without exhausting MAX_VERTEX_UNIFORM_VECTORS.
|
|
1379
|
+
const path = skinning.jointCount > MAX_UNIFORM_SKINNING_JOINTS ? "data-texture" : "uniform-array";
|
|
1380
|
+
if (path === "data-texture") {
|
|
1381
|
+
if (!shader.reflection.uniforms.has("u_jointPaletteTexture") || !shader.reflection.uniforms.has("u_jointPaletteMode")) {
|
|
1382
|
+
throw new RenderDeviceError(`Skinning palettes above ${MAX_UNIFORM_SKINNING_JOINTS} joints require a shader with data-texture palette uniforms`, "SKINNING_SHADER_CONTRACT", { material: material.name, jointCount: skinning.jointCount });
|
|
1383
|
+
}
|
|
1384
|
+
const texture = createSkinningPaletteTexture(skinning, material.name);
|
|
1385
|
+
uniforms.set("u_jointPaletteMode", 1);
|
|
1386
|
+
uniforms.set("u_jointPaletteTexture", new TextureBinding({
|
|
1387
|
+
name: "u_jointPaletteTexture",
|
|
1388
|
+
texture,
|
|
1389
|
+
sampler: new Sampler({ minFilter: "nearest", magFilter: "nearest", addressU: "clamp-to-edge", addressV: "clamp-to-edge" }),
|
|
1390
|
+
required: true
|
|
1391
|
+
}));
|
|
1392
|
+
uniforms.set("u_jointPaletteTextureSize", [texture.width, texture.height]);
|
|
1393
|
+
// The uniform array is still declared by the shader, so give it a valid value.
|
|
1394
|
+
uniforms.set("u_jointMatrices", new Float32Array(MAX_UNIFORM_SKINNING_JOINTS * 16));
|
|
1395
|
+
return path;
|
|
1396
|
+
}
|
|
1397
|
+
if (shader.reflection.uniforms.has("u_jointPaletteMode")) {
|
|
1398
|
+
uniforms.set("u_jointPaletteMode", 0);
|
|
1399
|
+
if (shader.reflection.uniforms.has("u_jointPaletteTextureSize"))
|
|
1400
|
+
uniforms.set("u_jointPaletteTextureSize", [1, 1]);
|
|
1401
|
+
if (shader.reflection.uniforms.has("u_jointPaletteTexture")) {
|
|
1402
|
+
uniforms.set("u_jointPaletteTexture", new TextureBinding({ name: "u_jointPaletteTexture", required: false }));
|
|
1403
|
+
}
|
|
1404
|
+
}
|
|
1262
1405
|
uniforms.set("u_jointMatrices", skinning.matrices);
|
|
1406
|
+
return path;
|
|
1407
|
+
}
|
|
1408
|
+
/**
|
|
1409
|
+
* Packs a joint palette into an RGBA32F texture, one texel per matrix column.
|
|
1410
|
+
*
|
|
1411
|
+
* Width is a multiple of four so no matrix straddles a row boundary, which keeps the
|
|
1412
|
+
* shader's texel addressing a simple divide and avoids per-column row recomputation.
|
|
1413
|
+
*/
|
|
1414
|
+
function createSkinningPaletteTexture(skinning, materialName) {
|
|
1415
|
+
const texelsPerMatrix = 4;
|
|
1416
|
+
const totalTexels = skinning.jointCount * texelsPerMatrix;
|
|
1417
|
+
const width = Math.min(SKINNING_PALETTE_TEXTURE_MAX_WIDTH, Math.max(texelsPerMatrix, ceilToMultiple(Math.ceil(Math.sqrt(totalTexels)), texelsPerMatrix)));
|
|
1418
|
+
const height = Math.ceil(totalTexels / width);
|
|
1419
|
+
const data = new Float32Array(width * height * 4);
|
|
1420
|
+
data.set(skinning.matrices.subarray(0, Math.min(skinning.matrices.length, data.length)));
|
|
1421
|
+
if (skinning.matrices.length > data.length) {
|
|
1422
|
+
throw new RenderDeviceError("Skinning palette does not fit the data texture", "INVALID_SKINNING_PALETTE", {
|
|
1423
|
+
material: materialName,
|
|
1424
|
+
jointCount: skinning.jointCount
|
|
1425
|
+
});
|
|
1426
|
+
}
|
|
1427
|
+
return new Texture({
|
|
1428
|
+
width,
|
|
1429
|
+
height,
|
|
1430
|
+
format: "rgba32f",
|
|
1431
|
+
colorSpace: "linear",
|
|
1432
|
+
label: `aura3d-skinning-palette-${skinning.jointCount}-joints`,
|
|
1433
|
+
data
|
|
1434
|
+
});
|
|
1435
|
+
}
|
|
1436
|
+
function ceilToMultiple(value, multiple) {
|
|
1437
|
+
return Math.ceil(value / multiple) * multiple;
|
|
1263
1438
|
}
|
|
1264
1439
|
function validateSkinningGeometryContract(item, skinning) {
|
|
1265
1440
|
const format = item.geometry.vertexBuffer.format;
|
|
@@ -1284,10 +1459,62 @@ function validateSkinningGeometryContract(item, skinning) {
|
|
|
1284
1459
|
weightComponents: weightsAttribute.components
|
|
1285
1460
|
});
|
|
1286
1461
|
}
|
|
1462
|
+
// Eight-influence geometry must supply both halves of the second set, and both must
|
|
1463
|
+
// be vec4. A half-declared second set would silently drop influences at draw time.
|
|
1464
|
+
const hasJoints1 = format.hasAttribute("joints1");
|
|
1465
|
+
const hasWeights1 = format.hasAttribute("weights1");
|
|
1466
|
+
if (hasJoints1 !== hasWeights1) {
|
|
1467
|
+
throw new RenderDeviceError("Eight-influence skinned geometry must declare both joints1 and weights1", "SKINNING_GEOMETRY_CONTRACT", {
|
|
1468
|
+
label: item.label,
|
|
1469
|
+
hasJoints1,
|
|
1470
|
+
hasWeights1
|
|
1471
|
+
});
|
|
1472
|
+
}
|
|
1473
|
+
const eightInfluence = hasJoints1 && hasWeights1;
|
|
1474
|
+
if (eightInfluence) {
|
|
1475
|
+
const joints1Attribute = format.getAttribute("joints1");
|
|
1476
|
+
const weights1Attribute = format.getAttribute("weights1");
|
|
1477
|
+
if (joints1Attribute.components !== 4 || weights1Attribute.components !== 4) {
|
|
1478
|
+
throw new RenderDeviceError("Eight-influence skinned geometry must use four components per second-set attribute", "SKINNING_GEOMETRY_CONTRACT", {
|
|
1479
|
+
label: item.label,
|
|
1480
|
+
joints1Components: joints1Attribute.components,
|
|
1481
|
+
weights1Components: weights1Attribute.components
|
|
1482
|
+
});
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1287
1485
|
for (let vertex = 0; vertex < item.geometry.vertexBuffer.vertexCount; vertex += 1) {
|
|
1288
1486
|
const joints = item.geometry.vertexBuffer.getAttribute(vertex, "joints");
|
|
1289
1487
|
const weights = item.geometry.vertexBuffer.getAttribute(vertex, "weights");
|
|
1290
1488
|
let weightSum = 0;
|
|
1489
|
+
if (eightInfluence) {
|
|
1490
|
+
// Validate the second set with the same rules, and fold it into the weight sum so
|
|
1491
|
+
// a vertex whose influence is split across both sets is not reported as unweighted.
|
|
1492
|
+
const joints1 = item.geometry.vertexBuffer.getAttribute(vertex, "joints1");
|
|
1493
|
+
const weights1 = item.geometry.vertexBuffer.getAttribute(vertex, "weights1");
|
|
1494
|
+
for (let influence = 0; influence < 4; influence += 1) {
|
|
1495
|
+
const joint = joints1[influence] ?? 0;
|
|
1496
|
+
const weight = weights1[influence] ?? 0;
|
|
1497
|
+
if (!Number.isFinite(weight) || weight < 0) {
|
|
1498
|
+
throw new RenderDeviceError("Skinned render item weights must be finite non-negative values", "SKINNING_GEOMETRY_CONTRACT", {
|
|
1499
|
+
label: item.label,
|
|
1500
|
+
jointCount: skinning.jointCount,
|
|
1501
|
+
vertex,
|
|
1502
|
+
influence: influence + 4,
|
|
1503
|
+
weight
|
|
1504
|
+
});
|
|
1505
|
+
}
|
|
1506
|
+
if (!Number.isInteger(joint) || joint < 0 || joint >= skinning.jointCount) {
|
|
1507
|
+
throw new RenderDeviceError("Skinned render item joint indices must reference palette joints", "SKINNING_GEOMETRY_CONTRACT", {
|
|
1508
|
+
label: item.label,
|
|
1509
|
+
jointCount: skinning.jointCount,
|
|
1510
|
+
vertex,
|
|
1511
|
+
influence: influence + 4,
|
|
1512
|
+
joint
|
|
1513
|
+
});
|
|
1514
|
+
}
|
|
1515
|
+
weightSum += weight;
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1291
1518
|
for (let influence = 0; influence < 4; influence += 1) {
|
|
1292
1519
|
const joint = joints[influence] ?? 0;
|
|
1293
1520
|
const weight = weights[influence] ?? 0;
|