@carbonenginejs/runtime 0.1.0-alpha.4 → 0.1.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/global/blue/BlueClasses.js +200 -0
- package/dist/global/blue/BlueClasses.js.map +1 -0
- package/dist/global/blue/IBlueClasses.js +79 -0
- package/dist/global/blue/IBlueClasses.js.map +1 -0
- package/dist/global/blue/IBlueDynamicResourceConstructor.js +16 -0
- package/dist/global/blue/IBlueDynamicResourceConstructor.js.map +1 -1
- package/dist/global/blue/blue.js +8 -2
- package/dist/global/blue/blue.js.map +1 -1
- package/dist/global/blue/index.js +2 -0
- package/dist/global/blue/index.js.map +1 -1
- package/dist/global/consts/index.js +0 -1
- package/dist/global/consts/index.js.map +1 -1
- package/dist/global/consts/renderContext/formats.js +26 -25
- package/dist/global/consts/renderContext/formats.js.map +1 -1
- package/dist/{trinityal/Tr2BitmapDimensions.js → global/imageio/BitmapDimensions.js} +19 -15
- package/dist/global/imageio/BitmapDimensions.js.map +1 -0
- package/dist/global/imageio/Cutout.js +28 -0
- package/dist/global/imageio/Cutout.js.map +1 -0
- package/dist/global/imageio/HostBitmap.js +1106 -0
- package/dist/global/imageio/HostBitmap.js.map +1 -0
- package/dist/global/imageio/ImageIOResult.js +99 -0
- package/dist/global/imageio/ImageIOResult.js.map +1 -0
- package/dist/global/imageio/ImageUtility.js +205 -0
- package/dist/global/imageio/ImageUtility.js.map +1 -0
- package/dist/global/imageio/LoadParameters.js +86 -0
- package/dist/global/imageio/LoadParameters.js.map +1 -0
- package/dist/global/imageio/Metadata.js +22 -0
- package/dist/global/imageio/Metadata.js.map +1 -0
- package/dist/global/imageio/index.js +8 -0
- package/dist/global/{consts/webgpu → imageio}/index.js.map +1 -1
- package/dist/global/index.js +2 -1
- package/dist/global/index.js.map +1 -1
- package/dist/global/math/color.js +1 -1
- package/dist/global/math/color.js.map +1 -1
- package/dist/global/schema/CjsSchema.js +8 -0
- package/dist/global/schema/CjsSchema.js.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/resource/CjsResMan.js +47 -7
- package/dist/resource/CjsResMan.js.map +1 -1
- package/dist/resource/Tr2LightProfileRes.js +37 -0
- package/dist/resource/Tr2LightProfileRes.js.map +1 -1
- package/dist/resource/format/CjsByteWriter.js +46 -46
- package/dist/resource/format/CjsByteWriter.js.map +1 -1
- package/dist/resource/format/CjsFormat.js +7 -8
- package/dist/resource/format/CjsFormat.js.map +1 -1
- package/dist/resource/format/CjsFormatStore.js +8 -8
- package/dist/resource/format/CjsFormatStore.js.map +1 -1
- package/dist/resource/format/CjsGeometryFormat.js +114 -0
- package/dist/resource/format/CjsGeometryFormat.js.map +1 -0
- package/dist/resource/format/CjsImageFormat.js +282 -0
- package/dist/resource/format/CjsImageFormat.js.map +1 -0
- package/dist/resource/format/CjsResourceProbe.js +12 -48
- package/dist/resource/format/CjsResourceProbe.js.map +1 -1
- package/dist/resource/format/CjsStringTable.js +37 -37
- package/dist/resource/format/CjsStringTable.js.map +1 -1
- package/dist/resource/format/carbonEffect/CjsCarbonEffectReader.js +10 -10
- package/dist/resource/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -1
- package/dist/resource/format/carbonEffect/CjsCarbonEffectWriter.js +37 -37
- package/dist/resource/format/carbonEffect/CjsCarbonEffectWriter.js.map +1 -1
- package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js +35 -7
- package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
- package/dist/resource/format/index.js +3 -1
- package/dist/resource/format/index.js.map +1 -1
- package/dist/resource/formats/black/CjsBlackFormat.js +130 -137
- package/dist/resource/formats/black/CjsBlackFormat.js.map +1 -1
- package/dist/resource/formats/bnk/CjsBnkFormat.js +12 -19
- package/dist/resource/formats/bnk/CjsBnkFormat.js.map +1 -1
- package/dist/resource/formats/bnk/core/helpers.js +1 -3
- package/dist/resource/formats/bnk/core/helpers.js.map +1 -1
- package/dist/resource/formats/cmf/CjsCmfFormat.js +19 -82
- package/dist/resource/formats/cmf/CjsCmfFormat.js.map +1 -1
- package/dist/resource/formats/cmf/core/constants.js +1 -2
- package/dist/resource/formats/cmf/core/constants.js.map +1 -1
- package/dist/resource/formats/{stl/core/targets.js → cmf/core/flatShared.js} +9 -8
- package/dist/resource/formats/cmf/core/flatShared.js.map +1 -0
- package/dist/resource/formats/cmf/core/helpers.js +13 -13
- package/dist/resource/formats/cmf/core/helpers.js.map +1 -1
- package/dist/resource/formats/cmf/core/writer.js +24 -24
- package/dist/resource/formats/cmf/core/writer.js.map +1 -1
- package/dist/resource/formats/dds/CjsDdsFormat.js +134 -17
- package/dist/resource/formats/dds/CjsDdsFormat.js.map +1 -1
- package/dist/resource/formats/dds/core/helpers.js +125 -40
- package/dist/resource/formats/dds/core/helpers.js.map +1 -1
- package/dist/resource/formats/dxbc/CjsDxbcFormat.js +14 -16
- package/dist/resource/formats/dxbc/CjsDxbcFormat.js.map +1 -1
- package/dist/resource/formats/dxbc/core/{container.js → DxbcContainer.js} +2 -2
- package/dist/resource/formats/dxbc/core/DxbcContainer.js.map +1 -0
- package/dist/resource/formats/dxbc/core/{errors.js → DxbcReadError.js} +1 -1
- package/dist/resource/formats/dxbc/core/DxbcReadError.js.map +1 -0
- package/dist/resource/formats/dxbc/core/DxbcReader.js +1 -1
- package/dist/resource/formats/dxbc/core/DxbcReader.js.map +1 -1
- package/dist/resource/formats/dxbc/core/{program.js → DxbcShaderProgram.js} +2 -2
- package/dist/resource/formats/dxbc/core/DxbcShaderProgram.js.map +1 -0
- package/dist/resource/formats/dxbc/core/{signature.js → DxbcSignatureChunk.js} +2 -2
- package/dist/resource/formats/dxbc/core/DxbcSignatureChunk.js.map +1 -0
- package/dist/resource/formats/dxbc/core/decoder.js +2 -2
- package/dist/resource/formats/dxbc/core/decoder.js.map +1 -1
- package/dist/resource/formats/dxbc/core/helpers.js +3 -3
- package/dist/resource/formats/dxbc/core/helpers.js.map +1 -1
- package/dist/resource/formats/fbx/CjsFbxFormat.js +18 -20
- package/dist/resource/formats/fbx/CjsFbxFormat.js.map +1 -1
- package/dist/resource/formats/flac/CjsFlacFormat.js +7 -13
- package/dist/resource/formats/flac/CjsFlacFormat.js.map +1 -1
- package/dist/resource/formats/fsd/32/CjsFsd32Format.js +29 -29
- package/dist/resource/formats/fsd/32/CjsFsd32Format.js.map +1 -1
- package/dist/resource/formats/fsd/64/CjsFsd64Format.js +3 -3
- package/dist/resource/formats/fsd/64/CjsFsd64Format.js.map +1 -1
- package/dist/resource/formats/fsd/64/core/CjsFsd64Binary.js +23 -23
- package/dist/resource/formats/fsd/64/core/CjsFsd64Binary.js.map +1 -1
- package/dist/resource/formats/fsd/64/core/CjsFsd64Reader.js +8 -8
- package/dist/resource/formats/fsd/64/core/CjsFsd64Reader.js.map +1 -1
- package/dist/resource/formats/fsd/CjsFsdFormat.js +23 -23
- package/dist/resource/formats/fsd/CjsFsdFormat.js.map +1 -1
- package/dist/resource/formats/gif/CjsGifFormat.js +24 -15
- package/dist/resource/formats/gif/CjsGifFormat.js.map +1 -1
- package/dist/resource/formats/gltf/CjsGltfFormat.js +33 -98
- package/dist/resource/formats/gltf/CjsGltfFormat.js.map +1 -1
- package/dist/resource/formats/gltf/core/helpers.js +3 -12
- package/dist/resource/formats/gltf/core/helpers.js.map +1 -1
- package/dist/resource/formats/gr2/CjsGr2Format.js +27 -91
- package/dist/resource/formats/gr2/CjsGr2Format.js.map +1 -1
- package/dist/resource/formats/hlsl/CjsHlslFormat.js +22 -25
- package/dist/resource/formats/hlsl/CjsHlslFormat.js.map +1 -1
- package/dist/resource/formats/hlsl/core/carbonDescriptionToRuntime.js +1 -1
- package/dist/resource/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
- package/dist/resource/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js +3 -3
- package/dist/resource/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js.map +1 -1
- package/dist/resource/formats/ies/CjsIESFormat.js +29 -29
- package/dist/resource/formats/ies/CjsIESFormat.js.map +1 -1
- package/dist/resource/formats/jpeg/CjsJpegFormat.js +24 -15
- package/dist/resource/formats/jpeg/CjsJpegFormat.js.map +1 -1
- package/dist/resource/formats/jpeg/core/helpers.js +3 -5
- package/dist/resource/formats/jpeg/core/helpers.js.map +1 -1
- package/dist/resource/formats/jpeg/core/jpeg.js +58 -58
- package/dist/resource/formats/jpeg/core/jpeg.js.map +1 -1
- package/dist/resource/formats/jsonl/CjsJsonlFormat.js +3 -3
- package/dist/resource/formats/jsonl/CjsJsonlFormat.js.map +1 -1
- package/dist/resource/formats/mp3/CjsMp3Format.js +7 -14
- package/dist/resource/formats/mp3/CjsMp3Format.js.map +1 -1
- package/dist/resource/formats/mp3/core/helpers.js +3 -5
- package/dist/resource/formats/mp3/core/helpers.js.map +1 -1
- package/dist/resource/formats/mp4/CjsMp4Format.js +7 -13
- package/dist/resource/formats/mp4/CjsMp4Format.js.map +1 -1
- package/dist/resource/formats/mp4/core/helpers.js +3 -5
- package/dist/resource/formats/mp4/core/helpers.js.map +1 -1
- package/dist/resource/formats/obj/CjsObjFormat.js +92 -157
- package/dist/resource/formats/obj/CjsObjFormat.js.map +1 -1
- package/dist/resource/formats/obj/core/helpers.js +5 -113
- package/dist/resource/formats/obj/core/helpers.js.map +1 -1
- package/dist/resource/formats/ogg/CjsOggFormat.js +7 -14
- package/dist/resource/formats/ogg/CjsOggFormat.js.map +1 -1
- package/dist/resource/formats/pickle/CjsPickleFormat.js +7 -12
- package/dist/resource/formats/pickle/CjsPickleFormat.js.map +1 -1
- package/dist/resource/formats/pickle/core/CjsPickleProtocol0Reader.js +7 -7
- package/dist/resource/formats/pickle/core/CjsPickleProtocol0Reader.js.map +1 -1
- package/dist/resource/formats/pickle/core/CjsPickleProtocol4Reader.js +7 -7
- package/dist/resource/formats/pickle/core/CjsPickleProtocol4Reader.js.map +1 -1
- package/dist/resource/formats/png/CjsPngFormat.js +40 -15
- package/dist/resource/formats/png/CjsPngFormat.js.map +1 -1
- package/dist/resource/formats/png/core/helpers.js +4 -6
- package/dist/resource/formats/png/core/helpers.js.map +1 -1
- package/dist/resource/formats/red/CjsRedFormat.js +22 -28
- package/dist/resource/formats/red/CjsRedFormat.js.map +1 -1
- package/dist/resource/formats/schemabound/CjsSchemaBoundFormat.js +3 -7
- package/dist/resource/formats/schemabound/CjsSchemaBoundFormat.js.map +1 -1
- package/dist/resource/formats/schemabound/core/schemaBoundValues.js +5 -0
- package/dist/resource/formats/schemabound/core/schemaBoundValues.js.map +1 -1
- package/dist/resource/formats/sqlite/CjsSqliteFormat.js +4 -9
- package/dist/resource/formats/sqlite/CjsSqliteFormat.js.map +1 -1
- package/dist/resource/formats/static/CjsStaticFormat.js +4 -4
- package/dist/resource/formats/static/CjsStaticFormat.js.map +1 -1
- package/dist/resource/formats/stl/CjsStlFormat.js +39 -104
- package/dist/resource/formats/stl/CjsStlFormat.js.map +1 -1
- package/dist/resource/formats/stl/core/helpers.js +5 -19
- package/dist/resource/formats/stl/core/helpers.js.map +1 -1
- package/dist/resource/formats/tga/CjsTgaFormat.js +26 -15
- package/dist/resource/formats/tga/CjsTgaFormat.js.map +1 -1
- package/dist/resource/formats/tga/core/helpers.js +3 -5
- package/dist/resource/formats/tga/core/helpers.js.map +1 -1
- package/dist/resource/formats/vta/CjsVtaFormat.js +8 -15
- package/dist/resource/formats/vta/CjsVtaFormat.js.map +1 -1
- package/dist/resource/formats/wav/CjsWavFormat.js +7 -14
- package/dist/resource/formats/wav/CjsWavFormat.js.map +1 -1
- package/dist/resource/formats/wav/core/helpers.js +3 -5
- package/dist/resource/formats/wav/core/helpers.js.map +1 -1
- package/dist/resource/formats/webgl/CjsWebglFormat.js +103 -105
- package/dist/resource/formats/webgl/CjsWebglFormat.js.map +1 -1
- package/dist/resource/formats/webgl/core/{errors.js → WebglReadError.js} +1 -1
- package/dist/resource/formats/webgl/core/WebglReadError.js.map +1 -0
- package/dist/resource/formats/webgl/core/effectPackage.js +1 -1
- package/dist/resource/formats/webgl/core/effectPackage.js.map +1 -1
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js +3 -3
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/resource/formats/webgl/core/glsl/{DxbcGlslHelpers.js → DxbcGlslHelperRegistry.js} +2 -2
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslHelperRegistry.js.map +1 -0
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +1 -1
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -1
- package/dist/resource/formats/webgl/core/glslBackendBlock.js +1 -1
- package/dist/resource/formats/webgl/core/glslBackendBlock.js.map +1 -1
- package/dist/resource/formats/webgl/core/helpers.js.map +1 -1
- package/dist/resource/formats/webgpu/CjsWebgpuFormat.js +28 -29
- package/dist/resource/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
- package/dist/resource/formats/webgpu/core/{errors.js → WebgpuReadError.js} +1 -1
- package/dist/resource/formats/webgpu/core/WebgpuReadError.js.map +1 -0
- package/dist/resource/formats/webgpu/core/carbonWebgpu/validateContainer.js +1 -1
- package/dist/resource/formats/webgpu/core/carbonWebgpu/validateContainer.js.map +1 -1
- package/dist/resource/formats/webgpu/core/helpers.js +1 -1
- package/dist/resource/formats/webgpu/core/helpers.js.map +1 -1
- package/dist/resource/formats/webgpu/core/ir/lowerDxbcToIr.js +1 -1
- package/dist/resource/formats/webgpu/core/ir/lowerDxbcToIr.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/buildWgslSet.js +18 -6
- package/dist/resource/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js +39 -13
- package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js +16 -14
- package/dist/resource/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js.map +1 -1
- package/dist/resource/formats/webm/CjsWebmFormat.js +8 -13
- package/dist/resource/formats/webm/CjsWebmFormat.js.map +1 -1
- package/dist/resource/formats/webm/core/helpers.js +3 -5
- package/dist/resource/formats/webm/core/helpers.js.map +1 -1
- package/dist/resource/formats/webp/CjsWebpFormat.js +8 -12
- package/dist/resource/formats/webp/CjsWebpFormat.js.map +1 -1
- package/dist/resource/formats/wem/CjsWemFormat.js +9 -17
- package/dist/resource/formats/wem/CjsWemFormat.js.map +1 -1
- package/dist/resource/formats/wem/core/bitStream.js +35 -35
- package/dist/resource/formats/wem/core/bitStream.js.map +1 -1
- package/dist/resource/formats/wem/core/helpers.js +1 -3
- package/dist/resource/formats/wem/core/helpers.js.map +1 -1
- package/dist/resource/formats/yaml/CjsYamlFormat.js +28 -37
- package/dist/resource/formats/yaml/CjsYamlFormat.js.map +1 -1
- package/dist/resource/imageio/ImageIO.js +142 -0
- package/dist/resource/imageio/ImageIO.js.map +1 -0
- package/dist/resource/imageio/index.js +17 -0
- package/dist/resource/imageio/index.js.map +1 -0
- package/dist/resource/index.js +7 -0
- package/dist/resource/index.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectResource.js +24 -2
- package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2Pass.js +76 -5
- package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
- package/dist/resource/texture/CjsTextureArrayConstructor.js +97 -0
- package/dist/resource/texture/CjsTextureArrayConstructor.js.map +1 -0
- package/dist/resource/texture/CjsTexturePackConstructor.js +160 -0
- package/dist/resource/texture/CjsTexturePackConstructor.js.map +1 -0
- package/dist/resource/texture/CjsTexturePipelineStepArray.js +72 -0
- package/dist/resource/texture/CjsTexturePipelineStepArray.js.map +1 -0
- package/dist/resource/texture/CjsTexturePipelineStepConvert.js +73 -0
- package/dist/resource/texture/CjsTexturePipelineStepConvert.js.map +1 -0
- package/dist/resource/texture/CjsTexturePipelineStepPack.js +71 -0
- package/dist/resource/texture/CjsTexturePipelineStepPack.js.map +1 -0
- package/dist/resource/texture/CjsTexturePipelineStepResize.js +123 -0
- package/dist/resource/texture/CjsTexturePipelineStepResize.js.map +1 -0
- package/dist/resource/texture/SolidColorTextureConstructor.js +11 -1
- package/dist/resource/texture/SolidColorTextureConstructor.js.map +1 -1
- package/dist/resource/texture/Tr2ImageRes.js +100 -68
- package/dist/resource/texture/Tr2ImageRes.js.map +1 -1
- package/dist/resource/texture/Tr2TexturePipeline.js +45 -25
- package/dist/resource/texture/Tr2TexturePipeline.js.map +1 -1
- package/dist/resource/texture/Tr2TexturePipelineStepCompress.js +34 -1
- package/dist/resource/texture/Tr2TexturePipelineStepCompress.js.map +1 -1
- package/dist/resource/texture/Tr2TexturePipelineStepGenerateMips.js +30 -3
- package/dist/resource/texture/Tr2TexturePipelineStepGenerateMips.js.map +1 -1
- package/dist/resource/texture/Tr2TexturePipelineStepLimitSize.js +81 -1
- package/dist/resource/texture/Tr2TexturePipelineStepLimitSize.js.map +1 -1
- package/dist/resource/texture/Tr2TexturePipelineStepLoad.js +36 -1
- package/dist/resource/texture/Tr2TexturePipelineStepLoad.js.map +1 -1
- package/dist/resource/texture/Tr2TexturePipelineStepPack.js +146 -24
- package/dist/resource/texture/Tr2TexturePipelineStepPack.js.map +1 -1
- package/dist/resource/texture/TriTextureRes.js +151 -29
- package/dist/resource/texture/TriTextureRes.js.map +1 -1
- package/dist/resource/texture/index.js +7 -0
- package/dist/resource/texture/index.js.map +1 -1
- package/dist/resource/texture/registerTextureResources.js +83 -0
- package/dist/resource/texture/registerTextureResources.js.map +1 -0
- package/dist/resource/texture/solidColorTexture.js +10 -19
- package/dist/resource/texture/solidColorTexture.js.map +1 -1
- package/dist/sof/EveSOF.js +39 -7
- package/dist/sof/EveSOF.js.map +1 -1
- package/dist/trinity/core/Tr2GpuResourcePool/Tr2GpuResourcePool.js +2 -2
- package/dist/trinity/core/Tr2GpuResourcePool/Tr2GpuResourcePool.js.map +1 -1
- package/dist/trinity/core/Tr2ImageIOHelpers.js +80 -17
- package/dist/trinity/core/Tr2ImageIOHelpers.js.map +1 -1
- package/dist/trinity/core/Tr2RenderUtils.js +1 -1
- package/dist/trinity/core/Tr2TextureArray/Tr2TextureArray.js +49 -62
- package/dist/trinity/core/Tr2TextureArray/Tr2TextureArray.js.map +1 -1
- package/dist/trinity/core/Tr2TextureReference.js +114 -0
- package/dist/trinity/core/Tr2TextureReference.js.map +1 -0
- package/dist/trinity/core/device/Tr2DepthStencil.js +2 -2
- package/dist/trinity/core/device/Tr2DepthStencil.js.map +1 -1
- package/dist/trinity/core/device/Tr2RingBuffer/Tr2RingBuffer.js +1 -1
- package/dist/trinity/core/index.js +1 -0
- package/dist/trinity/core/index.js.map +1 -1
- package/dist/trinity/core/lighting/Tr2LightManager.js +5 -4
- package/dist/trinity/core/lighting/Tr2LightManager.js.map +1 -1
- package/dist/trinity/core/procedural/GradientTextureConstructor.js +5 -4
- package/dist/trinity/core/procedural/GradientTextureConstructor.js.map +1 -1
- package/dist/trinity/core/procedural/gradientTexture.js +10 -13
- package/dist/trinity/core/procedural/gradientTexture.js.map +1 -1
- package/dist/trinity/core/volumetrics/Tr2VolumetricsRenderer.js +1 -1
- package/dist/trinity/core/volumetrics/Tr2VolumetricsRenderer.js.map +1 -1
- package/dist/trinity/eve/EveImpactOverlay.js +102 -50
- package/dist/trinity/eve/EveImpactOverlay.js.map +1 -1
- package/dist/trinity/eve/EveModularObjectModifier.js +9 -18
- package/dist/trinity/eve/EveModularObjectModifier.js.map +1 -1
- package/dist/trinity/eve/attachment/turrets/EveTurretSet.js +175 -157
- package/dist/trinity/eve/attachment/turrets/EveTurretSet.js.map +1 -1
- package/dist/trinity/eve/attachment/turrets/EveTurretTarget.js +100 -83
- package/dist/trinity/eve/attachment/turrets/EveTurretTarget.js.map +1 -1
- package/dist/trinity/eve/child/EveChildInstancedMeshes/EveChildInstancedMesh.js +26 -20
- package/dist/trinity/eve/child/EveChildInstancedMeshes/EveChildInstancedMesh.js.map +1 -1
- package/dist/trinity/eve/child/EveChildInstancedMeshes/EveChildInstancedMeshes.js +368 -179
- package/dist/trinity/eve/child/EveChildInstancedMeshes/EveChildInstancedMeshes.js.map +1 -1
- package/dist/trinity/eve/child/EveChildMesh.js +242 -234
- package/dist/trinity/eve/child/EveChildMesh.js.map +1 -1
- package/dist/trinity/eve/child/EveChildTurret.js +57 -16
- package/dist/trinity/eve/child/EveChildTurret.js.map +1 -1
- package/dist/trinity/eve/child/EveSpaceObjectChild.js +28 -1
- package/dist/trinity/eve/child/EveSpaceObjectChild.js.map +1 -1
- package/dist/trinity/eve/index.js +2 -2
- package/dist/trinity/eve/overlays/EveDamageOverlay.js +5 -1
- package/dist/trinity/eve/overlays/EveDamageOverlay.js.map +1 -1
- package/dist/trinity/eve/scene/EveSpaceScene.js +234 -233
- package/dist/trinity/eve/scene/EveSpaceScene.js.map +1 -1
- package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js +2 -0
- package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js.map +1 -1
- package/dist/trinity/eve/spaceObject/EveSpaceObject2.js +492 -437
- package/dist/trinity/eve/spaceObject/EveSpaceObject2.js.map +1 -1
- package/dist/trinity/generated/index.js +0 -1
- package/dist/trinity/generated/index.js.map +1 -1
- package/dist/trinity/generated/trinityCore/index.js +0 -1
- package/dist/trinity/generated/trinityCore/index.js.map +1 -1
- package/dist/trinity/index.js +3 -3
- package/dist/trinity/particle/emitter/Tr2GpuSharedEmitter.js +10 -1
- package/dist/trinity/particle/emitter/Tr2GpuSharedEmitter.js.map +1 -1
- package/dist/trinity/shader/Tr2DataTextureManager.js +152 -66
- package/dist/trinity/shader/Tr2DataTextureManager.js.map +1 -1
- package/dist/trinity/shader/Tr2Material.js +1 -1
- package/dist/trinityal/Tr2HalHelperStructures/Tr2TextureSubresource.js +5 -5
- package/dist/trinityal/Tr2HalHelperStructures/Tr2TextureSubresource.js.map +1 -1
- package/dist/trinityal/index.js +1 -1
- package/dist/trinityal/stub/Tr2RenderContextALStub/Tr2RenderContextALStub.js +2 -2
- package/dist/trinityal/stub/Tr2RenderContextALStub/Tr2RenderContextALStub.js.map +1 -1
- package/dist/trinityal/stub/Tr2SwapChainALStub.js +45 -45
- package/dist/trinityal/stub/Tr2SwapChainALStub.js.map +1 -1
- package/dist/trinityal/stub/Tr2TextureALStub.js +170 -170
- package/dist/trinityal/stub/Tr2TextureALStub.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuDevice.js +234 -164
- package/dist/trinityal/webgpu/CjsWebgpuDevice.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js +7 -0
- package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js +78 -14
- package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js.map +1 -1
- package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js +94 -0
- package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js.map +1 -0
- package/dist/trinityal/webgpu/internal.js +1 -0
- package/dist/trinityal/webgpu/internal.js.map +1 -1
- package/docs/global/reference/classes/README.md +90 -0
- package/docs/resource/concepts/format-capabilities.md +3 -3
- package/docs/resource/formats/README.md +1 -1
- package/docs/resource/reference/classes/core.md +31 -1
- package/docs/resource/reference/classes/formats.md +7 -7
- package/docs/resource/reference/classes/resources.md +76 -16
- package/docs/trinity/reference/classes/generated.md +0 -10
- package/docs/trinity/reference/classes/trinity-core.md +1692 -1682
- package/docs/trinityal/reference/classes/README.md +0 -10
- package/docs/trinityal/webgpu/reference/classes/README.md +276 -266
- package/package.json +4 -3
- package/dist/global/consts/webgpu/index.js +0 -2
- package/dist/global/consts/webgpu/textureFormats.js +0 -180
- package/dist/global/consts/webgpu/textureFormats.js.map +0 -1
- package/dist/resource/formats/dxbc/core/container.js.map +0 -1
- package/dist/resource/formats/dxbc/core/errors.js.map +0 -1
- package/dist/resource/formats/dxbc/core/program.js.map +0 -1
- package/dist/resource/formats/dxbc/core/signature.js.map +0 -1
- package/dist/resource/formats/stl/core/targets.js.map +0 -1
- package/dist/resource/formats/webgl/core/errors.js.map +0 -1
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslHelpers.js.map +0 -1
- package/dist/resource/formats/webgpu/core/errors.js.map +0 -1
- package/dist/resource/texture/texturePipelineBehavior.js +0 -332
- package/dist/resource/texture/texturePipelineBehavior.js.map +0 -1
- package/dist/trinity/generated/trinityCore/Tr2TextureReference.js +0 -40
- package/dist/trinity/generated/trinityCore/Tr2TextureReference.js.map +0 -1
- package/dist/trinityal/Tr2BitmapDimensions.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tr2LightManager.js","sources":["../../../../../src/trinity/core/lighting/Tr2LightManager.js"],"sourcesContent":["// Source: trinity/trinity/Tr2LightManager.h + Tr2LightManager.cpp\n//\n// The local-light manager: collects per-light records from every\n// ITr2LightOwner during the scene gather, culls and premultiplies them,\n// selects the volumetric set, and owns the PACKED light buffer bytes the\n// abstraction layer uploads. Description-building throughout - under the\n// engine-means-AL vocabulary (docs c5a4b66) everything here is Trinity's;\n// only realizing LightBuffer/LightIndexBuffer into device objects, the\n// tiling compute dispatch, the shadow atlas textures and the raytraced\n// path are the AL's, and all of those are deferred below.\n//\n// SHIPPING BEHAVIOUR PIN: Carbon ships with g_useDynamicLightsShadows =\n// false (cpp:21-22, a TRI_REGISTER_SETTING - runtime-mutable, hence the\n// static below rather than a constant). With it false, ResolveLightData\n// returns after the volumetric pass (cpp:568-571) and AddLight always\n// strips FLAG_CASTS_SHADOWS (cpp:359-365). The caster/atlas CPU half IS\n// ported (settings derivation, guillotine packer, five-pass fit, packed\n// 10-bit offsets) and sits behind the same setting; only its GPU\n// realization (the pooled D32 atlas texture, cpp:703-706) stays the\n// abstraction layer's.\n//\n// Carbon's thread-local gather vectors (safe under Tr2ParallelFor,\n// EveSpaceScene.cpp:1410) collapse to one array: the JS gather is\n// sequential. Carbon's file-static singleton (GetOrCreateInstance) is NOT\n// ported - the runtime injects a manager into GatherLights, which is the\n// shape every call site and test already has.\n//\n// docs/contracts/carbon-light-data.md owns the PerLightData layout, the\n// packed flag word, the premultiply and the fade band; the packing below\n// cites it rather than re-deriving it.\n\nimport { CjsModel } from \"#model\";\nimport { carbon, impl, type } from \"#schema\";\nimport { num } from \"#math/num\";\nimport { vec3 } from \"#math/vec3\";\nimport { ShadowQuality } from \"../../generated/trinityCore/enums.js\";\nimport { Tr2TextureArray } from \"../Tr2TextureArray/index.js\";\n\n// Tr2LightManager.cpp:30-48 - copied verbatim; the buffer sizes are the ABI\n// the AL uploads against.\nconst LIGHT_BUFFER_SIZE = 1024;\nconst CUTOFF_PIXEL_SIZE = 7;\nconst FADE_SIZE = 5;\nconst MAX_NUM_VOLUMETRIC_LIGHTS = 16;\nconst MAX_NUM_SHADOWCASTING_LIGHTS = 16;\nconst HIGH_QUALITY_ATLAS_SIZE_LOG2 = 14;\nconst HIGH_QUALITY_ATLAS_ENTRY_MAX_SIZE = 1 << 13;\nconst INFINITE_SIZE_CLAMP = 1 << 14; // 1 << HIGH_QUALITY_ATLAS_SIZE_LOG2\nconst FLOATS_PER_LIGHT = 12; // 48 bytes / 3 RGBA32 texels\n\n/** CCP_ALIGN: round up to a power-of-two alignment. */\nfunction align(value, alignment)\n{\n return (value + alignment - 1) & ~(alignment - 1);\n}\n\n/**\n * Carbon's anonymous-namespace CalculateShadowMapAtlasSettings (cpp:92-122).\n *\n * Ported branch for branch, including the SHADOW_RAYTRACED quirk: it zeroes\n * with SHADOW_DISABLED but then re-enters the != DISABLED block, so\n * `entryMinSizeLog2 = 0 - 10` wraps unsigned (4294967286) and\n * `1 << entryMinSizeLog2` shifts by that count. MSVC x86 masks the shift\n * count by 31 and SO DOES JavaScript's << - writing the arithmetic plainly\n * reproduces Carbon's shipping behaviour exactly (entryMinSize 1<<22,\n * entryMaxSize 8192 >> 14 = 0).\n *\n * @param {number} shadowQuality ShadowQuality ordinal.\n * @returns {object} ShadowMapAtlasSettings (actualTextureSize starts 0).\n */\nfunction calculateShadowMapAtlasSettings(shadowQuality)\n{\n const settings = {\n actualTextureSize: 0,\n sizeLog2: 0,\n size: 0,\n entryMinSizeLog2: 0,\n entryMinSize: 0,\n entryInverseScaleFactorLog2: 0,\n entryMaxSize: 0\n };\n switch (shadowQuality)\n {\n case ShadowQuality.SHADOW_DISABLED:\n case ShadowQuality.SHADOW_RAYTRACED:\n break;\n case ShadowQuality.SHADOW_LOW:\n settings.sizeLog2 = HIGH_QUALITY_ATLAS_SIZE_LOG2 - 2;\n break;\n case ShadowQuality.SHADOW_HIGH:\n settings.sizeLog2 = HIGH_QUALITY_ATLAS_SIZE_LOG2;\n break;\n }\n if (shadowQuality !== ShadowQuality.SHADOW_DISABLED)\n {\n settings.size = 1 << settings.sizeLog2;\n settings.entryMinSizeLog2 = (settings.sizeLog2 - 10) >>> 0;\n settings.entryMinSize = 1 << settings.entryMinSizeLog2;\n settings.entryInverseScaleFactorLog2 = HIGH_QUALITY_ATLAS_SIZE_LOG2 - settings.sizeLog2;\n settings.entryMaxSize = HIGH_QUALITY_ATLAS_ENTRY_MAX_SIZE >> settings.entryInverseScaleFactorLog2;\n }\n return settings;\n}\n\n// Carbon packs these halves through Float_16(...) (Tr2LightManager.cpp:297,\n// :328-329), which rounds to nearest. num.toHalfFloat is the runtime's one\n// half codec and rounds identically for every in-range value; an earlier\n// file-local encoder here TRUNCATED, a 1-ulp divergence from Carbon,\n// removed 2026-09-08.\nconst toHalf = num.toHalfFloat;\n\n/** Owns the frame's local-light records, their selection, and the packed light-buffer bytes the abstraction layer uploads. */\n@type.define({ className: \"Tr2LightManager\", family: \"trinityCore\" })\nexport class Tr2LightManager extends CjsModel\n{\n\n // Carbon m_lightData after the TLS flatten: the frame's accepted records,\n // plain-object copies (every producer reuses a static scratch record, so\n // AddLight copies by value exactly as std::vector::push_back does).\n #records = [];\n\n // Carbon m_volumetricLights / m_shadowCastingLights: indices into #records.\n #volumetricLights = [];\n\n #shadowCastingLights = [];\n\n // Carbon m_frustum, by reference (SetFrustum copies by value in C++; the\n // stamped frame frustum is not mutated during the gather, so a reference\n // carries the same guarantee here).\n #frustum = null;\n\n // Carbon m_adjustedCutoff (cpp:249-252).\n #adjustedCutoff = CUTOFF_PIXEL_SIZE;\n\n // Carbon m_currentSpaceSceneShadowQuality (h:197).\n #currentSpaceSceneShadowQuality = ShadowQuality.SHADOW_DISABLED;\n\n // Carbon nextFrameShadowQuality (h:196) - a bitmask collecting every\n // scene's requested quality during the current frame.\n #nextFrameShadowQuality = 0;\n\n // Carbon m_currentFrameCounter (h:198; ctor sets -1, cpp:164).\n #currentFrameCounter = -1;\n\n // Carbon's anonymous m_ShadowMap block (h:200-205): the atlas settings,\n // the guillotine node tree, and the quality the atlas was last sized for.\n #shadowMap = {\n atlasSettings: calculateShadowMapAtlasSettings(ShadowQuality.SHADOW_DISABLED),\n atlasNodes: [],\n qualityUsedByAtlas: ShadowQuality.SHADOW_DISABLED\n };\n\n // Non-Carbon: profile-object -> slice index, assigned on first sight. The\n // slot registry is description-side (Carbon assigns slices through the\n // manager-owned Tr2TextureArray, cpp:682-686, whose realization is AL).\n #profileSlots = new Map();\n\n // The packed PerLightData buffer (contract: 48 bytes / 3 RGBA32 texels per\n // light), built by ResolveLightData, uploaded by the AL.\n #packed = new Float32Array(LIGHT_BUFFER_SIZE * FLOATS_PER_LIGHT);\n\n #packedBits = new Uint32Array(this.#packed.buffer);\n\n #packedCount = 0;\n\n // Non-Carbon: bumped by ResolveLightData so the AL can skip re-uploads.\n #revision = 0;\n\n /** Tr2LightManager.h:100-105 - the light flag bits, Carbon's raw uint16 spelling. */\n static Flags = Object.freeze({\n AFFECTS_SURFACES: 1,\n AFFECTS_PARTICLES: 1 << 1,\n CASTS_SHADOWS: 1 << 2,\n IS_VOLUMETRIC: 1 << 3,\n DEFAULT: 1\n });\n\n /** The variable-store names the AL binds the packed buffers under\n * (Tr2LightManager.h:46-47; both isAutoregister). The NAMES are Trinity's\n * contract; the variables are the AL's to create. */\n static LIGHT_BUFFER_NAME = \"LightBuffer\";\n\n static LIGHT_INDEX_BUFFER_NAME = \"LightIndexBuffer\";\n\n /**\n * Carbon g_useDynamicLightsShadows (cpp:21-22) - a TRI_REGISTER_SETTING,\n * i.e. a runtime-mutable setting rather than a compile constant, shipped\n * FALSE. The whole shadow-caster/atlas half sits behind it; flipping it\n * exercises the ported path (the tests do), and shipping behaviour is\n * unchanged while it stays false.\n */\n static useDynamicLightsShadows = false;\n\n /** The atlas-settings derivation, exposed for tests (Carbon cpp:92-122). */\n static calculateShadowMapAtlasSettings = calculateShadowMapAtlasSettings;\n\n /**\n * Carbon Tr2LightManager::AreLightFlagsValid (cpp:677-680): a light must\n * affect surfaces or particles to exist at all.\n */\n @carbon.method\n @impl.implemented\n static areLightFlagsValid(flags)\n {\n return (flags & (Tr2LightManager.Flags.AFFECTS_SURFACES | Tr2LightManager.Flags.AFFECTS_PARTICLES)) !== 0;\n }\n\n /**\n * Carbon SetShadowQuality (cpp:262-295), the full body: record the\n * scene's quality, collapse the previous frame's quality bitmask into\n * qualityUsedByAtlas on a frame change (HIGH beats LOW beats DISABLED),\n * and recompute the atlas settings for min(requested, atlas quality)\n * with actualTextureSize taken from the atlas quality - multiple scenes\n * may request different qualities in one frame and the texture must fit\n * the largest.\n */\n @carbon.method\n @impl.implemented\n SetShadowQuality(quality, frameCounter = 0)\n {\n const shadowQuality = Number(quality) || 0;\n this.#currentSpaceSceneShadowQuality = shadowQuality;\n\n if (this.#currentFrameCounter !== frameCounter)\n {\n if (!Tr2LightManager.useDynamicLightsShadows)\n {\n this.#nextFrameShadowQuality = 0;\n }\n\n if (this.#nextFrameShadowQuality & (1 << ShadowQuality.SHADOW_HIGH))\n {\n this.#shadowMap.qualityUsedByAtlas = ShadowQuality.SHADOW_HIGH;\n }\n else if (this.#nextFrameShadowQuality & (1 << ShadowQuality.SHADOW_LOW))\n {\n this.#shadowMap.qualityUsedByAtlas = ShadowQuality.SHADOW_LOW;\n }\n else\n {\n this.#shadowMap.qualityUsedByAtlas = ShadowQuality.SHADOW_DISABLED;\n }\n this.#nextFrameShadowQuality = 1 << shadowQuality;\n this.#currentFrameCounter = frameCounter;\n }\n\n this.#nextFrameShadowQuality |= 1 << shadowQuality;\n\n const clamped = Math.min(shadowQuality, this.#shadowMap.qualityUsedByAtlas);\n this.#shadowMap.atlasSettings = calculateShadowMapAtlasSettings(clamped);\n this.#shadowMap.atlasSettings.actualTextureSize =\n calculateShadowMapAtlasSettings(this.#shadowMap.qualityUsedByAtlas).size;\n }\n\n /** Carbon GetShadowMapAtlasSettings (cpp:708-711). */\n @carbon.method\n @impl.implemented\n GetShadowMapAtlasSettings()\n {\n return this.#shadowMap.atlasSettings;\n }\n\n /**\n * Carbon GetUnpackedShadowMapData (cpp:810-815): the packed 10-bit\n * offsets/scale back into texels via the entry-min-size shift.\n *\n * @param {object} record A light record carrying the packed fields.\n * @param {object} [out] Receives scale/offsetX/offsetY.\n * @returns {object} out\n */\n @carbon.method\n @impl.implemented\n GetUnpackedShadowMapData(record, out = {})\n {\n const shift = this.#shadowMap.atlasSettings.entryMinSizeLog2;\n out.shadowMapScale = (record.shadowMapScale ?? 0) << shift;\n out.shadowMapOffsetX = (record.shadowMapOffsetX ?? 0) << shift;\n out.shadowMapOffsetY = (record.shadowMapOffsetY ?? 0) << shift;\n return out;\n }\n\n /**\n * Carbon Clear (cpp:220-242), the CPU half: drops the frame's records and\n * selections. The index-buffer UAV clear (cpp:224) is device work the AL\n * performs when it consumes the frame.\n */\n @carbon.method\n @impl.adapted\n @impl.reason(\"ClearLightIndices' UAV clear is AL realization; the vector clears are ported. The render-context parameter is accepted for signature parity and unused.\")\n Clear(_renderContext = null)\n {\n this.#records.length = 0;\n this.#volumetricLights.length = 0;\n this.#shadowCastingLights.length = 0;\n }\n\n /** Carbon SetFrustum (cpp:244-247). */\n @carbon.method\n @impl.implemented\n SetFrustum(frustum)\n {\n this.#frustum = frustum ?? null;\n }\n\n /** Carbon AdjustLightCutoff (cpp:249-252): the cull threshold is 7px * lodFactor. */\n @carbon.method\n @impl.implemented\n AdjustLightCutoff(lodFactor)\n {\n this.#adjustedCutoff = CUTOFF_PIXEL_SIZE * (Number(lodFactor) || 0);\n }\n\n /**\n * Carbon AddPointLight (cpp:297-332): authors a record from scratch, in\n * Carbon's exact order - flags gate, brightness gate, frustum cull, pixel\n * cutoff, premultiply+fade, defaults for everything a caller cannot\n * supply. The direction default is (1,0,0), never zero - a zero direction\n * is a legal bit pattern the shader normalises into NaN (contract §\"third\n * texel\").\n */\n @carbon.method\n @impl.implemented\n AddPointLight(position, radius, color, innerRadius = 0, flags = Tr2LightManager.Flags.DEFAULT)\n {\n if (!Tr2LightManager.areLightFlagsValid(flags)) return;\n\n const brightness = Math.max(color[0], color[1], color[2]);\n if (!(brightness > 0)) return;\n\n const dimming = this.#CullAndDim(position, radius);\n if (dimming <= 0) return;\n\n const scale = radius * dimming;\n this.#records.push({\n owner: null,\n lightData: null,\n lightProfile: null,\n lightType: 0,\n position: vec3.fromValues(position[0], position[1], position[2]),\n direction: vec3.fromValues(1, 0, 0),\n color: vec3.fromValues(color[0] * scale, color[1] * scale, color[2] * scale),\n radius,\n innerRadius,\n flags,\n outerAngle: 0,\n innerAngle: 0,\n projectionPlaneDistance: 0\n });\n }\n\n /**\n * Carbon AddLight (cpp:334-368): takes a caller-built record, applies the\n * same gates, premultiplies, and - faithfully - MUTATES the caller's\n * record in place where Carbon does (the shadow-flag strip on the non-const\n * reference, cpp:359-365; always taken under the shipping pin). The stored\n * record is a by-value copy: every producer reuses a static scratch record,\n * exactly as Carbon's std::vector push copies.\n */\n @carbon.method\n @impl.implemented\n AddLight(record)\n {\n if (!Tr2LightManager.areLightFlagsValid(record.flags)) return;\n\n const brightness = Math.max(record.color[0], record.color[1], record.color[2]);\n if (!(brightness > 0) || !(record.radius > 0)) return;\n\n const dimming = this.#CullAndDim(record.position, record.radius);\n if (dimming <= 0) return;\n\n // Carbon's conditional strip (cpp:359-365): shadows survive only when\n // the setting is on, the scene quality is not DISABLED, and a shadow-map\n // quality has an atlas actually sized for it (qualityUsedByAtlas lags a\n // frame behind). Always taken under the shipping default.\n const usingShadowMap = this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_LOW\n || this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_HIGH;\n if (this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_DISABLED\n || (usingShadowMap && this.#shadowMap.qualityUsedByAtlas === ShadowQuality.SHADOW_DISABLED)\n || !Tr2LightManager.useDynamicLightsShadows)\n {\n record.flags &= ~Tr2LightManager.Flags.CASTS_SHADOWS;\n }\n\n const scale = record.radius * dimming;\n this.#records.push({\n owner: record.owner ?? null,\n lightData: record.lightData ?? null,\n lightProfile: record.lightProfile ?? null,\n lightType: record.lightType ?? 0,\n position: vec3.fromValues(record.position[0], record.position[1], record.position[2]),\n direction: vec3.fromValues(record.direction[0], record.direction[1], record.direction[2]),\n color: vec3.fromValues(record.color[0] * scale, record.color[1] * scale, record.color[2] * scale),\n radius: record.radius,\n innerRadius: record.innerRadius ?? 0,\n flags: record.flags,\n outerAngle: record.outerAngle ?? 0,\n innerAngle: record.innerAngle ?? 0,\n projectionPlaneDistance: record.projectionPlaneDistance ?? 0\n });\n }\n\n /**\n * Carbon ResolveLightData (cpp:520-620): the TLS flatten is a no-op here\n * (one array), the volumetric top-16 selection runs exactly as Carbon's -\n * including clearing IS_VOLUMETRIC on the losers so shader and CPU agree -\n * then the shadow-caster half (ported in full, gated by the same\n * useDynamicLightsShadows setting Carbon ships false), then the packed\n * buffer: byte layout per the contract, profile slots biased by one into\n * flag bits 4-15, the shadow union in word 11.\n */\n @carbon.method\n @impl.implemented\n ResolveLightData()\n {\n const volumetric = [];\n for (let i = 0; i < this.#records.length; i++)\n {\n if (this.#records[i].flags & Tr2LightManager.Flags.IS_VOLUMETRIC)\n {\n const size = this.#ScreenSize(this.#records[i]);\n volumetric.push([ i, Math.min(size, INFINITE_SIZE_CLAMP) ]);\n }\n }\n volumetric.sort((a, b) => b[1] - a[1]);\n\n this.#volumetricLights.length = 0;\n for (let i = 0; i < volumetric.length; i++)\n {\n if (i < MAX_NUM_VOLUMETRIC_LIGHTS) this.#volumetricLights.push(volumetric[i][0]);\n else this.#records[volumetric[i][0]].flags &= ~Tr2LightManager.Flags.IS_VOLUMETRIC;\n }\n\n this.#ResolveShadowCasters();\n\n this.#Pack();\n this.#revision += 1;\n }\n\n /**\n * Carbon's shadow-caster half of ResolveLightData (cpp:568-620): the\n * useDynamicLightsShadows/DISABLED early-out (Carbon ships with the\n * setting FALSE - it is a TRI_REGISTER_SETTING, hence a mutable static\n * here rather than a constant), then filter casters by flag, estimate\n * screen size (Carbon's FLT_MAX inside-the-sphere sentinel clamps to the\n * high-quality atlas size), sort descending, keep the largest sixteen,\n * strip FLAG_CASTS_SHADOWS from the losers, assign raytracing masks by\n * rank under SHADOW_RAYTRACED, and pack the atlas for LOW/HIGH.\n */\n #ResolveShadowCasters()\n {\n this.#shadowCastingLights.length = 0;\n if (!Tr2LightManager.useDynamicLightsShadows\n || this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_DISABLED)\n {\n return;\n }\n\n const lightTuples = [];\n for (let i = 0; i < this.#records.length; i++)\n {\n if ((this.#records[i].flags & Tr2LightManager.Flags.CASTS_SHADOWS) !== 0)\n {\n let sizeAcross = this.#frustum\n ? this.#frustum.GetPixelSizeAccrossEst(this.#records[i].position, this.#records[i].radius)\n : 0;\n if (!Number.isFinite(sizeAcross)) sizeAcross = 1 << HIGH_QUALITY_ATLAS_SIZE_LOG2;\n lightTuples.push({ lightIndex: i, sizeAcross });\n }\n }\n\n lightTuples.sort((a, b) => b.sizeAcross - a.sizeAcross);\n\n const raytraced = this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_RAYTRACED;\n const numShadowCastingLights = Math.min(MAX_NUM_SHADOWCASTING_LIGHTS, lightTuples.length);\n let i = 0;\n for (; i < numShadowCastingLights; i++)\n {\n this.#shadowCastingLights.push(lightTuples[i].lightIndex);\n if (raytraced)\n {\n this.#records[lightTuples[i].lightIndex].raytracingShadowMask = 1 << i;\n }\n }\n for (; i < lightTuples.length; i++)\n {\n const record = this.#records[lightTuples[i].lightIndex];\n record.flags &= ~Tr2LightManager.Flags.CASTS_SHADOWS;\n if (raytraced)\n {\n record.raytracingShadowMask = 0;\n }\n }\n\n if (this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_LOW\n || this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_HIGH)\n {\n this.#CreateShadowMapAtlas(numShadowCastingLights, lightTuples);\n }\n }\n\n /**\n * Carbon CreateShadowMapAtlas (cpp:442-508): five fitting passes, each\n * halving entryMaxSize and incrementing the inverse-scale shift; entry\n * MIN size never scales. A failing pass still inserts every remaining\n * light before retrying. Point lights (innerAngle <= 0) take a 3x2\n * cube-cross, spots a square. Successful entries pack their offsets and\n * scale in entry-min-size units into the record's 10-bit fields; failures\n * zero them.\n */\n #CreateShadowMapAtlas(numShadowCastingLights, lightTuples)\n {\n const settings = this.#shadowMap.atlasSettings;\n const entry = { x: 0, y: 0 };\n let everythingFit = false;\n for (let j = 0; j < 5 && !everythingFit; j++)\n {\n everythingFit = true;\n const entryInverseScaleFactorLog2 = settings.entryInverseScaleFactorLog2 + j;\n const entryMaxSize = settings.entryMaxSize >> j;\n\n this.#shadowMap.atlasNodes.length = 0;\n this.#shadowMap.atlasNodes.push({\n children: [ -1, -1 ],\n lightIndex: -1,\n x: 0,\n y: 0,\n width: settings.size,\n height: settings.size\n });\n\n for (let i = 0; i < numShadowCastingLights; i++)\n {\n const lightIndex = lightTuples[i].lightIndex;\n const record = this.#records[lightIndex];\n\n let size = (lightTuples[i].sizeAcross >>> 0) >>> entryInverseScaleFactorLog2;\n size = Math.min(Math.max(size, settings.entryMinSize), entryMaxSize);\n size = align(size, settings.entryMinSize);\n\n let width, height;\n if (record.innerAngle <= 0)\n {\n // pointlight: a 3x2 cube-face cross\n width = 3 * size;\n height = 2 * size;\n }\n else\n {\n // spotlight\n width = size;\n height = size;\n }\n\n if (this.#GetShadowMapAtlasEntry(lightIndex, width, height, entry))\n {\n record.shadowMapOffsetX = entry.x >>> settings.entryMinSizeLog2;\n record.shadowMapOffsetY = entry.y >>> settings.entryMinSizeLog2;\n record.shadowMapScale = size >>> settings.entryMinSizeLog2;\n }\n else\n {\n record.shadowMapOffsetX = 0;\n record.shadowMapOffsetY = 0;\n record.shadowMapScale = 0;\n everythingFit = false;\n }\n }\n }\n }\n\n /**\n * Carbon GetShadowMapAtlasEntry (cpp:790-808): align the request to the\n * entry min size, insert from the root, and report position ONLY on\n * success - the out object is untouched on failure, exactly as Carbon\n * leaves its out-references.\n */\n #GetShadowMapAtlasEntry(lightIndex, width, height, out)\n {\n const settings = this.#shadowMap.atlasSettings;\n width = align(width, settings.entryMinSize);\n height = align(height, settings.entryMinSize);\n\n const nodeId = this.#InsertAtlasNode(this.#shadowMap.atlasNodes, 0, lightIndex, width, height);\n if (nodeId !== -1)\n {\n out.x = this.#shadowMap.atlasNodes[nodeId].x;\n out.y = this.#shadowMap.atlasNodes[nodeId].y;\n }\n return nodeId !== -1;\n }\n\n /**\n * Carbon InsertAtlasNode (cpp:718-788) - the blackpawn.com guillotine\n * packer, ported branch for branch: descend into split nodes (first\n * child, then second), reject occupied or too-small leaves, claim exact\n * fits, otherwise split along the larger remainder axis and recurse into\n * the first child.\n */\n #InsertAtlasNode(atlasNodes, nodeId, lightIndex, width, height)\n {\n const node = atlasNodes[nodeId];\n if (node.children[0] !== -1 || node.children[1] !== -1)\n {\n const newNode = this.#InsertAtlasNode(atlasNodes, node.children[0], lightIndex, width, height);\n if (newNode !== -1)\n {\n return newNode;\n }\n return this.#InsertAtlasNode(atlasNodes, node.children[1], lightIndex, width, height);\n }\n\n if (node.lightIndex !== -1)\n {\n return -1;\n }\n if (node.width < width || node.height < height)\n {\n return -1;\n }\n if (node.width === width && node.height === height)\n {\n node.lightIndex = lightIndex;\n return nodeId;\n }\n\n const child0 = { children: [ -1, -1 ], lightIndex: -1, x: 0, y: 0, width: 0, height: 0 };\n const child1 = { children: [ -1, -1 ], lightIndex: -1, x: 0, y: 0, width: 0, height: 0 };\n atlasNodes.push(child0, child1);\n node.children[0] = atlasNodes.length - 2;\n node.children[1] = atlasNodes.length - 1;\n\n const deltaWidth = node.width - width;\n const deltaHeight = node.height - height;\n\n if (deltaWidth > deltaHeight)\n {\n child0.x = node.x;\n child0.y = node.y;\n child0.width = width;\n child0.height = node.height;\n child1.x = node.x + width;\n child1.y = node.y;\n child1.width = node.width - width;\n child1.height = node.height;\n }\n else\n {\n child0.x = node.x;\n child0.y = node.y;\n child0.width = node.width;\n child0.height = height;\n child1.x = node.x;\n child1.y = node.y + height;\n child1.width = node.width;\n child1.height = node.height - height;\n }\n\n return this.#InsertAtlasNode(atlasNodes, node.children[0], lightIndex, width, height);\n }\n\n /** Carbon GetCurrentSpaceSceneShadowQuality (cpp:713-716): a bare field read; every record producer asks it before building. */\n @carbon.method\n @impl.implemented\n GetCurrentSpaceSceneShadowQuality()\n {\n return this.#currentSpaceSceneShadowQuality;\n }\n\n /** Carbon GetLightData (cpp:695-698): the frame's resolved records, borrowed. */\n @carbon.method\n @impl.implemented\n GetLightData()\n {\n return this.#records;\n }\n\n /** Carbon GetVolumetricLights (cpp:707-710): indices into GetLightData, borrowed. */\n @carbon.method\n @impl.implemented\n GetVolumetricLights()\n {\n return this.#volumetricLights;\n }\n\n /** Carbon GetShadowCastingLights (cpp:688-691): empty under the shipping pin, kept for signature parity. */\n @carbon.method\n @impl.implemented\n GetShadowCastingLights()\n {\n return this.#shadowCastingLights;\n }\n\n // The frame clock used to be threaded through here, as a non-Carbon seam:\n // the packed sets needed it for curve sampling and the manager was the one\n // object every GetLights implementation already received. Carbon's sets read\n // the renderer's clock, which is `gTriDev->GetAnimationTime()`, and they do\n // that here now. Nothing in src ever called the setter, so the five readers\n // had been sampling a constant zero.\n\n /** The packed PerLightData bytes for the AL to upload, borrowed (contract layout, 3 RGBA32 texels per light). */\n @impl.custom\n @impl.reason(\"AL seam: Trinity owns the packed description bytes; the AL realizes LightBuffer from this view (precedent: Tr2DataTextureManager.GetPackedBlocks).\")\n GetLightBufferData()\n {\n return this.#packed.subarray(0, this.#packedCount * FLOATS_PER_LIGHT);\n }\n\n /** The number of packed lights in GetLightBufferData. */\n @impl.custom\n @impl.reason(\"AL seam companion to GetLightBufferData.\")\n GetLightCount()\n {\n return this.#packedCount;\n }\n\n /** Monotonic revision of the packed data, bumped by ResolveLightData, so the AL can skip unchanged re-uploads. */\n @impl.custom\n @impl.reason(\"Non-Carbon extension: cheaper than the AL diffing a typed array; Carbon re-uploads unconditionally.\")\n GetDataRevision()\n {\n return this.#revision;\n }\n\n /** Frustum cull + pixel-size cutoff, returning the fade-band dimming factor (0 = rejected). Cull applies only when a frustum was set. */\n #CullAndDim(position, radius)\n {\n if (!this.#frustum) return 1;\n if (!this.#frustum.IsSphereVisible(position, radius)) return 0;\n const size = this.#frustum.GetPixelSizeAccross(position, radius);\n if (!(size > this.#adjustedCutoff)) return 0;\n // Contract §\"Colour carries the radius\": the fade band sits ABOVE the\n // cutoff - absent at the cutoff, full brightness FADE_SIZE above it.\n return Math.min((size - this.#adjustedCutoff) / FADE_SIZE, 1);\n }\n\n /**\n * Returns the light's projected pixel size, or its radius when no frustum is\n * set.\n */\n #ScreenSize(record)\n {\n if (!this.#frustum) return record.radius;\n return this.#frustum.GetPixelSizeAccross(record.position, record.radius);\n }\n\n /**\n * The slice a profile occupies, +1 biased so 0 means \"no profile\"\n * (Tr2Light.cpp:137: `m_lightProfile ? GetTextureIndex() + 1 : 0`).\n *\n * The index comes from the RESOURCE (`GetTextureIndex`, the texture-array\n * slice - stable, shared across managers, reused after release), never\n * from an invented per-manager counter: Carbon assigns slices through the\n * process-wide light profile array (cpp:682-686), and a manager-local\n * numbering diverges from what the shader samples the moment two managers\n * or a released slot exist. A profile carrying a baked payload but no\n * slice yet is registered here - Carbon does this in the resource's\n * DoPrepare (Tr2LightProfileRes.cpp:95-99), which the layering forbids\n * (resource cannot import trinity), so the manager performs it at the\n * first pack instead; same array, same first-fit slot, one seam later.\n * The first-sight map remains only for foreign profile objects that\n * expose no GetTextureIndex.\n */\n #ProfileSlot(profile)\n {\n if (!profile) return 0;\n if (typeof profile.GetTextureIndex === \"function\")\n {\n let index = profile.GetTextureIndex();\n if (index < 0 && typeof profile.RegisterProfileElement === \"function\")\n {\n const payload = typeof profile.GetPayload === \"function\" ? profile.GetPayload() : null;\n if (payload && payload.samples)\n {\n const element = Tr2LightManager.getLightProfileArray().AddElement(payload);\n if (element.IsValid())\n {\n profile.RegisterProfileElement(element);\n index = element.GetElementIndex();\n }\n }\n }\n return index >= 0 ? index + 1 : 0;\n }\n let slot = this.#profileSlots.get(profile);\n if (slot === undefined)\n {\n slot = this.#profileSlots.size;\n this.#profileSlots.set(profile, slot);\n }\n return slot + 1;\n }\n\n /**\n * The process-wide light profile array (Tr2LightManager.cpp:682-686).\n *\n * Carbon's is a function-local static that deliberately survives manager\n * destruction (ResetVariableStore re-registers the SAME live array,\n * cpp:186) - so under instance-per-scene managers this stays a class\n * static: two scenes share slices, and a profile's texture index means\n * the same thing everywhere. Realizing it as a GPU texture array is the\n * abstraction layer's job; consumers poll GetRevision or subscribe via\n * OnTextureChange.\n *\n * @returns {Tr2TextureArray} The shared profile array.\n */\n static getLightProfileArray()\n {\n if (!Tr2LightManager.#lightProfileArray)\n {\n Tr2LightManager.#lightProfileArray = new Tr2TextureArray();\n }\n return Tr2LightManager.#lightProfileArray;\n }\n\n static #lightProfileArray = null;\n\n /** Packs #records into the 48-byte-per-light buffer per the contract layout. */\n #Pack()\n {\n const count = Math.min(this.#records.length, LIGHT_BUFFER_SIZE);\n for (let i = 0; i < count; i++)\n {\n const record = this.#records[i];\n const f = i * FLOATS_PER_LIGHT;\n\n // Texel 0: position + radius, four f32.\n this.#packed[f] = record.position[0];\n this.#packed[f + 1] = record.position[1];\n this.#packed[f + 2] = record.position[2];\n this.#packed[f + 3] = record.radius;\n\n // Texel 1: colour (premultiplied at Add time) + the packed word -\n // innerRadius f16 low, flags u16 high with the biased profile slot in\n // bits 4-15 (contract §\"The packed flag word\").\n this.#packed[f + 4] = record.color[0];\n this.#packed[f + 5] = record.color[1];\n this.#packed[f + 6] = record.color[2];\n const flagsWord = (record.flags & 0xF) | (this.#ProfileSlot(record.lightProfile) << 4);\n this.#packedBits[f + 7] = toHalf(record.innerRadius) | ((flagsWord & 0xFFFF) << 16);\n\n // Texel 2: direction as three f16, projectionPlaneDistance, the two\n // angles, then the shadow union (h:70-84, MSVC low-bit-first layout:\n // bits 0-1 padding, 2-11 scale, 12-21 offsetX, 22-31 offsetY; the\n // raytraced mask shares the word - the paths are exclusive by\n // quality). All zeros under the shipping pin, exactly as before.\n this.#packedBits[f + 8] = toHalf(record.direction[0]) | (toHalf(record.direction[1]) << 16);\n this.#packedBits[f + 9] = toHalf(record.direction[2]) | (toHalf(record.projectionPlaneDistance) << 16);\n this.#packedBits[f + 10] = toHalf(record.outerAngle) | (toHalf(record.innerAngle) << 16);\n this.#packedBits[f + 11] = this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_RAYTRACED\n ? (record.raytracingShadowMask ?? 0) & 0xFFFF\n : (((record.shadowMapScale ?? 0) & 0x3FF) << 2)\n | (((record.shadowMapOffsetX ?? 0) & 0x3FF) << 12)\n | (((record.shadowMapOffsetY ?? 0) & 0x3FF) << 22);\n }\n this.#packedCount = count;\n }\n}\n"],"names":["LIGHT_BUFFER_SIZE","CUTOFF_PIXEL_SIZE","FADE_SIZE","MAX_NUM_VOLUMETRIC_LIGHTS","MAX_NUM_SHADOWCASTING_LIGHTS","HIGH_QUALITY_ATLAS_SIZE_LOG2","HIGH_QUALITY_ATLAS_ENTRY_MAX_SIZE","INFINITE_SIZE_CLAMP","FLOATS_PER_LIGHT","align","value","alignment","calculateShadowMapAtlasSettings","shadowQuality","settings","actualTextureSize","sizeLog2","size","entryMinSizeLog2","entryMinSize","entryInverseScaleFactorLog2","entryMaxSize","ShadowQuality","SHADOW_DISABLED","SHADOW_RAYTRACED","SHADOW_LOW","SHADOW_HIGH","toHalf","num","toHalfFloat","_Tr2LightManager","_identity","Tr2LightManager","CjsModel","e","_initProto","_initStatic","c","_initClass","_applyDecs","type","define","className","family","carbon","method","impl","implemented","adapted","reason","custom","atlasSettings","atlasNodes","qualityUsedByAtlas","Map","Float32Array","Uint32Array","buffer","areLightFlagsValid","flags","Flags","AFFECTS_SURFACES","AFFECTS_PARTICLES","SetShadowQuality","quality","frameCounter","Number","useDynamicLightsShadows","clamped","Math","min","GetShadowMapAtlasSettings","GetUnpackedShadowMapData","record","out","shift","shadowMapScale","shadowMapOffsetX","shadowMapOffsetY","Clear","_renderContext","length","SetFrustum","frustum","AdjustLightCutoff","lodFactor","AddPointLight","position","radius","color","innerRadius","DEFAULT","brightness","max","dimming","scale","push","owner","lightData","lightProfile","lightType","vec3","fromValues","direction","outerAngle","innerAngle","projectionPlaneDistance","AddLight","usingShadowMap","CASTS_SHADOWS","ResolveLightData","volumetric","i","IS_VOLUMETRIC","sort","a","b","#ResolveShadowCasters","lightTuples","sizeAcross","GetPixelSizeAccrossEst","isFinite","lightIndex","raytraced","numShadowCastingLights","raytracingShadowMask","#CreateShadowMapAtlas","entry","x","y","everythingFit","j","children","width","height","#GetShadowMapAtlasEntry","nodeId","#InsertAtlasNode","node","newNode","child0","child1","deltaWidth","deltaHeight","GetCurrentSpaceSceneShadowQuality","GetLightData","GetVolumetricLights","GetShadowCastingLights","GetLightBufferData","subarray","GetLightCount","GetDataRevision","#CullAndDim","IsSphereVisible","GetPixelSizeAccross","#ScreenSize","#ProfileSlot","profile","GetTextureIndex","index","RegisterProfileElement","payload","GetPayload","samples","element","getLightProfileArray","AddElement","IsValid","GetElementIndex","slot","get","undefined","set","Tr2TextureArray","#Pack","count","f","flagsWord","Object","freeze","LIGHT_BUFFER_NAME","LIGHT_INDEX_BUFFER_NAME","constructor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tr2LightManager.js","sources":["../../../../../src/trinity/core/lighting/Tr2LightManager.js"],"sourcesContent":["// Source: trinity/trinity/Tr2LightManager.h + Tr2LightManager.cpp\n//\n// The local-light manager: collects per-light records from every\n// ITr2LightOwner during the scene gather, culls and premultiplies them,\n// selects the volumetric set, and owns the PACKED light buffer bytes the\n// abstraction layer uploads. Description-building throughout - under the\n// engine-means-AL vocabulary (docs c5a4b66) everything here is Trinity's;\n// only realizing LightBuffer/LightIndexBuffer into device objects, the\n// tiling compute dispatch, the shadow atlas textures and the raytraced\n// path are the AL's, and all of those are deferred below.\n//\n// SHIPPING BEHAVIOUR PIN: Carbon ships with g_useDynamicLightsShadows =\n// false (cpp:21-22, a TRI_REGISTER_SETTING - runtime-mutable, hence the\n// static below rather than a constant). With it false, ResolveLightData\n// returns after the volumetric pass (cpp:568-571) and AddLight always\n// strips FLAG_CASTS_SHADOWS (cpp:359-365). The caster/atlas CPU half IS\n// ported (settings derivation, guillotine packer, five-pass fit, packed\n// 10-bit offsets) and sits behind the same setting; only its GPU\n// realization (the pooled D32 atlas texture, cpp:703-706) stays the\n// abstraction layer's.\n//\n// Carbon's thread-local gather vectors (safe under Tr2ParallelFor,\n// EveSpaceScene.cpp:1410) collapse to one array: the JS gather is\n// sequential. Carbon's file-static singleton (GetOrCreateInstance) is NOT\n// ported - the runtime injects a manager into GatherLights, which is the\n// shape every call site and test already has.\n//\n// docs/contracts/carbon-light-data.md owns the PerLightData layout, the\n// packed flag word, the premultiply and the fade band; the packing below\n// cites it rather than re-deriving it.\n\nimport { CjsModel } from \"#model\";\nimport { carbon, impl, type } from \"#schema\";\nimport { num } from \"#math/num\";\nimport { vec3 } from \"#math/vec3\";\nimport { ShadowQuality } from \"../../generated/trinityCore/enums.js\";\nimport { Tr2TextureArray } from \"../Tr2TextureArray/index.js\";\n\n// Tr2LightManager.cpp:30-48 - copied verbatim; the buffer sizes are the ABI\n// the AL uploads against.\nconst LIGHT_BUFFER_SIZE = 1024;\nconst CUTOFF_PIXEL_SIZE = 7;\nconst FADE_SIZE = 5;\nconst MAX_NUM_VOLUMETRIC_LIGHTS = 16;\nconst MAX_NUM_SHADOWCASTING_LIGHTS = 16;\nconst HIGH_QUALITY_ATLAS_SIZE_LOG2 = 14;\nconst HIGH_QUALITY_ATLAS_ENTRY_MAX_SIZE = 1 << 13;\nconst INFINITE_SIZE_CLAMP = 1 << 14; // 1 << HIGH_QUALITY_ATLAS_SIZE_LOG2\nconst FLOATS_PER_LIGHT = 12; // 48 bytes / 3 RGBA32 texels\n\n/** CCP_ALIGN: round up to a power-of-two alignment. */\nfunction align(value, alignment)\n{\n return (value + alignment - 1) & ~(alignment - 1);\n}\n\n/**\n * Carbon's anonymous-namespace CalculateShadowMapAtlasSettings (cpp:92-122).\n *\n * Ported branch for branch, including the SHADOW_RAYTRACED quirk: it zeroes\n * with SHADOW_DISABLED but then re-enters the != DISABLED block, so\n * `entryMinSizeLog2 = 0 - 10` wraps unsigned (4294967286) and\n * `1 << entryMinSizeLog2` shifts by that count. MSVC x86 masks the shift\n * count by 31 and SO DOES JavaScript's << - writing the arithmetic plainly\n * reproduces Carbon's shipping behaviour exactly (entryMinSize 1<<22,\n * entryMaxSize 8192 >> 14 = 0).\n *\n * @param {number} shadowQuality ShadowQuality ordinal.\n * @returns {object} ShadowMapAtlasSettings (actualTextureSize starts 0).\n */\nfunction calculateShadowMapAtlasSettings(shadowQuality)\n{\n const settings = {\n actualTextureSize: 0,\n sizeLog2: 0,\n size: 0,\n entryMinSizeLog2: 0,\n entryMinSize: 0,\n entryInverseScaleFactorLog2: 0,\n entryMaxSize: 0\n };\n switch (shadowQuality)\n {\n case ShadowQuality.SHADOW_DISABLED:\n case ShadowQuality.SHADOW_RAYTRACED:\n break;\n case ShadowQuality.SHADOW_LOW:\n settings.sizeLog2 = HIGH_QUALITY_ATLAS_SIZE_LOG2 - 2;\n break;\n case ShadowQuality.SHADOW_HIGH:\n settings.sizeLog2 = HIGH_QUALITY_ATLAS_SIZE_LOG2;\n break;\n }\n if (shadowQuality !== ShadowQuality.SHADOW_DISABLED)\n {\n settings.size = 1 << settings.sizeLog2;\n settings.entryMinSizeLog2 = (settings.sizeLog2 - 10) >>> 0;\n settings.entryMinSize = 1 << settings.entryMinSizeLog2;\n settings.entryInverseScaleFactorLog2 = HIGH_QUALITY_ATLAS_SIZE_LOG2 - settings.sizeLog2;\n settings.entryMaxSize = HIGH_QUALITY_ATLAS_ENTRY_MAX_SIZE >> settings.entryInverseScaleFactorLog2;\n }\n return settings;\n}\n\n// Carbon packs these halves through Float_16(...) (Tr2LightManager.cpp:297,\n// :328-329), which rounds to nearest. num.toHalfFloat is the runtime's one\n// half codec and rounds identically for every in-range value; an earlier\n// file-local encoder here TRUNCATED, a 1-ulp divergence from Carbon,\n// removed 2026-09-08.\nconst toHalf = num.toHalfFloat;\n\n/** Owns the frame's local-light records, their selection, and the packed light-buffer bytes the abstraction layer uploads. */\n@type.define({ className: \"Tr2LightManager\", family: \"trinityCore\" })\nexport class Tr2LightManager extends CjsModel\n{\n\n // Carbon m_lightData after the TLS flatten: the frame's accepted records,\n // plain-object copies (every producer reuses a static scratch record, so\n // AddLight copies by value exactly as std::vector::push_back does).\n #records = [];\n\n // Carbon m_volumetricLights / m_shadowCastingLights: indices into #records.\n #volumetricLights = [];\n\n #shadowCastingLights = [];\n\n // Carbon m_frustum, by reference (SetFrustum copies by value in C++; the\n // stamped frame frustum is not mutated during the gather, so a reference\n // carries the same guarantee here).\n #frustum = null;\n\n // Carbon m_adjustedCutoff (cpp:249-252).\n #adjustedCutoff = CUTOFF_PIXEL_SIZE;\n\n // Carbon m_currentSpaceSceneShadowQuality (h:197).\n #currentSpaceSceneShadowQuality = ShadowQuality.SHADOW_DISABLED;\n\n // Carbon nextFrameShadowQuality (h:196) - a bitmask collecting every\n // scene's requested quality during the current frame.\n #nextFrameShadowQuality = 0;\n\n // Carbon m_currentFrameCounter (h:198; ctor sets -1, cpp:164).\n #currentFrameCounter = -1;\n\n // Carbon's anonymous m_ShadowMap block (h:200-205): the atlas settings,\n // the guillotine node tree, and the quality the atlas was last sized for.\n #shadowMap = {\n atlasSettings: calculateShadowMapAtlasSettings(ShadowQuality.SHADOW_DISABLED),\n atlasNodes: [],\n qualityUsedByAtlas: ShadowQuality.SHADOW_DISABLED\n };\n\n // Non-Carbon: profile-object -> slice index, assigned on first sight. The\n // slot registry is description-side (Carbon assigns slices through the\n // manager-owned Tr2TextureArray, cpp:682-686, whose realization is AL).\n #profileSlots = new Map();\n\n // The packed PerLightData buffer (contract: 48 bytes / 3 RGBA32 texels per\n // light), built by ResolveLightData, uploaded by the AL.\n #packed = new Float32Array(LIGHT_BUFFER_SIZE * FLOATS_PER_LIGHT);\n\n #packedBits = new Uint32Array(this.#packed.buffer);\n\n #packedCount = 0;\n\n // Non-Carbon: bumped by ResolveLightData so the AL can skip re-uploads.\n #revision = 0;\n\n /** Tr2LightManager.h:100-105 - the light flag bits, Carbon's raw uint16 spelling. */\n static Flags = Object.freeze({\n AFFECTS_SURFACES: 1,\n AFFECTS_PARTICLES: 1 << 1,\n CASTS_SHADOWS: 1 << 2,\n IS_VOLUMETRIC: 1 << 3,\n DEFAULT: 1\n });\n\n /** The variable-store names the AL binds the packed buffers under\n * (Tr2LightManager.h:46-47; both isAutoregister). The NAMES are Trinity's\n * contract; the variables are the AL's to create. */\n static LIGHT_BUFFER_NAME = \"LightBuffer\";\n\n static LIGHT_INDEX_BUFFER_NAME = \"LightIndexBuffer\";\n\n /**\n * Carbon g_useDynamicLightsShadows (cpp:21-22) - a TRI_REGISTER_SETTING,\n * i.e. a runtime-mutable setting rather than a compile constant, shipped\n * FALSE. The whole shadow-caster/atlas half sits behind it; flipping it\n * exercises the ported path (the tests do), and shipping behaviour is\n * unchanged while it stays false.\n */\n static useDynamicLightsShadows = false;\n\n /** The atlas-settings derivation, exposed for tests (Carbon cpp:92-122). */\n static calculateShadowMapAtlasSettings = calculateShadowMapAtlasSettings;\n\n /**\n * Carbon Tr2LightManager::AreLightFlagsValid (cpp:677-680): a light must\n * affect surfaces or particles to exist at all.\n */\n @carbon.method\n @impl.implemented\n static areLightFlagsValid(flags)\n {\n return (flags & (Tr2LightManager.Flags.AFFECTS_SURFACES | Tr2LightManager.Flags.AFFECTS_PARTICLES)) !== 0;\n }\n\n /**\n * Carbon SetShadowQuality (cpp:262-295), the full body: record the\n * scene's quality, collapse the previous frame's quality bitmask into\n * qualityUsedByAtlas on a frame change (HIGH beats LOW beats DISABLED),\n * and recompute the atlas settings for min(requested, atlas quality)\n * with actualTextureSize taken from the atlas quality - multiple scenes\n * may request different qualities in one frame and the texture must fit\n * the largest.\n */\n @carbon.method\n @impl.implemented\n SetShadowQuality(quality, frameCounter = 0)\n {\n const shadowQuality = Number(quality) || 0;\n this.#currentSpaceSceneShadowQuality = shadowQuality;\n\n if (this.#currentFrameCounter !== frameCounter)\n {\n if (!Tr2LightManager.useDynamicLightsShadows)\n {\n this.#nextFrameShadowQuality = 0;\n }\n\n if (this.#nextFrameShadowQuality & (1 << ShadowQuality.SHADOW_HIGH))\n {\n this.#shadowMap.qualityUsedByAtlas = ShadowQuality.SHADOW_HIGH;\n }\n else if (this.#nextFrameShadowQuality & (1 << ShadowQuality.SHADOW_LOW))\n {\n this.#shadowMap.qualityUsedByAtlas = ShadowQuality.SHADOW_LOW;\n }\n else\n {\n this.#shadowMap.qualityUsedByAtlas = ShadowQuality.SHADOW_DISABLED;\n }\n this.#nextFrameShadowQuality = 1 << shadowQuality;\n this.#currentFrameCounter = frameCounter;\n }\n\n this.#nextFrameShadowQuality |= 1 << shadowQuality;\n\n const clamped = Math.min(shadowQuality, this.#shadowMap.qualityUsedByAtlas);\n this.#shadowMap.atlasSettings = calculateShadowMapAtlasSettings(clamped);\n this.#shadowMap.atlasSettings.actualTextureSize =\n calculateShadowMapAtlasSettings(this.#shadowMap.qualityUsedByAtlas).size;\n }\n\n /** Carbon GetShadowMapAtlasSettings (cpp:708-711). */\n @carbon.method\n @impl.implemented\n GetShadowMapAtlasSettings()\n {\n return this.#shadowMap.atlasSettings;\n }\n\n /**\n * Carbon GetUnpackedShadowMapData (cpp:810-815): the packed 10-bit\n * offsets/scale back into texels via the entry-min-size shift.\n *\n * @param {object} record A light record carrying the packed fields.\n * @param {object} [out] Receives scale/offsetX/offsetY.\n * @returns {object} out\n */\n @carbon.method\n @impl.implemented\n GetUnpackedShadowMapData(record, out = {})\n {\n const shift = this.#shadowMap.atlasSettings.entryMinSizeLog2;\n out.shadowMapScale = (record.shadowMapScale ?? 0) << shift;\n out.shadowMapOffsetX = (record.shadowMapOffsetX ?? 0) << shift;\n out.shadowMapOffsetY = (record.shadowMapOffsetY ?? 0) << shift;\n return out;\n }\n\n /**\n * Carbon Clear (cpp:220-242), the CPU half: drops the frame's records and\n * selections. The index-buffer UAV clear (cpp:224) is device work the AL\n * performs when it consumes the frame.\n */\n @carbon.method\n @impl.adapted\n @impl.reason(\"ClearLightIndices' UAV clear is AL realization; the vector clears are ported. The render-context parameter is accepted for signature parity and unused.\")\n Clear(_renderContext = null)\n {\n this.#records.length = 0;\n this.#volumetricLights.length = 0;\n this.#shadowCastingLights.length = 0;\n }\n\n /** Carbon SetFrustum (cpp:244-247). */\n @carbon.method\n @impl.implemented\n SetFrustum(frustum)\n {\n this.#frustum = frustum ?? null;\n }\n\n /** Carbon AdjustLightCutoff (cpp:249-252): the cull threshold is 7px * lodFactor. */\n @carbon.method\n @impl.implemented\n AdjustLightCutoff(lodFactor)\n {\n this.#adjustedCutoff = CUTOFF_PIXEL_SIZE * (Number(lodFactor) || 0);\n }\n\n /**\n * Carbon AddPointLight (cpp:297-332): authors a record from scratch, in\n * Carbon's exact order - flags gate, brightness gate, frustum cull, pixel\n * cutoff, premultiply+fade, defaults for everything a caller cannot\n * supply. The direction default is (1,0,0), never zero - a zero direction\n * is a legal bit pattern the shader normalises into NaN (contract §\"third\n * texel\").\n */\n @carbon.method\n @impl.implemented\n AddPointLight(position, radius, color, innerRadius = 0, flags = Tr2LightManager.Flags.DEFAULT)\n {\n if (!Tr2LightManager.areLightFlagsValid(flags)) return;\n\n const brightness = Math.max(color[0], color[1], color[2]);\n if (!(brightness > 0)) return;\n\n const dimming = this.#CullAndDim(position, radius);\n if (dimming <= 0) return;\n\n const scale = radius * dimming;\n this.#records.push({\n owner: null,\n lightData: null,\n lightProfile: null,\n lightType: 0,\n position: vec3.fromValues(position[0], position[1], position[2]),\n direction: vec3.fromValues(1, 0, 0),\n color: vec3.fromValues(color[0] * scale, color[1] * scale, color[2] * scale),\n radius,\n innerRadius,\n flags,\n outerAngle: 0,\n innerAngle: 0,\n projectionPlaneDistance: 0\n });\n }\n\n /**\n * Carbon AddLight (cpp:334-368): takes a caller-built record, applies the\n * same gates, premultiplies, and - faithfully - MUTATES the caller's\n * record in place where Carbon does (the shadow-flag strip on the non-const\n * reference, cpp:359-365; always taken under the shipping pin). The stored\n * record is a by-value copy: every producer reuses a static scratch record,\n * exactly as Carbon's std::vector push copies.\n */\n @carbon.method\n @impl.implemented\n AddLight(record)\n {\n if (!Tr2LightManager.areLightFlagsValid(record.flags)) return;\n\n const brightness = Math.max(record.color[0], record.color[1], record.color[2]);\n if (!(brightness > 0) || !(record.radius > 0)) return;\n\n const dimming = this.#CullAndDim(record.position, record.radius);\n if (dimming <= 0) return;\n\n // Carbon's conditional strip (cpp:359-365): shadows survive only when\n // the setting is on, the scene quality is not DISABLED, and a shadow-map\n // quality has an atlas actually sized for it (qualityUsedByAtlas lags a\n // frame behind). Always taken under the shipping default.\n const usingShadowMap = this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_LOW\n || this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_HIGH;\n if (this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_DISABLED\n || (usingShadowMap && this.#shadowMap.qualityUsedByAtlas === ShadowQuality.SHADOW_DISABLED)\n || !Tr2LightManager.useDynamicLightsShadows)\n {\n record.flags &= ~Tr2LightManager.Flags.CASTS_SHADOWS;\n }\n\n const scale = record.radius * dimming;\n this.#records.push({\n owner: record.owner ?? null,\n lightData: record.lightData ?? null,\n lightProfile: record.lightProfile ?? null,\n lightType: record.lightType ?? 0,\n position: vec3.fromValues(record.position[0], record.position[1], record.position[2]),\n direction: vec3.fromValues(record.direction[0], record.direction[1], record.direction[2]),\n color: vec3.fromValues(record.color[0] * scale, record.color[1] * scale, record.color[2] * scale),\n radius: record.radius,\n innerRadius: record.innerRadius ?? 0,\n flags: record.flags,\n outerAngle: record.outerAngle ?? 0,\n innerAngle: record.innerAngle ?? 0,\n projectionPlaneDistance: record.projectionPlaneDistance ?? 0\n });\n }\n\n /**\n * Carbon ResolveLightData (cpp:520-620): the TLS flatten is a no-op here\n * (one array), the volumetric top-16 selection runs exactly as Carbon's -\n * including clearing IS_VOLUMETRIC on the losers so shader and CPU agree -\n * then the shadow-caster half (ported in full, gated by the same\n * useDynamicLightsShadows setting Carbon ships false), then the packed\n * buffer: byte layout per the contract, profile slots biased by one into\n * flag bits 4-15, the shadow union in word 11.\n */\n @carbon.method\n @impl.implemented\n ResolveLightData()\n {\n const volumetric = [];\n for (let i = 0; i < this.#records.length; i++)\n {\n if (this.#records[i].flags & Tr2LightManager.Flags.IS_VOLUMETRIC)\n {\n const size = this.#ScreenSize(this.#records[i]);\n volumetric.push([ i, Math.min(size, INFINITE_SIZE_CLAMP) ]);\n }\n }\n volumetric.sort((a, b) => b[1] - a[1]);\n\n this.#volumetricLights.length = 0;\n for (let i = 0; i < volumetric.length; i++)\n {\n if (i < MAX_NUM_VOLUMETRIC_LIGHTS) this.#volumetricLights.push(volumetric[i][0]);\n else this.#records[volumetric[i][0]].flags &= ~Tr2LightManager.Flags.IS_VOLUMETRIC;\n }\n\n this.#ResolveShadowCasters();\n\n this.#Pack();\n this.#revision += 1;\n }\n\n /**\n * Carbon's shadow-caster half of ResolveLightData (cpp:568-620): the\n * useDynamicLightsShadows/DISABLED early-out (Carbon ships with the\n * setting FALSE - it is a TRI_REGISTER_SETTING, hence a mutable static\n * here rather than a constant), then filter casters by flag, estimate\n * screen size (Carbon's FLT_MAX inside-the-sphere sentinel clamps to the\n * high-quality atlas size), sort descending, keep the largest sixteen,\n * strip FLAG_CASTS_SHADOWS from the losers, assign raytracing masks by\n * rank under SHADOW_RAYTRACED, and pack the atlas for LOW/HIGH.\n */\n #ResolveShadowCasters()\n {\n this.#shadowCastingLights.length = 0;\n if (!Tr2LightManager.useDynamicLightsShadows\n || this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_DISABLED)\n {\n return;\n }\n\n const lightTuples = [];\n for (let i = 0; i < this.#records.length; i++)\n {\n if ((this.#records[i].flags & Tr2LightManager.Flags.CASTS_SHADOWS) !== 0)\n {\n let sizeAcross = this.#frustum\n ? this.#frustum.GetPixelSizeAccrossEst(this.#records[i].position, this.#records[i].radius)\n : 0;\n if (!Number.isFinite(sizeAcross)) sizeAcross = 1 << HIGH_QUALITY_ATLAS_SIZE_LOG2;\n lightTuples.push({ lightIndex: i, sizeAcross });\n }\n }\n\n lightTuples.sort((a, b) => b.sizeAcross - a.sizeAcross);\n\n const raytraced = this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_RAYTRACED;\n const numShadowCastingLights = Math.min(MAX_NUM_SHADOWCASTING_LIGHTS, lightTuples.length);\n let i = 0;\n for (; i < numShadowCastingLights; i++)\n {\n this.#shadowCastingLights.push(lightTuples[i].lightIndex);\n if (raytraced)\n {\n this.#records[lightTuples[i].lightIndex].raytracingShadowMask = 1 << i;\n }\n }\n for (; i < lightTuples.length; i++)\n {\n const record = this.#records[lightTuples[i].lightIndex];\n record.flags &= ~Tr2LightManager.Flags.CASTS_SHADOWS;\n if (raytraced)\n {\n record.raytracingShadowMask = 0;\n }\n }\n\n if (this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_LOW\n || this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_HIGH)\n {\n this.#CreateShadowMapAtlas(numShadowCastingLights, lightTuples);\n }\n }\n\n /**\n * Carbon CreateShadowMapAtlas (cpp:442-508): five fitting passes, each\n * halving entryMaxSize and incrementing the inverse-scale shift; entry\n * MIN size never scales. A failing pass still inserts every remaining\n * light before retrying. Point lights (innerAngle <= 0) take a 3x2\n * cube-cross, spots a square. Successful entries pack their offsets and\n * scale in entry-min-size units into the record's 10-bit fields; failures\n * zero them.\n */\n #CreateShadowMapAtlas(numShadowCastingLights, lightTuples)\n {\n const settings = this.#shadowMap.atlasSettings;\n const entry = { x: 0, y: 0 };\n let everythingFit = false;\n for (let j = 0; j < 5 && !everythingFit; j++)\n {\n everythingFit = true;\n const entryInverseScaleFactorLog2 = settings.entryInverseScaleFactorLog2 + j;\n const entryMaxSize = settings.entryMaxSize >> j;\n\n this.#shadowMap.atlasNodes.length = 0;\n this.#shadowMap.atlasNodes.push({\n children: [ -1, -1 ],\n lightIndex: -1,\n x: 0,\n y: 0,\n width: settings.size,\n height: settings.size\n });\n\n for (let i = 0; i < numShadowCastingLights; i++)\n {\n const lightIndex = lightTuples[i].lightIndex;\n const record = this.#records[lightIndex];\n\n let size = (lightTuples[i].sizeAcross >>> 0) >>> entryInverseScaleFactorLog2;\n size = Math.min(Math.max(size, settings.entryMinSize), entryMaxSize);\n size = align(size, settings.entryMinSize);\n\n let width, height;\n if (record.innerAngle <= 0)\n {\n // pointlight: a 3x2 cube-face cross\n width = 3 * size;\n height = 2 * size;\n }\n else\n {\n // spotlight\n width = size;\n height = size;\n }\n\n if (this.#GetShadowMapAtlasEntry(lightIndex, width, height, entry))\n {\n record.shadowMapOffsetX = entry.x >>> settings.entryMinSizeLog2;\n record.shadowMapOffsetY = entry.y >>> settings.entryMinSizeLog2;\n record.shadowMapScale = size >>> settings.entryMinSizeLog2;\n }\n else\n {\n record.shadowMapOffsetX = 0;\n record.shadowMapOffsetY = 0;\n record.shadowMapScale = 0;\n everythingFit = false;\n }\n }\n }\n }\n\n /**\n * Carbon GetShadowMapAtlasEntry (cpp:790-808): align the request to the\n * entry min size, insert from the root, and report position ONLY on\n * success - the out object is untouched on failure, exactly as Carbon\n * leaves its out-references.\n */\n #GetShadowMapAtlasEntry(lightIndex, width, height, out)\n {\n const settings = this.#shadowMap.atlasSettings;\n width = align(width, settings.entryMinSize);\n height = align(height, settings.entryMinSize);\n\n const nodeId = this.#InsertAtlasNode(this.#shadowMap.atlasNodes, 0, lightIndex, width, height);\n if (nodeId !== -1)\n {\n out.x = this.#shadowMap.atlasNodes[nodeId].x;\n out.y = this.#shadowMap.atlasNodes[nodeId].y;\n }\n return nodeId !== -1;\n }\n\n /**\n * Carbon InsertAtlasNode (cpp:718-788) - the blackpawn.com guillotine\n * packer, ported branch for branch: descend into split nodes (first\n * child, then second), reject occupied or too-small leaves, claim exact\n * fits, otherwise split along the larger remainder axis and recurse into\n * the first child.\n */\n #InsertAtlasNode(atlasNodes, nodeId, lightIndex, width, height)\n {\n const node = atlasNodes[nodeId];\n if (node.children[0] !== -1 || node.children[1] !== -1)\n {\n const newNode = this.#InsertAtlasNode(atlasNodes, node.children[0], lightIndex, width, height);\n if (newNode !== -1)\n {\n return newNode;\n }\n return this.#InsertAtlasNode(atlasNodes, node.children[1], lightIndex, width, height);\n }\n\n if (node.lightIndex !== -1)\n {\n return -1;\n }\n if (node.width < width || node.height < height)\n {\n return -1;\n }\n if (node.width === width && node.height === height)\n {\n node.lightIndex = lightIndex;\n return nodeId;\n }\n\n const child0 = { children: [ -1, -1 ], lightIndex: -1, x: 0, y: 0, width: 0, height: 0 };\n const child1 = { children: [ -1, -1 ], lightIndex: -1, x: 0, y: 0, width: 0, height: 0 };\n atlasNodes.push(child0, child1);\n node.children[0] = atlasNodes.length - 2;\n node.children[1] = atlasNodes.length - 1;\n\n const deltaWidth = node.width - width;\n const deltaHeight = node.height - height;\n\n if (deltaWidth > deltaHeight)\n {\n child0.x = node.x;\n child0.y = node.y;\n child0.width = width;\n child0.height = node.height;\n child1.x = node.x + width;\n child1.y = node.y;\n child1.width = node.width - width;\n child1.height = node.height;\n }\n else\n {\n child0.x = node.x;\n child0.y = node.y;\n child0.width = node.width;\n child0.height = height;\n child1.x = node.x;\n child1.y = node.y + height;\n child1.width = node.width;\n child1.height = node.height - height;\n }\n\n return this.#InsertAtlasNode(atlasNodes, node.children[0], lightIndex, width, height);\n }\n\n /** Carbon GetCurrentSpaceSceneShadowQuality (cpp:713-716): a bare field read; every record producer asks it before building. */\n @carbon.method\n @impl.implemented\n GetCurrentSpaceSceneShadowQuality()\n {\n return this.#currentSpaceSceneShadowQuality;\n }\n\n /** Carbon GetLightData (cpp:695-698): the frame's resolved records, borrowed. */\n @carbon.method\n @impl.implemented\n GetLightData()\n {\n return this.#records;\n }\n\n /** Carbon GetVolumetricLights (cpp:707-710): indices into GetLightData, borrowed. */\n @carbon.method\n @impl.implemented\n GetVolumetricLights()\n {\n return this.#volumetricLights;\n }\n\n /** Carbon GetShadowCastingLights (cpp:688-691): empty under the shipping pin, kept for signature parity. */\n @carbon.method\n @impl.implemented\n GetShadowCastingLights()\n {\n return this.#shadowCastingLights;\n }\n\n // The frame clock used to be threaded through here, as a non-Carbon seam:\n // the packed sets needed it for curve sampling and the manager was the one\n // object every GetLights implementation already received. Carbon's sets read\n // the renderer's clock, which is `gTriDev->GetAnimationTime()`, and they do\n // that here now. Nothing in src ever called the setter, so the five readers\n // had been sampling a constant zero.\n\n /** The packed PerLightData bytes for the AL to upload, borrowed (contract layout, 3 RGBA32 texels per light). */\n @impl.custom\n @impl.reason(\"AL seam: Trinity owns the packed description bytes; the AL realizes LightBuffer from this view. Carbon has no such seam; Tr2DataTextureManager now writes its own texture, so this has no precedent.\")\n GetLightBufferData()\n {\n return this.#packed.subarray(0, this.#packedCount * FLOATS_PER_LIGHT);\n }\n\n /** The number of packed lights in GetLightBufferData. */\n @impl.custom\n @impl.reason(\"AL seam companion to GetLightBufferData.\")\n GetLightCount()\n {\n return this.#packedCount;\n }\n\n /** Monotonic revision of the packed data, bumped by ResolveLightData, so the AL can skip unchanged re-uploads. */\n @impl.custom\n @impl.reason(\"Non-Carbon extension: cheaper than the AL diffing a typed array; Carbon re-uploads unconditionally.\")\n GetDataRevision()\n {\n return this.#revision;\n }\n\n /** Frustum cull + pixel-size cutoff, returning the fade-band dimming factor (0 = rejected). Cull applies only when a frustum was set. */\n #CullAndDim(position, radius)\n {\n if (!this.#frustum) return 1;\n if (!this.#frustum.IsSphereVisible(position, radius)) return 0;\n const size = this.#frustum.GetPixelSizeAccross(position, radius);\n if (!(size > this.#adjustedCutoff)) return 0;\n // Contract §\"Colour carries the radius\": the fade band sits ABOVE the\n // cutoff - absent at the cutoff, full brightness FADE_SIZE above it.\n return Math.min((size - this.#adjustedCutoff) / FADE_SIZE, 1);\n }\n\n /**\n * Returns the light's projected pixel size, or its radius when no frustum is\n * set.\n */\n #ScreenSize(record)\n {\n if (!this.#frustum) return record.radius;\n return this.#frustum.GetPixelSizeAccross(record.position, record.radius);\n }\n\n /**\n * The slice a profile occupies, +1 biased so 0 means \"no profile\"\n * (Tr2Light.cpp:137: `m_lightProfile ? GetTextureIndex() + 1 : 0`).\n *\n * The index comes from the RESOURCE (`GetTextureIndex`, the texture-array\n * slice - stable, shared across managers, reused after release), never\n * from an invented per-manager counter: Carbon assigns slices through the\n * process-wide light profile array (cpp:682-686), and a manager-local\n * numbering diverges from what the shader samples the moment two managers\n * or a released slot exist. A profile carrying a baked payload but no\n * slice yet is registered here - Carbon does this in the resource's\n * DoPrepare (Tr2LightProfileRes.cpp:95-99), which the layering forbids\n * (resource cannot import trinity), so the manager performs it at the\n * first pack instead; same array, same first-fit slot, one seam later.\n * The first-sight map remains only for foreign profile objects that\n * expose no GetTextureIndex.\n */\n #ProfileSlot(profile)\n {\n if (!profile) return 0;\n if (typeof profile.GetTextureIndex === \"function\")\n {\n let index = profile.GetTextureIndex();\n if (index < 0 && typeof profile.RegisterProfileElement === \"function\")\n {\n // Carbon hands the profile's m_bitmap to the array (Tr2LightProfileRes.cpp:95-99).\n const bitmap = profile.GetBitmap();\n if (bitmap.IsValid())\n {\n const element = Tr2LightManager.getLightProfileArray().AddElement(bitmap);\n if (element.IsValid())\n {\n profile.RegisterProfileElement(element);\n index = element.GetElementIndex();\n }\n }\n }\n return index >= 0 ? index + 1 : 0;\n }\n let slot = this.#profileSlots.get(profile);\n if (slot === undefined)\n {\n slot = this.#profileSlots.size;\n this.#profileSlots.set(profile, slot);\n }\n return slot + 1;\n }\n\n /**\n * The process-wide light profile array (Tr2LightManager.cpp:682-686).\n *\n * Carbon's is a function-local static that deliberately survives manager\n * destruction (ResetVariableStore re-registers the SAME live array,\n * cpp:186) - so under instance-per-scene managers this stays a class\n * static: two scenes share slices, and a profile's texture index means\n * the same thing everywhere. Realizing it as a GPU texture array is the\n * abstraction layer's job; consumers poll GetRevision or subscribe via\n * OnTextureChange.\n *\n * @returns {Tr2TextureArray} The shared profile array.\n */\n static getLightProfileArray()\n {\n if (!Tr2LightManager.#lightProfileArray)\n {\n Tr2LightManager.#lightProfileArray = new Tr2TextureArray();\n }\n return Tr2LightManager.#lightProfileArray;\n }\n\n static #lightProfileArray = null;\n\n /** Packs #records into the 48-byte-per-light buffer per the contract layout. */\n #Pack()\n {\n const count = Math.min(this.#records.length, LIGHT_BUFFER_SIZE);\n for (let i = 0; i < count; i++)\n {\n const record = this.#records[i];\n const f = i * FLOATS_PER_LIGHT;\n\n // Texel 0: position + radius, four f32.\n this.#packed[f] = record.position[0];\n this.#packed[f + 1] = record.position[1];\n this.#packed[f + 2] = record.position[2];\n this.#packed[f + 3] = record.radius;\n\n // Texel 1: colour (premultiplied at Add time) + the packed word -\n // innerRadius f16 low, flags u16 high with the biased profile slot in\n // bits 4-15 (contract §\"The packed flag word\").\n this.#packed[f + 4] = record.color[0];\n this.#packed[f + 5] = record.color[1];\n this.#packed[f + 6] = record.color[2];\n const flagsWord = (record.flags & 0xF) | (this.#ProfileSlot(record.lightProfile) << 4);\n this.#packedBits[f + 7] = toHalf(record.innerRadius) | ((flagsWord & 0xFFFF) << 16);\n\n // Texel 2: direction as three f16, projectionPlaneDistance, the two\n // angles, then the shadow union (h:70-84, MSVC low-bit-first layout:\n // bits 0-1 padding, 2-11 scale, 12-21 offsetX, 22-31 offsetY; the\n // raytraced mask shares the word - the paths are exclusive by\n // quality). All zeros under the shipping pin, exactly as before.\n this.#packedBits[f + 8] = toHalf(record.direction[0]) | (toHalf(record.direction[1]) << 16);\n this.#packedBits[f + 9] = toHalf(record.direction[2]) | (toHalf(record.projectionPlaneDistance) << 16);\n this.#packedBits[f + 10] = toHalf(record.outerAngle) | (toHalf(record.innerAngle) << 16);\n this.#packedBits[f + 11] = this.#currentSpaceSceneShadowQuality === ShadowQuality.SHADOW_RAYTRACED\n ? (record.raytracingShadowMask ?? 0) & 0xFFFF\n : (((record.shadowMapScale ?? 0) & 0x3FF) << 2)\n | (((record.shadowMapOffsetX ?? 0) & 0x3FF) << 12)\n | (((record.shadowMapOffsetY ?? 0) & 0x3FF) << 22);\n }\n this.#packedCount = count;\n }\n}\n"],"names":["LIGHT_BUFFER_SIZE","CUTOFF_PIXEL_SIZE","FADE_SIZE","MAX_NUM_VOLUMETRIC_LIGHTS","MAX_NUM_SHADOWCASTING_LIGHTS","HIGH_QUALITY_ATLAS_SIZE_LOG2","HIGH_QUALITY_ATLAS_ENTRY_MAX_SIZE","INFINITE_SIZE_CLAMP","FLOATS_PER_LIGHT","align","value","alignment","calculateShadowMapAtlasSettings","shadowQuality","settings","actualTextureSize","sizeLog2","size","entryMinSizeLog2","entryMinSize","entryInverseScaleFactorLog2","entryMaxSize","ShadowQuality","SHADOW_DISABLED","SHADOW_RAYTRACED","SHADOW_LOW","SHADOW_HIGH","toHalf","num","toHalfFloat","_Tr2LightManager","_identity","Tr2LightManager","CjsModel","e","_initProto","_initStatic","c","_initClass","_applyDecs","type","define","className","family","carbon","method","impl","implemented","adapted","reason","custom","atlasSettings","atlasNodes","qualityUsedByAtlas","Map","Float32Array","Uint32Array","buffer","areLightFlagsValid","flags","Flags","AFFECTS_SURFACES","AFFECTS_PARTICLES","SetShadowQuality","quality","frameCounter","Number","useDynamicLightsShadows","clamped","Math","min","GetShadowMapAtlasSettings","GetUnpackedShadowMapData","record","out","shift","shadowMapScale","shadowMapOffsetX","shadowMapOffsetY","Clear","_renderContext","length","SetFrustum","frustum","AdjustLightCutoff","lodFactor","AddPointLight","position","radius","color","innerRadius","DEFAULT","brightness","max","dimming","scale","push","owner","lightData","lightProfile","lightType","vec3","fromValues","direction","outerAngle","innerAngle","projectionPlaneDistance","AddLight","usingShadowMap","CASTS_SHADOWS","ResolveLightData","volumetric","i","IS_VOLUMETRIC","sort","a","b","#ResolveShadowCasters","lightTuples","sizeAcross","GetPixelSizeAccrossEst","isFinite","lightIndex","raytraced","numShadowCastingLights","raytracingShadowMask","#CreateShadowMapAtlas","entry","x","y","everythingFit","j","children","width","height","#GetShadowMapAtlasEntry","nodeId","#InsertAtlasNode","node","newNode","child0","child1","deltaWidth","deltaHeight","GetCurrentSpaceSceneShadowQuality","GetLightData","GetVolumetricLights","GetShadowCastingLights","GetLightBufferData","subarray","GetLightCount","GetDataRevision","#CullAndDim","IsSphereVisible","GetPixelSizeAccross","#ScreenSize","#ProfileSlot","profile","GetTextureIndex","index","RegisterProfileElement","bitmap","GetBitmap","IsValid","element","getLightProfileArray","AddElement","GetElementIndex","slot","get","undefined","set","Tr2TextureArray","#Pack","count","f","flagsWord","Object","freeze","LIGHT_BUFFER_NAME","LIGHT_INDEX_BUFFER_NAME","constructor"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { IBlueDynamicResourceConstructor } from '#blue';
|
|
1
2
|
import { TriTextureRes } from '#resource';
|
|
2
3
|
import { RasterizeGradient, GradientPrefix } from './gradientTexture.js';
|
|
3
4
|
|
|
@@ -16,7 +17,7 @@ import { RasterizeGradient, GradientPrefix } from './gradientTexture.js';
|
|
|
16
17
|
* TriTextureRes is in the resource layer and cannot reach the curves - see the
|
|
17
18
|
* head comment of gradientTexture.js.
|
|
18
19
|
*/
|
|
19
|
-
class GradientTextureConstructor {
|
|
20
|
+
class GradientTextureConstructor extends IBlueDynamicResourceConstructor {
|
|
20
21
|
/**
|
|
21
22
|
* `IBlueDynamicResourceConstructor::GetResource` (GradientTexture.cpp:32-38).
|
|
22
23
|
*
|
|
@@ -27,8 +28,8 @@ class GradientTextureConstructor {
|
|
|
27
28
|
const path = GradientPrefix + query;
|
|
28
29
|
const texture = new TriTextureRes();
|
|
29
30
|
texture.Initialize(path, "");
|
|
30
|
-
const
|
|
31
|
-
if (!
|
|
31
|
+
const bitmap = RasterizeGradient(path);
|
|
32
|
+
if (!bitmap) {
|
|
32
33
|
// Carbon logs "Failed to parse dynamic:/gradient_1d/ texture path" (or the
|
|
33
34
|
// zero-width variant) and leaves the bitmap invalid, so the texture is
|
|
34
35
|
// never prepared.
|
|
@@ -38,7 +39,7 @@ class GradientTextureConstructor {
|
|
|
38
39
|
texture.SetError(error);
|
|
39
40
|
return texture;
|
|
40
41
|
}
|
|
41
|
-
texture.SetPayload(
|
|
42
|
+
texture.SetPayload(bitmap);
|
|
42
43
|
texture.MarkPrepared();
|
|
43
44
|
return texture;
|
|
44
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GradientTextureConstructor.js","sources":["../../../../../src/trinity/core/procedural/GradientTextureConstructor.js"],"sourcesContent":["// Source: trinity/trinity/Resources/Procedural/GradientTexture.cpp\n//\n// Carbon registers this constructor at static-initialisation time\n// (GradientTexture.cpp:26-44). As with RegisterShaderResources and\n// RegisterSolidColorTexture, registration here is an explicit composition call.\nimport { TriTextureRes } from \"#resource\";\nimport { GradientPrefix, RasterizeGradient } from \"./gradientTexture.js\";\n\n/**\n * Carbon's `GradientTextureConstructor`: builds the texture a\n * `dynamic:/gradient_1d/<query>` path names.\n *\n * Carbon's constructor only creates the resource and calls Initialize, which\n * rasterizes (TriTextureRes.cpp:223-229). Ours rasterizes here, because\n * TriTextureRes is in the resource layer and cannot reach the curves - see the\n * head comment of gradientTexture.js.\n */\nexport class GradientTextureConstructor\n{\n /**\n * `IBlueDynamicResourceConstructor::GetResource` (GradientTexture.cpp:32-38).\n *\n * @param {string} query Base64 text after `dynamic:/gradient_1d/`.\n * @returns {TriTextureRes} The texture resource, failed when the path is invalid.\n */\n GetResource(query)\n {\n const path = GradientPrefix + query;\n const texture = new TriTextureRes();\n texture.Initialize(path, \"\");\n\n const
|
|
1
|
+
{"version":3,"file":"GradientTextureConstructor.js","sources":["../../../../../src/trinity/core/procedural/GradientTextureConstructor.js"],"sourcesContent":["// Source: trinity/trinity/Resources/Procedural/GradientTexture.cpp\n//\n// Carbon registers this constructor at static-initialisation time\n// (GradientTexture.cpp:26-44). As with RegisterShaderResources and\n// RegisterSolidColorTexture, registration here is an explicit composition call.\nimport { IBlueDynamicResourceConstructor } from \"#blue\";\nimport { TriTextureRes } from \"#resource\";\nimport { GradientPrefix, RasterizeGradient } from \"./gradientTexture.js\";\n\n/**\n * Carbon's `GradientTextureConstructor`: builds the texture a\n * `dynamic:/gradient_1d/<query>` path names.\n *\n * Carbon's constructor only creates the resource and calls Initialize, which\n * rasterizes (TriTextureRes.cpp:223-229). Ours rasterizes here, because\n * TriTextureRes is in the resource layer and cannot reach the curves - see the\n * head comment of gradientTexture.js.\n */\nexport class GradientTextureConstructor extends IBlueDynamicResourceConstructor\n{\n /**\n * `IBlueDynamicResourceConstructor::GetResource` (GradientTexture.cpp:32-38).\n *\n * @param {string} query Base64 text after `dynamic:/gradient_1d/`.\n * @returns {TriTextureRes} The texture resource, failed when the path is invalid.\n */\n GetResource(query)\n {\n const path = GradientPrefix + query;\n const texture = new TriTextureRes();\n texture.Initialize(path, \"\");\n\n const bitmap = RasterizeGradient(path);\n if (!bitmap)\n {\n // Carbon logs \"Failed to parse dynamic:/gradient_1d/ texture path\" (or the\n // zero-width variant) and leaves the bitmap invalid, so the texture is\n // never prepared.\n const error = new Error(`Failed to parse ${path} texture path`);\n error.code = \"CJS_TEXTURE_PROCEDURAL_PATH_INVALID\";\n error.path = path;\n texture.SetError(error);\n return texture;\n }\n texture.SetPayload(bitmap);\n texture.MarkPrepared();\n return texture;\n }\n}\n\n/**\n * Registers the `gradient_1d` dynamic constructor on one manager.\n *\n * @param {object} resourceManager Manager to register on.\n * @returns {object} The same manager, for chaining.\n */\nexport function RegisterGradientTexture(resourceManager)\n{\n if (typeof resourceManager?.RegisterResourceConstructor !== \"function\")\n {\n throw new TypeError(\"RegisterGradientTexture requires a CjsResMan.\");\n }\n resourceManager.RegisterResourceConstructor(\"gradient_1d\", new GradientTextureConstructor());\n return resourceManager;\n}\n"],"names":["GradientTextureConstructor","IBlueDynamicResourceConstructor","GetResource","query","path","GradientPrefix","texture","TriTextureRes","Initialize","bitmap","RasterizeGradient","error","Error","code","SetError","SetPayload","MarkPrepared","RegisterGradientTexture","resourceManager","RegisterResourceConstructor","TypeError"],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,0BAA0B,SAASC,+BAA+B,CAC/E;AACE;AACF;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,KAAK,EACjB;AACE,IAAA,MAAMC,IAAI,GAAGC,cAAc,GAAGF,KAAK;AACnC,IAAA,MAAMG,OAAO,GAAG,IAAIC,aAAa,EAAE;AACnCD,IAAAA,OAAO,CAACE,UAAU,CAACJ,IAAI,EAAE,EAAE,CAAC;AAE5B,IAAA,MAAMK,MAAM,GAAGC,iBAAiB,CAACN,IAAI,CAAC;IACtC,IAAI,CAACK,MAAM,EACX;AACE;AACA;AACA;MACA,MAAME,KAAK,GAAG,IAAIC,KAAK,CAAC,CAAA,gBAAA,EAAmBR,IAAI,eAAe,CAAC;MAC/DO,KAAK,CAACE,IAAI,GAAG,qCAAqC;MAClDF,KAAK,CAACP,IAAI,GAAGA,IAAI;AACjBE,MAAAA,OAAO,CAACQ,QAAQ,CAACH,KAAK,CAAC;AACvB,MAAA,OAAOL,OAAO;AAChB,IAAA;AACAA,IAAAA,OAAO,CAACS,UAAU,CAACN,MAAM,CAAC;IAC1BH,OAAO,CAACU,YAAY,EAAE;AACtB,IAAA,OAAOV,OAAO;AAChB,EAAA;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASW,uBAAuBA,CAACC,eAAe,EACvD;AACE,EAAA,IAAI,OAAOA,eAAe,EAAEC,2BAA2B,KAAK,UAAU,EACtE;AACE,IAAA,MAAM,IAAIC,SAAS,CAAC,+CAA+C,CAAC;AACtE,EAAA;EACAF,eAAe,CAACC,2BAA2B,CAAC,aAAa,EAAE,IAAInB,0BAA0B,EAAE,CAAC;AAC5F,EAAA,OAAOkB,eAAe;AACxB;;;;"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { HostBitmap } from '#imageio';
|
|
2
|
+
import { PixelFormat } from '#consts/render-context';
|
|
1
3
|
import { num } from '#math/num';
|
|
2
4
|
import { Tr2CurveColor as _Tr2CurveColor } from '../../curves/curve/Tr2CurveColor.js';
|
|
3
5
|
import { Tr2CurveScalar as _Tr2CurveScalar } from '../../curves/curve/Tr2CurveScalar.js';
|
|
@@ -175,21 +177,16 @@ function RasterizeGradient(path) {
|
|
|
175
177
|
data: data.subarray(channel)
|
|
176
178
|
});
|
|
177
179
|
}
|
|
180
|
+
const bitmap = new HostBitmap();
|
|
181
|
+
|
|
182
|
+
// Carbon's format: one half-float per channel (GradientTexture.cpp).
|
|
183
|
+
if (!bitmap.Create(width, 1, 1, PixelFormat.PIXEL_FORMAT_R16G16B16A16_FLOAT)) return null;
|
|
184
|
+
const raw = bitmap.GetRawData();
|
|
185
|
+
const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);
|
|
178
186
|
for (let index = 0; index < data.length; index++) {
|
|
179
|
-
|
|
187
|
+
view.setUint16(index * 2, num.toHalfFloat(data[index]), true);
|
|
180
188
|
}
|
|
181
|
-
return
|
|
182
|
-
payloadType: "rgba",
|
|
183
|
-
sourceFormat: "dynamic-gradient",
|
|
184
|
-
width,
|
|
185
|
-
height: 1,
|
|
186
|
-
pixelFormat: "rgba32float",
|
|
187
|
-
data,
|
|
188
|
-
strideBytes: width * 16,
|
|
189
|
-
origin: "top-left",
|
|
190
|
-
colorSpace: "linear",
|
|
191
|
-
alphaMode: "straight"
|
|
192
|
-
};
|
|
189
|
+
return bitmap;
|
|
193
190
|
}
|
|
194
191
|
|
|
195
192
|
export { GradientPathToCurve, GradientPrefix, IsGradientTexturePath, RasterizeGradient };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gradientTexture.js","sources":["../../../../../src/trinity/core/procedural/gradientTexture.js"],"sourcesContent":["// Source: trinity/trinity/Resources/Procedural/GradientTexture.h\n// Source: trinity/trinity/Resources/Procedural/GradientTexture.cpp\n//\n// `dynamic:/gradient_1d/<base64>` names a width x 1 texture rasterized from four\n// scalar curves - Carbon's second procedural texture, beside `dynamic:/color/`.\n//\n// WHY THIS IS IN TRINITY AND THE COLOUR ONE IS NOT. Carbon rasterizes both\n// inside TriTextureRes::Initialize (TriTextureRes.cpp:223-236), because its\n// TriTextureRes sits in trinity beside the curves. Ours is in the resource\n// layer, which may not import trinity (layers.json), and a gradient needs\n// Tr2CurveScalar. So the gradient is rasterized here and published by the\n// constructor beside this file, while the colour - which needs nothing but a\n// parse - stays in TriTextureRes.Initialize as Carbon has it.\n//\n// Not ported, for want of a consumer: CurveToGradientPath (the writer).\nimport { num } from \"#math/num\";\nimport { Tr2CurveColor } from \"../../curves/curve/Tr2CurveColor.js\";\nimport { Tr2CurveScalar } from \"../../curves/curve/Tr2CurveScalar.js\";\n\n/** `gradientPrefix` (GradientTexture.cpp:24). */\nexport const GradientPrefix = \"dynamic:/gradient_1d/\";\n\n// `Header` (GradientTexture.cpp:10-23): uint32 width, then four `Channel`\n// records of uint16 keyCount, uint8 extrapolationBefore, uint8 extrapolationAfter.\nconst HEADER_BYTES = 20;\n// `Tr2CurveScalarKey` (Tr2CurveScalar.h:54-70): float time, value, leftTangent,\n// rightTangent, then uint16 id, uint8 interpolation, uint8 tangentType.\nconst KEY_BYTES = 20;\nconst CHANNEL_COUNT = 4;\n\n/**\n * Carbon's `Base64::Decode` (Base64Encoding.h:5). Node and the browser each\n * carry a decoder; `formats/gltf/core/parser.js:163-167` picks between them the\n * same way.\n *\n * @param {string} text Base64 text.\n * @returns {Uint8Array|null} Decoded bytes, or null when the text is not base64.\n */\nfunction decodeBase64(text)\n{\n try\n {\n if (typeof Buffer !== \"undefined\") return new Uint8Array(Buffer.from(text, \"base64\"));\n const binary = atob(text);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index);\n return bytes;\n }\n catch\n {\n return null;\n }\n}\n\n/**\n * Whether a path names a gradient texture (GradientTexture.cpp:48-51).\n *\n * @param {string} path Resource path.\n * @returns {boolean}\n */\nexport function IsGradientTexturePath(path)\n{\n return String(path).startsWith(GradientPrefix);\n}\n\n/**\n * The header and curve definitions a gradient path carries, or null on every\n * condition Carbon logs and abandons: short data, a key count that disagrees\n * with the payload size, or a zero width (GradientTexture.cpp:148-172).\n *\n * Carbon writes this decode twice, in `GradientPathToCurve` and in\n * `RasterizeGradient`; both callers here share one copy.\n *\n * @param {string} path `dynamic:/gradient_1d/...` path.\n * @returns {{width: number, definitions: object[]}|null}\n */\nfunction readGradient(path)\n{\n if (!IsGradientTexturePath(path)) return null;\n\n const data = decodeBase64(String(path).slice(GradientPrefix.length));\n if (!data || data.byteLength < HEADER_BYTES) return null;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const width = view.getUint32(0, true);\n const channels = [];\n let keyCount = 0;\n for (let channel = 0; channel < CHANNEL_COUNT; channel++)\n {\n const offset = 4 + channel * 4;\n const count = view.getUint16(offset, true);\n channels.push({\n keyCount: count,\n extrapolationBefore: view.getUint8(offset + 2),\n extrapolationAfter: view.getUint8(offset + 3)\n });\n keyCount += count;\n }\n if (data.byteLength !== HEADER_BYTES + keyCount * KEY_BYTES) return null;\n if (width === 0) return null;\n\n let cursor = HEADER_BYTES;\n const definitions = channels.map(channel =>\n {\n const keys = [];\n for (let index = 0; index < channel.keyCount; index++)\n {\n keys.push({\n time: view.getFloat32(cursor, true),\n value: view.getFloat32(cursor + 4, true),\n leftTangent: view.getFloat32(cursor + 8, true),\n rightTangent: view.getFloat32(cursor + 12, true),\n id: view.getUint16(cursor + 16, true),\n interpolation: view.getUint8(cursor + 18),\n tangentType: view.getUint8(cursor + 19)\n });\n cursor += KEY_BYTES;\n }\n return {\n keys,\n keyCount: channel.keyCount,\n extrapolationBefore: channel.extrapolationBefore,\n extrapolationAfter: channel.extrapolationAfter\n };\n });\n\n return { width, definitions };\n}\n\n/**\n * Carbon's `GradientPathToCurve` (GradientTexture.cpp:55-101): the colour curve a\n * gradient path describes, with the texture width it asks for.\n *\n * Carbon returns `std::pair<IRootPtr, uint32_t>`; a JavaScript pair is an object.\n *\n * @param {string} path `dynamic:/gradient_1d/...` path.\n * @returns {{curve: Tr2CurveColor, width: number}|null}\n */\nexport function GradientPathToCurve(path)\n{\n const gradient = readGradient(path);\n if (!gradient) return null;\n\n const curve = new Tr2CurveColor();\n const [ r, g, b, a ] = gradient.definitions;\n curve.r.SetDefinition(r);\n curve.g.SetDefinition(g);\n curve.b.SetDefinition(b);\n curve.a.SetDefinition(a);\n return { curve, width: gradient.width };\n}\n\n/**\n * Carbon's `RasterizeGradient` (GradientTexture.cpp:140-196): each channel\n * sampled across the texture width into one interleaved bitmap.\n *\n * Carbon writes `PIXEL_FORMAT_R16G16B16A16_FLOAT`; as with `dynamic:/color/`,\n * the payload contract carries float colour as `rgba32float`, so the samples are\n * quantized through the half-float codec and stored in a wider container. A\n * channel with no keys rasterizes to 0, which is what Carbon's scalar curve\n * returns for an empty definition - `Tr2CurveColor`'s \"empty alpha is 1\" rule\n * belongs to its own GetValueAt and is not used here.\n *\n * @param {string} path `dynamic:/gradient_1d/...` path.\n * @returns {object|null} An `rgba` payload.\n */\nexport function RasterizeGradient(path)\n{\n const gradient = readGradient(path);\n if (!gradient) return null;\n\n const { width, definitions } = gradient;\n const data = new Float32Array(width * CHANNEL_COUNT);\n const curve = new Tr2CurveScalar();\n for (let channel = 0; channel < CHANNEL_COUNT; channel++)\n {\n curve.SetDefinition(definitions[channel]);\n // Carbon advances the pixel pointer by one half-float per channel\n // (`pixels + 1`, stride 4); a subarray is the same offset view.\n curve.Rasterize({ width, stride: CHANNEL_COUNT, data: data.subarray(channel) });\n }\n for (let index = 0; index < data.length; index++)\n {\n data[index] = num.fromHalfFloat(num.toHalfFloat(data[index]));\n }\n\n return {\n payloadType: \"rgba\",\n sourceFormat: \"dynamic-gradient\",\n width,\n height: 1,\n pixelFormat: \"rgba32float\",\n data,\n strideBytes: width * 16,\n origin: \"top-left\",\n colorSpace: \"linear\",\n alphaMode: \"straight\"\n };\n}\n"],"names":["GradientPrefix","HEADER_BYTES","KEY_BYTES","CHANNEL_COUNT","decodeBase64","text","Buffer","Uint8Array","from","binary","atob","bytes","length","index","charCodeAt","IsGradientTexturePath","path","String","startsWith","readGradient","data","slice","byteLength","view","DataView","buffer","byteOffset","width","getUint32","channels","keyCount","channel","offset","count","getUint16","push","extrapolationBefore","getUint8","extrapolationAfter","cursor","definitions","map","keys","time","getFloat32","value","leftTangent","rightTangent","id","interpolation","tangentType","GradientPathToCurve","gradient","curve","Tr2CurveColor","r","g","b","a","SetDefinition","RasterizeGradient","Float32Array","Tr2CurveScalar","Rasterize","stride","subarray","num","fromHalfFloat","toHalfFloat","payloadType","sourceFormat","height","pixelFormat","strideBytes","origin","colorSpace","alphaMode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gradientTexture.js","sources":["../../../../../src/trinity/core/procedural/gradientTexture.js"],"sourcesContent":["// Source: trinity/trinity/Resources/Procedural/GradientTexture.h\n// Source: trinity/trinity/Resources/Procedural/GradientTexture.cpp\n//\n// `dynamic:/gradient_1d/<base64>` names a width x 1 texture rasterized from four\n// scalar curves - Carbon's second procedural texture, beside `dynamic:/color/`.\n//\n// WHY THIS IS IN TRINITY AND THE COLOUR ONE IS NOT. Carbon rasterizes both\n// inside TriTextureRes::Initialize (TriTextureRes.cpp:223-236), because its\n// TriTextureRes sits in trinity beside the curves. Ours is in the resource\n// layer, which may not import trinity (layers.json), and a gradient needs\n// Tr2CurveScalar. So the gradient is rasterized here and published by the\n// constructor beside this file, while the colour - which needs nothing but a\n// parse - stays in TriTextureRes.Initialize as Carbon has it.\n//\n// Not ported, for want of a consumer: CurveToGradientPath (the writer).\nimport { HostBitmap } from \"#imageio\";\nimport { PixelFormat } from \"#consts/render-context\";\nimport { num } from \"#math/num\";\nimport { Tr2CurveColor } from \"../../curves/curve/Tr2CurveColor.js\";\nimport { Tr2CurveScalar } from \"../../curves/curve/Tr2CurveScalar.js\";\n\n/** `gradientPrefix` (GradientTexture.cpp:24). */\nexport const GradientPrefix = \"dynamic:/gradient_1d/\";\n\n// `Header` (GradientTexture.cpp:10-23): uint32 width, then four `Channel`\n// records of uint16 keyCount, uint8 extrapolationBefore, uint8 extrapolationAfter.\nconst HEADER_BYTES = 20;\n// `Tr2CurveScalarKey` (Tr2CurveScalar.h:54-70): float time, value, leftTangent,\n// rightTangent, then uint16 id, uint8 interpolation, uint8 tangentType.\nconst KEY_BYTES = 20;\nconst CHANNEL_COUNT = 4;\n\n/**\n * Carbon's `Base64::Decode` (Base64Encoding.h:5). Node and the browser each\n * carry a decoder; `formats/gltf/core/parser.js:163-167` picks between them the\n * same way.\n *\n * @param {string} text Base64 text.\n * @returns {Uint8Array|null} Decoded bytes, or null when the text is not base64.\n */\nfunction decodeBase64(text)\n{\n try\n {\n if (typeof Buffer !== \"undefined\") return new Uint8Array(Buffer.from(text, \"base64\"));\n const binary = atob(text);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index);\n return bytes;\n }\n catch\n {\n return null;\n }\n}\n\n/**\n * Whether a path names a gradient texture (GradientTexture.cpp:48-51).\n *\n * @param {string} path Resource path.\n * @returns {boolean}\n */\nexport function IsGradientTexturePath(path)\n{\n return String(path).startsWith(GradientPrefix);\n}\n\n/**\n * The header and curve definitions a gradient path carries, or null on every\n * condition Carbon logs and abandons: short data, a key count that disagrees\n * with the payload size, or a zero width (GradientTexture.cpp:148-172).\n *\n * Carbon writes this decode twice, in `GradientPathToCurve` and in\n * `RasterizeGradient`; both callers here share one copy.\n *\n * @param {string} path `dynamic:/gradient_1d/...` path.\n * @returns {{width: number, definitions: object[]}|null}\n */\nfunction readGradient(path)\n{\n if (!IsGradientTexturePath(path)) return null;\n\n const data = decodeBase64(String(path).slice(GradientPrefix.length));\n if (!data || data.byteLength < HEADER_BYTES) return null;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const width = view.getUint32(0, true);\n const channels = [];\n let keyCount = 0;\n for (let channel = 0; channel < CHANNEL_COUNT; channel++)\n {\n const offset = 4 + channel * 4;\n const count = view.getUint16(offset, true);\n channels.push({\n keyCount: count,\n extrapolationBefore: view.getUint8(offset + 2),\n extrapolationAfter: view.getUint8(offset + 3)\n });\n keyCount += count;\n }\n if (data.byteLength !== HEADER_BYTES + keyCount * KEY_BYTES) return null;\n if (width === 0) return null;\n\n let cursor = HEADER_BYTES;\n const definitions = channels.map(channel =>\n {\n const keys = [];\n for (let index = 0; index < channel.keyCount; index++)\n {\n keys.push({\n time: view.getFloat32(cursor, true),\n value: view.getFloat32(cursor + 4, true),\n leftTangent: view.getFloat32(cursor + 8, true),\n rightTangent: view.getFloat32(cursor + 12, true),\n id: view.getUint16(cursor + 16, true),\n interpolation: view.getUint8(cursor + 18),\n tangentType: view.getUint8(cursor + 19)\n });\n cursor += KEY_BYTES;\n }\n return {\n keys,\n keyCount: channel.keyCount,\n extrapolationBefore: channel.extrapolationBefore,\n extrapolationAfter: channel.extrapolationAfter\n };\n });\n\n return { width, definitions };\n}\n\n/**\n * Carbon's `GradientPathToCurve` (GradientTexture.cpp:55-101): the colour curve a\n * gradient path describes, with the texture width it asks for.\n *\n * Carbon returns `std::pair<IRootPtr, uint32_t>`; a JavaScript pair is an object.\n *\n * @param {string} path `dynamic:/gradient_1d/...` path.\n * @returns {{curve: Tr2CurveColor, width: number}|null}\n */\nexport function GradientPathToCurve(path)\n{\n const gradient = readGradient(path);\n if (!gradient) return null;\n\n const curve = new Tr2CurveColor();\n const [ r, g, b, a ] = gradient.definitions;\n curve.r.SetDefinition(r);\n curve.g.SetDefinition(g);\n curve.b.SetDefinition(b);\n curve.a.SetDefinition(a);\n return { curve, width: gradient.width };\n}\n\n/**\n * Carbon's `RasterizeGradient` (GradientTexture.cpp:140-196): each channel\n * sampled across the texture width into one interleaved bitmap.\n *\n * Carbon writes `PIXEL_FORMAT_R16G16B16A16_FLOAT`; as with `dynamic:/color/`,\n * the payload contract carries float colour as `rgba32float`, so the samples are\n * quantized through the half-float codec and stored in a wider container. A\n * channel with no keys rasterizes to 0, which is what Carbon's scalar curve\n * returns for an empty definition - `Tr2CurveColor`'s \"empty alpha is 1\" rule\n * belongs to its own GetValueAt and is not used here.\n *\n * @param {string} path `dynamic:/gradient_1d/...` path.\n * @returns {object|null} An `rgba` payload.\n */\nexport function RasterizeGradient(path)\n{\n const gradient = readGradient(path);\n if (!gradient) return null;\n\n const { width, definitions } = gradient;\n const data = new Float32Array(width * CHANNEL_COUNT);\n const curve = new Tr2CurveScalar();\n for (let channel = 0; channel < CHANNEL_COUNT; channel++)\n {\n curve.SetDefinition(definitions[channel]);\n // Carbon advances the pixel pointer by one half-float per channel\n // (`pixels + 1`, stride 4); a subarray is the same offset view.\n curve.Rasterize({ width, stride: CHANNEL_COUNT, data: data.subarray(channel) });\n }\n const bitmap = new HostBitmap();\n\n // Carbon's format: one half-float per channel (GradientTexture.cpp).\n if (!bitmap.Create(width, 1, 1, PixelFormat.PIXEL_FORMAT_R16G16B16A16_FLOAT)) return null;\n\n const raw = bitmap.GetRawData();\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);\n\n for (let index = 0; index < data.length; index++)\n {\n view.setUint16(index * 2, num.toHalfFloat(data[index]), true);\n }\n\n return bitmap;\n}\n"],"names":["GradientPrefix","HEADER_BYTES","KEY_BYTES","CHANNEL_COUNT","decodeBase64","text","Buffer","Uint8Array","from","binary","atob","bytes","length","index","charCodeAt","IsGradientTexturePath","path","String","startsWith","readGradient","data","slice","byteLength","view","DataView","buffer","byteOffset","width","getUint32","channels","keyCount","channel","offset","count","getUint16","push","extrapolationBefore","getUint8","extrapolationAfter","cursor","definitions","map","keys","time","getFloat32","value","leftTangent","rightTangent","id","interpolation","tangentType","GradientPathToCurve","gradient","curve","Tr2CurveColor","r","g","b","a","SetDefinition","RasterizeGradient","Float32Array","Tr2CurveScalar","Rasterize","stride","subarray","bitmap","HostBitmap","Create","PixelFormat","PIXEL_FORMAT_R16G16B16A16_FLOAT","raw","GetRawData","setUint16","num","toHalfFloat"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { CjsModel } from '#model';
|
|
|
4
4
|
import { vec3 } from '#math/vec3';
|
|
5
5
|
import { vec4 } from '#math/vec4';
|
|
6
6
|
import { Tr2VolumerticQuality } from '../../generated/trinityCore/enums.js';
|
|
7
|
-
import { Tr2TextureReference as _Tr2TextureReference } from '
|
|
7
|
+
import { Tr2TextureReference as _Tr2TextureReference } from '../Tr2TextureReference.js';
|
|
8
8
|
import { AccumulatePriorityAttribute } from '../PriorityBlend.js';
|
|
9
9
|
import { Tr2VariableStore as _Tr2VariableStore } from '../variable/Tr2VariableStore.js';
|
|
10
10
|
|