@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
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { ImageIOResult } from '#imageio';
|
|
2
|
+
import { CjsDdsFormat } from '../formats/dds/CjsDdsFormat.js';
|
|
3
|
+
import { CjsGifFormat } from '../formats/gif/CjsGifFormat.js';
|
|
4
|
+
import { CjsJpegFormat } from '../formats/jpeg/CjsJpegFormat.js';
|
|
5
|
+
import { CjsPngFormat } from '../formats/png/CjsPngFormat.js';
|
|
6
|
+
import { CjsTgaFormat } from '../formats/tga/CjsTgaFormat.js';
|
|
7
|
+
|
|
8
|
+
// Source: imageio/include/Tr2ImageHandler.h
|
|
9
|
+
// Source: imageio/Tr2ImageHandler.cpp
|
|
10
|
+
//
|
|
11
|
+
// Carbon's ImageIO entry points: a registry of per-format handler tables, and
|
|
12
|
+
// ReadImage / IsSaveSupported / SaveImage, which pick the handler by the
|
|
13
|
+
// filename's extension. It routes and never decodes: each image format's
|
|
14
|
+
// `Format.carbon` table does the work (resource/format/CjsImageFormat.js).
|
|
15
|
+
//
|
|
16
|
+
// A namespace of free functions becomes a class of statics, camelCase.
|
|
17
|
+
const Code = ImageIOResult.Code;
|
|
18
|
+
|
|
19
|
+
/** Registered handler tables, first match wins (GetImageHandlers). */
|
|
20
|
+
const handlers = [];
|
|
21
|
+
let registered = false;
|
|
22
|
+
|
|
23
|
+
/** Carbon's `ImageIO` registry and entry points (imageio/Tr2ImageHandler.cpp). */
|
|
24
|
+
class ImageIO {
|
|
25
|
+
/**
|
|
26
|
+
* Register the built-in image formats once (Tr2ImageHandler.cpp:26-42).
|
|
27
|
+
* Carbon registers Bmp, Dds, Jpeg, Png, Psd, Tga and Vta; ours register as
|
|
28
|
+
* each format gains its `carbon` table.
|
|
29
|
+
*/
|
|
30
|
+
static registerImageIOHandlers() {
|
|
31
|
+
if (registered) return;
|
|
32
|
+
registered = true;
|
|
33
|
+
// Carbon's order (Bmp, Dds, Jpeg, Png, Psd, Tga, Vta) for the ones we have, then ours.
|
|
34
|
+
ImageIO.registerImageHandler(CjsDdsFormat.carbon);
|
|
35
|
+
ImageIO.registerImageHandler(CjsJpegFormat.carbon);
|
|
36
|
+
ImageIO.registerImageHandler(CjsPngFormat.carbon);
|
|
37
|
+
ImageIO.registerImageHandler(CjsTgaFormat.carbon);
|
|
38
|
+
ImageIO.registerImageHandler(CjsGifFormat.carbon);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Register a handler table (Tr2ImageHandler.cpp:79-82).
|
|
43
|
+
*
|
|
44
|
+
* @param {{checkExtension: Function, readImage: Function, isSaveSupported: Function, save: Function}} imageHandler Handler table.
|
|
45
|
+
*/
|
|
46
|
+
static registerImageHandler(imageHandler) {
|
|
47
|
+
handlers.push(imageHandler);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The text after the last '.', or "" (Tr2ImageHandler.cpp:45-49).
|
|
52
|
+
*
|
|
53
|
+
* @param {string} filename File name.
|
|
54
|
+
* @returns {string} Extension.
|
|
55
|
+
*/
|
|
56
|
+
static getExtension(filename) {
|
|
57
|
+
const dot = filename.lastIndexOf(".");
|
|
58
|
+
return dot >= 0 ? filename.slice(dot + 1) : "";
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The first handler that claims an extension, or null (Tr2ImageHandler.cpp:51-63).
|
|
63
|
+
*
|
|
64
|
+
* @param {string} extension Extension, without the dot.
|
|
65
|
+
* @returns {object|null} Handler table.
|
|
66
|
+
*/
|
|
67
|
+
static getImageHandler(extension) {
|
|
68
|
+
ImageIO.registerImageIOHandlers();
|
|
69
|
+
return handlers.find(handler => handler.checkExtension(extension)) ?? null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Read an image into a bitmap, picking the handler by the filename in the
|
|
74
|
+
* load parameters (Tr2ImageHandler.cpp:95-106).
|
|
75
|
+
*
|
|
76
|
+
* adapted: a stream becomes the file's bytes.
|
|
77
|
+
*
|
|
78
|
+
* @param {Uint8Array|ArrayBuffer} bytes File bytes.
|
|
79
|
+
* @param {import("#imageio").LoadParameters} loadParameters Load parameters.
|
|
80
|
+
* @param {import("#imageio").HostBitmap} bitmap Destination bitmap.
|
|
81
|
+
* @param {import("#imageio").Metadata|null} [metadata] Optional metadata out.
|
|
82
|
+
* @returns {ImageIOResult} The result.
|
|
83
|
+
*/
|
|
84
|
+
static readImage(bytes, loadParameters, bitmap, metadata = null) {
|
|
85
|
+
const handler = ImageIO.getImageHandler(ImageIO.getExtension(loadParameters.filename));
|
|
86
|
+
if (!handler) return new ImageIOResult(Code.UNRECOGNIZED_IMAGE_TYPE);
|
|
87
|
+
return handler.readImage(bytes, loadParameters, bitmap, metadata);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* `readImage` that also serves formats whose decoder is asynchronous (PNG).
|
|
92
|
+
*
|
|
93
|
+
* Not Carbon: see CjsImageFormat.readImageAsync.
|
|
94
|
+
*
|
|
95
|
+
* @param {Uint8Array|ArrayBuffer} bytes File bytes.
|
|
96
|
+
* @param {import("#imageio").LoadParameters} loadParameters Load parameters.
|
|
97
|
+
* @param {import("#imageio").HostBitmap} bitmap Destination bitmap.
|
|
98
|
+
* @param {import("#imageio").Metadata|null} [metadata] Optional metadata out.
|
|
99
|
+
* @returns {Promise<ImageIOResult>} The result.
|
|
100
|
+
*/
|
|
101
|
+
static async readImageAsync(bytes, loadParameters, bitmap, metadata = null) {
|
|
102
|
+
const handler = ImageIO.getImageHandler(ImageIO.getExtension(loadParameters.filename));
|
|
103
|
+
if (!handler) return new ImageIOResult(Code.UNRECOGNIZED_IMAGE_TYPE);
|
|
104
|
+
return handler.readImageAsync(bytes, loadParameters, bitmap, metadata);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Whether an image of these dimensions can be saved under a filename
|
|
109
|
+
* (Tr2ImageHandler.cpp:117-128).
|
|
110
|
+
*
|
|
111
|
+
* @param {string} filename Destination file name.
|
|
112
|
+
* @param {import("#imageio").BitmapDimensions} dimensions Image description.
|
|
113
|
+
* @returns {ImageIOResult} OK if supported.
|
|
114
|
+
*/
|
|
115
|
+
static isSaveSupported(filename, dimensions) {
|
|
116
|
+
const handler = ImageIO.getImageHandler(ImageIO.getExtension(filename));
|
|
117
|
+
if (!handler) return new ImageIOResult(Code.UNRECOGNIZED_IMAGE_TYPE);
|
|
118
|
+
return handler.isSaveSupported(dimensions);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Save a bitmap in the format a filename names (Tr2ImageHandler.cpp:140-151).
|
|
123
|
+
*
|
|
124
|
+
* adapted: Carbon writes to a stream; this returns `{result, bytes}`.
|
|
125
|
+
*
|
|
126
|
+
* @param {string} filename Destination file name.
|
|
127
|
+
* @param {import("#imageio").HostBitmap} bitmap Bitmap to save.
|
|
128
|
+
* @param {import("#imageio").Metadata|null} [metadata] Optional metadata.
|
|
129
|
+
* @returns {{result: ImageIOResult, bytes: Uint8Array|null}} The outcome.
|
|
130
|
+
*/
|
|
131
|
+
static saveImage(filename, bitmap, metadata = null) {
|
|
132
|
+
const handler = ImageIO.getImageHandler(ImageIO.getExtension(filename));
|
|
133
|
+
if (!handler) return {
|
|
134
|
+
result: new ImageIOResult(Code.UNRECOGNIZED_IMAGE_TYPE),
|
|
135
|
+
bytes: null
|
|
136
|
+
};
|
|
137
|
+
return handler.save(bitmap, metadata);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export { ImageIO };
|
|
142
|
+
//# sourceMappingURL=ImageIO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageIO.js","sources":["../../../../src/resource/imageio/ImageIO.js"],"sourcesContent":["// Source: imageio/include/Tr2ImageHandler.h\n// Source: imageio/Tr2ImageHandler.cpp\n//\n// Carbon's ImageIO entry points: a registry of per-format handler tables, and\n// ReadImage / IsSaveSupported / SaveImage, which pick the handler by the\n// filename's extension. It routes and never decodes: each image format's\n// `Format.carbon` table does the work (resource/format/CjsImageFormat.js).\n//\n// A namespace of free functions becomes a class of statics, camelCase.\nimport { ImageIOResult } from \"#imageio\";\nimport { CjsDdsFormat } from \"../formats/dds/CjsDdsFormat.js\";\nimport { CjsGifFormat } from \"../formats/gif/CjsGifFormat.js\";\nimport { CjsJpegFormat } from \"../formats/jpeg/CjsJpegFormat.js\";\nimport { CjsPngFormat } from \"../formats/png/CjsPngFormat.js\";\nimport { CjsTgaFormat } from \"../formats/tga/CjsTgaFormat.js\";\n\nconst Code = ImageIOResult.Code;\n\n/** Registered handler tables, first match wins (GetImageHandlers). */\nconst handlers = [];\n\nlet registered = false;\n\n\n/** Carbon's `ImageIO` registry and entry points (imageio/Tr2ImageHandler.cpp). */\nexport class ImageIO\n{\n\n /**\n * Register the built-in image formats once (Tr2ImageHandler.cpp:26-42).\n * Carbon registers Bmp, Dds, Jpeg, Png, Psd, Tga and Vta; ours register as\n * each format gains its `carbon` table.\n */\n static registerImageIOHandlers()\n {\n if (registered) return;\n\n registered = true;\n // Carbon's order (Bmp, Dds, Jpeg, Png, Psd, Tga, Vta) for the ones we have, then ours.\n ImageIO.registerImageHandler(CjsDdsFormat.carbon);\n ImageIO.registerImageHandler(CjsJpegFormat.carbon);\n ImageIO.registerImageHandler(CjsPngFormat.carbon);\n ImageIO.registerImageHandler(CjsTgaFormat.carbon);\n ImageIO.registerImageHandler(CjsGifFormat.carbon);\n }\n\n /**\n * Register a handler table (Tr2ImageHandler.cpp:79-82).\n *\n * @param {{checkExtension: Function, readImage: Function, isSaveSupported: Function, save: Function}} imageHandler Handler table.\n */\n static registerImageHandler(imageHandler)\n {\n handlers.push(imageHandler);\n }\n\n /**\n * The text after the last '.', or \"\" (Tr2ImageHandler.cpp:45-49).\n *\n * @param {string} filename File name.\n * @returns {string} Extension.\n */\n static getExtension(filename)\n {\n const dot = filename.lastIndexOf(\".\");\n\n return dot >= 0 ? filename.slice(dot + 1) : \"\";\n }\n\n /**\n * The first handler that claims an extension, or null (Tr2ImageHandler.cpp:51-63).\n *\n * @param {string} extension Extension, without the dot.\n * @returns {object|null} Handler table.\n */\n static getImageHandler(extension)\n {\n ImageIO.registerImageIOHandlers();\n\n return handlers.find(handler => handler.checkExtension(extension)) ?? null;\n }\n\n /**\n * Read an image into a bitmap, picking the handler by the filename in the\n * load parameters (Tr2ImageHandler.cpp:95-106).\n *\n * adapted: a stream becomes the file's bytes.\n *\n * @param {Uint8Array|ArrayBuffer} bytes File bytes.\n * @param {import(\"#imageio\").LoadParameters} loadParameters Load parameters.\n * @param {import(\"#imageio\").HostBitmap} bitmap Destination bitmap.\n * @param {import(\"#imageio\").Metadata|null} [metadata] Optional metadata out.\n * @returns {ImageIOResult} The result.\n */\n static readImage(bytes, loadParameters, bitmap, metadata = null)\n {\n const handler = ImageIO.getImageHandler(ImageIO.getExtension(loadParameters.filename));\n\n if (!handler) return new ImageIOResult(Code.UNRECOGNIZED_IMAGE_TYPE);\n\n return handler.readImage(bytes, loadParameters, bitmap, metadata);\n }\n\n /**\n * `readImage` that also serves formats whose decoder is asynchronous (PNG).\n *\n * Not Carbon: see CjsImageFormat.readImageAsync.\n *\n * @param {Uint8Array|ArrayBuffer} bytes File bytes.\n * @param {import(\"#imageio\").LoadParameters} loadParameters Load parameters.\n * @param {import(\"#imageio\").HostBitmap} bitmap Destination bitmap.\n * @param {import(\"#imageio\").Metadata|null} [metadata] Optional metadata out.\n * @returns {Promise<ImageIOResult>} The result.\n */\n static async readImageAsync(bytes, loadParameters, bitmap, metadata = null)\n {\n const handler = ImageIO.getImageHandler(ImageIO.getExtension(loadParameters.filename));\n\n if (!handler) return new ImageIOResult(Code.UNRECOGNIZED_IMAGE_TYPE);\n\n return handler.readImageAsync(bytes, loadParameters, bitmap, metadata);\n }\n\n /**\n * Whether an image of these dimensions can be saved under a filename\n * (Tr2ImageHandler.cpp:117-128).\n *\n * @param {string} filename Destination file name.\n * @param {import(\"#imageio\").BitmapDimensions} dimensions Image description.\n * @returns {ImageIOResult} OK if supported.\n */\n static isSaveSupported(filename, dimensions)\n {\n const handler = ImageIO.getImageHandler(ImageIO.getExtension(filename));\n\n if (!handler) return new ImageIOResult(Code.UNRECOGNIZED_IMAGE_TYPE);\n\n return handler.isSaveSupported(dimensions);\n }\n\n /**\n * Save a bitmap in the format a filename names (Tr2ImageHandler.cpp:140-151).\n *\n * adapted: Carbon writes to a stream; this returns `{result, bytes}`.\n *\n * @param {string} filename Destination file name.\n * @param {import(\"#imageio\").HostBitmap} bitmap Bitmap to save.\n * @param {import(\"#imageio\").Metadata|null} [metadata] Optional metadata.\n * @returns {{result: ImageIOResult, bytes: Uint8Array|null}} The outcome.\n */\n static saveImage(filename, bitmap, metadata = null)\n {\n const handler = ImageIO.getImageHandler(ImageIO.getExtension(filename));\n\n if (!handler) return { result: new ImageIOResult(Code.UNRECOGNIZED_IMAGE_TYPE), bytes: null };\n\n return handler.save(bitmap, metadata);\n }\n\n}\n"],"names":["Code","ImageIOResult","handlers","registered","ImageIO","registerImageIOHandlers","registerImageHandler","CjsDdsFormat","carbon","CjsJpegFormat","CjsPngFormat","CjsTgaFormat","CjsGifFormat","imageHandler","push","getExtension","filename","dot","lastIndexOf","slice","getImageHandler","extension","find","handler","checkExtension","readImage","bytes","loadParameters","bitmap","metadata","UNRECOGNIZED_IMAGE_TYPE","readImageAsync","isSaveSupported","dimensions","saveImage","result","save"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { blue } from '#blue';
|
|
2
|
+
import { HostBitmap } from '#imageio';
|
|
3
|
+
export * from '#imageio';
|
|
4
|
+
export { ImageIO } from './ImageIO.js';
|
|
5
|
+
|
|
6
|
+
// Carbon's imageio library as the resource layer exposes it: the CPU image
|
|
7
|
+
// containers (which live in global/imageio because the abstraction layer shares
|
|
8
|
+
// them) re-exported here, plus the handler registry that reaches the image
|
|
9
|
+
// formats.
|
|
10
|
+
//
|
|
11
|
+
// HostBitmap is registered with blue.classes, so a layer that may not import
|
|
12
|
+
// the resource layer - trinityal - can still build one by name.
|
|
13
|
+
blue.classes.RegisterClasses([{
|
|
14
|
+
name: "HostBitmap",
|
|
15
|
+
type: HostBitmap
|
|
16
|
+
}]);
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/resource/imageio/index.js"],"sourcesContent":["// Carbon's imageio library as the resource layer exposes it: the CPU image\n// containers (which live in global/imageio because the abstraction layer shares\n// them) re-exported here, plus the handler registry that reaches the image\n// formats.\n//\n// HostBitmap is registered with blue.classes, so a layer that may not import\n// the resource layer - trinityal - can still build one by name.\nimport { blue } from \"#blue\";\nimport { HostBitmap } from \"#imageio\";\n\nexport * from \"#imageio\";\nexport * from \"./ImageIO.js\";\n\nblue.classes.RegisterClasses([\n { name: \"HostBitmap\", type: HostBitmap }\n]);\n"],"names":["blue","classes","RegisterClasses","name","type","HostBitmap"],"mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAOAA,IAAI,CAACC,OAAO,CAACC,eAAe,CAAC,CAC3B;AAAEC,EAAAA,IAAI,EAAE,YAAY;AAAEC,EAAAA,IAAI,EAAEC;AAAW,CAAC,CACzC,CAAC"}
|
package/dist/resource/index.js
CHANGED
|
@@ -45,6 +45,13 @@ export { Tr2RenderStateSetup } from './shader/reflection/Tr2RenderStateSetup.js'
|
|
|
45
45
|
export { SHADER_STAGE_COUNT, ShaderStageType, requireShaderStageType } from './shader/reflection/shaderStage.js';
|
|
46
46
|
export { Tr2SamplerSetup } from './shader/sampler/Tr2SamplerSetup.js';
|
|
47
47
|
export { RegisterShaderResources, ShaderResourceExtensions } from './shader/registerShaderResources.js';
|
|
48
|
+
export { CjsTextureArrayConstructor, RegisterTextureArray, TextureArrayPrefix } from './texture/CjsTextureArrayConstructor.js';
|
|
49
|
+
export { CjsTexturePipelineStepArray } from './texture/CjsTexturePipelineStepArray.js';
|
|
50
|
+
export { CjsTexturePipelineStepPack } from './texture/CjsTexturePipelineStepPack.js';
|
|
51
|
+
export { CjsTexturePackConstructor, RegisterTexturePack, TexturePackPrefix } from './texture/CjsTexturePackConstructor.js';
|
|
52
|
+
export { CjsTexturePipelineStepConvert } from './texture/CjsTexturePipelineStepConvert.js';
|
|
53
|
+
export { CjsTexturePipelineStepResize } from './texture/CjsTexturePipelineStepResize.js';
|
|
54
|
+
export { RegisterTextureResources, TextureResourceExtensions } from './texture/registerTextureResources.js';
|
|
48
55
|
export { CjsTextureArrayRes } from './texture/CjsTextureArrayRes.js';
|
|
49
56
|
export { CjsTextureArrayResParameterProxy } from './texture/CjsTextureArrayResParameterProxy.js';
|
|
50
57
|
export { RegisterSolidColorTexture, SolidColorTextureConstructor } from './texture/SolidColorTextureConstructor.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { assertCarbonRecord } from '../../format/carbonRecordGuard.js';
|
|
2
|
-
import { CjsSchema, type } from '#schema';
|
|
2
|
+
import { CjsSchema, impl, type } from '#schema';
|
|
3
3
|
import { CjsModel } from '#model';
|
|
4
4
|
import '#utils/is';
|
|
5
5
|
import { recordText, toRecordText } from './carbonRecordFields.js';
|
|
@@ -23,6 +23,26 @@ class Tr2EffectResource extends CjsModel {
|
|
|
23
23
|
/** arrayElements (uint32_t) */
|
|
24
24
|
arrayElements = 0;
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* The member parameter names, layer (or channel) 0 first, when a browser
|
|
28
|
+
* backend merged several of this stage's textures into the one bound at this
|
|
29
|
+
* register; null otherwise.
|
|
30
|
+
*
|
|
31
|
+
* Not Carbon. WebGL2 has sixteen texture units, so a family of maps
|
|
32
|
+
* (Detail1Map..Detail3Map) is merged into one texture when the container is
|
|
33
|
+
* built, and the pass's backend block records the merge. The reader copies it
|
|
34
|
+
* here so the effect can keep its named parameters and bind the assembled
|
|
35
|
+
* texture in their place. The members' own registers stay reflected; the
|
|
36
|
+
* backend no longer declares them.
|
|
37
|
+
*/
|
|
38
|
+
arrayLayers = null;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Whether the merge packs the members as channels of one 2D texture, rather
|
|
42
|
+
* than stacking them as layers of a 2D array. Not Carbon; see `arrayLayers`.
|
|
43
|
+
*/
|
|
44
|
+
packed = false;
|
|
45
|
+
|
|
26
46
|
/**
|
|
27
47
|
* Build one SRV or UAV from its Carbon v15 description record.
|
|
28
48
|
*
|
|
@@ -111,7 +131,9 @@ CjsSchema.define(Tr2EffectResource, {
|
|
|
111
131
|
isAutoregister: type.boolean,
|
|
112
132
|
name: type.string,
|
|
113
133
|
type: [type.int32, type.enum("Type")],
|
|
114
|
-
arrayElements: type.uint32
|
|
134
|
+
arrayElements: type.uint32,
|
|
135
|
+
arrayLayers: [impl.custom, type.list("string")],
|
|
136
|
+
packed: [impl.custom, type.boolean]
|
|
115
137
|
}
|
|
116
138
|
});
|
|
117
139
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tr2EffectResource.js","sources":["../../../../../src/resource/shader/reflection/Tr2EffectResource.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\nimport { assertCarbonRecord } from \"../../format/carbonRecordGuard.js\";\nimport { CjsSchema, impl, type } from \"#schema\";\nimport { CjsModel } from \"#model\";\nimport {\n} from \"#utils/is\";\nimport { recordText, toRecordText } from \"./carbonRecordFields.js\";\n\n/** Reflected SRV or UAV resource metadata. */\nexport class Tr2EffectResource extends CjsModel\n{\n\n /** isSRGB (bool) */\n isSRGB = false;\n\n /** isAutoregister (bool) */\n isAutoregister = false;\n\n /** name (const char*) */\n name = \"\";\n\n /** type (Type - enum Type) */\n type = 0;\n\n /** arrayElements (uint32_t) */\n arrayElements = 0;\n\n /**\n * Build one SRV or UAV from its Carbon v15 description record.\n *\n * Both a texture record and a UAV record land here, and they are not the same\n * shape: a UAV record carries no `isSRGB` at all. Carbon's reader hardcodes\n * `isSRGB = false` for UAVs rather than reading a byte, and `Uav::Save` omits\n * it, so the field being absent is correct rather than missing — reading\n * `undefined` through `!!` reproduces Carbon exactly. The array size is spelled\n * `count` in the record and `arrayElements` on the class.\n *\n * @param {object} record Carbon texture or UAV record.\n * @returns {Tr2EffectResource} Reflected resource.\n */\n static fromCarbonBinary(record)\n {\n assertCarbonRecord(record, \"resource\");\n\n const resource = new this();\n resource.name = recordText(record.name);\n resource.type = record.type;\n resource.arrayElements = record.count;\n resource.isSRGB = !!record.isSRGB;\n resource.isAutoregister = !!record.isAutoregister;\n return resource;\n }\n\n /**\n * Emit this resource as a Carbon v15 texture or UAV record.\n *\n * A UAV record is one byte shorter: it carries no `isSRGB`, because Carbon's\n * reader hardcodes it false and `Uav::Save` omits it. Emitting the field\n * anyway would desynchronise every following field in the stage.\n *\n * @param {number} registerIndex Register this resource is bound at.\n * @param {boolean} [uav] Whether to emit the UAV shape.\n * @returns {object} Carbon texture or UAV record.\n */\n toCarbonBinary(registerIndex, uav = false)\n {\n const record = {\n registerIndex,\n name: toRecordText(this.name),\n type: this.type,\n count: this.arrayElements,\n isAutoregister: this.isAutoregister ? 1 : 0\n };\n if (uav)\n {\n return record;\n }\n return {\n registerIndex,\n name: record.name,\n type: record.type,\n count: record.count,\n isSRGB: this.isSRGB ? 1 : 0,\n isAutoregister: record.isAutoregister\n };\n }\n\n static BINDLESS_SAMPLER = 100;\n\n static Type = Object.freeze({\n TEXTURE_1D: 1,\n TEXTURE_2D: 2,\n TEXTURE_3D: 3,\n TEXTURE_CUBE: 4,\n TEXTURE_TYPELESS: 5,\n BUFFER: 6,\n STRUCTURED_BUFFER: 7,\n TBUFFER: 8,\n BYTEADDRESS_BUFFER: 9,\n UAV_RWTYPED: 10,\n UAV_RWSTRUCTURED: 11,\n UAV_RWBYTEADDRESS: 12,\n UAV_APPEND_STRUCTURED: 13,\n UAV_CONSUME_STRUCTURED: 14,\n UAV_RWSTRUCTURED_WITH_COUNTER: 15\n });\n\n}\n\n// Declared imperatively rather than with decorators, so this module stays\n// plain ESM that loads from source without a transform. The decorator\n// expressions are reused verbatim, so the registered metadata is identical.\n// Statics belong in `methods`: decorateMethod targets the prototype and\n// would register a static as an instance field.\nCjsSchema.define(Tr2EffectResource, {\n className: \"Tr2EffectResource\",\n family: \"shader\",\n fields: {\n isSRGB: type.boolean,\n isAutoregister: type.boolean,\n name: type.string,\n type: [ type.int32, type.enum(\"Type\") ],\n arrayElements: type.uint32\n }\n});\n"],"names":["Tr2EffectResource","CjsModel","isSRGB","isAutoregister","name","type","arrayElements","fromCarbonBinary","record","assertCarbonRecord","resource","recordText","count","toCarbonBinary","registerIndex","uav","toRecordText","BINDLESS_SAMPLER","Type","Object","freeze","TEXTURE_1D","TEXTURE_2D","TEXTURE_3D","TEXTURE_CUBE","TEXTURE_TYPELESS","BUFFER","STRUCTURED_BUFFER","TBUFFER","BYTEADDRESS_BUFFER","UAV_RWTYPED","UAV_RWSTRUCTURED","UAV_RWBYTEADDRESS","UAV_APPEND_STRUCTURED","UAV_CONSUME_STRUCTURED","UAV_RWSTRUCTURED_WITH_COUNTER","CjsSchema","define","className","family","fields","boolean","string","int32","enum","uint32"],"mappings":";;;;;;AAAA;;AAQA;AACO,MAAMA,iBAAiB,SAASC,QAAQ,CAC/C;AAEE;AACAC,EAAAA,MAAM,GAAG,KAAK;;AAEd;AACAC,EAAAA,cAAc,GAAG,KAAK;;AAEtB;AACAC,EAAAA,IAAI,GAAG,EAAE;;AAET;AACAC,EAAAA,IAAI,GAAG,CAAC;;AAER;AACAC,EAAAA,aAAa,GAAG,CAAC;;AAEjB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,gBAAgBA,CAACC,MAAM,EAC9B;AACEC,IAAAA,kBAAkB,CAACD,MAAM,EAAE,UAAU,CAAC;AAEtC,IAAA,MAAME,QAAQ,GAAG,IAAI,IAAI,EAAE;IAC3BA,QAAQ,
|
|
1
|
+
{"version":3,"file":"Tr2EffectResource.js","sources":["../../../../../src/resource/shader/reflection/Tr2EffectResource.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\nimport { assertCarbonRecord } from \"../../format/carbonRecordGuard.js\";\nimport { CjsSchema, impl, type } from \"#schema\";\nimport { CjsModel } from \"#model\";\nimport {\n} from \"#utils/is\";\nimport { recordText, toRecordText } from \"./carbonRecordFields.js\";\n\n/** Reflected SRV or UAV resource metadata. */\nexport class Tr2EffectResource extends CjsModel\n{\n\n /** isSRGB (bool) */\n isSRGB = false;\n\n /** isAutoregister (bool) */\n isAutoregister = false;\n\n /** name (const char*) */\n name = \"\";\n\n /** type (Type - enum Type) */\n type = 0;\n\n /** arrayElements (uint32_t) */\n arrayElements = 0;\n\n /**\n * The member parameter names, layer (or channel) 0 first, when a browser\n * backend merged several of this stage's textures into the one bound at this\n * register; null otherwise.\n *\n * Not Carbon. WebGL2 has sixteen texture units, so a family of maps\n * (Detail1Map..Detail3Map) is merged into one texture when the container is\n * built, and the pass's backend block records the merge. The reader copies it\n * here so the effect can keep its named parameters and bind the assembled\n * texture in their place. The members' own registers stay reflected; the\n * backend no longer declares them.\n */\n arrayLayers = null;\n\n /**\n * Whether the merge packs the members as channels of one 2D texture, rather\n * than stacking them as layers of a 2D array. Not Carbon; see `arrayLayers`.\n */\n packed = false;\n\n /**\n * Build one SRV or UAV from its Carbon v15 description record.\n *\n * Both a texture record and a UAV record land here, and they are not the same\n * shape: a UAV record carries no `isSRGB` at all. Carbon's reader hardcodes\n * `isSRGB = false` for UAVs rather than reading a byte, and `Uav::Save` omits\n * it, so the field being absent is correct rather than missing — reading\n * `undefined` through `!!` reproduces Carbon exactly. The array size is spelled\n * `count` in the record and `arrayElements` on the class.\n *\n * @param {object} record Carbon texture or UAV record.\n * @returns {Tr2EffectResource} Reflected resource.\n */\n static fromCarbonBinary(record)\n {\n assertCarbonRecord(record, \"resource\");\n\n const resource = new this();\n resource.name = recordText(record.name);\n resource.type = record.type;\n resource.arrayElements = record.count;\n resource.isSRGB = !!record.isSRGB;\n resource.isAutoregister = !!record.isAutoregister;\n return resource;\n }\n\n /**\n * Emit this resource as a Carbon v15 texture or UAV record.\n *\n * A UAV record is one byte shorter: it carries no `isSRGB`, because Carbon's\n * reader hardcodes it false and `Uav::Save` omits it. Emitting the field\n * anyway would desynchronise every following field in the stage.\n *\n * @param {number} registerIndex Register this resource is bound at.\n * @param {boolean} [uav] Whether to emit the UAV shape.\n * @returns {object} Carbon texture or UAV record.\n */\n toCarbonBinary(registerIndex, uav = false)\n {\n const record = {\n registerIndex,\n name: toRecordText(this.name),\n type: this.type,\n count: this.arrayElements,\n isAutoregister: this.isAutoregister ? 1 : 0\n };\n if (uav)\n {\n return record;\n }\n return {\n registerIndex,\n name: record.name,\n type: record.type,\n count: record.count,\n isSRGB: this.isSRGB ? 1 : 0,\n isAutoregister: record.isAutoregister\n };\n }\n\n static BINDLESS_SAMPLER = 100;\n\n static Type = Object.freeze({\n TEXTURE_1D: 1,\n TEXTURE_2D: 2,\n TEXTURE_3D: 3,\n TEXTURE_CUBE: 4,\n TEXTURE_TYPELESS: 5,\n BUFFER: 6,\n STRUCTURED_BUFFER: 7,\n TBUFFER: 8,\n BYTEADDRESS_BUFFER: 9,\n UAV_RWTYPED: 10,\n UAV_RWSTRUCTURED: 11,\n UAV_RWBYTEADDRESS: 12,\n UAV_APPEND_STRUCTURED: 13,\n UAV_CONSUME_STRUCTURED: 14,\n UAV_RWSTRUCTURED_WITH_COUNTER: 15\n });\n\n}\n\n// Declared imperatively rather than with decorators, so this module stays\n// plain ESM that loads from source without a transform. The decorator\n// expressions are reused verbatim, so the registered metadata is identical.\n// Statics belong in `methods`: decorateMethod targets the prototype and\n// would register a static as an instance field.\nCjsSchema.define(Tr2EffectResource, {\n className: \"Tr2EffectResource\",\n family: \"shader\",\n fields: {\n isSRGB: type.boolean,\n isAutoregister: type.boolean,\n name: type.string,\n type: [ type.int32, type.enum(\"Type\") ],\n arrayElements: type.uint32,\n arrayLayers: [ impl.custom, type.list(\"string\") ],\n packed: [ impl.custom, type.boolean ]\n }\n});\n"],"names":["Tr2EffectResource","CjsModel","isSRGB","isAutoregister","name","type","arrayElements","arrayLayers","packed","fromCarbonBinary","record","assertCarbonRecord","resource","recordText","count","toCarbonBinary","registerIndex","uav","toRecordText","BINDLESS_SAMPLER","Type","Object","freeze","TEXTURE_1D","TEXTURE_2D","TEXTURE_3D","TEXTURE_CUBE","TEXTURE_TYPELESS","BUFFER","STRUCTURED_BUFFER","TBUFFER","BYTEADDRESS_BUFFER","UAV_RWTYPED","UAV_RWSTRUCTURED","UAV_RWBYTEADDRESS","UAV_APPEND_STRUCTURED","UAV_CONSUME_STRUCTURED","UAV_RWSTRUCTURED_WITH_COUNTER","CjsSchema","define","className","family","fields","boolean","string","int32","enum","uint32","impl","custom","list"],"mappings":";;;;;;AAAA;;AAQA;AACO,MAAMA,iBAAiB,SAASC,QAAQ,CAC/C;AAEE;AACAC,EAAAA,MAAM,GAAG,KAAK;;AAEd;AACAC,EAAAA,cAAc,GAAG,KAAK;;AAEtB;AACAC,EAAAA,IAAI,GAAG,EAAE;;AAET;AACAC,EAAAA,IAAI,GAAG,CAAC;;AAER;AACAC,EAAAA,aAAa,GAAG,CAAC;;AAEjB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,WAAW,GAAG,IAAI;;AAElB;AACF;AACA;AACA;AACEC,EAAAA,MAAM,GAAG,KAAK;;AAEd;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,gBAAgBA,CAACC,MAAM,EAC9B;AACEC,IAAAA,kBAAkB,CAACD,MAAM,EAAE,UAAU,CAAC;AAEtC,IAAA,MAAME,QAAQ,GAAG,IAAI,IAAI,EAAE;IAC3BA,QAAQ,CAACR,IAAI,GAAGS,UAAU,CAACH,MAAM,CAACN,IAAI,CAAC;AACvCQ,IAAAA,QAAQ,CAACP,IAAI,GAAGK,MAAM,CAACL,IAAI;AAC3BO,IAAAA,QAAQ,CAACN,aAAa,GAAGI,MAAM,CAACI,KAAK;AACrCF,IAAAA,QAAQ,CAACV,MAAM,GAAG,CAAC,CAACQ,MAAM,CAACR,MAAM;AACjCU,IAAAA,QAAQ,CAACT,cAAc,GAAG,CAAC,CAACO,MAAM,CAACP,cAAc;AACjD,IAAA,OAAOS,QAAQ;AACjB,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEG,EAAAA,cAAcA,CAACC,aAAa,EAAEC,GAAG,GAAG,KAAK,EACzC;AACE,IAAA,MAAMP,MAAM,GAAG;MACbM,aAAa;AACbZ,MAAAA,IAAI,EAAEc,YAAY,CAAC,IAAI,CAACd,IAAI,CAAC;MAC7BC,IAAI,EAAE,IAAI,CAACA,IAAI;MACfS,KAAK,EAAE,IAAI,CAACR,aAAa;AACzBH,MAAAA,cAAc,EAAE,IAAI,CAACA,cAAc,GAAG,CAAC,GAAG;KAC3C;AACD,IAAA,IAAIc,GAAG,EACP;AACE,MAAA,OAAOP,MAAM;AACf,IAAA;IACA,OAAO;MACLM,aAAa;MACbZ,IAAI,EAAEM,MAAM,CAACN,IAAI;MACjBC,IAAI,EAAEK,MAAM,CAACL,IAAI;MACjBS,KAAK,EAAEJ,MAAM,CAACI,KAAK;AACnBZ,MAAAA,MAAM,EAAE,IAAI,CAACA,MAAM,GAAG,CAAC,GAAG,CAAC;MAC3BC,cAAc,EAAEO,MAAM,CAACP;KACxB;AACH,EAAA;EAEA,OAAOgB,gBAAgB,GAAG,GAAG;AAE7B,EAAA,OAAOC,IAAI,GAAGC,MAAM,CAACC,MAAM,CAAC;AAC1BC,IAAAA,UAAU,EAAE,CAAC;AACbC,IAAAA,UAAU,EAAE,CAAC;AACbC,IAAAA,UAAU,EAAE,CAAC;AACbC,IAAAA,YAAY,EAAE,CAAC;AACfC,IAAAA,gBAAgB,EAAE,CAAC;AACnBC,IAAAA,MAAM,EAAE,CAAC;AACTC,IAAAA,iBAAiB,EAAE,CAAC;AACpBC,IAAAA,OAAO,EAAE,CAAC;AACVC,IAAAA,kBAAkB,EAAE,CAAC;AACrBC,IAAAA,WAAW,EAAE,EAAE;AACfC,IAAAA,gBAAgB,EAAE,EAAE;AACpBC,IAAAA,iBAAiB,EAAE,EAAE;AACrBC,IAAAA,qBAAqB,EAAE,EAAE;AACzBC,IAAAA,sBAAsB,EAAE,EAAE;AAC1BC,IAAAA,6BAA6B,EAAE;AACjC,GAAC,CAAC;AAEJ;;AAEA;AACA;AACA;AACA;AACA;AACAC,SAAS,CAACC,MAAM,CAACvC,iBAAiB,EAAE;AAClCwC,EAAAA,SAAS,EAAE,mBAAmB;AAC9BC,EAAAA,MAAM,EAAE,QAAQ;AAChBC,EAAAA,MAAM,EAAE;IACNxC,MAAM,EAAEG,IAAI,CAACsC,OAAO;IACpBxC,cAAc,EAAEE,IAAI,CAACsC,OAAO;IAC5BvC,IAAI,EAAEC,IAAI,CAACuC,MAAM;AACjBvC,IAAAA,IAAI,EAAE,CAAEA,IAAI,CAACwC,KAAK,EAAExC,IAAI,CAACyC,IAAI,CAAC,MAAM,CAAC,CAAE;IACvCxC,aAAa,EAAED,IAAI,CAAC0C,MAAM;AAC1BxC,IAAAA,WAAW,EAAE,CAAEyC,IAAI,CAACC,MAAM,EAAE5C,IAAI,CAAC6C,IAAI,CAAC,QAAQ,CAAC,CAAE;IACjD1C,MAAM,EAAE,CAAEwC,IAAI,CAACC,MAAM,EAAE5C,IAAI,CAACsC,OAAO;AACrC;AACF,CAAC,CAAC;;;;"}
|
|
@@ -2,9 +2,12 @@ import { assertCarbonRecord } from '../../format/carbonRecordGuard.js';
|
|
|
2
2
|
import { CjsSchema, impl, type } from '#schema';
|
|
3
3
|
import { CjsModel } from '#model';
|
|
4
4
|
import '#utils/is';
|
|
5
|
-
import { SHADER_STAGE_COUNT, requireShaderStageType } from './shaderStage.js';
|
|
5
|
+
import { SHADER_STAGE_COUNT, requireShaderStageType, ShaderStageType } from './shaderStage.js';
|
|
6
6
|
import { Tr2EffectStageInput } from './Tr2EffectStageInput.js';
|
|
7
7
|
import { recordBytes, toRecordBlob } from './carbonRecordFields.js';
|
|
8
|
+
import { peekBackendEngineId, CARBON_BACKEND_ENGINE_ID } from '../../format/carbonEffect/backendEngineId.js';
|
|
9
|
+
import { readBackendBlock } from '../../format/carbonEffect/carbonEffectBackendBlock.js';
|
|
10
|
+
import { readGlslBackendBlock } from '../../formats/webgl/core/glslBackendBlock.js';
|
|
8
11
|
|
|
9
12
|
// Source: trinity/trinity/Shader/Tr2EffectDescription.h
|
|
10
13
|
|
|
@@ -53,9 +56,11 @@ class Tr2Pass extends CjsModel {
|
|
|
53
56
|
* explicit empty slots rather than left as holes. The stage's own type byte
|
|
54
57
|
* decides where it lands; position in the record does not.
|
|
55
58
|
*
|
|
56
|
-
* The optional backend block is retained verbatim
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
+
* The optional backend block is retained verbatim. It is the one place the
|
|
60
|
+
* container diverges by backend, and deciding what it means is the engine's
|
|
61
|
+
* job, not the reader's - with one exception: the texture merges it records
|
|
62
|
+
* are copied onto the pixel stage's reflected resources
|
|
63
|
+
* (`readMergedResources`).
|
|
59
64
|
*
|
|
60
65
|
* @param {object} record Carbon pass record.
|
|
61
66
|
* @returns {Tr2Pass} Reflected pass.
|
|
@@ -106,9 +111,72 @@ class Tr2Pass extends CjsModel {
|
|
|
106
111
|
if (stage?.exists && stage.signature) stage.signature.backendBlock = pass.backendBlock;
|
|
107
112
|
}
|
|
108
113
|
}
|
|
114
|
+
|
|
115
|
+
// The one part of the block that is not the backend's alone: which textures
|
|
116
|
+
// were merged. The effect binds by register from this reflection, so the
|
|
117
|
+
// merged register has to say what it now holds.
|
|
118
|
+
const pixel = pass.stageInputs[ShaderStageType.PIXEL_SHADER];
|
|
119
|
+
for (const merge of Tr2Pass.readMergedResources(pass.backendBlock)) {
|
|
120
|
+
const resource = pixel.resources.get(merge.register);
|
|
121
|
+
if (!resource) {
|
|
122
|
+
throw new Error(`Backend block merges into t${merge.register}, which the pixel stage does not reflect`);
|
|
123
|
+
}
|
|
124
|
+
resource.arrayLayers = merge.arrayLayers;
|
|
125
|
+
resource.packed = merge.packed;
|
|
126
|
+
}
|
|
109
127
|
return pass;
|
|
110
128
|
}
|
|
111
129
|
|
|
130
|
+
/**
|
|
131
|
+
* The texture merges a pass's backend block records, each at the register the
|
|
132
|
+
* merged texture binds to.
|
|
133
|
+
*
|
|
134
|
+
* Not Carbon; see `Tr2EffectResource.arrayLayers`. The merge list is shared by
|
|
135
|
+
* both browser backends, but where the merged texture landed is not: WebGPU
|
|
136
|
+
* tags the binding with the merge's id, and the GLSL emitter declares it as
|
|
137
|
+
* `s` + the merge's output name at the first member it met. A merge with no
|
|
138
|
+
* such binding was never sampled in this body, so it is left out. Blocks of
|
|
139
|
+
* any other backend record no merges.
|
|
140
|
+
*
|
|
141
|
+
* @param {{bytes: Uint8Array}|null} backendBlock The pass's backend block.
|
|
142
|
+
* @returns {Array<{register: number, arrayLayers: string[], packed: boolean}>} The merges.
|
|
143
|
+
*/
|
|
144
|
+
static readMergedResources(backendBlock) {
|
|
145
|
+
if (!backendBlock) return [];
|
|
146
|
+
const engine = peekBackendEngineId(backendBlock.bytes);
|
|
147
|
+
let transforms;
|
|
148
|
+
let registerOf;
|
|
149
|
+
if (engine === CARBON_BACKEND_ENGINE_ID.webgpu) {
|
|
150
|
+
const block = readBackendBlock(backendBlock.bytes, {
|
|
151
|
+
source: "Tr2Pass.backendBlock"
|
|
152
|
+
});
|
|
153
|
+
const bindings = block.bindGroups.flatMap(group => group.bindings);
|
|
154
|
+
transforms = block.transforms;
|
|
155
|
+
registerOf = transform => bindings.find(binding => binding.transformId === transform.id)?.registerIndex;
|
|
156
|
+
} else if (engine === CARBON_BACKEND_ENGINE_ID.webgl2) {
|
|
157
|
+
const block = readGlslBackendBlock(backendBlock.bytes, {
|
|
158
|
+
source: "Tr2Pass.backendBlock"
|
|
159
|
+
});
|
|
160
|
+
const bindings = block.stages.pixel?.bindings ?? [];
|
|
161
|
+
transforms = block.transforms;
|
|
162
|
+
registerOf = transform => bindings.find(binding => binding.kind === "resource" && binding.name === `s${transform.output.name}`)?.registerIndex;
|
|
163
|
+
} else {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
const merges = [];
|
|
167
|
+
for (const transform of transforms) {
|
|
168
|
+
if (transform.kind !== "texture-2d-array" && transform.kind !== "texture-2d-packed") continue;
|
|
169
|
+
const register = registerOf(transform);
|
|
170
|
+
if (register === undefined) continue;
|
|
171
|
+
merges.push({
|
|
172
|
+
register,
|
|
173
|
+
arrayLayers: transform.inputs.map(input => input.parameter),
|
|
174
|
+
packed: transform.kind === "texture-2d-packed"
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return merges;
|
|
178
|
+
}
|
|
179
|
+
|
|
112
180
|
/**
|
|
113
181
|
* The populated stages in the order they should be written.
|
|
114
182
|
*
|
|
@@ -173,7 +241,10 @@ CjsSchema.define(Tr2Pass, {
|
|
|
173
241
|
indirectLayout: type.rawStruct("Tr2IndirectDrawBufferLayout"),
|
|
174
242
|
renderStateValues: [impl.adapted, impl.reason("Carbon interns the state block while reading (Tr2EffectStateManager::RegisterRenderStateSetup, .h:118) and keeps only the renderStates index (Tr2EffectDescription.h:202). Ours interns at the Trinity boundary, so the authored state/value pairs are retained until then; see Tr2EffectStateManager.registerShaderHandles."), type.rawStruct("CjsEffectRenderStateValues")],
|
|
175
243
|
stageOrder: [impl.custom, impl.reason("Carbon indexes pass stages by type in a fixed array and loses the file's ordering; the port retains it so a body can be re-emitted as the file that produced it."), type.rawStruct("CjsEffectStageOrder")],
|
|
176
|
-
backendBlock: [impl.custom, impl.reason("Carbon ends a pass at its render states; CarbonEngineJS containers may append one per-pass block carrying the backend program, which the resource retains
|
|
244
|
+
backendBlock: [impl.custom, impl.reason("Carbon ends a pass at its render states; CarbonEngineJS containers may append one per-pass block carrying the backend program, which the resource retains, reading only its texture merges."), type.rawStruct("CjsEffectBackendBlock")]
|
|
245
|
+
},
|
|
246
|
+
methods: {
|
|
247
|
+
readMergedResources: impl.custom
|
|
177
248
|
}
|
|
178
249
|
});
|
|
179
250
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tr2Pass.js","sources":["../../../../../src/resource/shader/reflection/Tr2Pass.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\nimport { assertCarbonRecord } from \"../../format/carbonRecordGuard.js\";\nimport { CjsSchema, impl, type } from \"#schema\";\nimport { CjsModel } from \"#model\";\nimport {\n} from \"#utils/is\";\nimport { requireShaderStageType, SHADER_STAGE_COUNT } from \"./shaderStage.js\";\nimport { Tr2EffectStageInput } from \"./Tr2EffectStageInput.js\";\nimport { recordBytes, toRecordBlob } from \"./carbonRecordFields.js\";\n\n/** Reflected effect pass; Carbon's interned program and state handles are kept as authored data. */\nexport class Tr2Pass extends CjsModel\n{\n\n /** stageInputs (Tr2EffectStageInput) */\n stageInputs = [];\n\n /** renderStates (unsigned int) */\n renderStates = 0;\n\n /** shaderTypeMask (unsigned int) */\n shaderTypeMask = 0;\n\n /** shaderProgram (unsigned int) */\n shaderProgram = 0;\n\n /** resourceSetDesc (Tr2ResourceSetDescriptionAL) */\n resourceSetDesc = null;\n\n /** indirectLayout (Tr2IndirectDrawBufferLayout) */\n indirectLayout = null;\n\n /** Exact authored render-state pairs retained before an engine creates a state handle. */\n renderStateValues = [];\n\n /** Optional per-pass backend block, absent in a stock Carbon file. */\n backendBlock = null;\n\n /**\n * Stage types in the order the file stored them.\n *\n * `stageInputs` is indexed by stage type, as Carbon's fixed array is, so the\n * file's ordering is not recoverable from it. That ordering is authored rather\n * than derivable: measured over 288,528 passes in the shipped corpus, 156 put\n * geometry before pixel (`0,3,1`) and 12 put it after (`0,1,3`). Any sort loses\n * one group or the other, so the sequence is kept.\n */\n stageOrder = [];\n\n /**\n * Build one pass from its Carbon v15 description record.\n *\n * Carbon writes only the stages a pass actually uses, but the class keeps a\n * fixed six-slot array indexed by stage type, so absent stages are filled with\n * explicit empty slots rather than left as holes. The stage's own type byte\n * decides where it lands; position in the record does not.\n *\n * The optional backend block is retained verbatim and not interpreted here. It\n * is the one place the container diverges by backend, and deciding what it\n * means is the engine's job, not the reader's.\n *\n * @param {object} record Carbon pass record.\n * @returns {Tr2Pass} Reflected pass.\n */\n static fromCarbonBinary(record)\n {\n assertCarbonRecord(record, \"pass\");\n\n const pass = new this();\n const renderStateIds = new Set();\n pass.renderStateValues = record.renderStates.map(entry =>\n {\n if (renderStateIds.has(entry.state))\n {\n throw new Error(\n `Carbon effect render-state id ${entry.state} is duplicated`\n );\n }\n renderStateIds.add(entry.state);\n return { state: entry.state, value: entry.value };\n });\n\n pass.stageInputs = Array.from(\n { length: SHADER_STAGE_COUNT },\n (_, stageType) => Tr2EffectStageInput.createEmpty(stageType)\n );\n pass.shaderTypeMask = 0;\n\n for (const stageRecord of record.stages)\n {\n const stage = Tr2EffectStageInput.fromCarbonBinary(stageRecord);\n const stageType = requireShaderStageType(stage.stageType);\n if ((pass.shaderTypeMask & (1 << stageType)) !== 0)\n {\n throw new Error(\n `Carbon effect stage type ${stageType} is duplicated`\n );\n }\n pass.stageInputs[stageType] = stage;\n pass.shaderTypeMask = (pass.shaderTypeMask | (1 << stageType)) >>> 0;\n }\n\n pass.stageOrder = record.stages.map(stage => stage.type);\n pass.backendBlock = record.backendBlock\n ? { bytes: recordBytes(record.backendBlock), size: record.backendBlock.size }\n : null;\n\n // THE BLOCK RIDES THE SIGNATURE, STILL UNINTERPRETED. Carbon's signature is\n // the one thing Trinity hands a backend at CreateShader besides the\n // bytecode (Tr2EffectDescription.cpp:589-593), and backends consume it\n // without adding to it - Metal even refuses a field it cannot honour\n // (Tr2ShaderALMetal.mm:24-27). Our per-pass block is backend information\n // of exactly that kind, so it travels the same road: stamped on every stage\n // of the pass, read by the backend whose block it is, ignored by the rest.\n // The pass keeps its own copy for the format libraries that read it today.\n if (pass.backendBlock)\n {\n for (const stage of pass.stageInputs)\n {\n if (stage?.exists && stage.signature) stage.signature.backendBlock = pass.backendBlock;\n }\n }\n\n return pass;\n }\n\n\n /**\n * The populated stages in the order they should be written.\n *\n * A retained order wins; anything present but unlisted follows in stage-type\n * order, so a pass assembled by hand still emits every stage it has.\n *\n * @returns {Array<object>} Stages in file order.\n */\n #orderedStages()\n {\n const present = this.stageInputs.filter(stage => stage?.exists);\n const ordered = [];\n for (const stageType of this.stageOrder)\n {\n const stage = present.find(entry => entry.stageType === stageType);\n if (stage && !ordered.includes(stage)) ordered.push(stage);\n }\n for (const stage of present)\n {\n if (!ordered.includes(stage)) ordered.push(stage);\n }\n return ordered;\n }\n\n /**\n * Emit this pass as a Carbon v15 record.\n *\n * Only stages that exist are written, in ascending stage type. The class keeps\n * six slots because Carbon addresses them positionally in memory; the file\n * stores a count and only the populated ones.\n *\n * Render states are sorted by id because Carbon holds them in a `std::map`.\n *\n * @returns {object} Carbon pass record.\n */\n toCarbonBinary()\n {\n const record = {\n stages: this.#orderedStages().map(stage => stage.toCarbonBinary()),\n renderStates: this.renderStateValues\n .map(entry => ({ state: entry.state, value: entry.value }))\n .sort((left, right) => left.state - right.state)\n };\n if (this.backendBlock)\n {\n record.backendBlock = toRecordBlob(\n this.backendBlock.bytes,\n this.backendBlock.size\n );\n }\n return record;\n }\n}\n\n// Declared imperatively rather than with decorators, so this module stays\n// plain ESM that loads from source without a transform. The decorator\n// expressions are reused verbatim, so the registered metadata is identical.\n// Statics belong in `methods`: decorateMethod targets the prototype and\n// would register a static as an instance field.\nCjsSchema.define(Tr2Pass, {\n className: \"Tr2Pass\",\n family: \"shader\",\n fields: {\n stageInputs: type.list(\"Tr2EffectStageInput\"),\n renderStates: type.uint32,\n shaderTypeMask: type.uint32,\n shaderProgram: type.uint32,\n resourceSetDesc: type.rawStruct(\"Tr2ResourceSetDescriptionAL\"),\n indirectLayout: type.rawStruct(\"Tr2IndirectDrawBufferLayout\"),\n renderStateValues: [ impl.adapted, impl.reason(\"Carbon interns the state block while reading (Tr2EffectStateManager::RegisterRenderStateSetup, .h:118) and keeps only the renderStates index (Tr2EffectDescription.h:202). Ours interns at the Trinity boundary, so the authored state/value pairs are retained until then; see Tr2EffectStateManager.registerShaderHandles.\"), type.rawStruct(\"CjsEffectRenderStateValues\") ],\n stageOrder: [ impl.custom, impl.reason(\"Carbon indexes pass stages by type in a fixed array and loses the file's ordering; the port retains it so a body can be re-emitted as the file that produced it.\"), type.rawStruct(\"CjsEffectStageOrder\") ],\n backendBlock: [ impl.custom, impl.reason(\"Carbon ends a pass at its render states; CarbonEngineJS containers may append one per-pass block carrying the backend program, which the resource retains uninterpreted.\"), type.rawStruct(\"CjsEffectBackendBlock\") ]\n }\n});\n"],"names":["Tr2Pass","CjsModel","stageInputs","renderStates","shaderTypeMask","shaderProgram","resourceSetDesc","indirectLayout","renderStateValues","backendBlock","stageOrder","fromCarbonBinary","record","assertCarbonRecord","pass","renderStateIds","Set","map","entry","has","state","Error","add","value","Array","from","length","SHADER_STAGE_COUNT","_","stageType","Tr2EffectStageInput","createEmpty","stageRecord","stages","stage","requireShaderStageType","type","bytes","recordBytes","size","exists","signature","#orderedStages","present","filter","ordered","find","includes","push","toCarbonBinary","sort","left","right","toRecordBlob","CjsSchema","define","className","family","fields","list","uint32","rawStruct","impl","adapted","reason","custom"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tr2Pass.js","sources":["../../../../../src/resource/shader/reflection/Tr2Pass.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\nimport { assertCarbonRecord } from \"../../format/carbonRecordGuard.js\";\nimport { CjsSchema, impl, type } from \"#schema\";\nimport { CjsModel } from \"#model\";\nimport {\n} from \"#utils/is\";\nimport { requireShaderStageType, SHADER_STAGE_COUNT, ShaderStageType } from \"./shaderStage.js\";\nimport { Tr2EffectStageInput } from \"./Tr2EffectStageInput.js\";\nimport { recordBytes, toRecordBlob } from \"./carbonRecordFields.js\";\nimport { CARBON_BACKEND_ENGINE_ID, peekBackendEngineId } from \"../../format/carbonEffect/backendEngineId.js\";\nimport { readBackendBlock } from \"../../format/carbonEffect/carbonEffectBackendBlock.js\";\nimport { readGlslBackendBlock } from \"../../formats/webgl/core/glslBackendBlock.js\";\n\n/** Reflected effect pass; Carbon's interned program and state handles are kept as authored data. */\nexport class Tr2Pass extends CjsModel\n{\n\n /** stageInputs (Tr2EffectStageInput) */\n stageInputs = [];\n\n /** renderStates (unsigned int) */\n renderStates = 0;\n\n /** shaderTypeMask (unsigned int) */\n shaderTypeMask = 0;\n\n /** shaderProgram (unsigned int) */\n shaderProgram = 0;\n\n /** resourceSetDesc (Tr2ResourceSetDescriptionAL) */\n resourceSetDesc = null;\n\n /** indirectLayout (Tr2IndirectDrawBufferLayout) */\n indirectLayout = null;\n\n /** Exact authored render-state pairs retained before an engine creates a state handle. */\n renderStateValues = [];\n\n /** Optional per-pass backend block, absent in a stock Carbon file. */\n backendBlock = null;\n\n /**\n * Stage types in the order the file stored them.\n *\n * `stageInputs` is indexed by stage type, as Carbon's fixed array is, so the\n * file's ordering is not recoverable from it. That ordering is authored rather\n * than derivable: measured over 288,528 passes in the shipped corpus, 156 put\n * geometry before pixel (`0,3,1`) and 12 put it after (`0,1,3`). Any sort loses\n * one group or the other, so the sequence is kept.\n */\n stageOrder = [];\n\n /**\n * Build one pass from its Carbon v15 description record.\n *\n * Carbon writes only the stages a pass actually uses, but the class keeps a\n * fixed six-slot array indexed by stage type, so absent stages are filled with\n * explicit empty slots rather than left as holes. The stage's own type byte\n * decides where it lands; position in the record does not.\n *\n * The optional backend block is retained verbatim. It is the one place the\n * container diverges by backend, and deciding what it means is the engine's\n * job, not the reader's - with one exception: the texture merges it records\n * are copied onto the pixel stage's reflected resources\n * (`readMergedResources`).\n *\n * @param {object} record Carbon pass record.\n * @returns {Tr2Pass} Reflected pass.\n */\n static fromCarbonBinary(record)\n {\n assertCarbonRecord(record, \"pass\");\n\n const pass = new this();\n const renderStateIds = new Set();\n pass.renderStateValues = record.renderStates.map(entry =>\n {\n if (renderStateIds.has(entry.state))\n {\n throw new Error(\n `Carbon effect render-state id ${entry.state} is duplicated`\n );\n }\n renderStateIds.add(entry.state);\n return { state: entry.state, value: entry.value };\n });\n\n pass.stageInputs = Array.from(\n { length: SHADER_STAGE_COUNT },\n (_, stageType) => Tr2EffectStageInput.createEmpty(stageType)\n );\n pass.shaderTypeMask = 0;\n\n for (const stageRecord of record.stages)\n {\n const stage = Tr2EffectStageInput.fromCarbonBinary(stageRecord);\n const stageType = requireShaderStageType(stage.stageType);\n if ((pass.shaderTypeMask & (1 << stageType)) !== 0)\n {\n throw new Error(\n `Carbon effect stage type ${stageType} is duplicated`\n );\n }\n pass.stageInputs[stageType] = stage;\n pass.shaderTypeMask = (pass.shaderTypeMask | (1 << stageType)) >>> 0;\n }\n\n pass.stageOrder = record.stages.map(stage => stage.type);\n pass.backendBlock = record.backendBlock\n ? { bytes: recordBytes(record.backendBlock), size: record.backendBlock.size }\n : null;\n\n // THE BLOCK RIDES THE SIGNATURE, STILL UNINTERPRETED. Carbon's signature is\n // the one thing Trinity hands a backend at CreateShader besides the\n // bytecode (Tr2EffectDescription.cpp:589-593), and backends consume it\n // without adding to it - Metal even refuses a field it cannot honour\n // (Tr2ShaderALMetal.mm:24-27). Our per-pass block is backend information\n // of exactly that kind, so it travels the same road: stamped on every stage\n // of the pass, read by the backend whose block it is, ignored by the rest.\n // The pass keeps its own copy for the format libraries that read it today.\n if (pass.backendBlock)\n {\n for (const stage of pass.stageInputs)\n {\n if (stage?.exists && stage.signature) stage.signature.backendBlock = pass.backendBlock;\n }\n }\n\n // The one part of the block that is not the backend's alone: which textures\n // were merged. The effect binds by register from this reflection, so the\n // merged register has to say what it now holds.\n const pixel = pass.stageInputs[ShaderStageType.PIXEL_SHADER];\n\n for (const merge of Tr2Pass.readMergedResources(pass.backendBlock))\n {\n const resource = pixel.resources.get(merge.register);\n\n if (!resource)\n {\n throw new Error(`Backend block merges into t${merge.register}, which the pixel stage does not reflect`);\n }\n\n resource.arrayLayers = merge.arrayLayers;\n resource.packed = merge.packed;\n }\n\n return pass;\n }\n\n /**\n * The texture merges a pass's backend block records, each at the register the\n * merged texture binds to.\n *\n * Not Carbon; see `Tr2EffectResource.arrayLayers`. The merge list is shared by\n * both browser backends, but where the merged texture landed is not: WebGPU\n * tags the binding with the merge's id, and the GLSL emitter declares it as\n * `s` + the merge's output name at the first member it met. A merge with no\n * such binding was never sampled in this body, so it is left out. Blocks of\n * any other backend record no merges.\n *\n * @param {{bytes: Uint8Array}|null} backendBlock The pass's backend block.\n * @returns {Array<{register: number, arrayLayers: string[], packed: boolean}>} The merges.\n */\n static readMergedResources(backendBlock)\n {\n if (!backendBlock) return [];\n\n const engine = peekBackendEngineId(backendBlock.bytes);\n let transforms;\n let registerOf;\n\n if (engine === CARBON_BACKEND_ENGINE_ID.webgpu)\n {\n const block = readBackendBlock(backendBlock.bytes, { source: \"Tr2Pass.backendBlock\" });\n const bindings = block.bindGroups.flatMap(group => group.bindings);\n\n transforms = block.transforms;\n registerOf = transform => bindings.find(binding => binding.transformId === transform.id)?.registerIndex;\n }\n else if (engine === CARBON_BACKEND_ENGINE_ID.webgl2)\n {\n const block = readGlslBackendBlock(backendBlock.bytes, { source: \"Tr2Pass.backendBlock\" });\n const bindings = block.stages.pixel?.bindings ?? [];\n\n transforms = block.transforms;\n registerOf = transform => bindings.find(binding => binding.kind === \"resource\" && binding.name === `s${transform.output.name}`)?.registerIndex;\n }\n else\n {\n return [];\n }\n\n const merges = [];\n\n for (const transform of transforms)\n {\n if (transform.kind !== \"texture-2d-array\" && transform.kind !== \"texture-2d-packed\") continue;\n\n const register = registerOf(transform);\n\n if (register === undefined) continue;\n\n merges.push({\n register,\n arrayLayers: transform.inputs.map(input => input.parameter),\n packed: transform.kind === \"texture-2d-packed\"\n });\n }\n\n return merges;\n }\n\n\n /**\n * The populated stages in the order they should be written.\n *\n * A retained order wins; anything present but unlisted follows in stage-type\n * order, so a pass assembled by hand still emits every stage it has.\n *\n * @returns {Array<object>} Stages in file order.\n */\n #orderedStages()\n {\n const present = this.stageInputs.filter(stage => stage?.exists);\n const ordered = [];\n for (const stageType of this.stageOrder)\n {\n const stage = present.find(entry => entry.stageType === stageType);\n if (stage && !ordered.includes(stage)) ordered.push(stage);\n }\n for (const stage of present)\n {\n if (!ordered.includes(stage)) ordered.push(stage);\n }\n return ordered;\n }\n\n /**\n * Emit this pass as a Carbon v15 record.\n *\n * Only stages that exist are written, in ascending stage type. The class keeps\n * six slots because Carbon addresses them positionally in memory; the file\n * stores a count and only the populated ones.\n *\n * Render states are sorted by id because Carbon holds them in a `std::map`.\n *\n * @returns {object} Carbon pass record.\n */\n toCarbonBinary()\n {\n const record = {\n stages: this.#orderedStages().map(stage => stage.toCarbonBinary()),\n renderStates: this.renderStateValues\n .map(entry => ({ state: entry.state, value: entry.value }))\n .sort((left, right) => left.state - right.state)\n };\n if (this.backendBlock)\n {\n record.backendBlock = toRecordBlob(\n this.backendBlock.bytes,\n this.backendBlock.size\n );\n }\n return record;\n }\n}\n\n// Declared imperatively rather than with decorators, so this module stays\n// plain ESM that loads from source without a transform. The decorator\n// expressions are reused verbatim, so the registered metadata is identical.\n// Statics belong in `methods`: decorateMethod targets the prototype and\n// would register a static as an instance field.\nCjsSchema.define(Tr2Pass, {\n className: \"Tr2Pass\",\n family: \"shader\",\n fields: {\n stageInputs: type.list(\"Tr2EffectStageInput\"),\n renderStates: type.uint32,\n shaderTypeMask: type.uint32,\n shaderProgram: type.uint32,\n resourceSetDesc: type.rawStruct(\"Tr2ResourceSetDescriptionAL\"),\n indirectLayout: type.rawStruct(\"Tr2IndirectDrawBufferLayout\"),\n renderStateValues: [ impl.adapted, impl.reason(\"Carbon interns the state block while reading (Tr2EffectStateManager::RegisterRenderStateSetup, .h:118) and keeps only the renderStates index (Tr2EffectDescription.h:202). Ours interns at the Trinity boundary, so the authored state/value pairs are retained until then; see Tr2EffectStateManager.registerShaderHandles.\"), type.rawStruct(\"CjsEffectRenderStateValues\") ],\n stageOrder: [ impl.custom, impl.reason(\"Carbon indexes pass stages by type in a fixed array and loses the file's ordering; the port retains it so a body can be re-emitted as the file that produced it.\"), type.rawStruct(\"CjsEffectStageOrder\") ],\n backendBlock: [ impl.custom, impl.reason(\"Carbon ends a pass at its render states; CarbonEngineJS containers may append one per-pass block carrying the backend program, which the resource retains, reading only its texture merges.\"), type.rawStruct(\"CjsEffectBackendBlock\") ]\n },\n methods: {\n readMergedResources: impl.custom\n }\n});\n"],"names":["Tr2Pass","CjsModel","stageInputs","renderStates","shaderTypeMask","shaderProgram","resourceSetDesc","indirectLayout","renderStateValues","backendBlock","stageOrder","fromCarbonBinary","record","assertCarbonRecord","pass","renderStateIds","Set","map","entry","has","state","Error","add","value","Array","from","length","SHADER_STAGE_COUNT","_","stageType","Tr2EffectStageInput","createEmpty","stageRecord","stages","stage","requireShaderStageType","type","bytes","recordBytes","size","exists","signature","pixel","ShaderStageType","PIXEL_SHADER","merge","readMergedResources","resource","resources","get","register","arrayLayers","packed","engine","peekBackendEngineId","transforms","registerOf","CARBON_BACKEND_ENGINE_ID","webgpu","block","readBackendBlock","source","bindings","bindGroups","flatMap","group","transform","find","binding","transformId","id","registerIndex","webgl2","readGlslBackendBlock","kind","name","output","merges","undefined","push","inputs","input","parameter","#orderedStages","present","filter","ordered","includes","toCarbonBinary","sort","left","right","toRecordBlob","CjsSchema","define","className","family","fields","list","uint32","rawStruct","impl","adapted","reason","custom","methods"],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { IBlueDynamicResourceConstructor } from '#blue';
|
|
2
|
+
import { TriTextureRes } from './TriTextureRes.js';
|
|
3
|
+
import { Tr2TexturePipeline } from './Tr2TexturePipeline.js';
|
|
4
|
+
import { Tr2TexturePipelineStepGenerateMips } from './Tr2TexturePipelineStepGenerateMips.js';
|
|
5
|
+
import { CjsTexturePipelineStepConvert } from './CjsTexturePipelineStepConvert.js';
|
|
6
|
+
import { CjsTexturePipelineStepResize } from './CjsTexturePipelineStepResize.js';
|
|
7
|
+
import { CjsTexturePipelineStepArray } from './CjsTexturePipelineStepArray.js';
|
|
8
|
+
|
|
9
|
+
// Not Carbon: `dynamic:/texturearray` is ours, registered in
|
|
10
|
+
// /docs/architecture/non-carbon-extensions.md.
|
|
11
|
+
|
|
12
|
+
/** The prefix an array path starts with. */
|
|
13
|
+
const TextureArrayPrefix = "dynamic:/texturearray/";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* `dynamic:/texturearray/<path>;<path>...` - separate images as the layers of
|
|
17
|
+
* one 2D texture array, layer 0 first.
|
|
18
|
+
*
|
|
19
|
+
* The string is the aggregate's whole identity: an effect keeps its named
|
|
20
|
+
* parameters, and whatever binds the merged sampler reads their current paths
|
|
21
|
+
* and asks for this string. A changed layer is a different string, so a
|
|
22
|
+
* different cached array - nothing is mutated in place. Two effects naming the
|
|
23
|
+
* same maps share one array.
|
|
24
|
+
*
|
|
25
|
+
* The query becomes a recipe - Convert, Resize, Array, GenerateMips - run
|
|
26
|
+
* through Carbon's `.ctr` route. Kept in the cache after release: a rebuild
|
|
27
|
+
* re-downloads and re-decodes every layer.
|
|
28
|
+
*/
|
|
29
|
+
class CjsTextureArrayConstructor extends IBlueDynamicResourceConstructor {
|
|
30
|
+
/**
|
|
31
|
+
* @param {object} resourceManager The `CjsResMan` that loads the layers.
|
|
32
|
+
*/
|
|
33
|
+
constructor(resourceManager) {
|
|
34
|
+
super();
|
|
35
|
+
this._resourceManager = resourceManager;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* An assembled array costs downloads and decodes to rebuild, so it is kept.
|
|
40
|
+
*
|
|
41
|
+
* @returns {boolean} Always true.
|
|
42
|
+
*/
|
|
43
|
+
IsCacheable() {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Build the texture array a query describes. The recipe starts at once; the
|
|
49
|
+
* texture is prepared when it finishes.
|
|
50
|
+
*
|
|
51
|
+
* @param {string} query Text after `dynamic:/texturearray/`.
|
|
52
|
+
* @returns {TriTextureRes} The texture resource.
|
|
53
|
+
*/
|
|
54
|
+
GetResource(query) {
|
|
55
|
+
const texture = new TriTextureRes();
|
|
56
|
+
texture.Initialize(TextureArrayPrefix + query, "");
|
|
57
|
+
const pipeline = CjsTextureArrayConstructor.buildRecipe(query);
|
|
58
|
+
if (!pipeline) {
|
|
59
|
+
const error = new Error(`Failed to parse ${TextureArrayPrefix}${query} texture path`);
|
|
60
|
+
error.code = "CJS_TEXTURE_PROCEDURAL_PATH_INVALID";
|
|
61
|
+
texture.SetError(error);
|
|
62
|
+
return texture;
|
|
63
|
+
}
|
|
64
|
+
texture.LoadPipeline(pipeline, this._resourceManager);
|
|
65
|
+
return texture;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The recipe for an array query, or null when it names no layers.
|
|
70
|
+
*
|
|
71
|
+
* @param {string} query `path;path;...`, layer 0 first.
|
|
72
|
+
* @returns {Tr2TexturePipeline|null} The recipe.
|
|
73
|
+
*/
|
|
74
|
+
static buildRecipe(query) {
|
|
75
|
+
const paths = String(query).split(";").map(part => part.trim()).filter(part => part);
|
|
76
|
+
if (paths.length === 0) return null;
|
|
77
|
+
const array = new CjsTexturePipelineStepArray();
|
|
78
|
+
array.paths = paths;
|
|
79
|
+
const pipeline = new Tr2TexturePipeline();
|
|
80
|
+
pipeline.steps = [new CjsTexturePipelineStepConvert(), new CjsTexturePipelineStepResize(), array, new Tr2TexturePipelineStepGenerateMips()];
|
|
81
|
+
return pipeline;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Registers `dynamic:/texturearray` on a manager.
|
|
87
|
+
*
|
|
88
|
+
* @param {object} resourceManager Manager to register on.
|
|
89
|
+
* @returns {object} The same manager, for chaining.
|
|
90
|
+
*/
|
|
91
|
+
function RegisterTextureArray(resourceManager) {
|
|
92
|
+
resourceManager.RegisterResourceConstructor("texturearray", new CjsTextureArrayConstructor(resourceManager));
|
|
93
|
+
return resourceManager;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { CjsTextureArrayConstructor, RegisterTextureArray, TextureArrayPrefix };
|
|
97
|
+
//# sourceMappingURL=CjsTextureArrayConstructor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CjsTextureArrayConstructor.js","sources":["../../../../src/resource/texture/CjsTextureArrayConstructor.js"],"sourcesContent":["// Not Carbon: `dynamic:/texturearray` is ours, registered in\n// /docs/architecture/non-carbon-extensions.md.\nimport { IBlueDynamicResourceConstructor } from \"#blue\";\nimport { TriTextureRes } from \"./TriTextureRes.js\";\nimport { Tr2TexturePipeline } from \"./Tr2TexturePipeline.js\";\nimport { Tr2TexturePipelineStepGenerateMips } from \"./Tr2TexturePipelineStepGenerateMips.js\";\nimport { CjsTexturePipelineStepConvert } from \"./CjsTexturePipelineStepConvert.js\";\nimport { CjsTexturePipelineStepResize } from \"./CjsTexturePipelineStepResize.js\";\nimport { CjsTexturePipelineStepArray } from \"./CjsTexturePipelineStepArray.js\";\n\n/** The prefix an array path starts with. */\nexport const TextureArrayPrefix = \"dynamic:/texturearray/\";\n\n/**\n * `dynamic:/texturearray/<path>;<path>...` - separate images as the layers of\n * one 2D texture array, layer 0 first.\n *\n * The string is the aggregate's whole identity: an effect keeps its named\n * parameters, and whatever binds the merged sampler reads their current paths\n * and asks for this string. A changed layer is a different string, so a\n * different cached array - nothing is mutated in place. Two effects naming the\n * same maps share one array.\n *\n * The query becomes a recipe - Convert, Resize, Array, GenerateMips - run\n * through Carbon's `.ctr` route. Kept in the cache after release: a rebuild\n * re-downloads and re-decodes every layer.\n */\nexport class CjsTextureArrayConstructor extends IBlueDynamicResourceConstructor\n{\n\n /**\n * @param {object} resourceManager The `CjsResMan` that loads the layers.\n */\n constructor(resourceManager)\n {\n super();\n this._resourceManager = resourceManager;\n }\n\n /**\n * An assembled array costs downloads and decodes to rebuild, so it is kept.\n *\n * @returns {boolean} Always true.\n */\n IsCacheable()\n {\n return true;\n }\n\n /**\n * Build the texture array a query describes. The recipe starts at once; the\n * texture is prepared when it finishes.\n *\n * @param {string} query Text after `dynamic:/texturearray/`.\n * @returns {TriTextureRes} The texture resource.\n */\n GetResource(query)\n {\n const texture = new TriTextureRes();\n texture.Initialize(TextureArrayPrefix + query, \"\");\n\n const pipeline = CjsTextureArrayConstructor.buildRecipe(query);\n\n if (!pipeline)\n {\n const error = new Error(`Failed to parse ${TextureArrayPrefix}${query} texture path`);\n error.code = \"CJS_TEXTURE_PROCEDURAL_PATH_INVALID\";\n texture.SetError(error);\n return texture;\n }\n\n texture.LoadPipeline(pipeline, this._resourceManager);\n return texture;\n }\n\n /**\n * The recipe for an array query, or null when it names no layers.\n *\n * @param {string} query `path;path;...`, layer 0 first.\n * @returns {Tr2TexturePipeline|null} The recipe.\n */\n static buildRecipe(query)\n {\n const paths = String(query).split(\";\").map(part => part.trim()).filter(part => part);\n\n if (paths.length === 0) return null;\n\n const array = new CjsTexturePipelineStepArray();\n array.paths = paths;\n\n const pipeline = new Tr2TexturePipeline();\n pipeline.steps = [\n new CjsTexturePipelineStepConvert(),\n new CjsTexturePipelineStepResize(),\n array,\n new Tr2TexturePipelineStepGenerateMips()\n ];\n return pipeline;\n }\n\n}\n\n/**\n * Registers `dynamic:/texturearray` on a manager.\n *\n * @param {object} resourceManager Manager to register on.\n * @returns {object} The same manager, for chaining.\n */\nexport function RegisterTextureArray(resourceManager)\n{\n resourceManager.RegisterResourceConstructor(\"texturearray\", new CjsTextureArrayConstructor(resourceManager));\n return resourceManager;\n}\n"],"names":["TextureArrayPrefix","CjsTextureArrayConstructor","IBlueDynamicResourceConstructor","constructor","resourceManager","_resourceManager","IsCacheable","GetResource","query","texture","TriTextureRes","Initialize","pipeline","buildRecipe","error","Error","code","SetError","LoadPipeline","paths","String","split","map","part","trim","filter","length","array","CjsTexturePipelineStepArray","Tr2TexturePipeline","steps","CjsTexturePipelineStepConvert","CjsTexturePipelineStepResize","Tr2TexturePipelineStepGenerateMips","RegisterTextureArray","RegisterResourceConstructor"],"mappings":";;;;;;;;AAAA;AACA;;AASA;AACO,MAAMA,kBAAkB,GAAG;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,0BAA0B,SAASC,+BAA+B,CAC/E;AAEE;AACF;AACA;EACEC,WAAWA,CAACC,eAAe,EAC3B;AACE,IAAA,KAAK,EAAE;IACP,IAAI,CAACC,gBAAgB,GAAGD,eAAe;AACzC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEE,EAAAA,WAAWA,GACX;AACE,IAAA,OAAO,IAAI;AACb,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,KAAK,EACjB;AACE,IAAA,MAAMC,OAAO,GAAG,IAAIC,aAAa,EAAE;IACnCD,OAAO,CAACE,UAAU,CAACX,kBAAkB,GAAGQ,KAAK,EAAE,EAAE,CAAC;AAElD,IAAA,MAAMI,QAAQ,GAAGX,0BAA0B,CAACY,WAAW,CAACL,KAAK,CAAC;IAE9D,IAAI,CAACI,QAAQ,EACb;MACE,MAAME,KAAK,GAAG,IAAIC,KAAK,CAAC,mBAAmBf,kBAAkB,CAAA,EAAGQ,KAAK,CAAA,aAAA,CAAe,CAAC;MACrFM,KAAK,CAACE,IAAI,GAAG,qCAAqC;AAClDP,MAAAA,OAAO,CAACQ,QAAQ,CAACH,KAAK,CAAC;AACvB,MAAA,OAAOL,OAAO;AAChB,IAAA;IAEAA,OAAO,CAACS,YAAY,CAACN,QAAQ,EAAE,IAAI,CAACP,gBAAgB,CAAC;AACrD,IAAA,OAAOI,OAAO;AAChB,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACE,OAAOI,WAAWA,CAACL,KAAK,EACxB;AACE,IAAA,MAAMW,KAAK,GAAGC,MAAM,CAACZ,KAAK,CAAC,CAACa,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAACC,IAAI,IAAIA,IAAI,CAACC,IAAI,EAAE,CAAC,CAACC,MAAM,CAACF,IAAI,IAAIA,IAAI,CAAC;AAEpF,IAAA,IAAIJ,KAAK,CAACO,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;AAEnC,IAAA,MAAMC,KAAK,GAAG,IAAIC,2BAA2B,EAAE;IAC/CD,KAAK,CAACR,KAAK,GAAGA,KAAK;AAEnB,IAAA,MAAMP,QAAQ,GAAG,IAAIiB,kBAAkB,EAAE;IACzCjB,QAAQ,CAACkB,KAAK,GAAG,CACf,IAAIC,6BAA6B,EAAE,EACnC,IAAIC,4BAA4B,EAAE,EAClCL,KAAK,EACL,IAAIM,kCAAkC,EAAE,CACzC;AACD,IAAA,OAAOrB,QAAQ;AACjB,EAAA;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASsB,oBAAoBA,CAAC9B,eAAe,EACpD;EACEA,eAAe,CAAC+B,2BAA2B,CAAC,cAAc,EAAE,IAAIlC,0BAA0B,CAACG,eAAe,CAAC,CAAC;AAC5G,EAAA,OAAOA,eAAe;AACxB;;;;"}
|