@photivra/engine 1.5.0 → 2.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/CHANGELOG.md +414 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +116 -9
- package/dist/capture/native-raw-development.js +221 -62
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +65 -12
- package/dist/capture/native-raw.js +81 -19
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/diffraction-provider.d.ts +30 -0
- package/dist/facade/diffraction-provider.js +127 -0
- package/dist/facade/diffraction-provider.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +19 -0
- package/dist/facade/host-yield.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +117 -0
- package/dist/facade/scene-radiance.js +205 -0
- package/dist/facade/scene-radiance.js.map +1 -0
- package/dist/facade/simulate-capture.d.ts +363 -0
- package/dist/facade/simulate-capture.js +1281 -0
- package/dist/facade/simulate-capture.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
- package/dist/gpu/chart-radiance-gpu.js +176 -0
- package/dist/gpu/chart-radiance-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
- package/dist/gpu/image-kernel-accelerator.js +720 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -0
- package/dist/gpu/image-kernel-execution.d.ts +92 -0
- package/dist/gpu/image-kernel-execution.js +84 -0
- package/dist/gpu/image-kernel-execution.js.map +1 -0
- package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
- package/dist/gpu/sensor-stage-gpu.js +317 -0
- package/dist/gpu/sensor-stage-gpu.js.map +1 -0
- package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
- package/dist/gpu/temporal-sum-gpu.js +150 -0
- package/dist/gpu/temporal-sum-gpu.js.map +1 -0
- package/dist/gpu/webgpu-runtime.d.ts +63 -0
- package/dist/gpu/webgpu-runtime.js +215 -0
- package/dist/gpu/webgpu-runtime.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
- package/dist/gpu/wgsl-chart-kernel.js +165 -0
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
- package/dist/gpu/wgsl-kernels.d.ts +53 -0
- package/dist/gpu/wgsl-kernels.js +365 -0
- package/dist/gpu/wgsl-kernels.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
- package/dist/gpu/wgsl-sensor-kernel.js +409 -0
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
- package/dist/index.d.ts +91 -25
- package/dist/index.js +60 -15
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +92 -40
- package/dist/motion/camera-rotation.js +84 -47
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
- package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
- package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
- package/dist/motion/capture-rotation-trajectory.js +36 -26
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
- package/dist/motion/extended-object-projection.d.ts +19 -16
- package/dist/motion/extended-object-projection.js +38 -18
- package/dist/motion/extended-object-projection.js.map +1 -1
- package/dist/motion/projected-motion.d.ts +18 -17
- package/dist/motion/projected-motion.js +25 -17
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.d.ts +55 -0
- package/dist/motion/temporal-exposure-sum.js +141 -0
- package/dist/motion/temporal-exposure-sum.js.map +1 -0
- package/dist/motion/video-sequence.d.ts +111 -0
- package/dist/motion/video-sequence.js +179 -0
- package/dist/motion/video-sequence.js.map +1 -0
- package/dist/optics/aperture.d.ts +14 -15
- package/dist/optics/aperture.js +13 -11
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/atmospheric-haze.d.ts +83 -0
- package/dist/optics/atmospheric-haze.js +113 -0
- package/dist/optics/atmospheric-haze.js.map +1 -0
- package/dist/optics/brown-conrady-distortion.d.ts +116 -0
- package/dist/optics/brown-conrady-distortion.js +291 -0
- package/dist/optics/brown-conrady-distortion.js.map +1 -0
- package/dist/optics/circle-of-confusion.d.ts +10 -10
- package/dist/optics/circle-of-confusion.js +15 -11
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +64 -33
- package/dist/optics/complex-pupil-psf.js +190 -98
- package/dist/optics/complex-pupil-psf.js.map +1 -1
- package/dist/optics/depth-of-field.d.ts +25 -15
- package/dist/optics/depth-of-field.js +67 -27
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction-psf-profile.d.ts +118 -0
- package/dist/optics/diffraction-psf-profile.js +252 -0
- package/dist/optics/diffraction-psf-profile.js.map +1 -0
- package/dist/optics/diffraction.d.ts +14 -13
- package/dist/optics/diffraction.js +14 -10
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +88 -27
- package/dist/optics/focus-breathing.js +114 -23
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +18 -18
- package/dist/optics/focus-state.js +21 -15
- package/dist/optics/focus-state.js.map +1 -1
- package/dist/optics/front-of-lens-filter.d.ts +45 -14
- package/dist/optics/front-of-lens-filter.js +259 -88
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/illumination-vignetting.d.ts +16 -17
- package/dist/optics/illumination-vignetting.js +40 -17
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +59 -0
- package/dist/optics/irradiance-convolution.js +138 -0
- package/dist/optics/irradiance-convolution.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
- package/dist/optics/lateral-chromatic-aberration.js +33 -23
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-kernels.d.ts +89 -0
- package/dist/optics/lens-psf-kernels.js +175 -0
- package/dist/optics/lens-psf-kernels.js.map +1 -0
- package/dist/optics/lens-psf-profile.d.ts +78 -46
- package/dist/optics/lens-psf-profile.js +335 -124
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
- package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
- package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +80 -23
- package/dist/optics/polygon-diffraction.js +130 -25
- package/dist/optics/polygon-diffraction.js.map +1 -1
- package/dist/optics/profile-contract.d.ts +5 -6
- package/dist/optics/profile-contract.js +14 -11
- package/dist/optics/profile-contract.js.map +1 -1
- package/dist/optics/psf-foundation.d.ts +23 -23
- package/dist/optics/psf-foundation.js +24 -21
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/pupil-vignetting.d.ts +118 -0
- package/dist/optics/pupil-vignetting.js +264 -0
- package/dist/optics/pupil-vignetting.js.map +1 -0
- package/dist/optics/radial-distortion.d.ts +34 -33
- package/dist/optics/radial-distortion.js +37 -30
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
- package/dist/optics/scene-to-sensor-irradiance.js +73 -45
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
- package/dist/optics/scene-to-sensor-quadrature.js +16 -11
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +20 -4
- package/dist/optics/sensor-aperture-rays.js +32 -14
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.d.ts +81 -16
- package/dist/optics/sensor-environment-query.js +145 -12
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
- package/dist/optics/sensor-psf-quadrature.js +18 -11
- package/dist/optics/sensor-psf-quadrature.js.map +1 -1
- package/dist/optics/sensor-psf-support.d.ts +8 -6
- package/dist/optics/sensor-psf-support.js +8 -5
- package/dist/optics/sensor-psf-support.js.map +1 -1
- package/dist/optics/stray-light.d.ts +22 -19
- package/dist/optics/stray-light.js +18 -12
- package/dist/optics/stray-light.js.map +1 -1
- package/dist/optics/thin-lens.d.ts +10 -9
- package/dist/optics/thin-lens.js +12 -8
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/optics/zernike-wavefront.d.ts +154 -0
- package/dist/optics/zernike-wavefront.js +352 -0
- package/dist/optics/zernike-wavefront.js.map +1 -0
- package/dist/output/capture-corrected-sdr.d.ts +16 -8
- package/dist/output/capture-corrected-sdr.js +16 -8
- package/dist/output/capture-corrected-sdr.js.map +1 -1
- package/dist/output/capture-geometry.d.ts +34 -36
- package/dist/output/capture-geometry.js +52 -32
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +7 -6
- package/dist/output/capture-sdr.js +11 -8
- package/dist/output/capture-sdr.js.map +1 -1
- package/dist/output/crop.d.ts +22 -6
- package/dist/output/crop.js +40 -6
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +60 -23
- package/dist/output/geometric-transforms.js +111 -24
- package/dist/output/geometric-transforms.js.map +1 -1
- package/dist/output/lens-corrections.d.ts +27 -19
- package/dist/output/lens-corrections.js +29 -13
- package/dist/output/lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.d.ts +71 -16
- package/dist/output/native-capture-sdr.js +190 -33
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.d.ts +65 -0
- package/dist/output/png-encoder.js +461 -0
- package/dist/output/png-encoder.js.map +1 -0
- package/dist/output/print-contrast-reference.d.ts +10 -9
- package/dist/output/print-contrast-reference.js +10 -8
- package/dist/output/print-contrast-reference.js.map +1 -1
- package/dist/output/print-detail.d.ts +18 -17
- package/dist/output/print-detail.js +12 -10
- package/dist/output/print-detail.js.map +1 -1
- package/dist/output/print-jpeg.d.ts +26 -5
- package/dist/output/print-jpeg.js +117 -50
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/print-plan.d.ts +19 -19
- package/dist/output/print-plan.js +11 -10
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/print-region-statistics.d.ts +14 -15
- package/dist/output/print-region-statistics.js +11 -11
- package/dist/output/print-region-statistics.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +48 -10
- package/dist/output/sdr-rendering.js +114 -25
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/output/subject-framing-crop.d.ts +6 -10
- package/dist/output/subject-framing-crop.js +23 -13
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/processing/demosaic.d.ts +90 -0
- package/dist/processing/demosaic.js +275 -0
- package/dist/processing/demosaic.js.map +1 -0
- package/dist/processing/denoise.d.ts +68 -0
- package/dist/processing/denoise.js +214 -0
- package/dist/processing/denoise.js.map +1 -0
- package/dist/processing/focus-stacking.d.ts +17 -0
- package/dist/processing/focus-stacking.js +80 -0
- package/dist/processing/focus-stacking.js.map +1 -0
- package/dist/processing/hdr.d.ts +54 -0
- package/dist/processing/hdr.js +172 -0
- package/dist/processing/hdr.js.map +1 -0
- package/dist/processing/image-ops.d.ts +66 -0
- package/dist/processing/image-ops.js +192 -0
- package/dist/processing/image-ops.js.map +1 -0
- package/dist/processing/panorama.d.ts +51 -0
- package/dist/processing/panorama.js +305 -0
- package/dist/processing/panorama.js.map +1 -0
- package/dist/processing/processing-task.d.ts +85 -0
- package/dist/processing/processing-task.js +164 -0
- package/dist/processing/processing-task.js.map +1 -0
- package/dist/processing/tone-mapping.d.ts +69 -0
- package/dist/processing/tone-mapping.js +310 -0
- package/dist/processing/tone-mapping.js.map +1 -0
- package/dist/schema/camera.d.ts +5 -4
- package/dist/schema/illumination-spectral.d.ts +13 -19
- package/dist/schema/illumination-spectral.js +23 -19
- package/dist/schema/illumination-spectral.js.map +1 -1
- package/dist/schema/illumination-temporal.d.ts +12 -15
- package/dist/schema/illumination-temporal.js +43 -28
- package/dist/schema/illumination-temporal.js.map +1 -1
- package/dist/schema/illumination.d.ts +5 -4
- package/dist/schema/illumination.js +55 -20
- package/dist/schema/illumination.js.map +1 -1
- package/dist/schema/scene-radiance-temporal.d.ts +9 -11
- package/dist/schema/scene-radiance-temporal.js +26 -23
- package/dist/schema/scene-radiance-temporal.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +17 -17
- package/dist/schema/scene-radiance.js +56 -34
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/schema/scene.d.ts +14 -13
- package/dist/schema/validation.d.ts +0 -1
- package/dist/schema/validation.js +17 -15
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +45 -64
- package/dist/sensor/accumulated-charge.js +41 -47
- package/dist/sensor/accumulated-charge.js.map +1 -1
- package/dist/sensor/architecture.d.ts +22 -25
- package/dist/sensor/architecture.js +17 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
- package/dist/sensor/camera-saturation-capacity.js +36 -34
- package/dist/sensor/camera-saturation-capacity.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
- package/dist/sensor/capture-color-sampling-binding.js +39 -41
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +8 -9
- package/dist/sensor/capture-mode-timing.js +24 -21
- package/dist/sensor/capture-mode-timing.js.map +1 -1
- package/dist/sensor/capture-mode.d.ts +28 -30
- package/dist/sensor/capture-mode.js +33 -31
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts +30 -33
- package/dist/sensor/color-sampling.js +32 -37
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
- package/dist/sensor/constant-rate-temporal-integration.js +28 -26
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
- package/dist/sensor/dark-current.d.ts +53 -49
- package/dist/sensor/dark-current.js +87 -46
- package/dist/sensor/dark-current.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +71 -30
- package/dist/sensor/environment-photo-signal.js +127 -46
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/eqe-electron-rate.d.ts +14 -13
- package/dist/sensor/eqe-electron-rate.js +34 -14
- package/dist/sensor/eqe-electron-rate.js.map +1 -1
- package/dist/sensor/eqe-local-exposure.d.ts +24 -24
- package/dist/sensor/eqe-local-exposure.js +15 -11
- package/dist/sensor/eqe-local-exposure.js.map +1 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
- package/dist/sensor/eqe-temporal-exposure.js +15 -10
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/exposure-window.d.ts +48 -34
- package/dist/sensor/exposure-window.js +77 -36
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
- package/dist/sensor/fixed-pattern-noise.js +166 -0
- package/dist/sensor/fixed-pattern-noise.js.map +1 -0
- package/dist/sensor/iso-gain.d.ts +44 -0
- package/dist/sensor/iso-gain.js +119 -0
- package/dist/sensor/iso-gain.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +25 -48
- package/dist/sensor/iso-signal-chain.js +52 -66
- package/dist/sensor/iso-signal-chain.js.map +1 -1
- package/dist/sensor/local-exposure-binding.d.ts +21 -21
- package/dist/sensor/local-exposure-binding.js +22 -18
- package/dist/sensor/local-exposure-binding.js.map +1 -1
- package/dist/sensor/optical-stack.d.ts +36 -40
- package/dist/sensor/optical-stack.js +34 -37
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +22 -28
- package/dist/sensor/photon-energy.js +42 -34
- package/dist/sensor/photon-energy.js.map +1 -1
- package/dist/sensor/physical-charge-capacity.d.ts +20 -30
- package/dist/sensor/physical-charge-capacity.js +35 -36
- package/dist/sensor/physical-charge-capacity.js.map +1 -1
- package/dist/sensor/pixel-pitch.d.ts +2 -3
- package/dist/sensor/pixel-pitch.js +4 -2
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +13 -15
- package/dist/sensor/radiometry-readiness.js +20 -17
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +173 -83
- package/dist/sensor/raw-readout.js +425 -160
- package/dist/sensor/raw-readout.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +112 -44
- package/dist/sensor/raw-reconstruction.js +200 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
- package/dist/sensor/readout-exposure-linkage.js +125 -27
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +43 -44
- package/dist/sensor/readout-timing.js +38 -30
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +21 -28
- package/dist/sensor/response-application-compatibility.js +35 -34
- package/dist/sensor/response-application-compatibility.js.map +1 -1
- package/dist/sensor/response-operating-range.d.ts +26 -35
- package/dist/sensor/response-operating-range.js +40 -39
- package/dist/sensor/response-operating-range.js.map +1 -1
- package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
- package/dist/sensor/responsivity-photocurrent.js +57 -40
- package/dist/sensor/responsivity-photocurrent.js.map +1 -1
- package/dist/sensor/sampling-aperture.d.ts +21 -25
- package/dist/sensor/sampling-aperture.js +29 -28
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
- package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/sensor-geometry.d.ts +28 -32
- package/dist/sensor/sensor-geometry.js +35 -20
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +14 -16
- package/dist/sensor/signal-noise.js +15 -13
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
- package/dist/sensor/spatial-sample-reduction.js +39 -48
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
- package/dist/sensor/spatial-sampling-quadrature.js +31 -36
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
- package/dist/sensor/spatio-spectral-reduction.js +24 -29
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
- package/dist/sensor/spectral-coverage.d.ts +6 -9
- package/dist/sensor/spectral-coverage.js +9 -6
- package/dist/sensor/spectral-coverage.js.map +1 -1
- package/dist/sensor/spectral-quadrature.d.ts +46 -60
- package/dist/sensor/spectral-quadrature.js +38 -48
- package/dist/sensor/spectral-quadrature.js.map +1 -1
- package/dist/sensor/spectral-response.d.ts +53 -41
- package/dist/sensor/spectral-response.js +80 -47
- package/dist/sensor/spectral-response.js.map +1 -1
- package/dist/sensor/stochastic-seed.d.ts +50 -0
- package/dist/sensor/stochastic-seed.js +123 -0
- package/dist/sensor/stochastic-seed.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
- package/dist/sensor/temporal-eqe-sum.js +5 -6
- package/dist/sensor/temporal-eqe-sum.js.map +1 -1
- package/dist/sensor/temporal-photo-signal.d.ts +5 -6
- package/dist/sensor/temporal-photo-signal.js +11 -10
- package/dist/sensor/temporal-photo-signal.js.map +1 -1
- package/dist/sensor/temporal-sample-binding.d.ts +1 -2
- package/dist/sensor/temporal-sample-binding.js +3 -3
- package/dist/sensor/temporal-sample-binding.js.map +1 -1
- package/dist/simulation/poc-simulation.d.ts +16 -16
- package/dist/simulation/poc-simulation.js +20 -15
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +42 -18
- package/dist/stabilization/camera-shake.js +43 -20
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +44 -41
- package/dist/stabilization/system.js +196 -108
- package/dist/stabilization/system.js.map +1 -1
- package/docs/AGENT_GUIDE.md +183 -0
- package/docs/API_REFERENCE.md +777 -2
- package/docs/QUICK_START.md +663 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -8
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +21 -10
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2253 -3
- package/docs/api/exposure-exposure-duration-control.md +9 -9
- package/docs/api/exposure-exposure-mode-resolver.md +35 -31
- package/docs/api/exposure-exposure.md +10 -10
- package/docs/api/exposure-flash-ttl.md +182 -0
- package/docs/api/exposure-flash.md +183 -28
- package/docs/api/exposure-metering-scene-radiance.md +11 -10
- package/docs/api/exposure-metering-target.md +9 -8
- package/docs/api/exposure-metering-temporal.md +8 -8
- package/docs/api/exposure-metering.md +69 -9
- package/docs/api/exposure-program-line.md +6 -5
- package/docs/api/facade-chart-radiance-batch.md +96 -0
- package/docs/api/facade-chart-scenes.md +240 -0
- package/docs/api/facade-scene-radiance.md +122 -0
- package/docs/api/facade-simulate-capture.md +397 -0
- package/docs/api/gpu-image-kernel-accelerator.md +157 -0
- package/docs/api/gpu-image-kernel-execution.md +152 -0
- package/docs/api/motion-camera-rotation.md +43 -26
- package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
- package/docs/api/motion-capture-rotation-trajectory.md +15 -15
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
- package/docs/api/motion-extended-object-projection.md +10 -8
- package/docs/api/motion-projected-motion.md +8 -8
- package/docs/api/motion-temporal-exposure-sum.md +98 -0
- package/docs/api/motion-video-sequence.md +159 -0
- package/docs/api/optics-aperture.md +8 -8
- package/docs/api/optics-atmospheric-haze.md +104 -0
- package/docs/api/optics-brown-conrady-distortion.md +123 -0
- package/docs/api/optics-circle-of-confusion.md +5 -4
- package/docs/api/optics-complex-pupil-psf.md +57 -16
- package/docs/api/optics-depth-of-field.md +12 -6
- package/docs/api/optics-diffraction-psf-profile.md +96 -0
- package/docs/api/optics-diffraction.md +8 -7
- package/docs/api/optics-focus-breathing.md +104 -16
- package/docs/api/optics-focus-state.md +9 -10
- package/docs/api/optics-front-of-lens-filter.md +72 -14
- package/docs/api/optics-illumination-vignetting.md +10 -10
- package/docs/api/optics-irradiance-convolution.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
- package/docs/api/optics-lens-psf-kernels.md +72 -0
- package/docs/api/optics-lens-psf-profile.md +48 -26
- package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
- package/docs/api/optics-polygon-diffraction.md +78 -13
- package/docs/api/optics-profile-contract.md +4 -4
- package/docs/api/optics-psf-foundation.md +12 -12
- package/docs/api/optics-pupil-vignetting.md +132 -0
- package/docs/api/optics-radial-distortion.md +12 -12
- package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
- package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
- package/docs/api/optics-sensor-aperture-rays.md +3 -2
- package/docs/api/optics-sensor-environment-query.md +52 -9
- package/docs/api/optics-sensor-psf-quadrature.md +13 -10
- package/docs/api/optics-stray-light.md +12 -11
- package/docs/api/optics-thin-lens.md +4 -3
- package/docs/api/optics-zernike-wavefront.md +229 -0
- package/docs/api/output-capture-corrected-sdr.md +10 -7
- package/docs/api/output-capture-geometry.md +35 -36
- package/docs/api/output-capture-sdr.md +4 -4
- package/docs/api/output-crop.md +7 -4
- package/docs/api/output-geometric-transforms.md +65 -19
- package/docs/api/output-lens-corrections.md +17 -15
- package/docs/api/output-native-capture-sdr.md +26 -13
- package/docs/api/output-png-encoder.md +105 -0
- package/docs/api/output-print-contrast-reference.md +8 -8
- package/docs/api/output-print-detail.md +14 -14
- package/docs/api/output-print-jpeg.md +22 -5
- package/docs/api/output-print-plan.md +18 -18
- package/docs/api/output-print-region-statistics.md +14 -14
- package/docs/api/output-sdr-rendering.md +52 -10
- package/docs/api/output-subject-framing-crop.md +5 -6
- package/docs/api/processing-demosaic.md +120 -0
- package/docs/api/processing-denoise.md +148 -0
- package/docs/api/processing-focus-stacking.md +41 -0
- package/docs/api/processing-hdr.md +113 -0
- package/docs/api/processing-panorama.md +82 -0
- package/docs/api/processing-processing-task.md +107 -0
- package/docs/api/processing-tone-mapping.md +142 -0
- package/docs/api/schema-camera.md +6 -4
- package/docs/api/schema-illumination-spectral.md +10 -11
- package/docs/api/schema-illumination-temporal.md +13 -15
- package/docs/api/schema-illumination.md +4 -4
- package/docs/api/schema-scene-radiance-temporal.md +10 -11
- package/docs/api/schema-scene-radiance.md +18 -17
- package/docs/api/schema-scene.md +9 -9
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +12 -20
- package/docs/api/sensor-architecture.md +15 -16
- package/docs/api/sensor-camera-saturation-capacity.md +9 -11
- package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
- package/docs/api/sensor-capture-mode-timing.md +9 -9
- package/docs/api/sensor-capture-mode.md +29 -30
- package/docs/api/sensor-color-sampling.md +31 -33
- package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
- package/docs/api/sensor-dark-current.md +30 -14
- package/docs/api/sensor-environment-photo-signal.md +13 -6
- package/docs/api/sensor-eqe-electron-rate.md +9 -8
- package/docs/api/sensor-eqe-local-exposure.md +18 -17
- package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
- package/docs/api/sensor-exposure-window.md +24 -24
- package/docs/api/sensor-fixed-pattern-noise.md +104 -0
- package/docs/api/sensor-iso-gain.md +63 -0
- package/docs/api/sensor-iso-signal-chain.md +13 -22
- package/docs/api/sensor-local-exposure-binding.md +12 -13
- package/docs/api/sensor-optical-stack.md +37 -40
- package/docs/api/sensor-photon-energy.md +10 -11
- package/docs/api/sensor-physical-charge-capacity.md +8 -13
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +9 -9
- package/docs/api/sensor-raw-readout.md +118 -52
- package/docs/api/sensor-raw-reconstruction.md +97 -20
- package/docs/api/sensor-readout-exposure-linkage.md +120 -24
- package/docs/api/sensor-readout-timing.md +33 -35
- package/docs/api/sensor-response-application-compatibility.md +9 -11
- package/docs/api/sensor-response-operating-range.md +14 -18
- package/docs/api/sensor-responsivity-photocurrent.md +9 -12
- package/docs/api/sensor-sampling-aperture.md +22 -25
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
- package/docs/api/sensor-sensor-geometry.md +23 -24
- package/docs/api/sensor-signal-noise.md +10 -10
- package/docs/api/sensor-spatial-sample-reduction.md +27 -30
- package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
- package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
- package/docs/api/sensor-spectral-coverage.md +5 -5
- package/docs/api/sensor-spectral-quadrature.md +33 -35
- package/docs/api/sensor-spectral-response.md +28 -16
- package/docs/api/sensor-temporal-photo-signal.md +6 -6
- package/docs/api/simulation-poc-simulation.md +17 -16
- package/docs/api/stabilization-camera-shake.md +29 -10
- package/docs/api/stabilization-system.md +25 -21
- package/docs/examples/production-request.json +3821 -2157
- package/docs/examples/simulate-capture.mjs +14 -0
- package/llms.txt +35 -0
- package/package.json +32 -11
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_1_5_0.md +0 -105
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -1,26 +1,23 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* cryptographic integrity proofs.
|
|
18
|
-
* @see docs/PRODUCTION_ENVIRONMENT_CAPTURE.md for equations, coordinate/unit conventions, blockers and
|
|
19
|
-
* support limits.
|
|
3
|
+
* The production image-formation plan: the ordered list of scientific stages that turns a scene into
|
|
4
|
+
* a capture, and the record of which stages ran.
|
|
5
|
+
*
|
|
6
|
+
* The parsers validate untrusted input and return the normalized typed contract. Unknown enum values,
|
|
7
|
+
* missing required fields and incompatible scientific data are rejected.
|
|
8
|
+
*
|
|
9
|
+
* The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
|
|
10
|
+
* change, and makes results reproducible. A well-formed but unsupported combination returns
|
|
11
|
+
* structured blockers. A malformed declaration throws. The bounded environment route runs the
|
|
12
|
+
* supplied radiance through native RAW and, optionally, output processing. The sample-only and
|
|
13
|
+
* attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
|
|
14
|
+
* reproducibility, not cryptographic proof of integrity.
|
|
15
|
+
* @see docs/PRODUCTION_ENVIRONMENT_CAPTURE.md for the equations, units, coordinate conventions, known
|
|
16
|
+
* blockers and support limits.
|
|
20
17
|
*/
|
|
21
18
|
import { simulateEnvironmentSensorRawFrame } from "../capture/environment-raw-producer.js";
|
|
22
19
|
import { parseSimulatedCapture } from "../capture/simulated-capture.js";
|
|
23
|
-
import { calculateProcessedSensorRaw, validateProcessedSensorRawEnvelope } from "../capture/photographic-export.js";
|
|
20
|
+
import { calculateProcessedSensorRaw, validateProcessedSensorRawEnvelope, PROCESSED_SENSOR_RAW_MODEL_VERSION } from "../capture/photographic-export.js";
|
|
24
21
|
import { stringifyCanonicalJson } from "../core/canonical-json.js";
|
|
25
22
|
import { RELEASE_SEQUENCE_VERSION } from "../capture/release-sequence.js";
|
|
26
23
|
import { parseResolvedWhiteBalanceState } from "../color/white-balance.js";
|
|
@@ -29,6 +26,8 @@ import { getImageFormationContract, IMAGE_FORMATION_CONTRACT_VERSION } from "../
|
|
|
29
26
|
import { ENGINE_API_VERSION } from "../core/version.js";
|
|
30
27
|
import { SCIENTIFIC_ASSURANCE_CONTRACT_VERSION, composeScientificAssurance } from "../core/scientific-assurance.js";
|
|
31
28
|
import { InvalidScientificInputError } from "../core/validation.js";
|
|
29
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
30
|
+
import { isElectronicRollingShutterExposureSchedule } from "../sensor/readout-exposure-linkage.js";
|
|
32
31
|
import { calculateCaptureRotationTemporalQuadrature } from "../motion/capture-rotation-temporal-quadrature.js";
|
|
33
32
|
import { calculateCaptureExposureWindows } from "../sensor/exposure-window.js";
|
|
34
33
|
import { calculateSensorReadoutTiming } from "../sensor/readout-timing.js";
|
|
@@ -37,6 +36,7 @@ import { parseFrontOfLensFilterProfile, resolveFrontOfLensFilterTransmission } f
|
|
|
37
36
|
import { parseFocusPlane } from "../optics/focus-state.js";
|
|
38
37
|
import { calculateSceneRadianceToSensorIrradiance, parseSceneToSensorIrradianceProfile } from "../optics/scene-to-sensor-irradiance.js";
|
|
39
38
|
import { parseSceneRadianceEvaluationRequest, parseSceneRadianceEvaluationResult } from "../schema/scene-radiance.js";
|
|
39
|
+
import { requireInputObject, requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields } from "../core/record-validation.js";
|
|
40
40
|
export const PRODUCTION_IMAGE_FORMATION_PLAN_VERSION = "0.7.0";
|
|
41
41
|
export const PREPARED_IMAGE_FORMATION_CONTEXT_VERSION = "0.1.0";
|
|
42
42
|
export const PRODUCTION_CAPTURE_SNAPSHOT_VERSION = "0.3.0";
|
|
@@ -53,15 +53,18 @@ const COMPOSER_SUPPORTED_STAGES = new Set([
|
|
|
53
53
|
]);
|
|
54
54
|
const COMPOSER_SUPPORTED_EFFECTS = new Set([
|
|
55
55
|
"illumination-vignetting",
|
|
56
|
+
"geometric-distortion",
|
|
56
57
|
"spatial-camera-rotation",
|
|
57
58
|
"rolling-readout"
|
|
58
59
|
]);
|
|
59
|
-
function requireRecord(value, path) {
|
|
60
|
+
function requireRecord(value, path, allowedKeys) {
|
|
60
61
|
if (typeof value !== "object" ||
|
|
61
62
|
value === null ||
|
|
62
63
|
Array.isArray(value)) {
|
|
63
64
|
throw new InvalidConfigurationError(path + " must be an object.");
|
|
64
65
|
}
|
|
66
|
+
if (allowedKeys !== null)
|
|
67
|
+
rejectUnknownFields(value, allowedKeys, path);
|
|
65
68
|
return value;
|
|
66
69
|
}
|
|
67
70
|
function requireNonEmptyString(value, path) {
|
|
@@ -157,21 +160,22 @@ function parseUniqueEffectIds(value, path) {
|
|
|
157
160
|
.filter((effectId) => seen.has(effectId));
|
|
158
161
|
}
|
|
159
162
|
/**
|
|
160
|
-
*
|
|
161
|
-
* missing required fields and incompatible scientific data
|
|
163
|
+
* Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
|
|
164
|
+
* missing required fields and incompatible scientific data are rejected here.
|
|
162
165
|
*
|
|
163
|
-
* The planner
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
* @
|
|
166
|
+
* The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
|
|
167
|
+
* change, and makes results reproducible. A well-formed but unsupported combination returns
|
|
168
|
+
* structured blockers. A malformed declaration throws. The bounded environment route runs the
|
|
169
|
+
* supplied radiance through native RAW and, optionally, output processing. The sample-only and
|
|
170
|
+
* attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
|
|
171
|
+
* reproducibility, not cryptographic proof of integrity.
|
|
172
|
+
* @param value - unknown. Untrusted input; TypeScript types alone are not validation.
|
|
173
|
+
* @returns RendererCapabilityDeclaration. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
170
174
|
*
|
|
171
175
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
172
176
|
*/
|
|
173
177
|
export function parseRendererCapabilityDeclaration(value) {
|
|
174
|
-
const record = requireRecord(value, "rendererCapability");
|
|
178
|
+
const record = requireRecord(value, "rendererCapability", ["schemaVersion", "consumerKind", "spectralCapability", "temporalSampling", "depthCapability", "alphaRepresentation", "inverseFieldMapping", "preservesDepthOrderAcrossWarps", "sensorDomainProcessing", "rendererId", "rendererVersion", "supportedStages", "supportedEffects"]);
|
|
175
179
|
if (record.schemaVersion !==
|
|
176
180
|
RENDERER_CAPABILITY_SCHEMA_VERSION) {
|
|
177
181
|
throw new InvalidConfigurationError('rendererCapability.schemaVersion must be "' +
|
|
@@ -191,7 +195,8 @@ export function parseRendererCapabilityDeclaration(value) {
|
|
|
191
195
|
"wavelength-independent-approximation") {
|
|
192
196
|
throw new InvalidConfigurationError("rendererCapability.spectralCapability is invalid.");
|
|
193
197
|
}
|
|
194
|
-
const temporal = requireRecord(record.temporalSampling, "rendererCapability.temporalSampling");
|
|
198
|
+
const temporal = requireRecord(record.temporalSampling, "rendererCapability.temporalSampling", null);
|
|
199
|
+
rejectUnknownVariantFields(temporal, "kind", { none: ["kind"], bounded: ["kind", "maximumSamples"] }, "rendererCapability.temporalSampling");
|
|
195
200
|
let temporalSampling;
|
|
196
201
|
if (temporal.kind === "none") {
|
|
197
202
|
temporalSampling = {
|
|
@@ -267,21 +272,22 @@ export function parseRendererCapabilityDeclaration(value) {
|
|
|
267
272
|
};
|
|
268
273
|
}
|
|
269
274
|
/**
|
|
270
|
-
*
|
|
271
|
-
* missing required fields and incompatible scientific data
|
|
275
|
+
* Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
|
|
276
|
+
* missing required fields and incompatible scientific data are rejected here.
|
|
272
277
|
*
|
|
273
|
-
* The planner
|
|
274
|
-
*
|
|
275
|
-
*
|
|
276
|
-
*
|
|
277
|
-
*
|
|
278
|
-
*
|
|
279
|
-
* @
|
|
278
|
+
* The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
|
|
279
|
+
* change, and makes results reproducible. A well-formed but unsupported combination returns
|
|
280
|
+
* structured blockers. A malformed declaration throws. The bounded environment route runs the
|
|
281
|
+
* supplied radiance through native RAW and, optionally, output processing. The sample-only and
|
|
282
|
+
* attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
|
|
283
|
+
* reproducibility, not cryptographic proof of integrity.
|
|
284
|
+
* @param value - unknown. Untrusted input; TypeScript types alone are not validation.
|
|
285
|
+
* @returns ImageFormationFidelityProfile. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
280
286
|
*
|
|
281
287
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
282
288
|
*/
|
|
283
289
|
export function parseImageFormationFidelityProfile(value) {
|
|
284
|
-
const record = requireRecord(value, "imageFormationFidelityProfile");
|
|
290
|
+
const record = requireRecord(value, "imageFormationFidelityProfile", ["schemaVersion", "requiredEffects", "rendererRequirements", "profileId", "profileVersion", "requiredStages"]);
|
|
285
291
|
if (record.schemaVersion !==
|
|
286
292
|
IMAGE_FORMATION_FIDELITY_PROFILE_SCHEMA_VERSION) {
|
|
287
293
|
throw new InvalidConfigurationError('imageFormationFidelityProfile.schemaVersion must be "' +
|
|
@@ -297,7 +303,7 @@ export function parseImageFormationFidelityProfile(value) {
|
|
|
297
303
|
const path = "imageFormationFidelityProfile.requiredEffects[" +
|
|
298
304
|
index +
|
|
299
305
|
"]";
|
|
300
|
-
const effect = requireRecord(entry, path);
|
|
306
|
+
const effect = requireRecord(entry, path, ["effectId", "modelId", "modelVersion"]);
|
|
301
307
|
const effectId = effect.effectId;
|
|
302
308
|
if (typeof effectId !==
|
|
303
309
|
"string" ||
|
|
@@ -326,7 +332,7 @@ export function parseImageFormationFidelityProfile(value) {
|
|
|
326
332
|
...requestedEffects
|
|
327
333
|
].sort((left, right) => (effectOrder.get(left.effectId) ?? 0) -
|
|
328
334
|
(effectOrder.get(right.effectId) ?? 0));
|
|
329
|
-
const requirements = requireRecord(record.rendererRequirements, "imageFormationFidelityProfile.rendererRequirements");
|
|
335
|
+
const requirements = requireRecord(record.rendererRequirements, "imageFormationFidelityProfile.rendererRequirements", ["spectral", "sensorDomainProcessing", "depth"]);
|
|
330
336
|
const spectral = requirements.spectral;
|
|
331
337
|
if (spectral !==
|
|
332
338
|
"wavelength-resolved" &&
|
|
@@ -359,6 +365,7 @@ export function parseImageFormationFidelityProfile(value) {
|
|
|
359
365
|
};
|
|
360
366
|
}
|
|
361
367
|
function validateEquipmentCapabilities(value) {
|
|
368
|
+
requireInputObject(value, "value input");
|
|
362
369
|
if (value.schemaVersion !==
|
|
363
370
|
GENERIC_EQUIPMENT_EXPOSURE_CAPABILITY_SCHEMA_VERSION ||
|
|
364
371
|
value.scientificStatus !==
|
|
@@ -436,39 +443,65 @@ function fingerprintText(text) {
|
|
|
436
443
|
function fingerprintValue(value) {
|
|
437
444
|
return fingerprintText(canonicalStringify(value));
|
|
438
445
|
}
|
|
446
|
+
/** Top-level fields of `ProductionImageFormationPlan`. */
|
|
447
|
+
const PRODUCTION_PLAN_FIELDS = ["version", "status", "versions", "contextIdentity", "captureIdentity", "rendererIdentity",
|
|
448
|
+
"fidelityIdentity", "stagePlan", "effectPlan", "blockers", "environmentCaptureRequestFingerprint", "environmentCaptureResult",
|
|
449
|
+
"processedOutputResult", "physicalSceneToSensorResult", "temporalCaptureResult", "scientificAssurance", "stochastic",
|
|
450
|
+
"immutableCaptureSnapshot", "legacyPocModified", "fingerprint"];
|
|
439
451
|
/**
|
|
440
|
-
*
|
|
441
|
-
* array order
|
|
452
|
+
* Returns deterministic canonical JSON for a validated production plan. Object keys are sorted;
|
|
453
|
+
* array order is kept. The JSON holds data only and leaves out provider callbacks. The plan version
|
|
454
|
+
* and its fingerprint (recomputed over the content) must match, so an empty or edited object is
|
|
455
|
+
* rejected instead of serialized.
|
|
442
456
|
*
|
|
443
|
-
* The planner
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
*
|
|
447
|
-
*
|
|
448
|
-
*
|
|
449
|
-
* @
|
|
457
|
+
* The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
|
|
458
|
+
* change, and makes results reproducible. A well-formed but unsupported combination returns
|
|
459
|
+
* structured blockers. A malformed declaration throws. The bounded environment route runs the
|
|
460
|
+
* supplied radiance through native RAW and, optionally, output processing. The sample-only and
|
|
461
|
+
* attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
|
|
462
|
+
* reproducibility, not cryptographic proof of integrity.
|
|
463
|
+
* @param plan - ProductionImageFormationPlan. See that type for coordinates, units and profile binding.
|
|
464
|
+
* @returns string. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
450
465
|
*
|
|
451
466
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
452
467
|
*/
|
|
453
468
|
export function serializeProductionImageFormationPlan(plan) {
|
|
469
|
+
requireInputObject(plan, "serializeProductionImageFormationPlan input");
|
|
470
|
+
// 2.0.0: unknown top-level and fingerprint fields are named. Nested content is bound by the recomputed fingerprint.
|
|
471
|
+
rejectUnknownFields(plan, PRODUCTION_PLAN_FIELDS, "productionImageFormationPlan");
|
|
472
|
+
const { fingerprint, ...core } = plan;
|
|
473
|
+
if (isPlainObjectValue(fingerprint)) {
|
|
474
|
+
rejectUnknownFields(fingerprint, ["algorithm", "value", "purpose"], "productionImageFormationPlan.fingerprint");
|
|
475
|
+
}
|
|
476
|
+
if (core.version !== PRODUCTION_IMAGE_FORMATION_PLAN_VERSION) {
|
|
477
|
+
throw new InvalidConfigurationError(`Production plan version must be "${PRODUCTION_IMAGE_FORMATION_PLAN_VERSION}".`);
|
|
478
|
+
}
|
|
479
|
+
const supplied = fingerprint;
|
|
480
|
+
if (typeof supplied !== "object" || supplied === null ||
|
|
481
|
+
supplied.algorithm !== "fnv1a-32-non-cryptographic" ||
|
|
482
|
+
supplied.purpose !== "deterministic-reproducibility-key-not-integrity-security" ||
|
|
483
|
+
supplied.value !== fingerprintValue(core)) {
|
|
484
|
+
throw new InvalidConfigurationError("Production plan fingerprint does not match its content; serialize only a plan returned by createProductionImageFormationPlan.");
|
|
485
|
+
}
|
|
454
486
|
return canonicalStringify(plan);
|
|
455
487
|
}
|
|
456
488
|
/**
|
|
457
|
-
*
|
|
458
|
-
* missing required fields and incompatible scientific data
|
|
489
|
+
* Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
|
|
490
|
+
* missing required fields and incompatible scientific data are rejected here.
|
|
459
491
|
*
|
|
460
|
-
* The planner
|
|
461
|
-
*
|
|
462
|
-
*
|
|
463
|
-
*
|
|
464
|
-
*
|
|
465
|
-
*
|
|
466
|
-
* @
|
|
492
|
+
* The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
|
|
493
|
+
* change, and makes results reproducible. A well-formed but unsupported combination returns
|
|
494
|
+
* structured blockers. A malformed declaration throws. The bounded environment route runs the
|
|
495
|
+
* supplied radiance through native RAW and, optionally, output processing. The sample-only and
|
|
496
|
+
* attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
|
|
497
|
+
* reproducibility, not cryptographic proof of integrity.
|
|
498
|
+
* @param value - unknown. Untrusted input; TypeScript types alone are not validation.
|
|
499
|
+
* @returns PreparedImageFormationContext. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
467
500
|
*
|
|
468
501
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
469
502
|
*/
|
|
470
503
|
export function parsePreparedImageFormationContext(value) {
|
|
471
|
-
const record = requireRecord(value, "preparedImageFormationContext");
|
|
504
|
+
const record = requireRecord(value, "preparedImageFormationContext", ["version", "contextId", "sceneId", "sceneRadianceProviderProfileId", "outputGeometryProfileId", "equipmentCapabilities", "opticalBridgeProfile", "renderer", "fidelity", "fingerprint"]);
|
|
472
505
|
if (record.version !==
|
|
473
506
|
PREPARED_IMAGE_FORMATION_CONTEXT_VERSION) {
|
|
474
507
|
throw new InvalidConfigurationError('preparedImageFormationContext.version must be "' +
|
|
@@ -500,7 +533,7 @@ export function parsePreparedImageFormationContext(value) {
|
|
|
500
533
|
record.fingerprint === null) {
|
|
501
534
|
throw new InvalidConfigurationError("preparedImageFormationContext.fingerprint must be present.");
|
|
502
535
|
}
|
|
503
|
-
const supplied = requireRecord(record.fingerprint, "preparedImageFormationContext.fingerprint");
|
|
536
|
+
const supplied = requireRecord(record.fingerprint, "preparedImageFormationContext.fingerprint", ["algorithm", "value"]);
|
|
504
537
|
if (supplied.algorithm !==
|
|
505
538
|
"fnv1a-32-non-cryptographic" ||
|
|
506
539
|
supplied.value !==
|
|
@@ -510,20 +543,23 @@ export function parsePreparedImageFormationContext(value) {
|
|
|
510
543
|
return parsed;
|
|
511
544
|
}
|
|
512
545
|
/**
|
|
513
|
-
*
|
|
514
|
-
*
|
|
546
|
+
* Parses, copies and freezes the declarations that change rarely (equipment, scene, renderer and
|
|
547
|
+
* fidelity), so later immutable captures can reuse them. This prepares state; it does not render a
|
|
548
|
+
* frame.
|
|
515
549
|
*
|
|
516
|
-
* The planner
|
|
517
|
-
*
|
|
518
|
-
*
|
|
519
|
-
*
|
|
520
|
-
*
|
|
521
|
-
*
|
|
522
|
-
* @
|
|
550
|
+
* The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
|
|
551
|
+
* change, and makes results reproducible. A well-formed but unsupported combination returns
|
|
552
|
+
* structured blockers. A malformed declaration throws. The bounded environment route runs the
|
|
553
|
+
* supplied radiance through native RAW and, optionally, output processing. The sample-only and
|
|
554
|
+
* attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
|
|
555
|
+
* reproducibility, not cryptographic proof of integrity.
|
|
556
|
+
* @param input - PrepareImageFormationContextInput. See that type for coordinates, units and profile binding.
|
|
557
|
+
* @returns PreparedImageFormationContext. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
523
558
|
*
|
|
524
559
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
525
560
|
*/
|
|
526
561
|
export function prepareImageFormationContext(input) {
|
|
562
|
+
requireInputKeys(input, "prepareImageFormationContext", ["contextId", "sceneId", "sceneRadianceProviderProfileId", "outputGeometryProfileId", "equipmentCapabilities", "opticalBridgeProfile", "renderer", "fidelity", "version", "fingerprint"]);
|
|
527
563
|
validateEquipmentCapabilities(input.equipmentCapabilities);
|
|
528
564
|
const renderer = parseRendererCapabilityDeclaration(input.renderer);
|
|
529
565
|
const fidelity = parseImageFormationFidelityProfile(input.fidelity);
|
|
@@ -568,7 +604,41 @@ export function prepareImageFormationContext(input) {
|
|
|
568
604
|
};
|
|
569
605
|
return deepFreeze(cloneJson(prepared));
|
|
570
606
|
}
|
|
607
|
+
/**
|
|
608
|
+
* Rejects unknown fields in the optical-bridge focus and field-throughput declarations carried by a
|
|
609
|
+
* physical scene sample. Values that are not objects are left to the optical bridge, which reports
|
|
610
|
+
* them; the vignetting `result` is an engine result and is checked where it is used.
|
|
611
|
+
*/
|
|
612
|
+
function rejectUnknownOpticalBridgeFields(focus, fieldThroughput, path) {
|
|
613
|
+
if (isPlainObjectValue(focus)) {
|
|
614
|
+
rejectUnknownVariantFields(focus, "kind", {
|
|
615
|
+
"infinity-focus": ["kind"],
|
|
616
|
+
"ideal-symmetric-thin-lens": ["kind", "objectDistanceM", "pupilMagnificationAssumption"],
|
|
617
|
+
"supplied-working-f-number": ["kind", "focus", "workingFNumber", "basis"]
|
|
618
|
+
}, path + ".focus");
|
|
619
|
+
if (focus.kind === "supplied-working-f-number") {
|
|
620
|
+
if (isPlainObjectValue(focus.focus)) {
|
|
621
|
+
rejectUnknownVariantFields(focus.focus, "kind", { infinity: ["kind"], finite: ["kind", "objectDistanceM"] }, path + ".focus.focus");
|
|
622
|
+
}
|
|
623
|
+
if (isPlainObjectValue(focus.workingFNumber)) {
|
|
624
|
+
rejectUnknownFields(focus.workingFNumber, ["value", "evidence"], path + ".focus.workingFNumber");
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
if (isPlainObjectValue(fieldThroughput)) {
|
|
629
|
+
rejectUnknownVariantFields(fieldThroughput, "kind", {
|
|
630
|
+
unity: ["kind"],
|
|
631
|
+
"illumination-vignetting-result": ["kind", "result"]
|
|
632
|
+
}, path + ".fieldThroughput");
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
function isPlainObjectValue(value) {
|
|
636
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
637
|
+
}
|
|
571
638
|
function validatePhysicalSceneSample(sample, sceneTimeSecondsFromExposureStart) {
|
|
639
|
+
requireRecord(sample, "physicalSceneSample", ["sceneRadianceRequest", "sceneRadianceResult", "focus", "imagePointMm",
|
|
640
|
+
"fieldThroughput", "frontOfLensFilters"]);
|
|
641
|
+
rejectUnknownOpticalBridgeFields(sample.focus, sample.fieldThroughput, "physicalSceneSample");
|
|
572
642
|
const request = parseSceneRadianceEvaluationRequest(sample.sceneRadianceRequest);
|
|
573
643
|
const result = parseSceneRadianceEvaluationResult(sample.sceneRadianceResult);
|
|
574
644
|
if (request
|
|
@@ -576,7 +646,7 @@ function validatePhysicalSceneSample(sample, sceneTimeSecondsFromExposureStart)
|
|
|
576
646
|
sceneTimeSecondsFromExposureStart) {
|
|
577
647
|
throw new InvalidConfigurationError("physicalSceneSample.sceneRadianceRequest.timeSecondsFromExposureStart must equal the capture snapshot scene time.");
|
|
578
648
|
}
|
|
579
|
-
const imagePoint = requireRecord(sample.imagePointMm, "physicalSceneSample.imagePointMm");
|
|
649
|
+
const imagePoint = requireRecord(sample.imagePointMm, "physicalSceneSample.imagePointMm", ["x", "y"]);
|
|
580
650
|
return cloneJson({
|
|
581
651
|
sceneRadianceRequest: request,
|
|
582
652
|
sceneRadianceResult: result,
|
|
@@ -601,6 +671,16 @@ const CAPTURE_ORIENTATIONS = new Set([
|
|
|
601
671
|
"portrait-counter-clockwise"
|
|
602
672
|
]);
|
|
603
673
|
function validateTemporalCaptureInput(input, shutterSeconds) {
|
|
674
|
+
requireRecord(input, "temporalCapture", ["exposureWindowInput", "imagingArea", "orientation", "readout",
|
|
675
|
+
"readoutExposureLinkage", "rotation"]);
|
|
676
|
+
requireRecord(input.imagingArea, "temporalCapture.imagingArea", ["widthMm", "heightMm"]);
|
|
677
|
+
if (isPlainObjectValue(input.readoutExposureLinkage)) {
|
|
678
|
+
rejectUnknownFields(input.readoutExposureLinkage, ["kind", "evidence"], "temporalCapture.readoutExposureLinkage");
|
|
679
|
+
}
|
|
680
|
+
if (input.rotation !== undefined) {
|
|
681
|
+
requireRecord(input.rotation, "temporalCapture.rotation", ["angularVelocityRadPerSec", "focusDistanceM", "temporalSampleCount"]);
|
|
682
|
+
requireRecord(input.rotation.angularVelocityRadPerSec, "temporalCapture.rotation.angularVelocityRadPerSec", ["pitch", "yaw", "roll"]);
|
|
683
|
+
}
|
|
604
684
|
const exposureWindows = calculateCaptureExposureWindows(input.exposureWindowInput).value;
|
|
605
685
|
if (!settingEquals(exposureWindows
|
|
606
686
|
.nominalExposureDurationSeconds
|
|
@@ -639,6 +719,19 @@ function validateTemporalCaptureInput(input, shutterSeconds) {
|
|
|
639
719
|
})
|
|
640
720
|
});
|
|
641
721
|
}
|
|
722
|
+
if (input.readoutExposureLinkage !== undefined) {
|
|
723
|
+
const linkage = input.readoutExposureLinkage;
|
|
724
|
+
if (typeof linkage !== "object" ||
|
|
725
|
+
linkage === null ||
|
|
726
|
+
linkage.kind !== "electronic-rolling-shutter-line-reset-read") {
|
|
727
|
+
throw new InvalidConfigurationError("temporalCapture.readoutExposureLinkage.kind is invalid.");
|
|
728
|
+
}
|
|
729
|
+
parseEvidenceList(linkage.evidence, "temporalCapture.readoutExposureLinkage.evidence");
|
|
730
|
+
if (input.readout === undefined ||
|
|
731
|
+
!isElectronicRollingShutterExposureSchedule(input.exposureWindowInput, input.readout)) {
|
|
732
|
+
throw new InvalidConfigurationError("temporalCapture electronic rolling-shutter linkage requires a rolling readout and the exposure schedule derived from it.");
|
|
733
|
+
}
|
|
734
|
+
}
|
|
642
735
|
if (input.rotation !== undefined) {
|
|
643
736
|
const sampleCount = input.rotation
|
|
644
737
|
.temporalSampleCount;
|
|
@@ -700,6 +793,9 @@ function validateReleaseAutomationState(value, path) {
|
|
|
700
793
|
return value;
|
|
701
794
|
}
|
|
702
795
|
function validateProductionReleaseFrameBinding(binding, releaseFrameId, exposure, stochasticSeedUint32) {
|
|
796
|
+
requireRecord(binding, "releaseFrameBinding", ["releaseSequenceVersion", "sequenceId", "releaseFrameId", "frameIndex", "exposure",
|
|
797
|
+
"stochasticSeedUint32", "exposureStartTimeSeconds", "exposureEndTimeSeconds", "sceneTimeSecondsFromSequenceStart",
|
|
798
|
+
"startIntervalFromPreviousSeconds", "timingConstraints", "focus", "automation", "whiteBalanceStateId"]);
|
|
703
799
|
if (binding.releaseSequenceVersion !==
|
|
704
800
|
RELEASE_SEQUENCE_VERSION) {
|
|
705
801
|
throw new InvalidConfigurationError('releaseFrameBinding.releaseSequenceVersion must be "' +
|
|
@@ -752,7 +848,7 @@ function validateProductionReleaseFrameBinding(binding, releaseFrameId, exposure
|
|
|
752
848
|
timingConstraints.length) {
|
|
753
849
|
throw new InvalidConfigurationError("releaseFrameBinding.timingConstraints must not contain duplicates.");
|
|
754
850
|
}
|
|
755
|
-
const automationRecord = requireRecord(binding.automation, "releaseFrameBinding.automation");
|
|
851
|
+
const automationRecord = requireRecord(binding.automation, "releaseFrameBinding.automation", ["ae", "af", "awb"]);
|
|
756
852
|
const automation = {
|
|
757
853
|
ae: validateReleaseAutomationState(automationRecord.ae, "releaseFrameBinding.automation.ae"),
|
|
758
854
|
af: validateReleaseAutomationState(automationRecord.af, "releaseFrameBinding.automation.af"),
|
|
@@ -762,7 +858,7 @@ function validateProductionReleaseFrameBinding(binding, releaseFrameId, exposure
|
|
|
762
858
|
undefined
|
|
763
859
|
? undefined
|
|
764
860
|
: requireNonEmptyString(binding.whiteBalanceStateId, "releaseFrameBinding.whiteBalanceStateId");
|
|
765
|
-
const exposureRecord = requireRecord(binding.exposure, "releaseFrameBinding.exposure");
|
|
861
|
+
const exposureRecord = requireRecord(binding.exposure, "releaseFrameBinding.exposure", ["aperture", "shutterSeconds", "iso"]);
|
|
766
862
|
const parsedExposure = {
|
|
767
863
|
aperture: requirePositiveFinite(exposureRecord.aperture, "releaseFrameBinding.exposure.aperture"),
|
|
768
864
|
shutterSeconds: requirePositiveFinite(exposureRecord.shutterSeconds, "releaseFrameBinding.exposure.shutterSeconds"),
|
|
@@ -856,26 +952,30 @@ function validateCommittedWhiteBalanceState(state, binding) {
|
|
|
856
952
|
return parsed;
|
|
857
953
|
}
|
|
858
954
|
/**
|
|
859
|
-
*
|
|
860
|
-
*
|
|
955
|
+
* Records, by value, the resolved capture settings, the scene time and identity, the random seed,
|
|
956
|
+
* and optional timing, focus and white-balance state. Later changes in the application cannot alter
|
|
957
|
+
* this captured event.
|
|
861
958
|
*
|
|
862
|
-
* The planner
|
|
863
|
-
*
|
|
864
|
-
*
|
|
865
|
-
*
|
|
866
|
-
*
|
|
867
|
-
*
|
|
868
|
-
* @
|
|
959
|
+
* The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
|
|
960
|
+
* change, and makes results reproducible. A well-formed but unsupported combination returns
|
|
961
|
+
* structured blockers. A malformed declaration throws. The bounded environment route runs the
|
|
962
|
+
* supplied radiance through native RAW and, optionally, output processing. The sample-only and
|
|
963
|
+
* attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
|
|
964
|
+
* reproducibility, not cryptographic proof of integrity.
|
|
965
|
+
* @param input - CreateProductionCaptureSnapshotInput. See that type for coordinates, units and profile binding.
|
|
966
|
+
* @returns ProductionCaptureSnapshot. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
869
967
|
*
|
|
870
968
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
871
969
|
*/
|
|
872
970
|
export function createProductionCaptureSnapshot(input) {
|
|
971
|
+
requireInputKeys(input, "createProductionCaptureSnapshot", ["captureId", "releaseFrameId", "sceneStateId", "sceneTimeSecondsFromExposureStart", "outputStateId", "exposure", "stochasticSeedUint32", "releaseFrameBinding", "whiteBalanceState", "physicalSceneSample", "temporalCapture", "version", "fingerprint"]);
|
|
873
972
|
const sceneTime = requireFinite(input
|
|
874
973
|
.sceneTimeSecondsFromExposureStart, "sceneTimeSecondsFromExposureStart");
|
|
875
974
|
if (sceneTime < 0) {
|
|
876
975
|
throw new InvalidConfigurationError("sceneTimeSecondsFromExposureStart must be greater than or equal to zero.");
|
|
877
976
|
}
|
|
878
977
|
const releaseFrameId = requireNonEmptyString(input.releaseFrameId, "releaseFrameId");
|
|
978
|
+
requireRecord(input.exposure, "exposure", null);
|
|
879
979
|
const exposure = {
|
|
880
980
|
aperture: requirePositiveFinite(input.exposure.aperture, "exposure.aperture"),
|
|
881
981
|
shutterSeconds: requirePositiveFinite(input.exposure
|
|
@@ -942,13 +1042,15 @@ export function createProductionCaptureSnapshot(input) {
|
|
|
942
1042
|
return deepFreeze(cloneJson(snapshot));
|
|
943
1043
|
}
|
|
944
1044
|
/**
|
|
945
|
-
* Creates one immutable production snapshot directly from a committed
|
|
946
|
-
*
|
|
947
|
-
*
|
|
948
|
-
*
|
|
1045
|
+
* Creates one immutable production snapshot directly from a committed release
|
|
1046
|
+
* frame (ResolvedReleaseFrame). The release frame supplies the exposure, focus,
|
|
1047
|
+
* automation and seed. The caller supplies only the scene and output state that
|
|
1048
|
+
* the release sequence does not.
|
|
949
1049
|
*/
|
|
950
1050
|
export function createProductionCaptureSnapshotFromReleaseFrame(input) {
|
|
1051
|
+
requireInputKeys(input, "createProductionCaptureSnapshotFromReleaseFrame", ["captureId", "sceneStateId", "sceneTimeSecondsFromExposureStart", "outputStateId", "releaseFrame", "whiteBalanceState", "physicalSceneSample", "temporalCapture"]);
|
|
951
1052
|
const frame = input.releaseFrame;
|
|
1053
|
+
requireInputObject(frame, "frame input");
|
|
952
1054
|
const releaseFrameBinding = {
|
|
953
1055
|
releaseSequenceVersion: RELEASE_SEQUENCE_VERSION,
|
|
954
1056
|
sequenceId: requireNonEmptyString(frame.sequenceId, "releaseFrame.sequenceId"),
|
|
@@ -1009,27 +1111,29 @@ export function createProductionCaptureSnapshotFromReleaseFrame(input) {
|
|
|
1009
1111
|
});
|
|
1010
1112
|
}
|
|
1011
1113
|
/**
|
|
1012
|
-
*
|
|
1013
|
-
* missing required fields and incompatible scientific data
|
|
1114
|
+
* Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
|
|
1115
|
+
* missing required fields and incompatible scientific data are rejected here.
|
|
1014
1116
|
*
|
|
1015
|
-
* The planner
|
|
1016
|
-
*
|
|
1017
|
-
*
|
|
1018
|
-
*
|
|
1019
|
-
*
|
|
1020
|
-
*
|
|
1021
|
-
* @
|
|
1117
|
+
* The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
|
|
1118
|
+
* change, and makes results reproducible. A well-formed but unsupported combination returns
|
|
1119
|
+
* structured blockers. A malformed declaration throws. The bounded environment route runs the
|
|
1120
|
+
* supplied radiance through native RAW and, optionally, output processing. The sample-only and
|
|
1121
|
+
* attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
|
|
1122
|
+
* reproducibility, not cryptographic proof of integrity.
|
|
1123
|
+
* @param value - unknown. Untrusted input; TypeScript types alone are not validation.
|
|
1124
|
+
* @returns ProductionCaptureSnapshot. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
1022
1125
|
*
|
|
1023
1126
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
1024
1127
|
*/
|
|
1025
1128
|
export function parseProductionCaptureSnapshot(value) {
|
|
1026
|
-
const record = requireRecord(value, "productionCaptureSnapshot");
|
|
1129
|
+
const record = requireRecord(value, "productionCaptureSnapshot", ["version", "captureId", "releaseFrameId", "sceneStateId", "sceneTimeSecondsFromExposureStart", "outputStateId", "exposure", "stochasticSeedUint32", "releaseFrameBinding", "whiteBalanceState", "physicalSceneSample", "temporalCapture", "fingerprint"]);
|
|
1027
1130
|
if (record.version !==
|
|
1028
1131
|
PRODUCTION_CAPTURE_SNAPSHOT_VERSION) {
|
|
1029
1132
|
throw new InvalidConfigurationError('productionCaptureSnapshot.version must be "' +
|
|
1030
1133
|
PRODUCTION_CAPTURE_SNAPSHOT_VERSION +
|
|
1031
1134
|
'".');
|
|
1032
1135
|
}
|
|
1136
|
+
requireRecord(record.exposure, "productionCaptureSnapshot.exposure", ["aperture", "shutterSeconds", "iso"]);
|
|
1033
1137
|
const parsed = createProductionCaptureSnapshot({
|
|
1034
1138
|
captureId: record.captureId,
|
|
1035
1139
|
releaseFrameId: record.releaseFrameId,
|
|
@@ -1072,7 +1176,7 @@ export function parseProductionCaptureSnapshot(value) {
|
|
|
1072
1176
|
.temporalCapture
|
|
1073
1177
|
})
|
|
1074
1178
|
});
|
|
1075
|
-
const supplied = requireRecord(record.fingerprint, "productionCaptureSnapshot.fingerprint");
|
|
1179
|
+
const supplied = requireRecord(record.fingerprint, "productionCaptureSnapshot.fingerprint", ["algorithm", "value"]);
|
|
1076
1180
|
if (supplied.algorithm !==
|
|
1077
1181
|
"fnv1a-32-non-cryptographic" ||
|
|
1078
1182
|
supplied.value !==
|
|
@@ -1082,10 +1186,11 @@ export function parseProductionCaptureSnapshot(value) {
|
|
|
1082
1186
|
return parsed;
|
|
1083
1187
|
}
|
|
1084
1188
|
/**
|
|
1085
|
-
*
|
|
1086
|
-
* contract. Shared
|
|
1087
|
-
*
|
|
1088
|
-
* inputs, renderer capabilities and scientific support
|
|
1189
|
+
* Adds the hard upstream dependencies of each requested stage, as the engine
|
|
1190
|
+
* contract defines them. Shared or coupled effects stay separate from the
|
|
1191
|
+
* serialization order. Adding a dependency does not mean it runs: deriveStagePlan
|
|
1192
|
+
* still checks the declared inputs, renderer capabilities and scientific support
|
|
1193
|
+
* for every added stage.
|
|
1089
1194
|
*/
|
|
1090
1195
|
function expandRequiredStages(fidelity) {
|
|
1091
1196
|
const contract = getImageFormationContract();
|
|
@@ -1252,6 +1357,15 @@ function requestedEffectMap(fidelity) {
|
|
|
1252
1357
|
effect
|
|
1253
1358
|
]));
|
|
1254
1359
|
}
|
|
1360
|
+
/** True when a declared lens field mapping applies no distortion (absent, "none" or all-zero terms). */
|
|
1361
|
+
function lensDistortionIsZero(mapping) {
|
|
1362
|
+
const distortion = mapping?.distortion;
|
|
1363
|
+
if (distortion === undefined || distortion.kind === "none")
|
|
1364
|
+
return true;
|
|
1365
|
+
const coefficients = distortion.profile?.coefficients;
|
|
1366
|
+
return typeof coefficients === "object" && coefficients !== null &&
|
|
1367
|
+
Object.values(coefficients).every(value => value === 0);
|
|
1368
|
+
}
|
|
1255
1369
|
function hasActiveUndeclaredFieldThroughput(prepared, snapshot) {
|
|
1256
1370
|
const sample = snapshot.physicalSceneSample;
|
|
1257
1371
|
if (sample === undefined ||
|
|
@@ -1395,7 +1509,10 @@ function computeTemporalResult(prepared, snapshot, requiredStages, blockers) {
|
|
|
1395
1509
|
rotationQuadrature
|
|
1396
1510
|
}),
|
|
1397
1511
|
exposureTimeReference: "first-opening-boundary-phase",
|
|
1398
|
-
readoutExposureSynchronization:
|
|
1512
|
+
readoutExposureSynchronization: temporal.readoutExposureLinkage ===
|
|
1513
|
+
undefined
|
|
1514
|
+
? "not-assumed"
|
|
1515
|
+
: "electronic-rolling-shutter-line-linked",
|
|
1399
1516
|
sensorReadoutTimingRemainsSeparate: true,
|
|
1400
1517
|
temporalRadianceIntegrated: false
|
|
1401
1518
|
};
|
|
@@ -1491,6 +1608,30 @@ function deriveEffectPlan(prepared, snapshot, temporalResult, blockers, environm
|
|
|
1491
1608
|
]
|
|
1492
1609
|
};
|
|
1493
1610
|
}
|
|
1611
|
+
if (placement.id === "geometric-distortion") {
|
|
1612
|
+
// 2.0: lens distortion is applied only through an executed environment capture whose
|
|
1613
|
+
// sites declare a lens field mapping. The ray query applies the inverse map and area factor.
|
|
1614
|
+
const mapping = environmentCapture?.capture.sites[0]?.environment.lensFieldMapping;
|
|
1615
|
+
if (mapping === undefined) {
|
|
1616
|
+
const blocker = {
|
|
1617
|
+
code: "missing-lens-field-mapping",
|
|
1618
|
+
effectId: placement.id,
|
|
1619
|
+
message: "Geometric-distortion planning requires an executed environment capture with an explicit lens field mapping."
|
|
1620
|
+
};
|
|
1621
|
+
addBlocker(blockers, blocker);
|
|
1622
|
+
return {
|
|
1623
|
+
effectId: placement.id, primaryStage: placement.primaryStage, coupledStages: [...placement.coupledStages],
|
|
1624
|
+
state: "blocked", scientificStatus: "not-applicable", requiredByFidelity: true,
|
|
1625
|
+
modelId: request.modelId, modelVersion: request.modelVersion, blockerCodes: [blocker.code]
|
|
1626
|
+
};
|
|
1627
|
+
}
|
|
1628
|
+
return {
|
|
1629
|
+
effectId: placement.id, primaryStage: placement.primaryStage, coupledStages: [...placement.coupledStages],
|
|
1630
|
+
state: lensDistortionIsZero(mapping) ? "modeled-zero" : "active",
|
|
1631
|
+
scientificStatus: "approximation", requiredByFidelity: true,
|
|
1632
|
+
modelId: request.modelId, modelVersion: request.modelVersion, blockerCodes: []
|
|
1633
|
+
};
|
|
1634
|
+
}
|
|
1494
1635
|
if (placement.id ===
|
|
1495
1636
|
"illumination-vignetting") {
|
|
1496
1637
|
const environmentField = environmentCapture?.capture.sites[0]?.environment.fieldThroughput;
|
|
@@ -1665,7 +1806,7 @@ function computePhysicalResult(prepared, snapshot, requiredStages, blockers) {
|
|
|
1665
1806
|
addBlocker(blockers, {
|
|
1666
1807
|
code: "missing-optical-bridge-profile",
|
|
1667
1808
|
stageId: "lens-field-pupil-evaluation",
|
|
1668
|
-
message: "Physical lens-throughput planning requires a prepared
|
|
1809
|
+
message: "Physical lens-throughput planning requires a prepared scene-radiance-to-sensor-irradiance optical bridge profile."
|
|
1669
1810
|
});
|
|
1670
1811
|
return undefined;
|
|
1671
1812
|
}
|
|
@@ -1779,7 +1920,7 @@ function deriveStagePlan(prepared, snapshot, requiredStages, physicalResult, tem
|
|
|
1779
1920
|
return { stageId: stage.id, contractStatus: stage.status, state: supported ? "active" : "blocked",
|
|
1780
1921
|
scientificStatus: supported ? "approximation" : "not-applicable", requiredByFidelity: true,
|
|
1781
1922
|
requiredUpstreamStages: [...stage.requiredUpstreamStages], coupledStages: [...stage.coupledStages],
|
|
1782
|
-
modelId: "processed-sensor-raw-sdr", modelVersion:
|
|
1923
|
+
modelId: "processed-sensor-raw-sdr", modelVersion: PROCESSED_SENSOR_RAW_MODEL_VERSION,
|
|
1783
1924
|
resultIdentity: processedResult.value.source.value.rawFrame.frameId,
|
|
1784
1925
|
blockerCodes: supported ? [] : ["renderer-stage-unsupported"] };
|
|
1785
1926
|
}
|
|
@@ -1886,7 +2027,7 @@ function deriveStagePlan(prepared, snapshot, requiredStages, physicalResult, tem
|
|
|
1886
2027
|
const blocker = {
|
|
1887
2028
|
code: "missing-physical-scene-sample",
|
|
1888
2029
|
stageId: stage.id,
|
|
1889
|
-
message: "Scene-radiance stage requires one immutable
|
|
2030
|
+
message: "Scene-radiance stage requires one immutable scene-radiance provider request/result sample."
|
|
1890
2031
|
};
|
|
1891
2032
|
addBlocker(blockers, blocker);
|
|
1892
2033
|
return {
|
|
@@ -2197,10 +2338,11 @@ function temporalAssuranceComponent(snapshot) {
|
|
|
2197
2338
|
};
|
|
2198
2339
|
}
|
|
2199
2340
|
/**
|
|
2200
|
-
*
|
|
2201
|
-
*
|
|
2202
|
-
* executed lineage are part of
|
|
2203
|
-
*
|
|
2341
|
+
* Builds the evidence and status from the child stages that actually ran. It
|
|
2342
|
+
* does not average uncertainty and never upgrades a declared approximation to
|
|
2343
|
+
* calibration. Requested blockers and executed lineage are part of the
|
|
2344
|
+
* assurance. A complete graph alone cannot show physical accuracy or validate
|
|
2345
|
+
* an external provider's numerical transport.
|
|
2204
2346
|
*/
|
|
2205
2347
|
function composeProductionScientificAssurance(prepared, snapshot, physicalResult, temporalResult, processedResult, environmentResult) {
|
|
2206
2348
|
const components = [];
|
|
@@ -2221,7 +2363,7 @@ function composeProductionScientificAssurance(prepared, snapshot, physicalResult
|
|
|
2221
2363
|
}
|
|
2222
2364
|
if (processedResult !== undefined) {
|
|
2223
2365
|
components.push({ componentId: "processed-sensor-raw-sdr", role: "committed post-capture SDR development", required: true,
|
|
2224
|
-
sourceIdentity: { kind: "model", id: "processed-sensor-raw-sdr", version:
|
|
2366
|
+
sourceIdentity: { kind: "model", id: "processed-sensor-raw-sdr", version: PROCESSED_SENSOR_RAW_MODEL_VERSION }, basisKind: "photivra-model-assumption",
|
|
2225
2367
|
scientificStatus: "approximation", evidenceRequirement: "required", evidence: processedResult.value.colorProfile.evidence,
|
|
2226
2368
|
uncertainty: { kind: "not-quantified", limitation: "Reconstruction, color interpretation and optional correction uncertainty are not propagated into a combined output uncertainty." },
|
|
2227
2369
|
limitations: [...processedResult.value.colorProfile.limitations,
|
|
@@ -2236,7 +2378,7 @@ function composeProductionScientificAssurance(prepared, snapshot, physicalResult
|
|
|
2236
2378
|
components
|
|
2237
2379
|
});
|
|
2238
2380
|
}
|
|
2239
|
-
/**
|
|
2381
|
+
/** Checks that the event is immutable and owned before any provider code or pixel work runs. */
|
|
2240
2382
|
function validateProductionRawCapture(capture, snapshot, label = "Processed RAW") {
|
|
2241
2383
|
if (capture.captureId !== snapshot.captureId || capture.sceneStateId !== snapshot.sceneStateId ||
|
|
2242
2384
|
capture.sceneTimeSeconds !== snapshot.sceneTimeSecondsFromExposureStart || capture.noise.seedUint32 !== snapshot.stochasticSeedUint32 ||
|
|
@@ -2254,12 +2396,12 @@ function validateProductionRawCapture(capture, snapshot, label = "Processed RAW"
|
|
|
2254
2396
|
throw new InvalidConfigurationError(label + " focus differs from the committed optical sample.");
|
|
2255
2397
|
}
|
|
2256
2398
|
}
|
|
2257
|
-
/**
|
|
2399
|
+
/** Runs the committed post-capture step, without treating missing upstream stages as done. */
|
|
2258
2400
|
function computeProcessedOutput(input, prepared, snapshot, required, blockers) {
|
|
2259
2401
|
if (input === undefined)
|
|
2260
2402
|
return undefined;
|
|
2261
2403
|
try {
|
|
2262
|
-
const declaration = requireRecord(input, "processedOutput");
|
|
2404
|
+
const declaration = requireRecord(input, "processedOutput", null);
|
|
2263
2405
|
if (Object.keys(declaration).some(key => key !== "outputStateId" && key !== "processing"))
|
|
2264
2406
|
throw new InvalidConfigurationError("Unknown processed output declaration fields.");
|
|
2265
2407
|
if (!required.has("display-processing") || !prepared.renderer.sensorDomainProcessing)
|
|
@@ -2278,22 +2420,24 @@ function computeProcessedOutput(input, prepared, snapshot, required, blockers) {
|
|
|
2278
2420
|
}
|
|
2279
2421
|
}
|
|
2280
2422
|
/**
|
|
2281
|
-
*
|
|
2282
|
-
* preflight
|
|
2283
|
-
* environment producer
|
|
2423
|
+
* Fixes the execution limits before any supplied provider code runs. If the
|
|
2424
|
+
* preflight check fails, a structured blocker is returned and the code is never
|
|
2425
|
+
* called. The existing environment producer handles all node budgets, response
|
|
2426
|
+
* checks and the seeded RAW.
|
|
2284
2427
|
*/
|
|
2285
2428
|
/**
|
|
2286
|
-
*
|
|
2287
|
-
* before any trusted provider callback runs.
|
|
2288
|
-
* policy data first, then
|
|
2289
|
-
*
|
|
2290
|
-
*
|
|
2429
|
+
* Validates the shared capture and context, the renderer and the supported range
|
|
2430
|
+
* before any trusted provider callback runs. Takes a snapshot of the scientific
|
|
2431
|
+
* and output policy data first, then hands off to the single existing
|
|
2432
|
+
* environment RAW producer. A callback failure is passed on. A successful call
|
|
2433
|
+
* shows only that the code ran and the data was bound. It does not show physical
|
|
2434
|
+
* transport, visibility or calibration, and there is no fallback renderer.
|
|
2291
2435
|
*/
|
|
2292
2436
|
function computeEnvironmentCapture(input, externalOutput, prepared, snapshot, required, blockers) {
|
|
2293
2437
|
if (input === undefined)
|
|
2294
2438
|
return undefined;
|
|
2295
2439
|
try {
|
|
2296
|
-
const declaration = requireRecord(input, "environmentCapture");
|
|
2440
|
+
const declaration = requireRecord(input, "environmentCapture", null);
|
|
2297
2441
|
if (Object.keys(declaration).some(key => key !== "capture" && key !== "processing")) {
|
|
2298
2442
|
throw new InvalidConfigurationError("Unknown environment capture declaration fields.");
|
|
2299
2443
|
}
|
|
@@ -2333,17 +2477,24 @@ function computeEnvironmentCapture(input, externalOutput, prepared, snapshot, re
|
|
|
2333
2477
|
throw new InvalidConfigurationError("Environment geometry, scene, focal length and shutter schedule differ from the committed production context.");
|
|
2334
2478
|
}
|
|
2335
2479
|
const rendererTemporal = prepared.renderer.temporalSampling;
|
|
2480
|
+
// Frame-constant serializations are computed once, lazily at their first comparison, instead of once per site.
|
|
2481
|
+
let opticalBridgeCanonical, rotationVelocityCanonical;
|
|
2336
2482
|
for (const site of owned.sites) {
|
|
2337
2483
|
const e = site.environment;
|
|
2338
2484
|
if (e.fieldThroughput.kind !== "unity" &&
|
|
2339
2485
|
!prepared.fidelity.requiredEffects.some(effect => effect.effectId === "illumination-vignetting")) {
|
|
2340
2486
|
throw new InvalidConfigurationError("Non-unity environment field throughput requires an explicitly requested illumination-vignetting effect.");
|
|
2341
2487
|
}
|
|
2488
|
+
if (e.lensFieldMapping !== undefined && !lensDistortionIsZero(e.lensFieldMapping) &&
|
|
2489
|
+
!prepared.fidelity.requiredEffects.some(effect => effect.effectId === "geometric-distortion")) {
|
|
2490
|
+
throw new InvalidConfigurationError("Active environment lens distortion requires an explicitly requested geometric-distortion effect.");
|
|
2491
|
+
}
|
|
2342
2492
|
if (e.sceneBindings.providerProfile.profileId !== prepared.sceneRadianceProviderProfileId ||
|
|
2343
|
-
canonicalStringify(e.optics.profile) !== canonicalStringify(prepared.opticalBridgeProfile) ||
|
|
2493
|
+
canonicalStringify(e.optics.profile) !== (opticalBridgeCanonical ??= canonicalStringify(prepared.opticalBridgeProfile)) ||
|
|
2344
2494
|
rendererTemporal.kind !== "bounded" || e.temporalSampleCount > rendererTemporal.maximumSamples ||
|
|
2345
2495
|
(temporal.rotation === undefined && !angularVelocityIsZero(e.motion.angularVelocityRadPerSec)) ||
|
|
2346
|
-
(temporal.rotation !== undefined && (canonicalStringify(e.motion.angularVelocityRadPerSec) !==
|
|
2496
|
+
(temporal.rotation !== undefined && (canonicalStringify(e.motion.angularVelocityRadPerSec) !==
|
|
2497
|
+
(rotationVelocityCanonical ??= canonicalStringify(temporal.rotation.angularVelocityRadPerSec)) ||
|
|
2347
2498
|
e.temporalSampleCount !== temporal.rotation.temporalSampleCount ||
|
|
2348
2499
|
(capture.focus.kind === "finite" ? capture.focus.distanceM : undefined) !== temporal.rotation.focusDistanceM))) {
|
|
2349
2500
|
throw new InvalidConfigurationError("Environment provider, optics, motion or temporal sampling differs from the committed production context.");
|
|
@@ -2360,22 +2511,24 @@ function computeEnvironmentCapture(input, externalOutput, prepared, snapshot, re
|
|
|
2360
2511
|
}
|
|
2361
2512
|
}
|
|
2362
2513
|
/**
|
|
2363
|
-
*
|
|
2364
|
-
* limits, then
|
|
2365
|
-
* active
|
|
2366
|
-
* requested effect.
|
|
2514
|
+
* Builds the production plan. Adds dependencies to the requested stages using the stage graph,
|
|
2515
|
+
* checks the shared state and capability limits, then runs only supported, declared input routes.
|
|
2516
|
+
* Each requested effect is reported as active, zero, omitted or blocked, with child evidence. A
|
|
2517
|
+
* requested effect is never skipped silently.
|
|
2367
2518
|
*
|
|
2368
|
-
* The planner
|
|
2369
|
-
*
|
|
2370
|
-
*
|
|
2371
|
-
*
|
|
2372
|
-
*
|
|
2373
|
-
*
|
|
2374
|
-
* @
|
|
2519
|
+
* The planner decides the order of the scientific stages, fixes each capture's identity so it cannot
|
|
2520
|
+
* change, and makes results reproducible. A well-formed but unsupported combination returns
|
|
2521
|
+
* structured blockers. A malformed declaration throws. The bounded environment route runs the
|
|
2522
|
+
* supplied radiance through native RAW and, optionally, output processing. The sample-only and
|
|
2523
|
+
* attached-RAW routes keep blockers for the upstream stages they lack. FNV fingerprints are keys for
|
|
2524
|
+
* reproducibility, not cryptographic proof of integrity.
|
|
2525
|
+
* @param input - CreateProductionImageFormationPlanInput. See that type for coordinates, units and profile binding.
|
|
2526
|
+
* @returns ProductionImageFormationPlan. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
2375
2527
|
*
|
|
2376
2528
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
2377
2529
|
*/
|
|
2378
2530
|
export function createProductionImageFormationPlan(input) {
|
|
2531
|
+
requireInputKeys(input, "createProductionImageFormationPlan", ["environmentCapture", "processedOutput", "preparedContext", "captureSnapshot"]);
|
|
2379
2532
|
const prepared = parsePreparedImageFormationContext(input.preparedContext);
|
|
2380
2533
|
const snapshot = parseProductionCaptureSnapshot(input.captureSnapshot);
|
|
2381
2534
|
validateSnapshotAgainstContext(prepared, snapshot);
|
|
@@ -2386,13 +2539,14 @@ export function createProductionImageFormationPlan(input) {
|
|
|
2386
2539
|
computePhysicalResult(prepared, snapshot, requiredStages, blockers);
|
|
2387
2540
|
const temporalResult = computeTemporalResult(prepared, snapshot, requiredStages, blockers);
|
|
2388
2541
|
let effectPlan = deriveEffectPlan(prepared, snapshot, temporalResult, blockers, input.environmentCapture);
|
|
2389
|
-
//
|
|
2542
|
+
// Copy the post-capture policy before a provider can change the caller's objects.
|
|
2390
2543
|
const environmentProcessing = input.environmentCapture?.processing === undefined ? undefined :
|
|
2391
2544
|
structuredClone(input.environmentCapture.processing);
|
|
2392
2545
|
const environmentExecution = computeEnvironmentCapture(input.environmentCapture, input.processedOutput, prepared, snapshot, requiredStages, blockers);
|
|
2393
2546
|
const environmentCaptureResult = environmentExecution?.result;
|
|
2394
2547
|
if (input.environmentCapture !== undefined && environmentCaptureResult === undefined) {
|
|
2395
|
-
effectPlan = effectPlan.map(effect => effect.effectId === "illumination-vignetting"
|
|
2548
|
+
effectPlan = effectPlan.map(effect => (effect.effectId === "illumination-vignetting" ||
|
|
2549
|
+
(effect.effectId === "geometric-distortion" && effect.state !== "blocked")) && effect.requiredByFidelity
|
|
2396
2550
|
? { ...effect, state: "blocked", scientificStatus: "not-applicable",
|
|
2397
2551
|
blockerCodes: ["environment-capture-evaluation-blocked"] } : effect);
|
|
2398
2552
|
}
|