@woosh/meep-engine 3.51.0 → 3.53.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/package.json +1 -1
- package/src/engine/ecs/animation/Animation.d.ts +4 -25
- package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
- package/src/engine/ecs/animation/Animation.js +9 -41
- package/src/engine/ecs/ik/IKGoalSystem.d.ts +4 -5
- package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/IKGoalSystem.js +4 -6
- package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +9 -22
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +58 -203
- package/src/engine/graphics3/AnimationSystem.d.ts +7 -18
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +62 -243
- package/src/engine/graphics3/FoliageWindSystem.d.ts +67 -0
- package/src/engine/graphics3/FoliageWindSystem.d.ts.map +1 -0
- package/src/engine/graphics3/FoliageWindSystem.js +257 -0
- package/src/engine/graphics3/GPUFluidSystem.d.ts +7 -0
- package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUFluidSystem.js +39 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +0 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +19 -5
- package/src/engine/graphics3/animation/AnimationClips.d.ts +107 -13
- package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
- package/src/engine/graphics3/animation/AnimationClips.js +207 -10
- package/src/engine/graphics3/animation/AnimationClipsSink.d.ts +89 -0
- package/src/engine/graphics3/animation/AnimationClipsSink.d.ts.map +1 -0
- package/src/engine/graphics3/animation/AnimationClipsSink.js +205 -0
- package/src/engine/graphics3/animation/FoliageWindRigs.d.ts +43 -0
- package/src/engine/graphics3/animation/FoliageWindRigs.d.ts.map +1 -0
- package/src/engine/graphics3/animation/FoliageWindRigs.js +69 -0
- package/src/engine/graphics3/animation/write_clip_playback.d.ts +17 -11
- package/src/engine/graphics3/animation/write_clip_playback.d.ts.map +1 -1
- package/src/engine/graphics3/animation/write_clip_playback.js +36 -27
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/decal/GPUDecalRenderer.js +8 -6
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_decal_composite.js +11 -5
- package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +7 -7
- package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -1
- package/src/engine/graphics3/pose/collect_entity_playbacks.js +14 -15
- package/src/engine/graphics3/prefab/Prefab.d.ts +6 -0
- package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/Prefab.js +169 -162
- package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_compile.js +369 -334
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_instantiate.js +43 -2
- package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +2 -2
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts +2 -3
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/ContactProbeSystem.js +2 -4
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/sound/simulation/PROBE_PLACEMENT.md +4 -4
- package/src/engine/sound/simulation/README.md +1 -1
- package/src/engine/sound/simulation/probe/bakeProbeField.d.ts +22 -8
- package/src/engine/sound/simulation/probe/bakeProbeField.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/bakeProbeField.js +60 -15
- package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +19 -23
- package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +63 -17
- package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/probe_sdf_grid.js +67 -17
- package/src/generation/foliage/FOLIAGE_DESIGN.md +318 -0
- package/src/generation/foliage/FOLIAGE_PLAN.md +198 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +20 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.js +108 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts +86 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -0
- package/src/generation/foliage/asset/TreeAsset.js +111 -0
- package/src/generation/foliage/asset/TreeLODAsset.d.ts +115 -0
- package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -0
- package/src/generation/foliage/asset/TreeLODAsset.js +346 -0
- package/src/generation/foliage/asset/generate_tree.d.ts +15 -0
- package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -0
- package/src/generation/foliage/asset/generate_tree.js +93 -0
- package/src/generation/foliage/asset/place_tree.d.ts +82 -0
- package/src/generation/foliage/asset/place_tree.d.ts.map +1 -0
- package/src/generation/foliage/asset/place_tree.js +194 -0
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts +120 -0
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/BarkMaterialConfig.js +250 -0
- package/src/generation/foliage/config/BranchLevelConfig.d.ts +288 -0
- package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/BranchLevelConfig.js +536 -0
- package/src/generation/foliage/config/CrownConfig.d.ts +100 -0
- package/src/generation/foliage/config/CrownConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/CrownConfig.js +186 -0
- package/src/generation/foliage/config/CrownEnvelopeType.d.ts +16 -0
- package/src/generation/foliage/config/CrownEnvelopeType.d.ts.map +1 -0
- package/src/generation/foliage/config/CrownEnvelopeType.js +17 -0
- package/src/generation/foliage/config/FoliageCardType.d.ts +12 -0
- package/src/generation/foliage/config/FoliageCardType.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageCardType.js +18 -0
- package/src/generation/foliage/config/FoliageConfig.d.ts +151 -0
- package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageConfig.js +283 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +90 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.js +181 -0
- package/src/generation/foliage/config/PhyllotaxisMode.d.ts +13 -0
- package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -0
- package/src/generation/foliage/config/PhyllotaxisMode.js +20 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts +87 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeLODConfig.js +211 -0
- package/src/generation/foliage/config/TreePreset.d.ts +16 -0
- package/src/generation/foliage/config/TreePreset.d.ts.map +1 -0
- package/src/generation/foliage/config/TreePreset.js +17 -0
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +109 -0
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeSpeciesConfig.js +400 -0
- package/src/generation/foliage/config/TreeWindConfig.d.ts +84 -0
- package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeWindConfig.js +157 -0
- package/src/generation/foliage/index.d.ts +38 -0
- package/src/generation/foliage/index.d.ts.map +1 -0
- package/src/generation/foliage/index.js +43 -0
- package/src/generation/foliage/material/make_bark_material.d.ts +37 -0
- package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -0
- package/src/generation/foliage/material/make_bark_material.js +802 -0
- package/src/generation/foliage/material/make_foliage_material.d.ts +14 -0
- package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
- package/src/generation/foliage/material/make_foliage_material.js +359 -0
- package/src/generation/foliage/mesh/branch_collar_project.d.ts +42 -0
- package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -0
- package/src/generation/foliage/mesh/branch_collar_project.js +203 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +35 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts.map +1 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.js +72 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +80 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +502 -0
- package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts +19 -0
- package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js +150 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts +55 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1047 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +21 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +415 -0
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts +13 -0
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -0
- package/src/generation/foliage/presets/make_tree_species_preset.js +837 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +443 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.js +1100 -0
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts +27 -0
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -0
- package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts +32 -0
- package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/spine_frame_double_reflection.js +87 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +33 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +205 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +14 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +179 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +18 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1104 -0
- package/src/shade/playground/additive_blending/index.html +197 -0
- package/src/shade/playground/additive_blending/main.d.ts +2 -0
- package/src/shade/playground/additive_blending/main.d.ts.map +1 -0
- package/src/shade/playground/additive_blending/main.js +529 -0
- package/src/shade/playground/foliage_wind/README.md +18 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts +127 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
- package/src/shade/playground/foliage_wind/foliage_world.js +593 -0
- package/src/shade/playground/foliage_wind/index.html +254 -0
- package/src/shade/playground/foliage_wind/main.d.ts +2 -0
- package/src/shade/playground/foliage_wind/main.d.ts.map +1 -0
- package/src/shade/playground/foliage_wind/main.js +263 -0
- package/src/shade/playground/tonemap_sdr/README.md +5 -3
- package/src/shade/renderer/Renderer.d.ts +1 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +88 -31
- package/src/shade/renderer/ShadeToneMappingMode.d.ts +3 -2
- package/src/shade/renderer/ShadeToneMappingMode.js +15 -4
- package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +145 -0
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +9 -1
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +53 -1
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts +8 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.js +71 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts +11 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.js +32 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +30 -3
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +532 -79
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +19 -12
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +20 -13
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +35 -8
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationClip.js +433 -2
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
- package/src/shade/renderer/animation/chunk_pose_accumulator.js +40 -32
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +97 -0
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +161 -0
- package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts +65 -0
- package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/FoliageWindRig.js +89 -0
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts +19 -0
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +143 -0
- package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts +14 -0
- package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js +116 -0
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +39 -29
- package/src/shade/renderer/animation/shader_animation_pose_resolve.js +37 -37
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
- package/src/shade/renderer/deferred/tonemap/TonemapAces2Tables.d.ts +38 -0
- package/src/shade/renderer/deferred/tonemap/TonemapAces2Tables.d.ts.map +1 -0
- package/src/shade/renderer/deferred/tonemap/TonemapAces2Tables.js +97 -0
- package/src/shade/renderer/deferred/{TonemapDisplaySettings.d.ts → tonemap/TonemapDisplaySettings.d.ts} +1 -1
- package/src/shade/renderer/deferred/tonemap/TonemapDisplaySettings.d.ts.map +1 -0
- package/src/shade/renderer/deferred/{TonemapDisplaySettings.js → tonemap/TonemapDisplaySettings.js} +5 -5
- package/src/shade/renderer/deferred/{shader_tonemap_HDR.d.ts → tonemap/shader_tonemap_HDR.d.ts} +1 -1
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR.d.ts.map +1 -0
- package/src/shade/renderer/deferred/{shader_tonemap_HDR.js → tonemap/shader_tonemap_HDR.js} +9 -9
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.d.ts +17 -0
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.d.ts.map +1 -0
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.js +101 -0
- package/src/shade/renderer/deferred/{shader_tonemap_HDR_none.d.ts → tonemap/shader_tonemap_HDR_none.d.ts} +1 -1
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_none.d.ts.map +1 -0
- package/src/shade/renderer/deferred/{shader_tonemap_HDR_none.js → tonemap/shader_tonemap_HDR_none.js} +6 -6
- package/src/shade/renderer/deferred/{shader_tonemap_HDR_pbr_neutral.d.ts → tonemap/shader_tonemap_HDR_pbr_neutral.d.ts} +1 -1
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_pbr_neutral.d.ts.map +1 -0
- package/src/shade/renderer/deferred/{shader_tonemap_HDR_pbr_neutral.js → tonemap/shader_tonemap_HDR_pbr_neutral.js} +8 -8
- package/src/shade/renderer/deferred/{shader_tonemap_LDR.d.ts → tonemap/shader_tonemap_LDR.d.ts} +1 -1
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR.d.ts.map +1 -0
- package/src/shade/renderer/deferred/{shader_tonemap_LDR.js → tonemap/shader_tonemap_LDR.js} +10 -10
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.d.ts +10 -0
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.d.ts.map +1 -0
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.js +77 -0
- package/src/shade/renderer/deferred/{shader_tonemap_LDR_none.d.ts → tonemap/shader_tonemap_LDR_none.d.ts} +1 -1
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_none.d.ts.map +1 -0
- package/src/shade/renderer/deferred/{shader_tonemap_LDR_none.js → tonemap/shader_tonemap_LDR_none.js} +7 -7
- package/src/shade/renderer/deferred/{shader_tonemap_LDR_pbr_neutral.d.ts → tonemap/shader_tonemap_LDR_pbr_neutral.d.ts} +1 -1
- package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_pbr_neutral.d.ts.map +1 -0
- package/src/shade/renderer/deferred/{shader_tonemap_LDR_pbr_neutral.js → tonemap/shader_tonemap_LDR_pbr_neutral.js} +8 -8
- package/src/shade/renderer/extension/RenderExtension.d.ts +7 -0
- package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtension.js +9 -0
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +6 -0
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtensionRegistry.js +15 -0
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +10 -3
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascade.js +15 -0
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +8 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +11 -0
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +51 -48
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -0
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/FluidMacPasses.js +16 -0
- package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +15 -3
- package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +102 -96
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +12 -12
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +12 -12
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +8 -1
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +16 -0
- package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +7 -0
- package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
- package/src/shade/renderer/fluid/publish/FluidWindPublish.js +10 -0
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +2 -2
- package/src/shade/renderer/loader/SceneBundle.d.ts +7 -0
- package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
- package/src/shade/renderer/loader/SceneBundle.js +119 -111
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +4 -0
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer.js +6 -5
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +8 -7
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -8
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +3 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +9 -4
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +9 -7
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.js +15 -7
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +6 -4
- package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +3 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +8 -5
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +4 -3
- package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +160 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +5 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +15 -5
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/aces2_transform_block.d.ts +41 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/aces2_transform_block.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/aces2_transform_block.js +692 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.d.ts +25 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.js +446 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.js +68 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.d.ts +32 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.js +163 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts +10 -3
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js +12 -4
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1 -1
- package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts +9 -0
- package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts.map +1 -0
- package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js +17 -0
- package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts +8 -0
- package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts.map +1 -1
- package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js +28 -20
- package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts +8 -0
- package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts.map +1 -0
- package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.js +15 -0
- package/src/shade/renderer/view/chunk_view_mip_bias.d.ts +21 -0
- package/src/shade/renderer/view/chunk_view_mip_bias.d.ts.map +1 -0
- package/src/shade/renderer/view/chunk_view_mip_bias.js +44 -0
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +105 -26
- package/src/engine/graphics/composit/CompositingStages.d.ts +0 -6
- package/src/engine/graphics/composit/CompositingStages.d.ts.map +0 -1
- package/src/engine/graphics/composit/CompositingStages.js +0 -8
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +0 -7
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +0 -24
- package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts +0 -8
- package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.js +0 -17
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +0 -8
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +0 -60
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +0 -7
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +0 -26
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +0 -7
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +0 -23
- package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts +0 -7
- package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts.map +0 -1
- package/src/engine/graphics/geometry/instancing/geometry_copy.js +0 -15
- package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts +0 -2
- package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts.map +0 -1
- package/src/engine/graphics/geometry/instancing/rewriteMaterial.js +0 -57
- package/src/engine/graphics/geometry/ribbon/Quad.d.ts +0 -96
- package/src/engine/graphics/geometry/ribbon/Quad.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/Quad.js +0 -213
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +0 -9
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +0 -12
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +0 -10
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +0 -17
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +0 -10
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +0 -13
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +0 -11
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +0 -24
- package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts +0 -6
- package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/rotateRibbon.js +0 -37
- package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts +0 -9
- package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/updateTipPosition.js +0 -52
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts +0 -8
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +0 -1
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +0 -54
- package/src/engine/graphics/render/RenderPassType.d.ts +0 -6
- package/src/engine/graphics/render/RenderPassType.d.ts.map +0 -1
- package/src/engine/graphics/render/RenderPassType.js +0 -8
- package/src/engine/graphics/render/layers/RenderLayer.d.ts +0 -78
- package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayer.js +0 -95
- package/src/engine/graphics/render/layers/RenderLayerManager.d.ts +0 -72
- package/src/engine/graphics/render/layers/RenderLayerManager.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerManager.js +0 -160
- package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts +0 -18
- package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerManagerState.js +0 -48
- package/src/engine/graphics/render/layers/RenderLayerState.d.ts +0 -18
- package/src/engine/graphics/render/layers/RenderLayerState.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerState.js +0 -27
- package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts +0 -8
- package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerUtils.js +0 -103
- package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts +0 -10
- package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts.map +0 -1
- package/src/engine/graphics/render/make_bvh_visibility_builder.js +0 -64
- package/src/engine/graphics/render/view/CameraViewFlags.d.ts +0 -7
- package/src/engine/graphics/render/view/CameraViewFlags.d.ts.map +0 -1
- package/src/engine/graphics/render/view/CameraViewFlags.js +0 -9
- package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +0 -143
- package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts.map +0 -1
- package/src/engine/graphics/render/visibility/IncrementalDeltaSet.js +0 -328
- package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +0 -39
- package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts.map +0 -1
- package/src/engine/graphics/render/visibility/VisibilityComputer.js +0 -80
- package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts +0 -29
- package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts.map +0 -1
- package/src/engine/graphics/render/visibility/VisibilityFilter.js +0 -37
- package/src/engine/graphics3/animation/write_graph_playback.d.ts +0 -24
- package/src/engine/graphics3/animation/write_graph_playback.d.ts.map +0 -1
- package/src/engine/graphics3/animation/write_graph_playback.js +0 -48
- package/src/shade/renderer/deferred/TonemapDisplaySettings.d.ts.map +0 -1
- package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +0 -1
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts.map +0 -1
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts.map +0 -1
- package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts.map +0 -1
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts.map +0 -1
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts.map +0 -1
|
@@ -0,0 +1,692 @@
|
|
|
1
|
+
import { m3_invert } from "../../../../../../../core/geom/mat3/m3_invert.js";
|
|
2
|
+
import { m3_multiply } from "../../../../../../../core/geom/mat3/m3_multiply.js";
|
|
3
|
+
import { m3_rgb_to_xyz_from_primaries } from "../../../../../../../core/color/xyz/m3_rgb_to_xyz_from_primaries.js";
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
The CPU half of the ACES 2.0 output transform: everything OpenColorIO's `init_*` functions compute from a display's
|
|
7
|
+
peak and limiting primaries, written as one block of floats that `chunk_aces2_output_transform` reads.
|
|
8
|
+
|
|
9
|
+
Ported from OpenColorIO v2.6.0 (BSD-3-Clause), src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp, which is the
|
|
10
|
+
Academy's reference (ampas/aces-core, Lib.Academy.OutputTransform.ctl) with its gamut tables. Matrices are row-major
|
|
11
|
+
here and `M · v` everywhere, as in that file.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** hue tables: 360 one-degree entries, one lower and two upper wrap entries */
|
|
15
|
+
const NOMINAL = 360;
|
|
16
|
+
const TOTAL = NOMINAL + 3;
|
|
17
|
+
const FIRST_NOMINAL = 1;
|
|
18
|
+
const UPPER_WRAP = FIRST_NOMINAL + NOMINAL;
|
|
19
|
+
const LAST_NOMINAL = UPPER_WRAP - 1;
|
|
20
|
+
const LOWER_WRAP = 0;
|
|
21
|
+
|
|
22
|
+
const REFERENCE_LUMINANCE = 100;
|
|
23
|
+
const L_A = 100;
|
|
24
|
+
const Y_B = 20;
|
|
25
|
+
const SURROUND = [0.9, 0.59, 0.9];
|
|
26
|
+
const J_SCALE = 100;
|
|
27
|
+
const CAM_NL_OFFSET = 0.2713 * 100;
|
|
28
|
+
const CAM_NL_SCALE = 4 * 100;
|
|
29
|
+
|
|
30
|
+
const CHROMA_COMPRESS = 2.4;
|
|
31
|
+
const CHROMA_COMPRESS_FACT = 3.3;
|
|
32
|
+
const CHROMA_EXPAND = 1.3;
|
|
33
|
+
const CHROMA_EXPAND_FACT = 0.69;
|
|
34
|
+
const CHROMA_EXPAND_THR = 0.5;
|
|
35
|
+
|
|
36
|
+
const SMOOTH_CUSPS = 0.12;
|
|
37
|
+
const SMOOTH_M = 0.27;
|
|
38
|
+
const CUSP_MID_BLEND = 1.3;
|
|
39
|
+
const FOCUS_GAIN_BLEND = 0.3;
|
|
40
|
+
const FOCUS_DISTANCE = 1.35;
|
|
41
|
+
const FOCUS_DISTANCE_SCALING = 1.75;
|
|
42
|
+
|
|
43
|
+
const GAMMA_MINIMUM = 0;
|
|
44
|
+
const GAMMA_MAXIMUM = 5;
|
|
45
|
+
const GAMMA_SEARCH_STEP = 0.4;
|
|
46
|
+
const GAMMA_ACCURACY = 1e-5;
|
|
47
|
+
const REACH_CUSP_TOLERANCE = 1e-3;
|
|
48
|
+
const DISPLAY_CUSP_TOLERANCE = 1e-7;
|
|
49
|
+
|
|
50
|
+
/** red, green, blue and white xy */
|
|
51
|
+
const PRIMARIES_CAM16 = [0.8336, 0.1735, 2.3854, -1.4659, 0.087, -0.125, 0.333, 0.333];
|
|
52
|
+
const PRIMARIES_AP0 = [0.7347, 0.2653, 0.0, 1.0, 0.0001, -0.0770, 0.32168, 0.33767];
|
|
53
|
+
const PRIMARIES_AP1 = [0.713, 0.293, 0.165, 0.830, 0.128, 0.044, 0.32168, 0.33767];
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Rec.709's red, green, blue and white xy: the limiting primaries the ACES tone mapping uses.
|
|
57
|
+
* @type {number[]}
|
|
58
|
+
*/
|
|
59
|
+
export const ACES2_LIMITING_REC709 = [0.64, 0.33, 0.30, 0.60, 0.15, 0.06, 0.3127, 0.3290];
|
|
60
|
+
|
|
61
|
+
/*
|
|
62
|
+
The block, in floats. Matrices are three columns of three, so WGSL reads a column with three loads.
|
|
63
|
+
*/
|
|
64
|
+
/** limiting primaries to the CAM16 cone space, white-adapted */
|
|
65
|
+
export const ACES2_OUT_RGB_TO_CAM = 0;
|
|
66
|
+
export const ACES2_OUT_CAM_TO_RGB = 9;
|
|
67
|
+
/** ACES2065-1 (AP0) to the cone space and back */
|
|
68
|
+
export const ACES2_IN_RGB_TO_CAM = 18;
|
|
69
|
+
export const ACES2_IN_CAM_TO_RGB = 27;
|
|
70
|
+
/** compressed cone response to achromatic and opponent (A, a, b) and back; the same for every set of primaries */
|
|
71
|
+
export const ACES2_CONE_TO_AAB = 36;
|
|
72
|
+
export const ACES2_AAB_TO_CONE = 45;
|
|
73
|
+
/**
|
|
74
|
+
* scalars, in this order: limit_J_max, model_gamma_inv, mid_J, focus_dist, lower_hull_gamma_inv, s_2, m_2, g, t_1,
|
|
75
|
+
* n_r, inverse_limit, AP1 upper bound, sat, sat_thr, compr, chroma_compress_scale, peak / 100, F_L_n, cz, inv_cz,
|
|
76
|
+
* A_w_J, inv_A_w_J, the hue search range's lower and upper offsets
|
|
77
|
+
*/
|
|
78
|
+
export const ACES2_SCALARS = 54;
|
|
79
|
+
export const ACES2_SCALAR_COUNT = 24;
|
|
80
|
+
/** TOTAL entries of (hue, cusp J, cusp M, upper hull inverse gamma) */
|
|
81
|
+
export const ACES2_CUSP_TABLE = ACES2_SCALARS + ACES2_SCALAR_COUNT;
|
|
82
|
+
/** TOTAL entries of the reach gamut's M at limit_J_max, one per degree from the first nominal entry */
|
|
83
|
+
export const ACES2_REACH_TABLE = ACES2_CUSP_TABLE + TOTAL * 4;
|
|
84
|
+
/** floats in one block */
|
|
85
|
+
export const ACES2_BLOCK_FLOATS = ACES2_REACH_TABLE + TOTAL;
|
|
86
|
+
|
|
87
|
+
// ---------------------------------------------------------------------------------------------------------------
|
|
88
|
+
// matrices, row-major
|
|
89
|
+
|
|
90
|
+
function rgb_to_xyz(out, P) {
|
|
91
|
+
m3_rgb_to_xyz_from_primaries(out, P.slice(0, 6), P[6], P[7]);
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function mul_m3_v3(out, M, x, y, z) {
|
|
96
|
+
out[0] = M[0] * x + M[1] * y + M[2] * z;
|
|
97
|
+
out[1] = M[3] * x + M[4] * y + M[5] * z;
|
|
98
|
+
out[2] = M[6] * x + M[7] * y + M[8] * z;
|
|
99
|
+
return out;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ---------------------------------------------------------------------------------------------------------------
|
|
103
|
+
// the colour appearance model (CAM16 in Hellwig's 2022 form)
|
|
104
|
+
|
|
105
|
+
function model_gamma() {
|
|
106
|
+
return SURROUND[1] * (1.48 + Math.sqrt(Y_B / REFERENCE_LUMINANCE));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function pacrc_fwd(v) {
|
|
110
|
+
const F = Math.pow(Math.abs(v), 0.42);
|
|
111
|
+
const Ra = F / (CAM_NL_OFFSET + F);
|
|
112
|
+
return v < 0 ? -Ra : Ra;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function pacrc_inv(v) {
|
|
116
|
+
const a = Math.min(Math.abs(v), 0.99);
|
|
117
|
+
const F = CAM_NL_OFFSET * a / (1 - a);
|
|
118
|
+
const Rc = Math.pow(F, 1 / 0.42);
|
|
119
|
+
return v < 0 ? -Rc : Rc;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* OCIO's JMhParams for one set of primaries.
|
|
124
|
+
*/
|
|
125
|
+
class JMhParams {
|
|
126
|
+
rgb_to_cam = new Float64Array(9);
|
|
127
|
+
cam_to_rgb = new Float64Array(9);
|
|
128
|
+
cone_to_Aab = new Float64Array(9);
|
|
129
|
+
Aab_to_cone = new Float64Array(9);
|
|
130
|
+
F_L_n = 0;
|
|
131
|
+
cz = 0;
|
|
132
|
+
inv_cz = 0;
|
|
133
|
+
A_w_J = 0;
|
|
134
|
+
inv_A_w_J = 0;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* @param {number[]} P red, green, blue and white xy
|
|
138
|
+
*/
|
|
139
|
+
constructor(P) {
|
|
140
|
+
const base = [2, 1, 1 / 20, 1, -12 / 11, 1 / 11, 1 / 9, 1 / 9, -2 / 9];
|
|
141
|
+
|
|
142
|
+
const m16 = rgb_to_xyz(new Float64Array(9), PRIMARIES_CAM16);
|
|
143
|
+
m3_invert(m16, m16);
|
|
144
|
+
|
|
145
|
+
const to_xyz = rgb_to_xyz(new Float64Array(9), P);
|
|
146
|
+
const XYZ_w = mul_m3_v3([0, 0, 0], to_xyz, REFERENCE_LUMINANCE, REFERENCE_LUMINANCE, REFERENCE_LUMINANCE);
|
|
147
|
+
const Y_W = XYZ_w[1];
|
|
148
|
+
const RGB_w = mul_m3_v3([0, 0, 0], m16, XYZ_w[0], XYZ_w[1], XYZ_w[2]);
|
|
149
|
+
|
|
150
|
+
const K = 1 / (5 * L_A + 1);
|
|
151
|
+
const K4 = K * K * K * K;
|
|
152
|
+
const F_L = 0.2 * K4 * (5 * L_A) + 0.1 * Math.pow(1 - K4, 2) * Math.pow(5 * L_A, 1 / 3);
|
|
153
|
+
|
|
154
|
+
this.F_L_n = F_L / REFERENCE_LUMINANCE;
|
|
155
|
+
this.cz = model_gamma();
|
|
156
|
+
this.inv_cz = 1 / this.cz;
|
|
157
|
+
|
|
158
|
+
const D = [0, 1, 2].map(i => this.F_L_n * Y_W / RGB_w[i]);
|
|
159
|
+
const RGB_AW = [0, 1, 2].map(i => pacrc_fwd(D[i] * RGB_w[i]));
|
|
160
|
+
|
|
161
|
+
const A_w = CAM_NL_SCALE * (base[0] * RGB_AW[0] + base[1] * RGB_AW[1] + base[2] * RGB_AW[2]);
|
|
162
|
+
|
|
163
|
+
this.A_w_J = pacrc_fwd(F_L);
|
|
164
|
+
this.inv_A_w_J = 1 / this.A_w_J;
|
|
165
|
+
|
|
166
|
+
// limiting primaries to CAM16, prescaled by the reference luminance and the white's discount
|
|
167
|
+
const xyz_to_cam = m16;
|
|
168
|
+
const to_cam = new Float64Array(9);
|
|
169
|
+
m3_multiply(to_cam, xyz_to_cam, to_xyz);
|
|
170
|
+
for (let row = 0; row < 3; row++) {
|
|
171
|
+
for (let column = 0; column < 3; column++) {
|
|
172
|
+
this.rgb_to_cam[row * 3 + column] = D[row] * to_cam[row * 3 + column] * REFERENCE_LUMINANCE;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
m3_invert(this.cam_to_rgb, this.rgb_to_cam);
|
|
176
|
+
|
|
177
|
+
for (let column = 0; column < 3; column++) {
|
|
178
|
+
this.cone_to_Aab[column] = CAM_NL_SCALE * base[column] / A_w;
|
|
179
|
+
this.cone_to_Aab[3 + column] = CAM_NL_SCALE * base[3 + column] * 43 * SURROUND[2];
|
|
180
|
+
this.cone_to_Aab[6 + column] = CAM_NL_SCALE * base[6 + column] * 43 * SURROUND[2];
|
|
181
|
+
}
|
|
182
|
+
m3_invert(this.Aab_to_cone, this.cone_to_Aab);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const scratch_v = [0, 0, 0];
|
|
187
|
+
const scratch_c = [0, 0, 0];
|
|
188
|
+
|
|
189
|
+
function RGB_to_Aab(out, r, g, b, p) {
|
|
190
|
+
mul_m3_v3(scratch_c, p.rgb_to_cam, r, g, b);
|
|
191
|
+
return mul_m3_v3(out, p.cone_to_Aab, pacrc_fwd(scratch_c[0]), pacrc_fwd(scratch_c[1]), pacrc_fwd(scratch_c[2]));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** JMh from Aab, in place */
|
|
195
|
+
function Aab_to_JMh(v, p) {
|
|
196
|
+
if (v[0] <= 0) {
|
|
197
|
+
v[0] = 0;
|
|
198
|
+
v[1] = 0;
|
|
199
|
+
v[2] = 0;
|
|
200
|
+
return v;
|
|
201
|
+
}
|
|
202
|
+
const J = J_SCALE * Math.pow(v[0], p.cz);
|
|
203
|
+
const M = Math.sqrt(v[1] * v[1] + v[2] * v[2]);
|
|
204
|
+
let h = 180 * Math.atan2(v[2], v[1]) / Math.PI;
|
|
205
|
+
if (h < 0) {
|
|
206
|
+
h += 360;
|
|
207
|
+
}
|
|
208
|
+
v[0] = J;
|
|
209
|
+
v[1] = M;
|
|
210
|
+
v[2] = h;
|
|
211
|
+
return v;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function RGB_to_JMh(out, r, g, b, p) {
|
|
215
|
+
return Aab_to_JMh(RGB_to_Aab(out, r, g, b, p), p);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function JMh_to_RGB(out, J, M, h, p) {
|
|
219
|
+
const hr = h * Math.PI / 180;
|
|
220
|
+
const A = Math.pow(J / J_SCALE, p.inv_cz);
|
|
221
|
+
mul_m3_v3(scratch_c, p.Aab_to_cone, A, M * Math.cos(hr), M * Math.sin(hr));
|
|
222
|
+
return mul_m3_v3(out, p.cam_to_rgb, pacrc_inv(scratch_c[0]), pacrc_inv(scratch_c[1]), pacrc_inv(scratch_c[2]));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function Y_to_J(Y, p) {
|
|
226
|
+
const abs_Y = Math.abs(Y);
|
|
227
|
+
const J = J_SCALE * Math.pow(pacrc_fwd(abs_Y * p.F_L_n) * p.inv_A_w_J, p.cz);
|
|
228
|
+
return Y < 0 ? -J : J;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// ---------------------------------------------------------------------------------------------------------------
|
|
232
|
+
// gamut compression helpers the table search evaluates
|
|
233
|
+
|
|
234
|
+
function get_focus_gain(J, threshold, J_max, focus_dist) {
|
|
235
|
+
let gain = J_max * focus_dist;
|
|
236
|
+
if (J > threshold) {
|
|
237
|
+
const adjustment = Math.log10((J_max - threshold) / Math.max(0.0001, J_max - J));
|
|
238
|
+
gain *= adjustment * adjustment + 1;
|
|
239
|
+
}
|
|
240
|
+
return gain;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function solve_J_intersect(J, M, focusJ, maxJ, slope_gain) {
|
|
244
|
+
const M_scaled = M / slope_gain;
|
|
245
|
+
const a = M_scaled / focusJ;
|
|
246
|
+
if (J < focusJ) {
|
|
247
|
+
const b = 1 - M_scaled;
|
|
248
|
+
const c = -J;
|
|
249
|
+
return -2 * c / (b + Math.sqrt(b * b - 4 * a * c));
|
|
250
|
+
}
|
|
251
|
+
const b = -(1 + M_scaled + maxJ * a);
|
|
252
|
+
const c = maxJ * M_scaled + J;
|
|
253
|
+
return -2 * c / (b - Math.sqrt(b * b - 4 * a * c));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function smin_scaled(a, b, reference) {
|
|
257
|
+
const s = SMOOTH_CUSPS * reference;
|
|
258
|
+
const h = Math.max(s - Math.abs(a - b), 0) / s;
|
|
259
|
+
return Math.min(a, b) - h * h * h * s / 6;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function compression_vector_slope(J_intersect, focusJ, J_max, slope_gain) {
|
|
263
|
+
const direction = J_intersect < focusJ ? J_intersect : J_max - J_intersect;
|
|
264
|
+
return direction * (J_intersect - focusJ) / (focusJ * slope_gain);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function line_boundary_M(J_axis_intersect, slope, inv_gamma, J_max, M_max, J_reference) {
|
|
268
|
+
const shifted = J_reference * Math.pow(J_axis_intersect / J_reference, inv_gamma);
|
|
269
|
+
return shifted * M_max / (J_max - slope * M_max);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function gamut_boundary_M(cusp_J, cusp_M, J_max, gamma_top_inv, gamma_bottom_inv, J_intersect_source, slope, J_intersect_cusp) {
|
|
273
|
+
const lower = line_boundary_M(J_intersect_source, slope, gamma_bottom_inv, cusp_J, cusp_M, J_intersect_cusp);
|
|
274
|
+
const upper = line_boundary_M(J_max - J_intersect_source, -slope, gamma_top_inv, J_max - cusp_J, cusp_M, J_max - J_intersect_cusp);
|
|
275
|
+
return smin_scaled(lower, upper, cusp_M);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function compute_focusJ(cusp_J, mid_J, J_max) {
|
|
279
|
+
const t = Math.min(1, CUSP_MID_BLEND - cusp_J / J_max);
|
|
280
|
+
return cusp_J + (mid_J - cusp_J) * t;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// ---------------------------------------------------------------------------------------------------------------
|
|
284
|
+
// tables
|
|
285
|
+
|
|
286
|
+
function unit_cube_corner(out, i) {
|
|
287
|
+
out[0] = ((i + 1) % 6) < 3 ? 1 : 0;
|
|
288
|
+
out[1] = ((i + 5) % 6) < 3 ? 1 : 0;
|
|
289
|
+
out[2] = ((i + 3) % 6) < 3 ? 1 : 0;
|
|
290
|
+
return out;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Six corners, lowest hue at [1], wrapped at [0] and [7] with their hues taken out of [0, 360).
|
|
295
|
+
* @returns {{rgb: number[][], jmh: number[][]}}
|
|
296
|
+
*/
|
|
297
|
+
function cycle_corners(rgb6, jmh6) {
|
|
298
|
+
let lowest = 0;
|
|
299
|
+
for (let i = 0; i < 6; i++) {
|
|
300
|
+
if (jmh6[i][2] < jmh6[lowest][2]) {
|
|
301
|
+
lowest = i;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
const rgb = new Array(8);
|
|
305
|
+
const jmh = new Array(8);
|
|
306
|
+
for (let i = 0; i < 6; i++) {
|
|
307
|
+
rgb[i + 1] = rgb6[(i + lowest) % 6];
|
|
308
|
+
jmh[i + 1] = jmh6[(i + lowest) % 6].slice();
|
|
309
|
+
}
|
|
310
|
+
rgb[0] = rgb[6];
|
|
311
|
+
rgb[7] = rgb[1];
|
|
312
|
+
jmh[0] = jmh[6].slice();
|
|
313
|
+
jmh[7] = jmh[1].slice();
|
|
314
|
+
jmh[0][2] -= 360;
|
|
315
|
+
jmh[7][2] += 360;
|
|
316
|
+
return { rgb, jmh };
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function limiting_corners(p, peak) {
|
|
320
|
+
const rgb6 = [];
|
|
321
|
+
const jmh6 = [];
|
|
322
|
+
for (let i = 0; i < 6; i++) {
|
|
323
|
+
const c = unit_cube_corner([0, 0, 0], i).map(v => v * peak / REFERENCE_LUMINANCE);
|
|
324
|
+
rgb6.push(c);
|
|
325
|
+
jmh6.push(RGB_to_JMh([0, 0, 0], c[0], c[1], c[2], p));
|
|
326
|
+
}
|
|
327
|
+
return cycle_corners(rgb6, jmh6);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function reach_corners(p, limit_J, maximum_source) {
|
|
331
|
+
const limit_A = Math.pow(limit_J / J_SCALE, p.inv_cz);
|
|
332
|
+
const jmh6 = [];
|
|
333
|
+
const corner = [0, 0, 0];
|
|
334
|
+
for (let i = 0; i < 6; i++) {
|
|
335
|
+
unit_cube_corner(corner, i);
|
|
336
|
+
let lower = 0;
|
|
337
|
+
let upper = maximum_source;
|
|
338
|
+
while (upper - lower > REACH_CUSP_TOLERANCE) {
|
|
339
|
+
const test = (lower + upper) / 2;
|
|
340
|
+
const A = RGB_to_Aab(scratch_v, test * corner[0], test * corner[1], test * corner[2], p)[0];
|
|
341
|
+
if (A < limit_A) {
|
|
342
|
+
lower = test;
|
|
343
|
+
} else {
|
|
344
|
+
upper = test;
|
|
345
|
+
}
|
|
346
|
+
if (A === limit_A) {
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
jmh6.push(RGB_to_JMh([0, 0, 0], upper * corner[0], upper * corner[1], upper * corner[2], p));
|
|
351
|
+
}
|
|
352
|
+
return cycle_corners(jmh6, jmh6).jmh;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function sorted_cube_hues(reach, display) {
|
|
356
|
+
const out = [];
|
|
357
|
+
let r = 1;
|
|
358
|
+
let d = 1;
|
|
359
|
+
while (r < 7 || d < 7) {
|
|
360
|
+
const reach_hue = reach[r][2];
|
|
361
|
+
const display_hue = display[d][2];
|
|
362
|
+
if (reach_hue === display_hue) {
|
|
363
|
+
out.push(reach_hue);
|
|
364
|
+
r++;
|
|
365
|
+
d++;
|
|
366
|
+
} else if (reach_hue < display_hue) {
|
|
367
|
+
out.push(reach_hue);
|
|
368
|
+
r++;
|
|
369
|
+
} else {
|
|
370
|
+
out.push(display_hue);
|
|
371
|
+
d++;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return out;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function build_hue_table(hues) {
|
|
378
|
+
const table = new Float64Array(TOTAL);
|
|
379
|
+
const counts = new Array(14).fill(0);
|
|
380
|
+
let last = -1;
|
|
381
|
+
let min_index = hues[0] === 0 ? 0 : 1;
|
|
382
|
+
|
|
383
|
+
for (let k = 0; k < hues.length; k++) {
|
|
384
|
+
// std::round, half away from zero
|
|
385
|
+
let nominal = Math.min(Math.max(Math.floor(hues[k] * (NOMINAL / 360) + 0.5), min_index), NOMINAL - 1);
|
|
386
|
+
if (last === nominal) {
|
|
387
|
+
if (k > 1 && counts[k - 2] !== counts[k - 1] - 1) {
|
|
388
|
+
counts[k - 1] -= 1;
|
|
389
|
+
} else {
|
|
390
|
+
nominal += 1;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
counts[k] = Math.min(nominal, NOMINAL - 1);
|
|
394
|
+
last = min_index = nominal;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
let total = 0;
|
|
398
|
+
const interval = (samples, lower, upper, base) => {
|
|
399
|
+
const delta = (upper - lower) / samples;
|
|
400
|
+
for (let i = 0; i < samples; i++) {
|
|
401
|
+
table[base + i] = lower + i * delta;
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
interval(counts[0], 0, hues[0], total + 1);
|
|
406
|
+
total += counts[0];
|
|
407
|
+
let i = 1;
|
|
408
|
+
for (; i < hues.length; i++) {
|
|
409
|
+
const samples = counts[i] - counts[i - 1];
|
|
410
|
+
interval(samples, hues[i - 1], hues[i], total + 1);
|
|
411
|
+
total += samples;
|
|
412
|
+
}
|
|
413
|
+
interval(NOMINAL - total, hues[i - 1], 360, total + 1);
|
|
414
|
+
|
|
415
|
+
table[LOWER_WRAP] = table[LAST_NOMINAL] - 360;
|
|
416
|
+
table[UPPER_WRAP] = table[FIRST_NOMINAL] + 360;
|
|
417
|
+
table[UPPER_WRAP + 1] = table[FIRST_NOMINAL + 1] + 360;
|
|
418
|
+
return table;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
function find_display_cusp(out, hue, rgb, jmh, p, previous) {
|
|
422
|
+
let upper = 1;
|
|
423
|
+
for (let i = 1; i < 8; i++) {
|
|
424
|
+
if (jmh[i][2] > hue) {
|
|
425
|
+
upper = i;
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
const lower = upper - 1;
|
|
430
|
+
if (jmh[lower][2] === hue) {
|
|
431
|
+
out[0] = jmh[lower][0];
|
|
432
|
+
out[1] = jmh[lower][1];
|
|
433
|
+
return out;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const a = rgb[lower];
|
|
437
|
+
const b = rgb[upper];
|
|
438
|
+
let lower_t = upper === previous[0] ? previous[1] : 0;
|
|
439
|
+
let upper_t = 1;
|
|
440
|
+
const sample = [0, 0, 0];
|
|
441
|
+
|
|
442
|
+
while (upper_t - lower_t > DISPLAY_CUSP_TOLERANCE) {
|
|
443
|
+
const t = (lower_t + upper_t) / 2;
|
|
444
|
+
RGB_to_JMh(sample, a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t, p);
|
|
445
|
+
if (sample[2] < jmh[lower][2]) {
|
|
446
|
+
upper_t = t;
|
|
447
|
+
} else if (sample[2] >= jmh[upper][2]) {
|
|
448
|
+
lower_t = t;
|
|
449
|
+
} else if (sample[2] > hue) {
|
|
450
|
+
upper_t = t;
|
|
451
|
+
} else {
|
|
452
|
+
lower_t = t;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
const t = (lower_t + upper_t) / 2;
|
|
457
|
+
RGB_to_JMh(sample, a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t, p);
|
|
458
|
+
previous[0] = upper;
|
|
459
|
+
previous[1] = t;
|
|
460
|
+
out[0] = sample[0];
|
|
461
|
+
out[1] = sample[1];
|
|
462
|
+
return out;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
function make_reach_table(table, p, limit_J_max) {
|
|
466
|
+
const rgb = [0, 0, 0];
|
|
467
|
+
const outside = (M, hue) => {
|
|
468
|
+
JMh_to_RGB(rgb, limit_J_max, M, hue, p);
|
|
469
|
+
return rgb[0] < 0 || rgb[1] < 0 || rgb[2] < 0;
|
|
470
|
+
};
|
|
471
|
+
for (let i = 0; i < NOMINAL; i++) {
|
|
472
|
+
const hue = i;
|
|
473
|
+
let low = 0;
|
|
474
|
+
let high = 50;
|
|
475
|
+
let is_outside = false;
|
|
476
|
+
while (!is_outside && high < 1300) {
|
|
477
|
+
is_outside = outside(high, hue);
|
|
478
|
+
if (!is_outside) {
|
|
479
|
+
low = high;
|
|
480
|
+
high += 50;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
while (high - low > 1e-2) {
|
|
484
|
+
const M = (high + low) / 2;
|
|
485
|
+
if (outside(M, hue)) {
|
|
486
|
+
high = M;
|
|
487
|
+
} else {
|
|
488
|
+
low = M;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
table[i + FIRST_NOMINAL] = high;
|
|
492
|
+
}
|
|
493
|
+
table[LOWER_WRAP] = table[LAST_NOMINAL];
|
|
494
|
+
table[UPPER_WRAP] = table[FIRST_NOMINAL];
|
|
495
|
+
table[UPPER_WRAP + 1] = table[FIRST_NOMINAL + 1];
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
const GAMMA_TEST_POSITIONS = [0.01, 0.1, 0.5, 0.8, 0.99];
|
|
499
|
+
|
|
500
|
+
function gamma_fits(cusp_J, cusp_M, hue, J_max, mid_J, focus_dist, gamma_top_inv, peak, gamma_bottom_inv, p) {
|
|
501
|
+
const threshold = cusp_J + (J_max - cusp_J) * FOCUS_GAIN_BLEND;
|
|
502
|
+
const focusJ = compute_focusJ(cusp_J, mid_J, J_max);
|
|
503
|
+
const luminance_limit = peak / REFERENCE_LUMINANCE;
|
|
504
|
+
const rgb = [0, 0, 0];
|
|
505
|
+
|
|
506
|
+
for (let i = 0; i < GAMMA_TEST_POSITIONS.length; i++) {
|
|
507
|
+
const test_J = cusp_J + (J_max - cusp_J) * GAMMA_TEST_POSITIONS[i];
|
|
508
|
+
const gain = get_focus_gain(test_J, threshold, J_max, focus_dist);
|
|
509
|
+
const J_intersect_source = solve_J_intersect(test_J, cusp_M, focusJ, J_max, gain);
|
|
510
|
+
const slope = compression_vector_slope(J_intersect_source, focusJ, J_max, gain);
|
|
511
|
+
const J_intersect_cusp = solve_J_intersect(cusp_J, cusp_M, focusJ, J_max, gain);
|
|
512
|
+
|
|
513
|
+
const M = gamut_boundary_M(cusp_J, cusp_M, J_max, gamma_top_inv, gamma_bottom_inv, J_intersect_source, slope, J_intersect_cusp);
|
|
514
|
+
const J = J_intersect_source + slope * M;
|
|
515
|
+
|
|
516
|
+
JMh_to_RGB(rgb, J, M, hue, p);
|
|
517
|
+
if (!(rgb[0] > luminance_limit || rgb[1] > luminance_limit || rgb[2] > luminance_limit)) {
|
|
518
|
+
return false;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return true;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// ---------------------------------------------------------------------------------------------------------------
|
|
525
|
+
|
|
526
|
+
const PARAMS_AP0 = new JMhParams(PRIMARIES_AP0);
|
|
527
|
+
const PARAMS_AP1 = new JMhParams(PRIMARIES_AP1);
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* @param {Float32Array} out
|
|
531
|
+
* @param {number} offset
|
|
532
|
+
* @param {Float64Array} M row-major
|
|
533
|
+
*/
|
|
534
|
+
function write_columns(out, offset, M) {
|
|
535
|
+
for (let column = 0; column < 3; column++) {
|
|
536
|
+
for (let row = 0; row < 3; row++) {
|
|
537
|
+
out[offset + column * 3 + row] = M[row * 3 + column];
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Fill one block of the ACES 2.0 output transform for a display: its peak and the primaries it limits to.
|
|
544
|
+
*
|
|
545
|
+
* Matches OpenColorIO's `ACES_OUTPUT_TRANSFORM_20` set up with the same two values, and the builtin transforms' AP1
|
|
546
|
+
* clamp before it and clamp at the peak after it. Takes a few tens of milliseconds, so it is for a display that
|
|
547
|
+
* changed, not for a frame.
|
|
548
|
+
*
|
|
549
|
+
* @param {Float32Array} out
|
|
550
|
+
* @param {number} offset first float of the block
|
|
551
|
+
* @param {number} peak_nits the display's peak, cd/m², where 100 is what an exposed 1.0 shows at
|
|
552
|
+
* @param {number[]} limiting red, green, blue and white xy
|
|
553
|
+
*/
|
|
554
|
+
export function aces2_transform_block_write(out, offset, peak_nits, limiting) {
|
|
555
|
+
const p_out = new JMhParams(limiting);
|
|
556
|
+
const p_in = PARAMS_AP0;
|
|
557
|
+
const reach = PARAMS_AP1;
|
|
558
|
+
|
|
559
|
+
// tone scale, init_ToneScaleParams
|
|
560
|
+
const n = peak_nits;
|
|
561
|
+
const n_r = 100;
|
|
562
|
+
const g = 1.15;
|
|
563
|
+
const c = 0.18;
|
|
564
|
+
const c_d = 10.013;
|
|
565
|
+
const w_g = 0.14;
|
|
566
|
+
const t_1 = 0.04;
|
|
567
|
+
const r_hit = 128 + (896 - 128) * (Math.log(n / n_r) / Math.log(10000 / 100));
|
|
568
|
+
const m_0 = n / n_r;
|
|
569
|
+
const m_1 = 0.5 * (m_0 + Math.sqrt(m_0 * (m_0 + 4 * t_1)));
|
|
570
|
+
const u = Math.pow((r_hit / m_1) / ((r_hit / m_1) + 1), g);
|
|
571
|
+
const m = m_1 / u;
|
|
572
|
+
const w_i = Math.log(n / 100) / Math.log(2);
|
|
573
|
+
const c_t = c_d / n_r * (1 + w_i * w_g);
|
|
574
|
+
const g_ip = 0.5 * (c_t + Math.sqrt(c_t * (c_t + 4 * t_1)));
|
|
575
|
+
const g_ipp2 = -(m_1 * Math.pow(g_ip / m, 1 / g)) / (Math.pow(g_ip / m, 1 / g) - 1);
|
|
576
|
+
const w_2 = c / g_ipp2;
|
|
577
|
+
const s_2 = w_2 * m_1 * REFERENCE_LUMINANCE;
|
|
578
|
+
const u_2 = Math.pow((r_hit / m_1) / ((r_hit / m_1) + w_2), g);
|
|
579
|
+
const m_2 = m_1 / u_2;
|
|
580
|
+
const inverse_limit = n / (u_2 * n_r);
|
|
581
|
+
const forward_limit = 8 * r_hit;
|
|
582
|
+
const log_peak = Math.log10(n / n_r);
|
|
583
|
+
|
|
584
|
+
// shared, chroma and gamut parameters
|
|
585
|
+
const limit_J_max = Y_to_J(peak_nits, p_in);
|
|
586
|
+
const model_gamma_inv = 1 / model_gamma();
|
|
587
|
+
|
|
588
|
+
const compr = CHROMA_COMPRESS + CHROMA_COMPRESS * CHROMA_COMPRESS_FACT * log_peak;
|
|
589
|
+
const sat = Math.max(0.2, CHROMA_EXPAND - CHROMA_EXPAND * CHROMA_EXPAND_FACT * log_peak);
|
|
590
|
+
const sat_thr = CHROMA_EXPAND_THR / n;
|
|
591
|
+
const chroma_compress_scale = Math.pow(0.03379 * peak_nits, 0.30596) - 0.45135;
|
|
592
|
+
|
|
593
|
+
const mid_J = Y_to_J(c_t * REFERENCE_LUMINANCE, p_in);
|
|
594
|
+
const focus_dist = FOCUS_DISTANCE + FOCUS_DISTANCE * FOCUS_DISTANCE_SCALING * log_peak;
|
|
595
|
+
const lower_hull_gamma_inv = 1 / (1.14 + 0.07 * log_peak);
|
|
596
|
+
|
|
597
|
+
// reach table
|
|
598
|
+
const reach_table = new Float64Array(TOTAL);
|
|
599
|
+
make_reach_table(reach_table, reach, limit_J_max);
|
|
600
|
+
|
|
601
|
+
// hue and cusp tables
|
|
602
|
+
const reach_jmh = reach_corners(reach, limit_J_max, forward_limit);
|
|
603
|
+
const corners = limiting_corners(p_out, peak_nits);
|
|
604
|
+
const hue_table = build_hue_table(sorted_cube_hues(reach_jmh, corners.jmh));
|
|
605
|
+
|
|
606
|
+
const cusp = new Float64Array(TOTAL * 3);
|
|
607
|
+
const previous = [0, 0];
|
|
608
|
+
const JM = [0, 0];
|
|
609
|
+
for (let i = FIRST_NOMINAL; i < UPPER_WRAP; i++) {
|
|
610
|
+
find_display_cusp(JM, hue_table[i], corners.rgb, corners.jmh, p_out, previous);
|
|
611
|
+
cusp[i * 3] = JM[0];
|
|
612
|
+
cusp[i * 3 + 1] = JM[1] * (1 + SMOOTH_M * SMOOTH_CUSPS);
|
|
613
|
+
cusp[i * 3 + 2] = hue_table[i];
|
|
614
|
+
}
|
|
615
|
+
for (const [to, from] of [[LOWER_WRAP, LAST_NOMINAL], [UPPER_WRAP, FIRST_NOMINAL], [UPPER_WRAP + 1, FIRST_NOMINAL + 1]]) {
|
|
616
|
+
cusp[to * 3] = cusp[from * 3];
|
|
617
|
+
cusp[to * 3 + 1] = cusp[from * 3 + 1];
|
|
618
|
+
cusp[to * 3 + 2] = hue_table[to];
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// how far the searched hue table strays from one entry a degree
|
|
622
|
+
let search_lower = 0;
|
|
623
|
+
let search_upper = 1;
|
|
624
|
+
for (let i = FIRST_NOMINAL; i < UPPER_WRAP; i++) {
|
|
625
|
+
const position = FIRST_NOMINAL + Math.trunc(cusp[i * 3 + 2]);
|
|
626
|
+
const delta = i - position;
|
|
627
|
+
search_lower = Math.min(search_lower, delta);
|
|
628
|
+
search_upper = Math.max(search_upper, delta + 1);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
// upper hull gamma, make_upper_hull_gamma; overwrites the hue in the third column
|
|
632
|
+
for (let i = FIRST_NOMINAL; i < UPPER_WRAP; i++) {
|
|
633
|
+
const hue = hue_table[i];
|
|
634
|
+
const cusp_J = cusp[i * 3];
|
|
635
|
+
const cusp_M = cusp[i * 3 + 1];
|
|
636
|
+
const fits = gamma => gamma_fits(cusp_J, cusp_M, hue, limit_J_max, mid_J, focus_dist, 1 / gamma, peak_nits, lower_hull_gamma_inv, p_out);
|
|
637
|
+
|
|
638
|
+
let low = GAMMA_MINIMUM;
|
|
639
|
+
let high = low + GAMMA_SEARCH_STEP;
|
|
640
|
+
let found = false;
|
|
641
|
+
while (!found && high < GAMMA_MAXIMUM) {
|
|
642
|
+
if (fits(high)) {
|
|
643
|
+
found = true;
|
|
644
|
+
} else {
|
|
645
|
+
low = high;
|
|
646
|
+
high += GAMMA_SEARCH_STEP;
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
while (high - low > GAMMA_ACCURACY) {
|
|
650
|
+
const test = (high + low) / 2;
|
|
651
|
+
if (fits(test)) {
|
|
652
|
+
high = test;
|
|
653
|
+
} else {
|
|
654
|
+
low = test;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
cusp[i * 3 + 2] = 1 / high;
|
|
658
|
+
}
|
|
659
|
+
cusp[LOWER_WRAP * 3 + 2] = cusp[LAST_NOMINAL * 3 + 2];
|
|
660
|
+
cusp[UPPER_WRAP * 3 + 2] = cusp[FIRST_NOMINAL * 3 + 2];
|
|
661
|
+
cusp[(UPPER_WRAP + 1) * 3 + 2] = cusp[(FIRST_NOMINAL + 1) * 3 + 2];
|
|
662
|
+
|
|
663
|
+
// write
|
|
664
|
+
write_columns(out, offset + ACES2_OUT_RGB_TO_CAM, p_out.rgb_to_cam);
|
|
665
|
+
write_columns(out, offset + ACES2_OUT_CAM_TO_RGB, p_out.cam_to_rgb);
|
|
666
|
+
write_columns(out, offset + ACES2_IN_RGB_TO_CAM, p_in.rgb_to_cam);
|
|
667
|
+
write_columns(out, offset + ACES2_IN_CAM_TO_RGB, p_in.cam_to_rgb);
|
|
668
|
+
write_columns(out, offset + ACES2_CONE_TO_AAB, p_in.cone_to_Aab);
|
|
669
|
+
write_columns(out, offset + ACES2_AAB_TO_CONE, p_in.Aab_to_cone);
|
|
670
|
+
|
|
671
|
+
const ap1_upper_bound = 8 * (128 + 768 * (Math.log(peak_nits / 100) / Math.log(10000 / 100)));
|
|
672
|
+
|
|
673
|
+
const scalars = [
|
|
674
|
+
limit_J_max, model_gamma_inv, mid_J, focus_dist,
|
|
675
|
+
lower_hull_gamma_inv, s_2, m_2, g,
|
|
676
|
+
t_1, n_r, inverse_limit, ap1_upper_bound,
|
|
677
|
+
sat, sat_thr, compr, chroma_compress_scale,
|
|
678
|
+
peak_nits / REFERENCE_LUMINANCE, p_in.F_L_n, p_in.cz, p_in.inv_cz,
|
|
679
|
+
p_in.A_w_J, p_in.inv_A_w_J, search_lower, search_upper,
|
|
680
|
+
];
|
|
681
|
+
for (let i = 0; i < ACES2_SCALAR_COUNT; i++) {
|
|
682
|
+
out[offset + ACES2_SCALARS + i] = scalars[i];
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
for (let i = 0; i < TOTAL; i++) {
|
|
686
|
+
out[offset + ACES2_CUSP_TABLE + i * 4] = hue_table[i];
|
|
687
|
+
out[offset + ACES2_CUSP_TABLE + i * 4 + 1] = cusp[i * 3];
|
|
688
|
+
out[offset + ACES2_CUSP_TABLE + i * 4 + 2] = cusp[i * 3 + 1];
|
|
689
|
+
out[offset + ACES2_CUSP_TABLE + i * 4 + 3] = cusp[i * 3 + 2];
|
|
690
|
+
out[offset + ACES2_REACH_TABLE + i] = reach_table[i];
|
|
691
|
+
}
|
|
692
|
+
}
|