@aura3d/rendering 1.4.0 → 1.4.2
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/package.json +38 -4
- package/AGENTS.md +0 -46
- package/src/ArchitecturalLightingFixtures.ts +0 -241
- package/src/ArchitecturalMaterialCatalog.ts +0 -130
- package/src/ArchitecturalMeasurementFixtures.ts +0 -155
- package/src/BRDFLut.ts +0 -47
- package/src/CameraFraming.ts +0 -200
- package/src/CanonicalSceneFixtures.ts +0 -95
- package/src/CascadedShadowMaps.ts +0 -449
- package/src/ColorManagement.ts +0 -127
- package/src/CullingFixtures.ts +0 -280
- package/src/DecalGeometry.ts +0 -26
- package/src/DepthPass.ts +0 -110
- package/src/EnvironmentBackgroundPass.ts +0 -194
- package/src/EnvironmentBackgroundResources.ts +0 -309
- package/src/EnvironmentLighting.ts +0 -96
- package/src/EnvironmentMapResources.ts +0 -1026
- package/src/EnvironmentPipeline.ts +0 -69
- package/src/EnvironmentPlatform.ts +0 -1306
- package/src/EnvironmentPreset.ts +0 -155
- package/src/Exposure.ts +0 -66
- package/src/ExternalParityRenderPreset.ts +0 -725
- package/src/ForwardPass.ts +0 -1668
- package/src/FrameVisualMetrics.ts +0 -301
- package/src/Geometry.ts +0 -461
- package/src/GeometryPrimitives.ts +0 -2
- package/src/HDRRenderPipeline.ts +0 -94
- package/src/IBL.ts +0 -86
- package/src/IndexBuffer.ts +0 -57
- package/src/InstancedPBRMaterial.ts +0 -186
- package/src/InstancedUnlitMaterial.ts +0 -60
- package/src/Instancing.ts +0 -19
- package/src/LightCollector.ts +0 -82
- package/src/LightUniforms.ts +0 -47
- package/src/LightingDebug.ts +0 -80
- package/src/LightingDefaults.ts +0 -79
- package/src/LightingRig.ts +0 -301
- package/src/LineGeometry.ts +0 -2
- package/src/Material.ts +0 -209
- package/src/MaterialBinding.ts +0 -131
- package/src/MaterialInstance.ts +0 -59
- package/src/MaterialPresets.ts +0 -272
- package/src/MorphTarget.ts +0 -124
- package/src/MorphTargetPlan.ts +0 -178
- package/src/MorphUnlitMaterial.ts +0 -60
- package/src/NormalMappedPBRMaterial.ts +0 -188
- package/src/OceanFixtures.ts +0 -318
- package/src/PBRLightingDefaults.ts +0 -12
- package/src/PBRMaterial.ts +0 -442
- package/src/PMREM.ts +0 -53
- package/src/PbrReference.ts +0 -681
- package/src/PostProcessPass.ts +0 -2507
- package/src/ProceduralTextureFixtures.ts +0 -393
- package/src/ProductTurntableFixtures.ts +0 -815
- package/src/Raycaster.ts +0 -21
- package/src/ReflectionProbe.ts +0 -13
- package/src/ReflectionSurfaces.ts +0 -219
- package/src/RenderBackend.ts +0 -43
- package/src/RenderDebugViews.ts +0 -138
- package/src/RenderDevice.ts +0 -836
- package/src/RenderGraph.ts +0 -194
- package/src/RenderPass.ts +0 -27
- package/src/RenderPipeline.ts +0 -101
- package/src/RenderQueue.ts +0 -12
- package/src/RenderState.ts +0 -12
- package/src/Renderer.ts +0 -2631
- package/src/RendererDebugOverlay.ts +0 -80
- package/src/RendererFeatureGates.ts +0 -150
- package/src/RendererPostprocessPlan.ts +0 -279
- package/src/RendererTiming.ts +0 -251
- package/src/RendererVisualPipelineReport.ts +0 -836
- package/src/ResourceLifecycle.ts +0 -21
- package/src/Sampler.ts +0 -37
- package/src/SceneOptimization.ts +0 -518
- package/src/ShaderChunks.ts +0 -393
- package/src/ShaderLibrary.ts +0 -2766
- package/src/ShaderModule.ts +0 -36
- package/src/ShaderPreprocessor.ts +0 -260
- package/src/ShaderReflection.ts +0 -201
- package/src/ShadowMap.ts +0 -237
- package/src/ShadowPass.ts +0 -198
- package/src/ShadowProjection.ts +0 -115
- package/src/SkinnedLitMaterial.ts +0 -397
- package/src/SkinnedUnlitMaterial.ts +0 -63
- package/src/SkinningBounds.ts +0 -131
- package/src/SpaceEnvironmentFixtures.ts +0 -200
- package/src/SpriteGeometry.ts +0 -21
- package/src/StereoCameraRig.ts +0 -127
- package/src/StereoEffects.ts +0 -274
- package/src/TerrainFixtures.ts +0 -180
- package/src/Texture.ts +0 -307
- package/src/TextureBinding.ts +0 -91
- package/src/TexturedPBRMaterial.ts +0 -1112
- package/src/TexturedUnlitMaterial.ts +0 -67
- package/src/ToneMapping.ts +0 -105
- package/src/UniformBinder.ts +0 -16
- package/src/UniformLayout.ts +0 -129
- package/src/UnlitMaterial.ts +0 -75
- package/src/VegetationFixtures.ts +0 -314
- package/src/VertexBuffer.ts +0 -120
- package/src/VertexFormat.ts +0 -171
- package/src/VoxelWorldFixtures.ts +0 -280
- package/src/WeatherFixtures.ts +0 -223
- package/src/WebGL2Device.ts +0 -2280
- package/src/WebGL2StateCache.ts +0 -330
- package/src/WebGPUDevice.ts +0 -2877
- package/src/WebGPURenderToTextureProof.ts +0 -139
- package/src/advanced-runtime/AdvancedRenderer.ts +0 -73
- package/src/advanced-runtime/index.ts +0 -9
- package/src/animation/AnimationMaterialStyle.ts +0 -32
- package/src/animation/AnimationRenderPreset.ts +0 -45
- package/src/animation/AnimationToonMaterial.ts +0 -387
- package/src/animation/AnimationVisualQuality.ts +0 -71
- package/src/animation/applyAnimationRenderPreset.ts +0 -180
- package/src/animation/index.ts +0 -5
- package/src/cinematic/BloomPass.ts +0 -26
- package/src/cinematic/CinematicDepthComposition.ts +0 -30
- package/src/cinematic/CinematicEvidence.ts +0 -123
- package/src/cinematic/CinematicLightingRig.ts +0 -144
- package/src/cinematic/CinematicMaterialPresets.ts +0 -130
- package/src/cinematic/CinematicPostProcess.ts +0 -83
- package/src/cinematic/DepthHazePass.ts +0 -30
- package/src/cinematic/EmissivePracticalLightSystem.ts +0 -45
- package/src/cinematic/FilmGrainPass.ts +0 -24
- package/src/cinematic/FogVolumeSystem.ts +0 -30
- package/src/cinematic/GlowCardSystem.ts +0 -44
- package/src/cinematic/RainParticleSystem.ts +0 -151
- package/src/cinematic/VignettePass.ts +0 -25
- package/src/cinematic/WetReflectionApproximation.ts +0 -27
- package/src/cinematic/index.ts +0 -14
- package/src/effects/CollisionModule.ts +0 -64
- package/src/effects/ColorModule.ts +0 -60
- package/src/effects/ForceModule.ts +0 -25
- package/src/effects/GPUParticleBackend.ts +0 -569
- package/src/effects/Particle.ts +0 -108
- package/src/effects/ParticleDiagnostics.ts +0 -224
- package/src/effects/ParticleEffectPresets.ts +0 -147
- package/src/effects/ParticleEmitter.ts +0 -326
- package/src/effects/ParticleModule.ts +0 -26
- package/src/effects/ParticleRenderPass.ts +0 -117
- package/src/effects/ParticleRenderer.ts +0 -132
- package/src/effects/ParticleSystem.ts +0 -333
- package/src/effects/SizeModule.ts +0 -56
- package/src/effects/TrailModule.ts +0 -72
- package/src/effects/VelocityModule.ts +0 -75
- package/src/effects/index.ts +0 -15
- package/src/index.ts +0 -925
- package/src/materials/AlphaSorting.ts +0 -30
- package/src/materials/MaterialExtensions.ts +0 -42
- package/src/materials/PhysicalMaterial.ts +0 -133
- package/src/materials/TransmissionPass.ts +0 -51
- package/src/performance/BVH.ts +0 -18
- package/src/performance/Batcher.ts +0 -2
- package/src/performance/FrustumCuller.ts +0 -9
- package/src/performance/LOD.ts +0 -20
- package/src/performance/Octree.ts +0 -10
- package/src/performance/RenderItemSorting.ts +0 -170
- package/src/performance/RendererStats.ts +0 -43
- package/src/performance/ResourceBudget.ts +0 -44
- package/src/postprocess/BloomPass.ts +0 -28
- package/src/postprocess/CinematicDiagnostics.ts +0 -642
- package/src/postprocess/ColorGradingPass.ts +0 -24
- package/src/postprocess/DepthOfFieldPass.ts +0 -12
- package/src/postprocess/EffectComposer.ts +0 -349
- package/src/postprocess/SSAOPass.ts +0 -20
- package/src/postprocess/index.ts +0 -34
- package/src/production-runtime/AnimationControlsPipeline.ts +0 -77
- package/src/production-runtime/PBRHDRPipeline.ts +0 -381
- package/src/production-runtime/ProductionEffectsPipeline.ts +0 -85
- package/src/production-runtime/ProductionRendererTypes.ts +0 -136
- package/src/production-runtime/ProductionRuntimeRenderer.ts +0 -172
- package/src/production-runtime/ProductionWebGL2Renderer.ts +0 -313
- package/src/production-runtime/ProductionWebGPURenderer.ts +0 -396
- package/src/production-runtime/TransmissionBackdropCapture.ts +0 -130
- package/src/production-runtime/animation/MorphTargetRenderer.ts +0 -2
- package/src/production-runtime/animation/SkinningRenderer.ts +0 -2
- package/src/production-runtime/backends/RendererBackend.ts +0 -17
- package/src/production-runtime/backends/WebGL2RendererBackend.ts +0 -30
- package/src/production-runtime/backends/WebGPURendererBackend.ts +0 -24
- package/src/production-runtime/backends/webgl2/WebGL2Buffer.ts +0 -2
- package/src/production-runtime/backends/webgl2/WebGL2Capabilities.ts +0 -2
- package/src/production-runtime/backends/webgl2/WebGL2RenderTarget.ts +0 -2
- package/src/production-runtime/backends/webgl2/WebGL2Shader.ts +0 -2
- package/src/production-runtime/backends/webgl2/WebGL2StateCache.ts +0 -1
- package/src/production-runtime/backends/webgl2/WebGL2Texture.ts +0 -2
- package/src/production-runtime/backends/webgpu/WebGPUBuffer.ts +0 -2
- package/src/production-runtime/backends/webgpu/WebGPUCapabilities.ts +0 -2
- package/src/production-runtime/backends/webgpu/WebGPURenderTarget.ts +0 -2
- package/src/production-runtime/backends/webgpu/WebGPUShader.ts +0 -2
- package/src/production-runtime/backends/webgpu/WebGPUTexture.ts +0 -2
- package/src/production-runtime/color/ColorManagement.ts +0 -3
- package/src/production-runtime/color/ToneMapping.ts +0 -7
- package/src/production-runtime/diagnostics/FrameCapture.ts +0 -2
- package/src/production-runtime/diagnostics/GPUCapabilities.ts +0 -2
- package/src/production-runtime/diagnostics/RendererStats.ts +0 -2
- package/src/production-runtime/environment/EnvironmentMap.ts +0 -1
- package/src/production-runtime/environment/HDRLoader.ts +0 -57
- package/src/production-runtime/environment/PMREMGenerator.ts +0 -713
- package/src/production-runtime/framegraph/FrameGraph.ts +0 -18
- package/src/production-runtime/framegraph/RenderPass.ts +0 -15
- package/src/production-runtime/geometry/ProjectedDecalGeometry.ts +0 -439
- package/src/production-runtime/index.ts +0 -127
- package/src/production-runtime/lights/LightManager.ts +0 -7
- package/src/production-runtime/lights/ShadowMapRenderer.ts +0 -5
- package/src/production-runtime/materials/GLTFMaterialAdapter.ts +0 -6
- package/src/production-runtime/materials/GLTFPBRMaterialAdapter.ts +0 -2
- package/src/production-runtime/materials/MaterialCompiler.ts +0 -7
- package/src/production-runtime/materials/MaterialTextureBindings.ts +0 -5
- package/src/production-runtime/materials/PBRMaterial.ts +0 -2
- package/src/production-runtime/materials/PBRShaderFeatures.ts +0 -2
- package/src/production-runtime/passes/ContactShadowPass.ts +0 -184
- package/src/production-runtime/passes/DepthPrepass.ts +0 -7
- package/src/production-runtime/passes/OpaquePass.ts +0 -7
- package/src/production-runtime/passes/ShadowPass.ts +0 -7
- package/src/production-runtime/passes/SkyboxPass.ts +0 -7
- package/src/production-runtime/passes/ToneMappingPass.ts +0 -7
- package/src/production-runtime/passes/TransparentPass.ts +0 -7
- package/src/production-runtime/postprocess/BloomPass.ts +0 -51
- package/src/production-runtime/postprocess/ColorGradingPass.ts +0 -49
- package/src/production-runtime/postprocess/DOFPass.ts +0 -47
- package/src/production-runtime/postprocess/FXAAPass.ts +0 -53
- package/src/production-runtime/postprocess/ProductionEffectComposer.ts +0 -78
- package/src/production-runtime/postprocess/ProductionPostProcessTypes.ts +0 -174
- package/src/production-runtime/postprocess/SSAOPass.ts +0 -45
- package/src/production-runtime/resources/GPUBuffer.ts +0 -2
- package/src/production-runtime/resources/GPUTexture.ts +0 -2
- package/src/production-runtime/resources/RenderTarget.ts +0 -3
- package/src/production-runtime/resources/ResourceCache.ts +0 -7
- package/src/production-runtime/scene/Camera.ts +0 -1
- package/src/production-runtime/scene/Lights.ts +0 -2
- package/src/production-runtime/scene/RenderableMesh.ts +0 -2
- package/src/production-runtime/scene/RenderablePrimitive.ts +0 -1
- package/src/production-runtime/scene/RenderableScene.ts +0 -4
- package/src/production-runtime/shaders/ShaderProgramLibrary.ts +0 -7
- package/src/production-runtime/shaders/chunks/brdf.glsl +0 -2
- package/src/production-runtime/shaders/chunks/ibl.glsl +0 -3
- package/src/production-runtime/shaders/chunks/pbr.frag.glsl +0 -47
- package/src/production-runtime/shaders/chunks/pbr.vert.glsl +0 -8
- package/src/production-runtime/shaders/chunks/shadows.glsl +0 -2
- package/src/production-runtime/shaders/wgsl/pbr.wgsl +0 -3
- package/src/production-runtime/shaders/wgsl/postprocess.wgsl +0 -2
- package/src/production-runtime/shaders/wgsl/skybox.wgsl +0 -2
- package/src/shaders/depth.frag.glsl +0 -5
- package/src/shaders/depth.vert.glsl +0 -8
- package/src/shaders/pbr-direct.frag.glsl +0 -687
- package/src/shaders/pbr-direct.vert.glsl +0 -18
- package/src/shaders/unlit.frag.glsl +0 -18
- package/src/shaders/unlit.vert.glsl +0 -13
- package/src/shadows/CascadedShadowPipeline.ts +0 -53
- package/src/shadows/ContactShadows.ts +0 -106
- package/src/shadows/ShadowDebugViews.ts +0 -46
- package/src/threejs-compatibility/InstancingSystem.ts +0 -17
- package/src/threejs-compatibility/LightingSystem.ts +0 -22
- package/src/threejs-compatibility/MaterialSystem.ts +0 -9
- package/src/threejs-compatibility/RenderTargetSystem.ts +0 -35
- package/src/threejs-compatibility/RendererDiagnostics.ts +0 -61
- package/src/threejs-compatibility/SceneRenderer.ts +0 -34
- package/src/threejs-compatibility/ShadowSystem.ts +0 -19
- package/src/threejs-compatibility/TextureSystem.ts +0 -19
- package/src/threejs-compatibility/ThreeCompatRenderer.ts +0 -90
- package/src/threejs-compatibility/TransparencySystem.ts +0 -19
- package/src/threejs-compatibility/index.ts +0 -29
- package/src/threejs-compatibility/performance/BVH.ts +0 -14
- package/src/threejs-compatibility/performance/FrustumCulling.ts +0 -10
- package/src/threejs-compatibility/performance/Instancing.ts +0 -4
- package/src/threejs-compatibility/performance/LODSystem.ts +0 -16
- package/src/threejs-compatibility/performance/OcclusionCulling.ts +0 -6
- package/src/threejs-compatibility/performance/RaycastAcceleration.ts +0 -12
- package/src/threejs-compatibility/performance/RendererProfiler.ts +0 -19
- package/src/threejs-compatibility/performance/TextureStreaming.ts +0 -4
- package/src/threejs-compatibility/performance/index.ts +0 -12
- package/src/threejs-compatibility/postprocess/BloomPass.ts +0 -16
- package/src/threejs-compatibility/postprocess/ColorGradingPass.ts +0 -16
- package/src/threejs-compatibility/postprocess/DepthOfFieldPass.ts +0 -21
- package/src/threejs-compatibility/postprocess/EffectComposer.ts +0 -14
- package/src/threejs-compatibility/postprocess/FXAAPass.ts +0 -15
- package/src/threejs-compatibility/postprocess/MotionBlurPass.ts +0 -20
- package/src/threejs-compatibility/postprocess/OutlinePass.ts +0 -21
- package/src/threejs-compatibility/postprocess/PostProcessTypes.ts +0 -169
- package/src/threejs-compatibility/postprocess/RenderPass.ts +0 -9
- package/src/threejs-compatibility/postprocess/SMAAPass.ts +0 -15
- package/src/threejs-compatibility/postprocess/SSAOPass.ts +0 -21
- package/src/threejs-compatibility/postprocess/ShaderPass.ts +0 -7
- package/src/threejs-compatibility/postprocess/TAAPass.ts +0 -15
- package/src/threejs-compatibility/postprocess/VignettePass.ts +0 -16
- package/src/threejs-compatibility/postprocess/index.ts +0 -15
- package/src/threejs-compatibility/shaders/NodeMaterial.ts +0 -21
- package/src/threejs-compatibility/shaders/RawShaderMaterial.ts +0 -6
- package/src/threejs-compatibility/shaders/ShaderDiagnostics.ts +0 -17
- package/src/threejs-compatibility/shaders/ShaderMaterial.ts +0 -18
- package/src/threejs-compatibility/shaders/ThreeCompatShaderChunks.ts +0 -6
- package/src/threejs-compatibility/shaders/Uniforms.ts +0 -18
- package/src/threejs-compatibility/shaders/index.ts +0 -9
- package/src/threejs-compatibility/vfx/GPUPointCloud.ts +0 -7
- package/src/threejs-compatibility/vfx/LineRenderer.ts +0 -13
- package/src/threejs-compatibility/vfx/ParticleSystem.ts +0 -23
- package/src/threejs-compatibility/vfx/SpriteSystem.ts +0 -14
- package/src/threejs-compatibility/vfx/TrailRenderer.ts +0 -8
- package/src/threejs-compatibility/vfx/VFXDiagnostics.ts +0 -23
- package/src/threejs-compatibility/vfx/index.ts +0 -9
- package/src/threejs-example-parity/index.ts +0 -205
- package/src/webgpu/WebGPUBuffer.ts +0 -1
- package/src/webgpu/WebGPUCompute.ts +0 -2
- package/src/webgpu/WebGPUPipelineCache.ts +0 -15
- package/src/webgpu/WebGPUPostProcess.ts +0 -2
- package/src/webgpu/WebGPUTexture.ts +0 -2
- package/tsconfig.json +0 -26
- package/vitest.config.ts +0 -20
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
import { Renderer, type RendererOptions } from "../Renderer";
|
|
2
|
-
import type { RenderDeviceDiagnostics, RenderTarget } from "../RenderDevice";
|
|
3
|
-
import { Texture } from "../Texture";
|
|
4
|
-
import {
|
|
5
|
-
analyzePixels,
|
|
6
|
-
type ProductionWebGL2RendererOptions
|
|
7
|
-
} from "./ProductionWebGL2Renderer";
|
|
8
|
-
import type {
|
|
9
|
-
ProductionPixelMetrics,
|
|
10
|
-
ProductionProductionRenderer,
|
|
11
|
-
ProductionRenderProof,
|
|
12
|
-
ProductionRendererFeature,
|
|
13
|
-
ProductionRendererInput,
|
|
14
|
-
RuntimeParityFrameRenderResult,
|
|
15
|
-
RuntimeParityTransmissionBackdropCaptureProof
|
|
16
|
-
} from "./ProductionRendererTypes";
|
|
17
|
-
import {
|
|
18
|
-
bindTransmissionBackdropCapture,
|
|
19
|
-
createSceneColorMipLevels,
|
|
20
|
-
normalizeTransmissionBackdropCapture
|
|
21
|
-
} from "./TransmissionBackdropCapture";
|
|
22
|
-
|
|
23
|
-
export type ProductionWebGPUStatus = "available" | "unavailable" | "blocked";
|
|
24
|
-
|
|
25
|
-
export interface ProductionWebGPURendererOptions extends Omit<RendererOptions, "backend"> {
|
|
26
|
-
readonly canvas?: HTMLCanvasElement | OffscreenCanvas;
|
|
27
|
-
readonly width: number;
|
|
28
|
-
readonly height: number;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export class ProductionWebGPURenderer implements ProductionProductionRenderer {
|
|
32
|
-
readonly backend = "webgpu" as const;
|
|
33
|
-
|
|
34
|
-
private constructor(private readonly renderer: Renderer, private readonly width: number, private readonly height: number) {}
|
|
35
|
-
|
|
36
|
-
static async create(options: ProductionWebGPURendererOptions | ProductionWebGL2RendererOptions): Promise<ProductionWebGPURenderer> {
|
|
37
|
-
const renderer = await Renderer.create({
|
|
38
|
-
...options,
|
|
39
|
-
backend: "webgpu",
|
|
40
|
-
requiredFeatures: ["basic-rendering", "pixel-readback", "render-targets", "hdr-image-based-lighting"]
|
|
41
|
-
});
|
|
42
|
-
if (renderer.device.kind !== "webgpu") {
|
|
43
|
-
renderer.dispose();
|
|
44
|
-
throw new Error(`Production WebGPU renderer requires a real WebGPU device, got ${renderer.device.kind}.`);
|
|
45
|
-
}
|
|
46
|
-
const capabilities = new Set<string>(renderer.device.info.capabilities ?? []);
|
|
47
|
-
const requiredCapabilities = ["native-render-pipeline", "native-sampled-textures", "native-texture-readback"];
|
|
48
|
-
const missing = requiredCapabilities.filter((capability) => !capabilities.has(capability));
|
|
49
|
-
if (missing.length > 0 || !renderer.device.readPixelsAsync) {
|
|
50
|
-
renderer.dispose();
|
|
51
|
-
throw new Error(`Production WebGPU renderer requires native render pipeline, sampled textures, and texture-to-buffer readback. Missing: ${missing.join(", ") || "readPixelsAsync"}.`);
|
|
52
|
-
}
|
|
53
|
-
return new ProductionWebGPURenderer(renderer, options.width, options.height);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
renderFrame(input: ProductionRendererInput): RuntimeParityFrameRenderResult {
|
|
57
|
-
this.validateImportedAsset(input);
|
|
58
|
-
const diagnostics = this.renderer.render(input.source, input.camera);
|
|
59
|
-
return {
|
|
60
|
-
backend: "webgpu",
|
|
61
|
-
diagnostics,
|
|
62
|
-
features: this.getFeatures(diagnostics, input)
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async renderFrameAsync(input: ProductionRendererInput): Promise<RuntimeParityFrameRenderResult> {
|
|
67
|
-
this.validateImportedAsset(input);
|
|
68
|
-
const diagnostics = await this.renderer.renderAsync(input.source, input.camera);
|
|
69
|
-
return {
|
|
70
|
-
backend: "webgpu",
|
|
71
|
-
diagnostics,
|
|
72
|
-
features: this.getFeatures(diagnostics, input)
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
renderImportedAsset(input: ProductionRendererInput): ProductionRenderProof {
|
|
77
|
-
this.validateImportedAsset(input);
|
|
78
|
-
const target = this.createProofTarget();
|
|
79
|
-
let transmissionBackdropCapture: RuntimeParityTransmissionBackdropCaptureProof | undefined;
|
|
80
|
-
let transmissionBackdropTexture: Texture | undefined;
|
|
81
|
-
try {
|
|
82
|
-
const captureOptions = normalizeTransmissionBackdropCapture(input.transmissionBackdropCapture);
|
|
83
|
-
if (captureOptions) {
|
|
84
|
-
this.renderer.render({ source: { ...input.source, renderTarget: target }, camera: input.camera });
|
|
85
|
-
this.renderer.device.setRenderTarget(target);
|
|
86
|
-
const scenePixels = this.renderer.device.readPixels(0, 0, this.width, this.height);
|
|
87
|
-
const mipLevels = createSceneColorMipLevels(scenePixels, this.width, this.height);
|
|
88
|
-
transmissionBackdropTexture = new Texture({
|
|
89
|
-
width: this.width,
|
|
90
|
-
height: this.height,
|
|
91
|
-
colorSpace: "srgb",
|
|
92
|
-
mipLevels,
|
|
93
|
-
label: "a3d-webgpu-renderer-owned-scene-color-transmission-backdrop"
|
|
94
|
-
});
|
|
95
|
-
const materialBindings = bindTransmissionBackdropCapture(input.source, transmissionBackdropTexture, captureOptions);
|
|
96
|
-
transmissionBackdropCapture = {
|
|
97
|
-
mode: "renderer-owned-scene-color-readback",
|
|
98
|
-
width: this.width,
|
|
99
|
-
height: this.height,
|
|
100
|
-
byteLength: scenePixels.byteLength,
|
|
101
|
-
mipCount: mipLevels.length,
|
|
102
|
-
strength: captureOptions.strength,
|
|
103
|
-
refractionScale: captureOptions.refractionScale,
|
|
104
|
-
materialBindings
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
const diagnostics = this.renderer.render({ source: { ...input.source, renderTarget: target }, camera: input.camera });
|
|
108
|
-
this.renderer.device.setRenderTarget(target);
|
|
109
|
-
const pixels = analyzePixels(this.renderer.device.readPixels(0, 0, this.width, this.height), this.width, this.height);
|
|
110
|
-
const features = this.getFeatures(diagnostics, input, pixels);
|
|
111
|
-
return this.createProof(input, diagnostics, features, pixels, transmissionBackdropCapture);
|
|
112
|
-
} finally {
|
|
113
|
-
transmissionBackdropTexture?.dispose();
|
|
114
|
-
target.dispose();
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
async renderImportedAssetAsync(input: ProductionRendererInput): Promise<ProductionRenderProof> {
|
|
119
|
-
this.validateImportedAsset(input);
|
|
120
|
-
const target = this.createProofTarget();
|
|
121
|
-
let transmissionBackdropCapture: RuntimeParityTransmissionBackdropCaptureProof | undefined;
|
|
122
|
-
let transmissionBackdropTexture: Texture | undefined;
|
|
123
|
-
try {
|
|
124
|
-
const readPixelsAsync = this.renderer.device.readPixelsAsync;
|
|
125
|
-
const captureOptions = normalizeTransmissionBackdropCapture(input.transmissionBackdropCapture);
|
|
126
|
-
if (captureOptions) {
|
|
127
|
-
await this.renderer.renderAsync({ source: { ...input.source, renderTarget: target }, camera: input.camera });
|
|
128
|
-
this.renderer.device.setRenderTarget(target);
|
|
129
|
-
const scenePixels = readPixelsAsync
|
|
130
|
-
? await readPixelsAsync.call(this.renderer.device, 0, 0, this.width, this.height)
|
|
131
|
-
: this.renderer.device.readPixels(0, 0, this.width, this.height);
|
|
132
|
-
const mipLevels = createSceneColorMipLevels(scenePixels, this.width, this.height);
|
|
133
|
-
transmissionBackdropTexture = new Texture({
|
|
134
|
-
width: this.width,
|
|
135
|
-
height: this.height,
|
|
136
|
-
colorSpace: "srgb",
|
|
137
|
-
mipLevels,
|
|
138
|
-
label: "a3d-webgpu-renderer-owned-scene-color-transmission-backdrop"
|
|
139
|
-
});
|
|
140
|
-
const materialBindings = bindTransmissionBackdropCapture(input.source, transmissionBackdropTexture, captureOptions);
|
|
141
|
-
transmissionBackdropCapture = {
|
|
142
|
-
mode: "renderer-owned-scene-color-readback",
|
|
143
|
-
width: this.width,
|
|
144
|
-
height: this.height,
|
|
145
|
-
byteLength: scenePixels.byteLength,
|
|
146
|
-
mipCount: mipLevels.length,
|
|
147
|
-
strength: captureOptions.strength,
|
|
148
|
-
refractionScale: captureOptions.refractionScale,
|
|
149
|
-
materialBindings
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
const diagnostics = await this.renderer.renderAsync({ source: { ...input.source, renderTarget: target }, camera: input.camera });
|
|
153
|
-
this.renderer.device.setRenderTarget(target);
|
|
154
|
-
const pixelBytes = readPixelsAsync
|
|
155
|
-
? await readPixelsAsync.call(this.renderer.device, 0, 0, this.width, this.height)
|
|
156
|
-
: this.renderer.device.readPixels(0, 0, this.width, this.height);
|
|
157
|
-
const pixels = analyzePixels(pixelBytes, this.width, this.height);
|
|
158
|
-
const features = this.getFeatures(diagnostics, input, pixels);
|
|
159
|
-
return this.createProof(input, diagnostics, features, pixels, transmissionBackdropCapture);
|
|
160
|
-
} finally {
|
|
161
|
-
transmissionBackdropTexture?.dispose();
|
|
162
|
-
target.dispose();
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
getFeatures(diagnostics = this.getDiagnostics(), input?: ProductionRendererInput, pixels?: ProductionPixelMetrics): readonly ProductionRendererFeature[] {
|
|
167
|
-
const capabilities = new Set(this.renderer.device.info.capabilities ?? []);
|
|
168
|
-
const feature = (id: string, state: ProductionRendererFeature["state"], detail: string): ProductionRendererFeature => ({ id, state, detail });
|
|
169
|
-
const nativePbrSubmissions = diagnostics.nativePbrSubmissions ?? 0;
|
|
170
|
-
return [
|
|
171
|
-
feature("real-webgpu-context", this.renderer.device.kind === "webgpu" ? "supported" : "blocked", `backend=${this.renderer.device.kind}`),
|
|
172
|
-
feature("no-canvas2d-proof", "supported", "Render proof is produced by Renderer/WebGPU and readback, not Canvas 2D drawing."),
|
|
173
|
-
feature("no-mock-device", this.renderer.device.kind === "mock" ? "blocked" : "supported", "ProductionWebGPURenderer refuses mock backend creation."),
|
|
174
|
-
feature("imported-gltf-render-source", input && input.metadata.primitiveCount > 0 ? "supported" : "partial", input ? `${input.metadata.assetId}: ${input.metadata.primitiveCount} primitives` : "Awaiting imported asset render input."),
|
|
175
|
-
feature("pbr-materials", input && input.metadata.materialCount > 0 ? "supported" : "partial", input ? `${input.metadata.materialCount} glTF materials in render metadata` : "Awaiting imported asset metadata."),
|
|
176
|
-
feature("texture-upload-diagnostics", (diagnostics.textures ?? 0) > 0 || (diagnostics.nativeTextureBindings ?? 0) > 0 ? "supported" : "partial", `${diagnostics.textures ?? 0} live textures, ${diagnostics.nativeTextureBindings ?? 0} native texture bindings`),
|
|
177
|
-
feature("render-target-diagnostics", diagnostics.renderTargets !== undefined ? "supported" : "partial", `${diagnostics.renderTargets ?? 0} live render targets`),
|
|
178
|
-
feature("draw-call-diagnostics", diagnostics.drawCalls > 0 ? "supported" : "partial", `${diagnostics.drawCalls} draw calls in last frame`),
|
|
179
|
-
feature("pixel-readback", pixels && pixels.nonBlackPixels > 0 ? "supported" : "partial", pixels ? `${pixels.nonBlackPixels} non-black pixels` : "Awaiting frame readback."),
|
|
180
|
-
feature("hdr-ibl-ready", capabilities.has("hdr-image-based-lighting") && (diagnostics.nativeEnvironmentBindings ?? 0) > 0 ? "supported" : "partial", `capabilities=${[...capabilities].join(",")}; nativeEnvironmentBindings=${diagnostics.nativeEnvironmentBindings ?? 0}`),
|
|
181
|
-
feature("native-webgpu-render-pipeline", capabilities.has("native-render-pipeline") && (diagnostics.nativeSubmissions ?? 0) > 0 ? "supported" : "blocked", `${diagnostics.nativeSubmissions ?? 0} native submissions`),
|
|
182
|
-
feature("native-webgpu-sampled-textures", capabilities.has("native-sampled-textures") && (diagnostics.nativeTextureBindings ?? 0) > 0 ? "supported" : "partial", `${diagnostics.nativeTextureBindings ?? 0} native sampled texture bindings`),
|
|
183
|
-
feature("native-webgpu-texture-readback", capabilities.has("native-texture-readback") && Boolean(this.renderer.device.readPixelsAsync) ? "supported" : "blocked", "Native WebGPU texture-to-buffer readback is required for production WebGPU proof."),
|
|
184
|
-
feature("native-webgpu-pbr-submissions", nativePbrSubmissions > 0 ? "supported" : "partial", `${nativePbrSubmissions} generated/native PBR submissions`),
|
|
185
|
-
feature(
|
|
186
|
-
"scene-color-transmission-capture",
|
|
187
|
-
input?.transmissionBackdropCapture ? "supported" : "partial",
|
|
188
|
-
input?.transmissionBackdropCapture
|
|
189
|
-
? "Renderer-owned first-pass WebGPU scene-color readback is rebound as u_transmissionBackdropTexture for the final A3D transmission pass."
|
|
190
|
-
: "Transmission backdrop capture was not requested for this proof."
|
|
191
|
-
)
|
|
192
|
-
];
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
getDiagnostics(): RenderDeviceDiagnostics {
|
|
196
|
-
return this.renderer.getDiagnostics();
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
dispose(): void {
|
|
200
|
-
this.renderer.dispose();
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
private validateImportedAsset(input: ProductionRendererInput): void {
|
|
204
|
-
if (input.metadata.primitiveCount <= 0 || input.metadata.meshCount <= 0) {
|
|
205
|
-
throw new Error("WebGPU imported-asset render proof requires real glTF mesh primitives.");
|
|
206
|
-
}
|
|
207
|
-
if (input.metadata.materialCount <= 0) {
|
|
208
|
-
throw new Error("WebGPU imported-asset render proof requires real material data.");
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
private createProofTarget(): RenderTarget {
|
|
213
|
-
return this.renderer.device.createRenderTarget({
|
|
214
|
-
width: this.width,
|
|
215
|
-
height: this.height,
|
|
216
|
-
label: "a3d-production-runtime-webgpu-production-proof",
|
|
217
|
-
format: "rgba8",
|
|
218
|
-
depth: true
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
private createProof(
|
|
223
|
-
input: ProductionRendererInput,
|
|
224
|
-
diagnostics: RenderDeviceDiagnostics,
|
|
225
|
-
features: readonly ProductionRendererFeature[],
|
|
226
|
-
pixels: ProductionPixelMetrics,
|
|
227
|
-
transmissionBackdropCapture?: RuntimeParityTransmissionBackdropCaptureProof
|
|
228
|
-
): ProductionRenderProof {
|
|
229
|
-
return {
|
|
230
|
-
backend: "webgpu",
|
|
231
|
-
realWebGL2: false,
|
|
232
|
-
mockDevice: this.renderer.device.kind === "mock",
|
|
233
|
-
canvas2dProof: false,
|
|
234
|
-
importedAsset: input.metadata,
|
|
235
|
-
diagnostics,
|
|
236
|
-
features,
|
|
237
|
-
pixels,
|
|
238
|
-
...(transmissionBackdropCapture ? { transmissionBackdropCapture } : {})
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
export interface ProductionWebGPUReport {
|
|
244
|
-
readonly schema: "a3d-production-runtime-webgpu-report";
|
|
245
|
-
readonly status: ProductionWebGPUStatus;
|
|
246
|
-
readonly adapterName: string | null;
|
|
247
|
-
readonly preferredFormat: string | null;
|
|
248
|
-
readonly canCreateDevice: boolean;
|
|
249
|
-
readonly realHardwareRequiredForParity: true;
|
|
250
|
-
readonly doesNotBlockWebGL2Production: true;
|
|
251
|
-
readonly warnings: readonly string[];
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
export interface ProductionWebGPUReadinessItem {
|
|
255
|
-
readonly id: string;
|
|
256
|
-
readonly status: "ready" | "missing" | "blocked";
|
|
257
|
-
readonly evidence: string;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
export interface ProductionWebGPUReadinessReport {
|
|
261
|
-
readonly schema: "a3d-production-runtime-webgpu-readiness";
|
|
262
|
-
readonly availability: ProductionWebGPUReport;
|
|
263
|
-
readonly productionBackend: "webgpu-production-sdk-path";
|
|
264
|
-
readonly primaryRendererClaim: true;
|
|
265
|
-
readonly safetyChecks: readonly ProductionWebGPUReadinessItem[];
|
|
266
|
-
readonly requiredForCompletion: readonly ProductionWebGPUReadinessItem[];
|
|
267
|
-
readonly blockers: readonly string[];
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
export interface ProductionWebGPULike {
|
|
271
|
-
requestAdapter(): Promise<ProductionWebGPUAdapterLike | null>;
|
|
272
|
-
getPreferredCanvasFormat?(): string;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
export interface ProductionWebGPUAdapterLike {
|
|
276
|
-
readonly name?: string;
|
|
277
|
-
readonly info?: {
|
|
278
|
-
readonly vendor?: string;
|
|
279
|
-
readonly architecture?: string;
|
|
280
|
-
readonly device?: string;
|
|
281
|
-
readonly description?: string;
|
|
282
|
-
};
|
|
283
|
-
requestDevice(): Promise<unknown>;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
export async function createProductionWebGPUReport(gpu: ProductionWebGPULike | undefined | null): Promise<ProductionWebGPUReport> {
|
|
287
|
-
if (!gpu) {
|
|
288
|
-
return unavailable("navigator.gpu is not exposed in this browser/runtime.");
|
|
289
|
-
}
|
|
290
|
-
let adapter: ProductionWebGPUAdapterLike | null = null;
|
|
291
|
-
try {
|
|
292
|
-
adapter = await gpu.requestAdapter();
|
|
293
|
-
} catch (error) {
|
|
294
|
-
return blocked(`requestAdapter failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
295
|
-
}
|
|
296
|
-
if (!adapter) {
|
|
297
|
-
return unavailable("WebGPU requestAdapter returned null.");
|
|
298
|
-
}
|
|
299
|
-
try {
|
|
300
|
-
await adapter.requestDevice();
|
|
301
|
-
} catch (error) {
|
|
302
|
-
return blocked(`requestDevice failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
303
|
-
}
|
|
304
|
-
return {
|
|
305
|
-
schema: "a3d-production-runtime-webgpu-report",
|
|
306
|
-
status: "available",
|
|
307
|
-
adapterName: adapter.name ?? adapter.info?.description ?? adapter.info?.device ?? "unknown-adapter",
|
|
308
|
-
preferredFormat: gpu.getPreferredCanvasFormat?.() ?? null,
|
|
309
|
-
canCreateDevice: true,
|
|
310
|
-
realHardwareRequiredForParity: true,
|
|
311
|
-
doesNotBlockWebGL2Production: true,
|
|
312
|
-
warnings: ["WebGPU availability is reported separately; it is not Three.js/WebGPU parity until visual parity gates pass on real hardware."]
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
export async function createProductionWebGPUReadinessReport(gpu: ProductionWebGPULike | undefined | null): Promise<ProductionWebGPUReadinessReport> {
|
|
317
|
-
const availability = await createProductionWebGPUReport(gpu);
|
|
318
|
-
const requiredForCompletion: readonly ProductionWebGPUReadinessItem[] = [
|
|
319
|
-
{
|
|
320
|
-
id: "real-browser-webgpu-device",
|
|
321
|
-
status: availability.status === "available" && availability.canCreateDevice ? "ready" : "blocked",
|
|
322
|
-
evidence: availability.status === "available"
|
|
323
|
-
? `adapter=${availability.adapterName ?? "unknown"}, preferredFormat=${availability.preferredFormat ?? "unknown"}`
|
|
324
|
-
: availability.warnings.join(" ")
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
id: "low-level-gltf-hdr-pbr-webgpu-imported-asset",
|
|
328
|
-
status: "ready",
|
|
329
|
-
evidence: "tests/reports/runtime-parity/webgpu-imported-asset/webgpu-imported-asset-report.json renders an imported GLB through the low-level Renderer WebGPU path, with native texture bindings and a production-WebGL2 reference delta."
|
|
330
|
-
},
|
|
331
|
-
{
|
|
332
|
-
id: "gltf-hdr-pbr-webgpu-product-viewer",
|
|
333
|
-
status: "ready",
|
|
334
|
-
evidence: "tests/reports/runtime-parity/webgpu-product-viewer/webgpu-product-viewer-report.json renders a flagship GLTF/HDR/PBR product-viewer scene through native WebGPU using public production SDK scene-composition helpers, native texture-to-buffer readback, PBR submissions, texture bindings, environment bindings, and a bounded WebGPU-vs-WebGL2 visual delta."
|
|
335
|
-
},
|
|
336
|
-
{
|
|
337
|
-
id: "webgpu-threejs-visual-delta",
|
|
338
|
-
status: "ready",
|
|
339
|
-
evidence: "tests/reports/runtime-parity/webgpu-threejs-delta/webgpu-threejs-delta-report.json captures same-asset native WebGPU and Three.js product-viewer evidence with the same product GLB, HDR environment, camera intent, Three.js PMREM reference, PNG artifacts, and bounded visual delta."
|
|
340
|
-
},
|
|
341
|
-
{
|
|
342
|
-
id: "webgpu-sdk-production-backend",
|
|
343
|
-
status: "ready",
|
|
344
|
-
evidence: "ProductionRuntimeRenderer and A3DRenderer now accept backend='webgpu' and expose an async imported GLTF/HDR/PBR production render path backed by native render-pipeline submission, sampled textures, and texture-to-buffer readback."
|
|
345
|
-
}
|
|
346
|
-
];
|
|
347
|
-
const safetyChecks: readonly ProductionWebGPUReadinessItem[] = [
|
|
348
|
-
{
|
|
349
|
-
id: "renderer-production-runtime-webgpu-uses-production-webgpu-path",
|
|
350
|
-
status: "ready",
|
|
351
|
-
evidence: "ProductionRuntimeRenderer.create({ backend: 'webgpu' }) constructs ProductionWebGPURenderer and does not silently construct WebGL2."
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
id: "sdk-webgpu-exposes-async-production-render",
|
|
355
|
-
status: "ready",
|
|
356
|
-
evidence: "A3DRenderer.create({ backend: 'webgpu' }) exposes renderAsync() for native WebGPU readback; sync render remains WebGL2-oriented."
|
|
357
|
-
}
|
|
358
|
-
];
|
|
359
|
-
return {
|
|
360
|
-
schema: "a3d-production-runtime-webgpu-readiness",
|
|
361
|
-
availability,
|
|
362
|
-
productionBackend: "webgpu-production-sdk-path",
|
|
363
|
-
primaryRendererClaim: true,
|
|
364
|
-
safetyChecks,
|
|
365
|
-
requiredForCompletion,
|
|
366
|
-
blockers: requiredForCompletion
|
|
367
|
-
.filter((item) => item.status !== "ready")
|
|
368
|
-
.map((item) => `${item.id}: ${item.evidence}`)
|
|
369
|
-
};
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
function unavailable(reason: string): ProductionWebGPUReport {
|
|
373
|
-
return {
|
|
374
|
-
schema: "a3d-production-runtime-webgpu-report",
|
|
375
|
-
status: "unavailable",
|
|
376
|
-
adapterName: null,
|
|
377
|
-
preferredFormat: null,
|
|
378
|
-
canCreateDevice: false,
|
|
379
|
-
realHardwareRequiredForParity: true,
|
|
380
|
-
doesNotBlockWebGL2Production: true,
|
|
381
|
-
warnings: [reason, "WebGL2 remains the production renderer baseline for this release gate."]
|
|
382
|
-
};
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
function blocked(reason: string): ProductionWebGPUReport {
|
|
386
|
-
return {
|
|
387
|
-
schema: "a3d-production-runtime-webgpu-report",
|
|
388
|
-
status: "blocked",
|
|
389
|
-
adapterName: null,
|
|
390
|
-
preferredFormat: null,
|
|
391
|
-
canCreateDevice: false,
|
|
392
|
-
realHardwareRequiredForParity: true,
|
|
393
|
-
doesNotBlockWebGL2Production: true,
|
|
394
|
-
warnings: [reason, "Do not claim WebGPU parity from this run."]
|
|
395
|
-
};
|
|
396
|
-
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { type RenderMaterial } from "../ForwardPass";
|
|
2
|
-
import { Material } from "../Material";
|
|
3
|
-
import { MaterialInstance } from "../MaterialInstance";
|
|
4
|
-
import type { RenderSource } from "../Renderer";
|
|
5
|
-
import { Texture } from "../Texture";
|
|
6
|
-
import { TextureBinding } from "../TextureBinding";
|
|
7
|
-
import type { ProductionRendererInput, RuntimeParityTransmissionBackdropCaptureOptions } from "./ProductionRendererTypes";
|
|
8
|
-
|
|
9
|
-
export function normalizeTransmissionBackdropCapture(
|
|
10
|
-
options: ProductionRendererInput["transmissionBackdropCapture"]
|
|
11
|
-
): Required<RuntimeParityTransmissionBackdropCaptureOptions> | null {
|
|
12
|
-
if (!options) return null;
|
|
13
|
-
const mode = options.mode ?? "scene-color-readback";
|
|
14
|
-
if (mode !== "scene-color-readback") {
|
|
15
|
-
throw new Error(`Unsupported transmission backdrop capture mode: ${mode}`);
|
|
16
|
-
}
|
|
17
|
-
const strength = options.strength ?? 0.82;
|
|
18
|
-
const refractionScale = options.refractionScale ?? 0.032;
|
|
19
|
-
if (!Number.isFinite(strength) || strength < 0 || strength > 1) {
|
|
20
|
-
throw new RangeError("transmissionBackdropCapture.strength must be finite and within [0, 1]");
|
|
21
|
-
}
|
|
22
|
-
if (!Number.isFinite(refractionScale) || refractionScale < 0) {
|
|
23
|
-
throw new RangeError("transmissionBackdropCapture.refractionScale must be finite and non-negative");
|
|
24
|
-
}
|
|
25
|
-
return { mode, strength, refractionScale };
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function bindTransmissionBackdropCapture(
|
|
29
|
-
source: RenderSource,
|
|
30
|
-
texture: Texture,
|
|
31
|
-
options: Required<RuntimeParityTransmissionBackdropCaptureOptions>
|
|
32
|
-
): number {
|
|
33
|
-
const binding = new TextureBinding({
|
|
34
|
-
name: "u_transmissionBackdropTexture",
|
|
35
|
-
texture,
|
|
36
|
-
expectedColorSpace: "srgb",
|
|
37
|
-
required: true
|
|
38
|
-
});
|
|
39
|
-
let count = 0;
|
|
40
|
-
for (const material of collectSourceMaterials(source)) {
|
|
41
|
-
setMaterialTransmissionBackdrop(material, binding, options);
|
|
42
|
-
count += 1;
|
|
43
|
-
}
|
|
44
|
-
return count;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function createSceneColorMipLevels(source: Uint8Array, width: number, height: number): readonly {
|
|
48
|
-
readonly width: number;
|
|
49
|
-
readonly height: number;
|
|
50
|
-
readonly data: Uint8Array;
|
|
51
|
-
}[] {
|
|
52
|
-
const levels: { width: number; height: number; data: Uint8Array }[] = [{ width, height, data: new Uint8Array(source) }];
|
|
53
|
-
let previous = levels[0]!;
|
|
54
|
-
while (previous.width > 1 || previous.height > 1) {
|
|
55
|
-
const nextWidth = Math.max(1, Math.floor(previous.width / 2));
|
|
56
|
-
const nextHeight = Math.max(1, Math.floor(previous.height / 2));
|
|
57
|
-
const next = new Uint8Array(nextWidth * nextHeight * 4);
|
|
58
|
-
for (let y = 0; y < nextHeight; y += 1) {
|
|
59
|
-
for (let x = 0; x < nextWidth; x += 1) {
|
|
60
|
-
const targetOffset = (y * nextWidth + x) * 4;
|
|
61
|
-
const samples: number[] = [0, 0, 0, 0];
|
|
62
|
-
let sampleCount = 0;
|
|
63
|
-
for (let dy = 0; dy < 2; dy += 1) {
|
|
64
|
-
for (let dx = 0; dx < 2; dx += 1) {
|
|
65
|
-
const sourceX = Math.min(previous.width - 1, x * 2 + dx);
|
|
66
|
-
const sourceY = Math.min(previous.height - 1, y * 2 + dy);
|
|
67
|
-
const sourceOffset = (sourceY * previous.width + sourceX) * 4;
|
|
68
|
-
samples[0]! += previous.data[sourceOffset] ?? 0;
|
|
69
|
-
samples[1]! += previous.data[sourceOffset + 1] ?? 0;
|
|
70
|
-
samples[2]! += previous.data[sourceOffset + 2] ?? 0;
|
|
71
|
-
samples[3]! += previous.data[sourceOffset + 3] ?? 255;
|
|
72
|
-
sampleCount += 1;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
next[targetOffset] = Math.round(samples[0]! / sampleCount);
|
|
76
|
-
next[targetOffset + 1] = Math.round(samples[1]! / sampleCount);
|
|
77
|
-
next[targetOffset + 2] = Math.round(samples[2]! / sampleCount);
|
|
78
|
-
next[targetOffset + 3] = Math.round(samples[3]! / sampleCount);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
previous = { width: nextWidth, height: nextHeight, data: next };
|
|
82
|
-
levels.push(previous);
|
|
83
|
-
}
|
|
84
|
-
return levels;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function setMaterialTransmissionBackdrop(
|
|
88
|
-
material: RenderMaterial,
|
|
89
|
-
binding: TextureBinding,
|
|
90
|
-
options: Required<RuntimeParityTransmissionBackdropCaptureOptions>
|
|
91
|
-
): void {
|
|
92
|
-
const target = material instanceof MaterialInstance ? material : material instanceof Material ? material : null;
|
|
93
|
-
if (!target) return;
|
|
94
|
-
const set = (name: string, value: Parameters<Material["setParameter"]>[1]) => {
|
|
95
|
-
if (target instanceof MaterialInstance) {
|
|
96
|
-
target.setOverride(name, value);
|
|
97
|
-
} else {
|
|
98
|
-
target.setParameter(name, value);
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
set("u_transmissionBackdropTexture", binding);
|
|
102
|
-
set("u_transmissionBackdropEnabled", 1);
|
|
103
|
-
set("u_transmissionBackdropStrength", options.strength);
|
|
104
|
-
set("u_transmissionBackdropResolution", [binding.texture?.width ?? 1, binding.texture?.height ?? 1]);
|
|
105
|
-
set("u_transmissionBackdropMipCount", binding.texture?.textureLevels.length ?? 1);
|
|
106
|
-
set("u_transmissionBackdropRefractionScale", options.refractionScale);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function collectSourceMaterials(source: RenderSource): readonly RenderMaterial[] {
|
|
110
|
-
const materials: RenderMaterial[] = [];
|
|
111
|
-
const seen = new Set<RenderMaterial>();
|
|
112
|
-
const add = (material: RenderMaterial | undefined) => {
|
|
113
|
-
if (!material || seen.has(material)) return;
|
|
114
|
-
seen.add(material);
|
|
115
|
-
materials.push(material);
|
|
116
|
-
};
|
|
117
|
-
const library = source.materialLibrary;
|
|
118
|
-
if (library instanceof Map) {
|
|
119
|
-
for (const material of library.values()) add(material);
|
|
120
|
-
} else if (library) {
|
|
121
|
-
for (const material of Object.values(library)) add(material);
|
|
122
|
-
}
|
|
123
|
-
if (source.renderItems) {
|
|
124
|
-
for (const item of source.renderItems) add(item.material);
|
|
125
|
-
}
|
|
126
|
-
if (source.collectRenderItems) {
|
|
127
|
-
for (const item of source.collectRenderItems()) add(item.material);
|
|
128
|
-
}
|
|
129
|
-
return materials;
|
|
130
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export interface MorphTargetPlan { readonly targetCount: number; readonly attributeSlots: number; readonly textureBacked: boolean; }
|
|
2
|
-
export function createMorphTargetPlan(targetCount: number, maxAttributeSlots = 8): MorphTargetPlan { return { targetCount, attributeSlots: Math.min(targetCount, maxAttributeSlots), textureBacked: targetCount > maxAttributeSlots }; }
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export interface SkinningPalette { readonly jointCount: number; readonly matrixTexture?: boolean; readonly uniformLimit?: number; }
|
|
2
|
-
export function chooseSkinningPalette(jointCount: number, uniformLimit = 64): SkinningPalette { return { jointCount, uniformLimit, matrixTexture: jointCount > uniformLimit }; }
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { ProductionRenderProof, ProductionRendererBackend, ProductionRendererFeature, ProductionRendererInput } from '../ProductionRendererTypes';
|
|
2
|
-
|
|
3
|
-
export interface RendererBackendDiagnostics {
|
|
4
|
-
readonly backend: ProductionRendererBackend;
|
|
5
|
-
readonly contextType: string;
|
|
6
|
-
readonly realDevice: boolean;
|
|
7
|
-
readonly fallback?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface RendererBackend {
|
|
11
|
-
readonly backend: ProductionRendererBackend;
|
|
12
|
-
readonly contextType: string;
|
|
13
|
-
renderImportedAsset(input: ProductionRendererInput): ProductionRenderProof;
|
|
14
|
-
getFeatures(): readonly ProductionRendererFeature[];
|
|
15
|
-
getDiagnostics(): RendererBackendDiagnostics;
|
|
16
|
-
dispose(): void;
|
|
17
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { ProductionWebGL2Renderer, type ProductionWebGL2RendererOptions } from '../ProductionWebGL2Renderer';
|
|
2
|
-
import type { ProductionRenderProof, ProductionRendererFeature, ProductionRendererInput } from "../ProductionRendererTypes";
|
|
3
|
-
import type { RendererBackend, RendererBackendDiagnostics } from './RendererBackend';
|
|
4
|
-
|
|
5
|
-
export class WebGL2RendererBackend implements RendererBackend {
|
|
6
|
-
readonly backend = "webgl2" as const;
|
|
7
|
-
readonly contextType = 'webgl2';
|
|
8
|
-
|
|
9
|
-
private constructor(private readonly renderer: ProductionWebGL2Renderer) {}
|
|
10
|
-
|
|
11
|
-
static async create(options: ProductionWebGL2RendererOptions): Promise<WebGL2RendererBackend> {
|
|
12
|
-
return new WebGL2RendererBackend(await ProductionWebGL2Renderer.create(options));
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
renderImportedAsset(input: ProductionRendererInput): ProductionRenderProof {
|
|
16
|
-
return this.renderer.renderImportedAsset(input);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
getFeatures(): readonly ProductionRendererFeature[] {
|
|
20
|
-
return this.renderer.getFeatures();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
getDiagnostics(): RendererBackendDiagnostics {
|
|
24
|
-
return { backend: "webgl2", contextType: this.contextType, realDevice: true };
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
dispose(): void {
|
|
28
|
-
this.renderer.dispose();
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { createProductionWebGPUReport, type ProductionWebGPULike, type ProductionWebGPUReport } from '../ProductionWebGPURenderer';
|
|
2
|
-
|
|
3
|
-
export interface WebGPURendererBackendOptions {
|
|
4
|
-
readonly navigatorGpu?: ProductionWebGPULike | null;
|
|
5
|
-
readonly userAgent?: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export class WebGPURendererBackend {
|
|
9
|
-
readonly backend = 'webgpu' as const;
|
|
10
|
-
readonly contextType = 'webgpu';
|
|
11
|
-
private constructor(private readonly report: ProductionWebGPUReport) {}
|
|
12
|
-
|
|
13
|
-
static async create(options: WebGPURendererBackendOptions = {}): Promise<WebGPURendererBackend> {
|
|
14
|
-
return new WebGPURendererBackend(await createProductionWebGPUReport(options.navigatorGpu ?? null));
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
getReport(): ProductionWebGPUReport {
|
|
18
|
-
return this.report;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
getDiagnostics(): { readonly backend: 'webgpu'; readonly contextType: 'webgpu'; readonly realDevice: boolean; readonly fallback?: string } {
|
|
22
|
-
return { backend: this.backend, contextType: this.contextType, realDevice: this.report.status === 'available', fallback: this.report.warnings[0] };
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "../../../WebGL2StateCache";
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export type ColorSpaceProduction = 'linear' | 'srgb' | 'display-p3';
|
|
2
|
-
export function srgbToLinear(value: number): number { return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4; }
|
|
3
|
-
export function linearToSrgb(value: number): number { return value <= 0.0031308 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055; }
|