@carbonenginejs/runtime 0.1.0-alpha.6 → 0.1.0-alpha.7
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.
Potentially problematic release.
This version of @carbonenginejs/runtime might be problematic. Click here for more details.
- package/dist/global/consts/effectPaths.js +4 -1
- package/dist/global/consts/effectPaths.js.map +1 -1
- package/dist/global/consts/index.js +1 -1
- package/dist/global/index.js +1 -1
- package/dist/index.js +3 -3
- package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js +19 -2
- package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
- package/dist/resource/format/index.js +1 -1
- package/dist/resource/formats/hlsl/core/carbonTypedViews.js +121 -65
- package/dist/resource/formats/hlsl/core/carbonTypedViews.js.map +1 -1
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js +10 -7
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/resource/formats/webgpu/core/effectBackendBodySet.js +3 -1
- package/dist/resource/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
- package/dist/resource/formats/webgpu/core/packageEffect.js +5 -0
- package/dist/resource/formats/webgpu/core/packageEffect.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/emitWgsl.js +20 -0
- package/dist/resource/formats/webgpu/core/wgsl/emitWgsl.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/emulatedAddressing.js +93 -4
- package/dist/resource/formats/webgpu/core/wgsl/emulatedAddressing.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js +74 -64
- package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/lowerFragmentProgram.js +16 -7
- package/dist/resource/formats/webgpu/core/wgsl/lowerFragmentProgram.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/wgslTypedViews.js +69 -27
- package/dist/resource/formats/webgpu/core/wgsl/wgslTypedViews.js.map +1 -1
- package/dist/resource/geometry/registerGeometryResources.js +10 -1
- package/dist/resource/geometry/registerGeometryResources.js.map +1 -1
- package/dist/sof/EveSOFDNA.js +4 -2
- package/dist/sof/EveSOFDNA.js.map +1 -1
- package/dist/sof/EveSOFDataMgr.js +83 -69
- package/dist/sof/EveSOFDataMgr.js.map +1 -1
- package/dist/trinity/core/Tr2Denoiser.js +6 -1
- package/dist/trinity/core/Tr2Denoiser.js.map +1 -1
- package/dist/trinity/core/Tr2ShadowMap.js +7 -2
- package/dist/trinity/core/Tr2ShadowMap.js.map +1 -1
- package/dist/trinity/core/context/Tr2RenderContext.js +43 -0
- package/dist/trinity/core/context/Tr2RenderContext.js.map +1 -1
- package/dist/trinity/core/device/Tr2GpuStructuredBuffer.js +134 -0
- package/dist/trinity/core/device/Tr2GpuStructuredBuffer.js.map +1 -0
- package/dist/trinity/core/index.js +1 -0
- package/dist/trinity/core/index.js.map +1 -1
- package/dist/trinity/core/lighting/Tr2LightManager.js +410 -124
- package/dist/trinity/core/lighting/Tr2LightManager.js.map +1 -1
- package/dist/trinity/eve/effect/lensflare/EveLensflare.js +303 -312
- package/dist/trinity/eve/effect/lensflare/EveLensflare.js.map +1 -1
- package/dist/trinity/eve/effect/lensflare/EveOccluder.js +117 -0
- package/dist/trinity/eve/effect/lensflare/EveOccluder.js.map +1 -0
- package/dist/trinity/eve/index.js +1 -0
- package/dist/trinity/eve/index.js.map +1 -1
- package/dist/trinity/eve/scene/EveSpaceScene.js +286 -6
- package/dist/trinity/eve/scene/EveSpaceScene.js.map +1 -1
- package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js +212 -32
- package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js.map +1 -1
- package/dist/trinity/generated/eve/effect/index.js +0 -1
- package/dist/trinity/generated/eve/effect/index.js.map +1 -1
- package/dist/trinity/generated/eve/index.js +0 -1
- package/dist/trinity/generated/eve/index.js.map +1 -1
- package/dist/trinity/generated/index.js +0 -2
- 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 +2 -2
- package/dist/trinity/postProcess/Tr2PostProcessRenderer.js +4 -1
- package/dist/trinity/postProcess/Tr2PostProcessRenderer.js.map +1 -1
- package/dist/trinity/postProcess/Tr2SSAO.js +282 -21
- package/dist/trinity/postProcess/Tr2SSAO.js.map +1 -1
- package/dist/trinity/shader/parameter/Tr2RuntimeTextureParameter.js +71 -53
- package/dist/trinity/shader/parameter/Tr2RuntimeTextureParameter.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js +81 -18
- package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuResourceSetAL.js +46 -4
- package/dist/trinityal/webgpu/CjsWebgpuResourceSetAL.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuShaderAL.js +32 -1
- package/dist/trinityal/webgpu/CjsWebgpuShaderAL.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuShaderProgramAL.js +27 -0
- package/dist/trinityal/webgpu/CjsWebgpuShaderProgramAL.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js +29 -4
- package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js.map +1 -1
- package/dist/trinityal/webgpu/core/CjsWebgpuPsoDescription.js +32 -2
- package/dist/trinityal/webgpu/core/CjsWebgpuPsoDescription.js.map +1 -1
- package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js +57 -5
- package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js.map +1 -1
- package/dist/trinityal/webgpu/core/CjsWebgpuWorkQueue.js +111 -5
- package/dist/trinityal/webgpu/core/CjsWebgpuWorkQueue.js.map +1 -1
- package/docs/trinity/reference/classes/generated.md +20 -20
- package/docs/trinity/reference/classes/post-process.md +1 -1
- package/package.json +1 -1
- package/dist/trinity/generated/eve/effect/EveOccluder.js +0 -38
- package/dist/trinity/generated/eve/effect/EveOccluder.js.map +0 -1
- package/dist/trinity/generated/trinityCore/Tr2GpuStructuredBuffer.js +0 -48
- package/dist/trinity/generated/trinityCore/Tr2GpuStructuredBuffer.js.map +0 -1
|
@@ -3,6 +3,7 @@ import { edit, type, carbon, impl } from '#schema';
|
|
|
3
3
|
import { CjsModel } from '#model';
|
|
4
4
|
import { vec2 } from '#math/vec2';
|
|
5
5
|
import { vec4 } from '#math/vec4';
|
|
6
|
+
import { float32FromBits } from '#utils/bytes';
|
|
6
7
|
import { Tr2Effect as _Tr2Effect } from '../shader/Tr2Effect.js';
|
|
7
8
|
import { Tr2LoadAction, Tr2StoreAction, Tr2GpuUsage, PixelFormat, TextureType } from '#consts/render-context';
|
|
8
9
|
import { RenderingMode } from '#consts/graphics';
|
|
@@ -238,7 +239,11 @@ class Tr2Denoiser extends CjsModel {
|
|
|
238
239
|
|
|
239
240
|
// Carbon's `max(uint32_t(radius / upscaling + 0.5f), 2u)`: round to nearest,
|
|
240
241
|
// and never below two, or the blur would sample only itself.
|
|
241
|
-
|
|
242
|
+
// THE UINT32 OVERLOAD STORES THE INTEGER'S BITS (Tr2Effect.cpp:2103-2120),
|
|
243
|
+
// and Denoise1D loops from -Radius to +Radius on those bits read as an int.
|
|
244
|
+
// Passed as the float 5.0 it read 1084227584: two billion iterations per
|
|
245
|
+
// pixel, which hung the GPU.
|
|
246
|
+
effect.SetParameter("Radius", float32FromBits(Math.max(Math.trunc(this.radius / upscaling + 0.5), 2)));
|
|
242
247
|
effect.SetParameter("ProjectionInv", projection);
|
|
243
248
|
// Carbon's Vector2( projection._43, projection._33 ); column-major puts
|
|
244
249
|
// those at 14 and 10.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tr2Denoiser.js","sources":["../../../../src/trinity/core/Tr2Denoiser.js"],"sourcesContent":["// Source: trinity/trinity/Tr2Denoiser.h\n// trinity/trinity/Tr2Denoiser.cpp\n//\n// A separable spatial denoiser, run over a noisy single-channel buffer - in\n// practice the screen-space shadow factor, which is why Tr2ShadowMap owns one.\n//\n// FOUR PASSES, AND THE ORDER IS THE ALGORITHM. Estimate how noisy the source is;\n// turn that into a per-pixel denoising strength; blur horizontally; blur\n// vertically. The two blur passes share one effect FILE and differ only by an\n// `Axis` parameter, which is what makes the filter separable and why there are\n// two effect instances rather than one used twice - each carries its own axis\n// and its own NORMALS_INPUT option.\n//\n// EDGES ARE PRESERVED BY WEIGHTING, NOT BY BRANCHING. Depth, normal and plane\n// weights decide how much a neighbouring sample counts, so the blur stops at a\n// geometric edge instead of smearing across it. That is why it needs the depth\n// buffer and the reversed-depth projection, and why a normals buffer is optional\n// rather than required - without one the effect takes its NONE permutation.\n//\n// WHAT IT CANNOT DO YET, stated plainly because the structure is complete and\n// the output is not: nothing loads the four effects. Each is constructed with\n// its res: path exactly as Carbon does, and Carbon loads them elsewhere too -\n// the constructor only names them. Until a resource manager resolves those\n// paths the passes run and draw nothing, which is the same state every other\n// effect-driven path in this runtime is in.\nimport { carbon, impl, edit, type } from \"#schema\";\nimport { CjsModel } from \"#model\";\nimport { vec2 } from \"#math/vec2\";\nimport { vec4 } from \"#math/vec4\";\nimport { Tr2Effect } from \"../shader/Tr2Effect.js\";\nimport { PixelFormat, TextureType, Tr2GpuUsage, Tr2LoadAction, Tr2StoreAction } from \"#consts/render-context\";\nimport { RenderingMode } from \"#consts/graphics\";\nimport { Tr2ColorAttachment } from \"../../trinityal/Tr2RenderPassAL/Tr2ColorAttachment.js\";\n\n/** Carbon's four effect paths (`Tr2Denoiser.cpp:19-28`). */\nconst ESTIMATE_NOISE_PATH = \"res:/graphics/effect/managed/space/system/EstimateNoise.fx\";\nconst DENOISE_ESTIMATE_PATH = \"res:/graphics/effect/managed/space/system/DenoiseEstimate.fx\";\nconst DENOISE_1D_PATH = \"res:/graphics/effect/managed/space/system/Denoise1D.fx\";\n\n/** Carbon's shader option and its two values (`cpp:33-35`). */\nconst NORMALS_INPUT = \"NORMALS_INPUT\";\nconst NORMALS_INPUT_NORMALS = \"NORMALS_INPUT_NORMALS\";\nconst NORMALS_INPUT_NONE = \"NORMALS_INPUT_NONE\";\n\n/**\n * Carbon's hint for every one of the four passes (`cpp:107` and after):\n * DONT_CARE the previous contents, STORE the result.\n *\n * DONT_CARE is not \"clear\". It says the old contents are not needed, which is\n * what lets a tiler skip loading them; clearing would cost a write instead.\n * Every pass here overwrites its whole target, so the load is always wasted.\n */\nconst OVERWRITE_AND_KEEP = new Tr2ColorAttachment(Tr2LoadAction.DONT_CARE, Tr2StoreAction.STORE);\n\n/** Every pass target is R8, and every one is both drawn to and sampled from. */\nconst TARGET_USAGE = Tr2GpuUsage.RENDER_TARGET | Tr2GpuUsage.SHADER_RESOURCE;\n\n/** Builds one effect already pointed at its path, as Carbon's constructor does. */\nfunction effectAt(path)\n{\n const effect = new Tr2Effect();\n\n effect.SetEffectPathName(path);\n return effect;\n}\n\n/** Carries depth, normal, and plane weights together with radius, step size, and bypass state for spatial denoising. */\n@type.define({ className: \"Tr2Denoiser\", family: \"trinityCore\", purpose: \"Carries depth, normal, and plane weights together with radius, step size, and bypass state for spatial denoising.\" })\nexport class Tr2Denoiser extends CjsModel\n{\n\n /** m_bypass (bool) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.boolean\n bypass = false;\n\n /** m_depthWeight (float) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.float32\n depthWeight = 100;\n\n /** m_normalWeight (float) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.float32\n normalWeight = 1.5;\n\n /** m_planeWeight (float) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.float32\n planeWeight = 0;\n\n /** m_radius (uint32_t) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.uint32\n radius = 5;\n\n /** m_stepSize (uint32_t) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.uint32\n stepSize = 1;\n\n /** m_estimateNoise */\n #estimateNoise = effectAt(ESTIMATE_NOISE_PATH);\n\n /** m_denoiseEstimate */\n #denoiseEstimate = effectAt(DENOISE_ESTIMATE_PATH);\n\n /** m_denoiseHoriz - Denoise1D with Axis (stepSize, 0). */\n #denoiseHoriz = effectAt(DENOISE_1D_PATH);\n\n /** m_denoiseVert - the SAME effect file with Axis (0, stepSize). */\n #denoiseVert = effectAt(DENOISE_1D_PATH);\n\n /**\n * m_parametersDirty - set by OnModified, cleared at the end of Apply.\n *\n * The weights and the axis are only re-sent when something changed, which is\n * the one place this class caches anything.\n */\n #parametersDirty = true;\n\n /**\n * Runs the four passes and returns the denoised result.\n *\n * Carbon `Apply` (`cpp:59-162`). The one-argument overload is the `index = 0`\n * default here (`cpp:54-57`).\n *\n * INVALID IN, EMPTY OUT. A source or depth that is not valid returns null\n * rather than borrowing four textures to produce nothing.\n *\n * @param {object} source The noisy texture, as a pool handle.\n * @param {object} depth The scene depth buffer.\n * @param {object|null} normals Optional normals; absence selects a permutation.\n * @param {Array<number>} projection The REVERSED-depth projection.\n * @param {number} upscaling Divides the radius, so an upscaled pass blurs less.\n * @param {object} gpuResourcePool The pool the pass targets come from.\n * @param {object} renderContext The context to draw through.\n * @param {object} renderer The renderer owning the blitter.\n * @param {number} [index] Array slice of the result to render into.\n * @returns {object|null} The result handle, or null.\n */\n @carbon.method\n @impl.adapted\n @impl.reason(\"Carbon reaches the blitter through the static Tr2Renderer; ours is an instance, so the renderer is passed in like the pool and the context.\")\n Apply(source, depth, normals, projection, upscaling, gpuResourcePool, renderContext, renderer, index = 0)\n {\n // Carbon tests the HANDLE, not the texture behind it (`cpp:61`).\n if (!source.IsValid() || !depth.IsValid()) return null;\n\n const sourceTexture = source.Get();\n // Carbon is handed a default-constructed Tr2TextureAL when there are no\n // normals - a real object. Ours is handed null, so the object may be\n // absent; the METHOD is not optional.\n const hasNormals = Boolean(normals && normals.IsValid());\n const option = hasNormals ? NORMALS_INPUT_NORMALS : NORMALS_INPUT_NONE;\n\n this.#denoiseVert.SetOption(NORMALS_INPUT, option);\n this.#denoiseHoriz.SetOption(NORMALS_INPUT, option);\n\n const width = sourceTexture.GetWidth();\n const height = sourceTexture.GetHeight();\n const sourceSize = vec4.fromValues(width, height, 1 / width, 1 / height);\n\n this.#denoiseEstimate.SetParameter(\"SourceDimensions\", sourceSize);\n\n const esm = renderContext.GetEffectStateManager();\n\n // Null is Carbon's default-constructed texture: bind EMPTY, do not merely\n // save. A depth buffer left bound would depth-test a fullscreen blur.\n esm.PushDepthStencilBuffer(null);\n esm.PushRenderTarget();\n\n try\n {\n esm.ApplyStandardStates(RenderingMode.RM_FULLSCREEN);\n\n const estimate = this.#Pass(gpuResourcePool, \"Tr2Denoiser Noise Estimate\", width, height);\n\n esm.SetRenderTarget(0, estimate.Get());\n renderContext.RenderPassHint(OVERWRITE_AND_KEEP, null);\n this.#estimateNoise.SetParameter(\"Source\", sourceTexture);\n renderer.DrawScreenQuad(renderContext, this.#estimateNoise);\n this.#estimateNoise.SetParameter(\"Source\", null);\n\n const mask = this.#Pass(gpuResourcePool, \"Tr2Denoiser Denoise Mask\", width, height);\n\n this.#denoiseEstimate.SetParameter(\"Source\", estimate.Get());\n esm.SetRenderTarget(0, mask.Get());\n renderContext.RenderPassHint(OVERWRITE_AND_KEEP, null);\n renderer.DrawScreenQuad(renderContext, this.#denoiseEstimate);\n\n // Carbon releases the estimate here, before borrowing the next target, so\n // the pool can hand the same surface back rather than grow (`cpp:118`).\n gpuResourcePool.Free(estimate);\n\n const temp = this.#Pass(gpuResourcePool, \"Tr2Denoiser Temp\", width, height);\n\n this.#SetPassParameters(this.#denoiseHoriz, vec2.fromValues(1, 0), depth, normals, projection, sourceSize, upscaling);\n this.#denoiseHoriz.SetParameter(\"Source\", sourceTexture);\n this.#denoiseHoriz.SetParameter(\"NoiseEstimate\", mask.Get());\n esm.SetRenderTarget(0, temp.Get());\n renderContext.RenderPassHint(OVERWRITE_AND_KEEP, null);\n renderer.DrawScreenQuad(renderContext, this.#denoiseHoriz);\n this.#denoiseHoriz.SetParameter(\"Source\", null);\n this.#denoiseHoriz.SetParameter(\"NoiseEstimate\", null);\n\n gpuResourcePool.Free(source);\n\n const result = this.#Pass(gpuResourcePool, \"Tr2Denoiser Result\", width, height);\n\n this.#SetPassParameters(this.#denoiseVert, vec2.fromValues(0, 1), depth, normals, projection, sourceSize, upscaling);\n this.#denoiseVert.SetParameter(\"Source\", temp.Get());\n this.#denoiseVert.SetParameter(\"NoiseEstimate\", mask.Get());\n esm.SetRenderTarget(0, result.Get(), true, index);\n renderContext.RenderPassHint(OVERWRITE_AND_KEEP, null);\n renderer.DrawScreenQuad(renderContext, this.#denoiseVert);\n this.#denoiseVert.SetParameter(\"Source\", null);\n this.#denoiseVert.SetParameter(\"NoiseEstimate\", null);\n\n // Both blur effects hold the depth and normal buffers until here, so a\n // later pass cannot inherit them (`cpp:155-158`).\n for (const effect of [ this.#denoiseHoriz, this.#denoiseVert ])\n {\n effect.SetParameter(\"DepthBuffer\", null);\n effect.SetParameter(\"NormalBuffer\", null);\n }\n\n this.#parametersDirty = false;\n return result;\n }\n finally\n {\n // Carbon pops through ON_BLOCK_EXIT, which runs however the block leaves.\n esm.PopRenderTarget();\n esm.PopDepthStencilBuffer();\n }\n }\n\n /**\n * Carbon `SetRadius` (`cpp:170-172`).\n *\n * @param {number} value The new radius.\n * @returns {void}\n */\n @carbon.method\n @impl.implemented\n SetRadius(value)\n {\n this.radius = value >>> 0;\n this.#parametersDirty = true;\n }\n\n /**\n * Carbon `OnModified` (`cpp:164-168`): any authored change re-sends the\n * weights on the next Apply.\n *\n * @returns {boolean} True, as Carbon's does.\n */\n @carbon.method\n @impl.implemented\n OnModified()\n {\n this.#parametersDirty = true;\n return true;\n }\n\n /** Borrows one R8 pass target of the source's size. */\n #Pass(gpuResourcePool, name, width, height)\n {\n return gpuResourcePool.GetTempTexture(name, {\n type: TextureType.TEX_TYPE_2D,\n width,\n height,\n depth: 1,\n mipCount: 1,\n format: PixelFormat.PIXEL_FORMAT_R8_UNORM,\n gpuUsage: TARGET_USAGE\n });\n }\n\n /**\n * Carbon's `SetParams` lambda (`cpp:76-94`).\n *\n * The weights and the axis are sent only when something changed; the radius,\n * projection and buffers go every time. Carbon draws that line and it is not\n * arbitrary - the axis is per effect and constant, the radius divides by an\n * upscaling factor the caller may vary per frame.\n */\n #SetPassParameters(effect, direction, depth, normals, projection, sourceSize, upscaling)\n {\n if (this.#parametersDirty)\n {\n effect.SetParameter(\"DepthWeight\", this.depthWeight);\n effect.SetParameter(\"NormalWeight\", this.normalWeight);\n effect.SetParameter(\"PlaneWeight\", this.planeWeight);\n effect.SetParameter(\"PassThrough\", this.bypass ? 1 : 0);\n effect.SetParameter(\"Axis\", vec2.scale(vec2.create(), direction, this.stepSize));\n }\n\n // Carbon's `max(uint32_t(radius / upscaling + 0.5f), 2u)`: round to nearest,\n // and never below two, or the blur would sample only itself.\n effect.SetParameter(\"Radius\", Math.max(Math.trunc(this.radius / upscaling + 0.5), 2));\n\n effect.SetParameter(\"ProjectionInv\", projection);\n // Carbon's Vector2( projection._43, projection._33 ); column-major puts\n // those at 14 and 10.\n effect.SetParameter(\"ClipInfo\", vec2.fromValues(projection[14], projection[10]));\n\n effect.SetParameter(\"DepthBuffer\", depth);\n effect.SetParameter(\"NormalBuffer\", normals);\n effect.SetParameter(\"SourceDimensions\", sourceSize);\n }\n\n\n}\n"],"names":["ESTIMATE_NOISE_PATH","DENOISE_ESTIMATE_PATH","DENOISE_1D_PATH","NORMALS_INPUT","NORMALS_INPUT_NORMALS","NORMALS_INPUT_NONE","OVERWRITE_AND_KEEP","Tr2ColorAttachment","Tr2LoadAction","DONT_CARE","Tr2StoreAction","STORE","TARGET_USAGE","Tr2GpuUsage","RENDER_TARGET","SHADER_RESOURCE","effectAt","path","effect","Tr2Effect","SetEffectPathName","_Tr2Denoiser","Tr2Denoiser","CjsModel","e","_init_bypass","_init_extra_bypass","_init_depthWeight","_init_extra_depthWeight","_init_normalWeight","_init_extra_normalWeight","_init_planeWeight","_init_extra_planeWeight","_init_radius","_init_extra_radius","_init_stepSize","_init_extra_stepSize","_initProto","c","_initClass","_applyDecs","type","define","className","family","purpose","edit","notify","readwrite","persist","boolean","float32","uint32","carbon","method","impl","adapted","reason","implemented","bypass","depthWeight","normalWeight","planeWeight","radius","stepSize","Apply","source","depth","normals","projection","upscaling","gpuResourcePool","renderContext","renderer","index","IsValid","sourceTexture","Get","hasNormals","Boolean","option","SetOption","width","GetWidth","height","GetHeight","sourceSize","vec4","fromValues","SetParameter","esm","GetEffectStateManager","PushDepthStencilBuffer","PushRenderTarget","ApplyStandardStates","RenderingMode","RM_FULLSCREEN","estimate","SetRenderTarget","RenderPassHint","DrawScreenQuad","mask","Free","temp","vec2","result","PopRenderTarget","PopDepthStencilBuffer","SetRadius","value","OnModified","#Pass","name","GetTempTexture","TextureType","TEX_TYPE_2D","mipCount","format","PixelFormat","PIXEL_FORMAT_R8_UNORM","gpuUsage","#SetPassParameters","direction","scale","create","Math","max","trunc"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tr2Denoiser.js","sources":["../../../../src/trinity/core/Tr2Denoiser.js"],"sourcesContent":["// Source: trinity/trinity/Tr2Denoiser.h\n// trinity/trinity/Tr2Denoiser.cpp\n//\n// A separable spatial denoiser, run over a noisy single-channel buffer - in\n// practice the screen-space shadow factor, which is why Tr2ShadowMap owns one.\n//\n// FOUR PASSES, AND THE ORDER IS THE ALGORITHM. Estimate how noisy the source is;\n// turn that into a per-pixel denoising strength; blur horizontally; blur\n// vertically. The two blur passes share one effect FILE and differ only by an\n// `Axis` parameter, which is what makes the filter separable and why there are\n// two effect instances rather than one used twice - each carries its own axis\n// and its own NORMALS_INPUT option.\n//\n// EDGES ARE PRESERVED BY WEIGHTING, NOT BY BRANCHING. Depth, normal and plane\n// weights decide how much a neighbouring sample counts, so the blur stops at a\n// geometric edge instead of smearing across it. That is why it needs the depth\n// buffer and the reversed-depth projection, and why a normals buffer is optional\n// rather than required - without one the effect takes its NONE permutation.\n//\n// WHAT IT CANNOT DO YET, stated plainly because the structure is complete and\n// the output is not: nothing loads the four effects. Each is constructed with\n// its res: path exactly as Carbon does, and Carbon loads them elsewhere too -\n// the constructor only names them. Until a resource manager resolves those\n// paths the passes run and draw nothing, which is the same state every other\n// effect-driven path in this runtime is in.\nimport { carbon, impl, edit, type } from \"#schema\";\nimport { CjsModel } from \"#model\";\nimport { vec2 } from \"#math/vec2\";\nimport { vec4 } from \"#math/vec4\";\nimport { float32FromBits } from \"#utils/bytes\";\nimport { Tr2Effect } from \"../shader/Tr2Effect.js\";\nimport { PixelFormat, TextureType, Tr2GpuUsage, Tr2LoadAction, Tr2StoreAction } from \"#consts/render-context\";\nimport { RenderingMode } from \"#consts/graphics\";\nimport { Tr2ColorAttachment } from \"../../trinityal/Tr2RenderPassAL/Tr2ColorAttachment.js\";\n\n/** Carbon's four effect paths (`Tr2Denoiser.cpp:19-28`). */\nconst ESTIMATE_NOISE_PATH = \"res:/graphics/effect/managed/space/system/EstimateNoise.fx\";\nconst DENOISE_ESTIMATE_PATH = \"res:/graphics/effect/managed/space/system/DenoiseEstimate.fx\";\nconst DENOISE_1D_PATH = \"res:/graphics/effect/managed/space/system/Denoise1D.fx\";\n\n/** Carbon's shader option and its two values (`cpp:33-35`). */\nconst NORMALS_INPUT = \"NORMALS_INPUT\";\nconst NORMALS_INPUT_NORMALS = \"NORMALS_INPUT_NORMALS\";\nconst NORMALS_INPUT_NONE = \"NORMALS_INPUT_NONE\";\n\n/**\n * Carbon's hint for every one of the four passes (`cpp:107` and after):\n * DONT_CARE the previous contents, STORE the result.\n *\n * DONT_CARE is not \"clear\". It says the old contents are not needed, which is\n * what lets a tiler skip loading them; clearing would cost a write instead.\n * Every pass here overwrites its whole target, so the load is always wasted.\n */\nconst OVERWRITE_AND_KEEP = new Tr2ColorAttachment(Tr2LoadAction.DONT_CARE, Tr2StoreAction.STORE);\n\n/** Every pass target is R8, and every one is both drawn to and sampled from. */\nconst TARGET_USAGE = Tr2GpuUsage.RENDER_TARGET | Tr2GpuUsage.SHADER_RESOURCE;\n\n/** Builds one effect already pointed at its path, as Carbon's constructor does. */\nfunction effectAt(path)\n{\n const effect = new Tr2Effect();\n\n effect.SetEffectPathName(path);\n return effect;\n}\n\n/** Carries depth, normal, and plane weights together with radius, step size, and bypass state for spatial denoising. */\n@type.define({ className: \"Tr2Denoiser\", family: \"trinityCore\", purpose: \"Carries depth, normal, and plane weights together with radius, step size, and bypass state for spatial denoising.\" })\nexport class Tr2Denoiser extends CjsModel\n{\n\n /** m_bypass (bool) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.boolean\n bypass = false;\n\n /** m_depthWeight (float) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.float32\n depthWeight = 100;\n\n /** m_normalWeight (float) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.float32\n normalWeight = 1.5;\n\n /** m_planeWeight (float) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.float32\n planeWeight = 0;\n\n /** m_radius (uint32_t) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.uint32\n radius = 5;\n\n /** m_stepSize (uint32_t) [READWRITE, PERSIST, NOTIFY] */\n @edit.notify\n @edit.readwrite\n @edit.persist\n @type.uint32\n stepSize = 1;\n\n /** m_estimateNoise */\n #estimateNoise = effectAt(ESTIMATE_NOISE_PATH);\n\n /** m_denoiseEstimate */\n #denoiseEstimate = effectAt(DENOISE_ESTIMATE_PATH);\n\n /** m_denoiseHoriz - Denoise1D with Axis (stepSize, 0). */\n #denoiseHoriz = effectAt(DENOISE_1D_PATH);\n\n /** m_denoiseVert - the SAME effect file with Axis (0, stepSize). */\n #denoiseVert = effectAt(DENOISE_1D_PATH);\n\n /**\n * m_parametersDirty - set by OnModified, cleared at the end of Apply.\n *\n * The weights and the axis are only re-sent when something changed, which is\n * the one place this class caches anything.\n */\n #parametersDirty = true;\n\n /**\n * Runs the four passes and returns the denoised result.\n *\n * Carbon `Apply` (`cpp:59-162`). The one-argument overload is the `index = 0`\n * default here (`cpp:54-57`).\n *\n * INVALID IN, EMPTY OUT. A source or depth that is not valid returns null\n * rather than borrowing four textures to produce nothing.\n *\n * @param {object} source The noisy texture, as a pool handle.\n * @param {object} depth The scene depth buffer.\n * @param {object|null} normals Optional normals; absence selects a permutation.\n * @param {Array<number>} projection The REVERSED-depth projection.\n * @param {number} upscaling Divides the radius, so an upscaled pass blurs less.\n * @param {object} gpuResourcePool The pool the pass targets come from.\n * @param {object} renderContext The context to draw through.\n * @param {object} renderer The renderer owning the blitter.\n * @param {number} [index] Array slice of the result to render into.\n * @returns {object|null} The result handle, or null.\n */\n @carbon.method\n @impl.adapted\n @impl.reason(\"Carbon reaches the blitter through the static Tr2Renderer; ours is an instance, so the renderer is passed in like the pool and the context.\")\n Apply(source, depth, normals, projection, upscaling, gpuResourcePool, renderContext, renderer, index = 0)\n {\n // Carbon tests the HANDLE, not the texture behind it (`cpp:61`).\n if (!source.IsValid() || !depth.IsValid()) return null;\n\n const sourceTexture = source.Get();\n // Carbon is handed a default-constructed Tr2TextureAL when there are no\n // normals - a real object. Ours is handed null, so the object may be\n // absent; the METHOD is not optional.\n const hasNormals = Boolean(normals && normals.IsValid());\n const option = hasNormals ? NORMALS_INPUT_NORMALS : NORMALS_INPUT_NONE;\n\n this.#denoiseVert.SetOption(NORMALS_INPUT, option);\n this.#denoiseHoriz.SetOption(NORMALS_INPUT, option);\n\n const width = sourceTexture.GetWidth();\n const height = sourceTexture.GetHeight();\n const sourceSize = vec4.fromValues(width, height, 1 / width, 1 / height);\n\n this.#denoiseEstimate.SetParameter(\"SourceDimensions\", sourceSize);\n\n const esm = renderContext.GetEffectStateManager();\n\n // Null is Carbon's default-constructed texture: bind EMPTY, do not merely\n // save. A depth buffer left bound would depth-test a fullscreen blur.\n esm.PushDepthStencilBuffer(null);\n esm.PushRenderTarget();\n\n try\n {\n esm.ApplyStandardStates(RenderingMode.RM_FULLSCREEN);\n\n const estimate = this.#Pass(gpuResourcePool, \"Tr2Denoiser Noise Estimate\", width, height);\n\n esm.SetRenderTarget(0, estimate.Get());\n renderContext.RenderPassHint(OVERWRITE_AND_KEEP, null);\n this.#estimateNoise.SetParameter(\"Source\", sourceTexture);\n renderer.DrawScreenQuad(renderContext, this.#estimateNoise);\n this.#estimateNoise.SetParameter(\"Source\", null);\n\n const mask = this.#Pass(gpuResourcePool, \"Tr2Denoiser Denoise Mask\", width, height);\n\n this.#denoiseEstimate.SetParameter(\"Source\", estimate.Get());\n esm.SetRenderTarget(0, mask.Get());\n renderContext.RenderPassHint(OVERWRITE_AND_KEEP, null);\n renderer.DrawScreenQuad(renderContext, this.#denoiseEstimate);\n\n // Carbon releases the estimate here, before borrowing the next target, so\n // the pool can hand the same surface back rather than grow (`cpp:118`).\n gpuResourcePool.Free(estimate);\n\n const temp = this.#Pass(gpuResourcePool, \"Tr2Denoiser Temp\", width, height);\n\n this.#SetPassParameters(this.#denoiseHoriz, vec2.fromValues(1, 0), depth, normals, projection, sourceSize, upscaling);\n this.#denoiseHoriz.SetParameter(\"Source\", sourceTexture);\n this.#denoiseHoriz.SetParameter(\"NoiseEstimate\", mask.Get());\n esm.SetRenderTarget(0, temp.Get());\n renderContext.RenderPassHint(OVERWRITE_AND_KEEP, null);\n renderer.DrawScreenQuad(renderContext, this.#denoiseHoriz);\n this.#denoiseHoriz.SetParameter(\"Source\", null);\n this.#denoiseHoriz.SetParameter(\"NoiseEstimate\", null);\n\n gpuResourcePool.Free(source);\n\n const result = this.#Pass(gpuResourcePool, \"Tr2Denoiser Result\", width, height);\n\n this.#SetPassParameters(this.#denoiseVert, vec2.fromValues(0, 1), depth, normals, projection, sourceSize, upscaling);\n this.#denoiseVert.SetParameter(\"Source\", temp.Get());\n this.#denoiseVert.SetParameter(\"NoiseEstimate\", mask.Get());\n esm.SetRenderTarget(0, result.Get(), true, index);\n renderContext.RenderPassHint(OVERWRITE_AND_KEEP, null);\n renderer.DrawScreenQuad(renderContext, this.#denoiseVert);\n this.#denoiseVert.SetParameter(\"Source\", null);\n this.#denoiseVert.SetParameter(\"NoiseEstimate\", null);\n\n // Both blur effects hold the depth and normal buffers until here, so a\n // later pass cannot inherit them (`cpp:155-158`).\n for (const effect of [ this.#denoiseHoriz, this.#denoiseVert ])\n {\n effect.SetParameter(\"DepthBuffer\", null);\n effect.SetParameter(\"NormalBuffer\", null);\n }\n\n this.#parametersDirty = false;\n return result;\n }\n finally\n {\n // Carbon pops through ON_BLOCK_EXIT, which runs however the block leaves.\n esm.PopRenderTarget();\n esm.PopDepthStencilBuffer();\n }\n }\n\n /**\n * Carbon `SetRadius` (`cpp:170-172`).\n *\n * @param {number} value The new radius.\n * @returns {void}\n */\n @carbon.method\n @impl.implemented\n SetRadius(value)\n {\n this.radius = value >>> 0;\n this.#parametersDirty = true;\n }\n\n /**\n * Carbon `OnModified` (`cpp:164-168`): any authored change re-sends the\n * weights on the next Apply.\n *\n * @returns {boolean} True, as Carbon's does.\n */\n @carbon.method\n @impl.implemented\n OnModified()\n {\n this.#parametersDirty = true;\n return true;\n }\n\n /** Borrows one R8 pass target of the source's size. */\n #Pass(gpuResourcePool, name, width, height)\n {\n return gpuResourcePool.GetTempTexture(name, {\n type: TextureType.TEX_TYPE_2D,\n width,\n height,\n depth: 1,\n mipCount: 1,\n format: PixelFormat.PIXEL_FORMAT_R8_UNORM,\n gpuUsage: TARGET_USAGE\n });\n }\n\n /**\n * Carbon's `SetParams` lambda (`cpp:76-94`).\n *\n * The weights and the axis are sent only when something changed; the radius,\n * projection and buffers go every time. Carbon draws that line and it is not\n * arbitrary - the axis is per effect and constant, the radius divides by an\n * upscaling factor the caller may vary per frame.\n */\n #SetPassParameters(effect, direction, depth, normals, projection, sourceSize, upscaling)\n {\n if (this.#parametersDirty)\n {\n effect.SetParameter(\"DepthWeight\", this.depthWeight);\n effect.SetParameter(\"NormalWeight\", this.normalWeight);\n effect.SetParameter(\"PlaneWeight\", this.planeWeight);\n effect.SetParameter(\"PassThrough\", this.bypass ? 1 : 0);\n effect.SetParameter(\"Axis\", vec2.scale(vec2.create(), direction, this.stepSize));\n }\n\n // Carbon's `max(uint32_t(radius / upscaling + 0.5f), 2u)`: round to nearest,\n // and never below two, or the blur would sample only itself.\n // THE UINT32 OVERLOAD STORES THE INTEGER'S BITS (Tr2Effect.cpp:2103-2120),\n // and Denoise1D loops from -Radius to +Radius on those bits read as an int.\n // Passed as the float 5.0 it read 1084227584: two billion iterations per\n // pixel, which hung the GPU.\n effect.SetParameter(\"Radius\", float32FromBits(Math.max(Math.trunc(this.radius / upscaling + 0.5), 2)));\n\n effect.SetParameter(\"ProjectionInv\", projection);\n // Carbon's Vector2( projection._43, projection._33 ); column-major puts\n // those at 14 and 10.\n effect.SetParameter(\"ClipInfo\", vec2.fromValues(projection[14], projection[10]));\n\n effect.SetParameter(\"DepthBuffer\", depth);\n effect.SetParameter(\"NormalBuffer\", normals);\n effect.SetParameter(\"SourceDimensions\", sourceSize);\n }\n\n\n}\n"],"names":["ESTIMATE_NOISE_PATH","DENOISE_ESTIMATE_PATH","DENOISE_1D_PATH","NORMALS_INPUT","NORMALS_INPUT_NORMALS","NORMALS_INPUT_NONE","OVERWRITE_AND_KEEP","Tr2ColorAttachment","Tr2LoadAction","DONT_CARE","Tr2StoreAction","STORE","TARGET_USAGE","Tr2GpuUsage","RENDER_TARGET","SHADER_RESOURCE","effectAt","path","effect","Tr2Effect","SetEffectPathName","_Tr2Denoiser","Tr2Denoiser","CjsModel","e","_init_bypass","_init_extra_bypass","_init_depthWeight","_init_extra_depthWeight","_init_normalWeight","_init_extra_normalWeight","_init_planeWeight","_init_extra_planeWeight","_init_radius","_init_extra_radius","_init_stepSize","_init_extra_stepSize","_initProto","c","_initClass","_applyDecs","type","define","className","family","purpose","edit","notify","readwrite","persist","boolean","float32","uint32","carbon","method","impl","adapted","reason","implemented","bypass","depthWeight","normalWeight","planeWeight","radius","stepSize","Apply","source","depth","normals","projection","upscaling","gpuResourcePool","renderContext","renderer","index","IsValid","sourceTexture","Get","hasNormals","Boolean","option","SetOption","width","GetWidth","height","GetHeight","sourceSize","vec4","fromValues","SetParameter","esm","GetEffectStateManager","PushDepthStencilBuffer","PushRenderTarget","ApplyStandardStates","RenderingMode","RM_FULLSCREEN","estimate","SetRenderTarget","RenderPassHint","DrawScreenQuad","mask","Free","temp","vec2","result","PopRenderTarget","PopDepthStencilBuffer","SetRadius","value","OnModified","#Pass","name","GetTempTexture","TextureType","TEX_TYPE_2D","mipCount","format","PixelFormat","PIXEL_FORMAT_R8_UNORM","gpuUsage","#SetPassParameters","direction","scale","create","float32FromBits","Math","max","trunc"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { CjsModel } from '#model';
|
|
|
4
4
|
import { mat4 } from '#math/mat4';
|
|
5
5
|
import { vec3 } from '#math/vec3';
|
|
6
6
|
import { vec4 } from '#math/vec4';
|
|
7
|
-
import { PixelFormat,
|
|
7
|
+
import { PixelFormat, TextureType, Tr2GpuUsage } from '#consts/render-context';
|
|
8
8
|
import { Tr2Effect as _Tr2Effect } from '../shader/Tr2Effect.js';
|
|
9
9
|
import { Tr2Denoiser as _Tr2Denoiser } from './Tr2Denoiser.js';
|
|
10
10
|
import { Tr2VariableStore as _Tr2VariableStore } from './variable/Tr2VariableStore.js';
|
|
@@ -356,9 +356,14 @@ new class extends _identity {
|
|
|
356
356
|
* could not supply one - which Carbon notes happens on a lost device.
|
|
357
357
|
*/
|
|
358
358
|
PrepareShadowRendering(gpuResourcePool, renderContext) {
|
|
359
|
+
// Carbon's GetTempTexture( name, width, height, format, usage ) overload:
|
|
360
|
+
// a 2D texture of one mip.
|
|
359
361
|
const cascadedShadowDepth = gpuResourcePool.GetTempTexture("cascadedShadowDepth", {
|
|
362
|
+
type: TextureType.TEX_TYPE_2D,
|
|
360
363
|
width: this.size * this.#width,
|
|
361
364
|
height: this.size * this.#height,
|
|
365
|
+
depth: 1,
|
|
366
|
+
mipCount: 1,
|
|
362
367
|
format: PixelFormat.PIXEL_FORMAT_D32_FLOAT,
|
|
363
368
|
gpuUsage: Tr2GpuUsage.DEPTH_STENCIL | Tr2GpuUsage.SHADER_RESOURCE
|
|
364
369
|
});
|
|
@@ -372,7 +377,7 @@ new class extends _identity {
|
|
|
372
377
|
// whole shadow pass, which is what this line used to do.
|
|
373
378
|
esm.PushViewport();
|
|
374
379
|
esm.PushRenderTarget(null);
|
|
375
|
-
esm.PushDepthStencilBuffer(cascadedShadowDepth);
|
|
380
|
+
esm.PushDepthStencilBuffer(cascadedShadowDepth.Get());
|
|
376
381
|
esm.UpdateRenderTargetViewport(cascadedShadowDepth.Get().GetWidth(), cascadedShadowDepth.Get().GetHeight());
|
|
377
382
|
|
|
378
383
|
// Carbon wants a clean depth buffer for this pass and says so.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tr2ShadowMap.js","sources":["../../../../src/trinity/core/Tr2ShadowMap.js"],"sourcesContent":["// Source: trinity/trinity/Tr2ShadowMap.h\r\n// trinity/trinity/Tr2ShadowMap.cpp\r\nimport { carbon, impl, edit, type } from \"#schema\";\r\nimport { CjsModel } from \"#model\";\r\nimport { mat4 } from \"#math/mat4\";\r\nimport { vec3 } from \"#math/vec3\";\r\nimport { vec4 } from \"#math/vec4\";\r\nimport { PixelFormat, TextureType, Tr2GpuUsage } from \"#consts/render-context\";\r\nimport { Tr2Effect } from \"../shader/Tr2Effect.js\";\r\nimport { Tr2Denoiser } from \"./Tr2Denoiser.js\";\r\nimport { Tr2VariableStore } from \"./variable/Tr2VariableStore.js\";\r\nimport { TriFrustumOrtho } from \"./view/TriFrustumOrtho.js\";\r\nimport { blue, EnumRegistrationType } from \"#blue\";\r\n\r\nconst SHADOW_FRUSTUM_COUNT = 16;\r\nconst SHADOW_MAP_WIDTH = 8;\r\nconst SHADOW_MAP_HEIGHT = 2;\r\n\r\nconst STATIC_SPLITS = Object.freeze([\r\n 25, 75, 150, 300,\r\n 600, 1200, 2400, 4800,\r\n 9600, 19200, 38400, 76800,\r\n 153600, 307200, 614400, 1228800\r\n]);\r\n\r\nconst DX_UNIT_CUBE = Object.freeze([\r\n Object.freeze([ -1, -1, 0 ]), Object.freeze([ -1, 1, 0 ]),\r\n Object.freeze([ 1, 1, 0 ]), Object.freeze([ 1, -1, 0 ]),\r\n Object.freeze([ -1, -1, 1 ]), Object.freeze([ -1, 1, 1 ]),\r\n Object.freeze([ 1, 1, 1 ]), Object.freeze([ 1, -1, 1 ])\r\n]);\r\n\r\nconst PROJECTION_SCRATCH = mat4.create();\r\nconst INVERSE_PROJECTION_SCRATCH = mat4.create();\r\nconst BASIS_SCRATCH = mat4.create();\r\nconst LIGHT_VIEW_SCRATCH = mat4.create();\r\nconst ORTHO_SCRATCH = mat4.create();\r\nconst TRANSFORMED_SCRATCH = vec4.create();\r\nconst WORLD_SCRATCH = vec3.create();\r\nconst LIGHT_DIRECTION_SCRATCH = vec3.create();\r\n\r\nfunction createPerSplitData()\r\n{\r\n return {\r\n ShadowMapValues: Array.from({ length: 4 }, () => vec4.create()),\r\n ShadowMatrixVal: Array.from({ length: SHADOW_FRUSTUM_COUNT }, () => mat4.create()),\r\n CascadeRanges: Array.from({ length: SHADOW_FRUSTUM_COUNT }, () => vec4.create()),\r\n SplitInfo: vec4.create()\r\n };\r\n}\r\n\r\nfunction createSplitSetup()\r\n{\r\n return {\r\n shadowFrustum: new TriFrustumOrtho(),\r\n lightViewProjection: mat4.create(),\r\n invViewProj: mat4.create(),\r\n aabb: { min: vec3.create(), max: vec3.create() },\r\n corners: Array.from({ length: 8 }, () => vec3.create())\r\n };\r\n}\r\n\r\nfunction createShadowEffect()\r\n{\r\n const effect = new Tr2Effect();\r\n\r\n effect.SetEffectPathName(\"res:/graphics/effect/managed/space/system/ShadowDepth.fx\");\r\n\r\n // DECLARED BY CLEARING, which is Carbon (`cpp:41-42`), not by\r\n // AddResourceTexture2D. The difference is not cosmetic: a res-path slot and a\r\n // runtime slot are different classes, so declaring the res-path kind here left\r\n // SetParameter unable to find a runtime slot to update - it added a new one on\r\n // every call, and a per-frame resolve grew the resource list without bound.\r\n effect.SetParameter(\"EveSpaceSceneCascadedShadowMap\", null);\r\n effect.SetParameter(\"DepthMap\", null);\r\n return effect;\r\n}\r\n\r\n/** Carbon PerspectiveOffCenterMatrix: D3D zero-to-one depth. */\r\nfunction writePerspectiveOffCenter(out, left, right, bottom, top, near, far)\r\n{\r\n out.fill(0);\r\n out[0] = 2 * near / (right - left);\r\n out[5] = -2 * near / (bottom - top);\r\n out[8] = 1 + 2 * left / (right - left);\r\n out[9] = -1 - 2 * top / (bottom - top);\r\n out[10] = far / (near - far);\r\n out[11] = -1;\r\n out[14] = near * far / (near - far);\r\n return out;\r\n}\r\n\r\n/** Carbon OrthoNormalBasisZ. Flat matrix bytes match gl-matrix storage. */\r\nfunction writeOrthoNormalBasisZ(out, z)\r\n{\r\n mat4.identity(out);\r\n const length = Math.hypot(z[0], z[1], z[2]);\r\n const zx = z[0] / length;\r\n const zy = z[1] / length;\r\n const zz = z[2] / length;\r\n out[8] = zx;\r\n out[9] = zy;\r\n out[10] = zz;\r\n\r\n const xx = Math.abs(zx) > 0.99 ? 0 : 1;\r\n const xy = Math.abs(zx) > 0.99 ? 1 : 0;\r\n let yx = xy * zz;\r\n let yy = -xx * zz;\r\n let yz = xx * zy - xy * zx;\r\n const yLength = Math.hypot(yx, yy, yz);\r\n yx /= yLength;\r\n yy /= yLength;\r\n yz /= yLength;\r\n\r\n out[4] = yx;\r\n out[5] = yy;\r\n out[6] = yz;\r\n out[0] = yy * zz - yz * zy;\r\n out[1] = yz * zx - yx * zz;\r\n out[2] = yx * zy - yy * zx;\r\n return out;\r\n}\r\n\r\n/** Carbon OrthoOffCenterMatrix: D3D zero-to-one depth. */\r\nfunction writeOrthoOffCenter(out, left, right, bottom, top, near, far)\r\n{\r\n mat4.identity(out);\r\n out[0] = 2 / (right - left);\r\n out[5] = 2 / (top - bottom);\r\n out[10] = 1 / (near - far);\r\n out[12] = -1 - 2 * left / (right - left);\r\n out[13] = 1 + 2 * top / (bottom - top);\r\n out[14] = near / (near - far);\r\n return out;\r\n}\r\n\r\n/** Cascaded-shadow split producer. Its GPU operations are not ported yet. */\r\n@type.define({ className: \"Tr2ShadowMap\", family: \"trinityCore\" })\r\nexport class Tr2ShadowMap extends CjsModel\r\n{\r\n @edit.notify\r\n @edit.readwrite\r\n @edit.persist\r\n @type.int32\r\n @type.enum(\"trinity.Tr2ShadowMap.ShadowSplitMode\")\r\n shadowSplitMode = 0;\r\n\r\n @edit.readwrite\r\n @type.objectRef(\"Tr2Denoiser\")\r\n denoiser = new Tr2Denoiser();\r\n\r\n @edit.readwrite\r\n @type.objectRef(\"Tr2Effect\")\r\n cascadeEffect = createShadowEffect();\r\n\r\n @edit.notify\r\n @edit.read\r\n @type.uint32\r\n splitCount = SHADOW_FRUSTUM_COUNT;\r\n\r\n @edit.notify\r\n @edit.readwrite\r\n @type.boolean\r\n debugColorSplit = false;\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr15 = STATIC_SPLITS[15];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr8 = STATIC_SPLITS[8];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr6 = STATIC_SPLITS[6];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr5 = STATIC_SPLITS[5];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr14 = STATIC_SPLITS[14];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr10 = STATIC_SPLITS[10];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr13 = STATIC_SPLITS[13];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr4 = STATIC_SPLITS[4];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr3 = STATIC_SPLITS[3];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr7 = STATIC_SPLITS[7];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr1 = STATIC_SPLITS[1];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr9 = STATIC_SPLITS[9];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr0 = STATIC_SPLITS[0];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr11 = STATIC_SPLITS[11];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr12 = STATIC_SPLITS[12];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr2 = STATIC_SPLITS[2];\r\n\r\n @edit.notify\r\n @edit.readwrite\r\n @type.boolean\r\n disableShimmer = true;\r\n\r\n @edit.readwrite\r\n @type.uint32\r\n size = 2048;\r\n\r\n /**\r\n * Carbon's `PerSplitData` record. `ShadowMatrixVal` holds each cascade's\r\n * logical gl-matrix light view-projection, untransposed. The scene composes\r\n * it with the inverse view and the atlas cell, and\r\n * `RawData.SetAndTransposeIndex` performs the single packing transpose;\r\n * engines must not transpose or rebuild these matrices.\r\n */\r\n perSplitData = createPerSplitData();\r\n\r\n #width = SHADOW_MAP_WIDTH;\r\n\r\n #height = SHADOW_MAP_HEIGHT;\r\n\r\n #oldZFar = 0;\r\n\r\n #useDenoiser = true;\r\n\r\n #lastNearClip = 0;\r\n\r\n #lastFarClip = 0;\r\n\r\n #lastShadowSplitMode = Tr2ShadowMap.ShadowSplitMode.STATIC;\r\n\r\n #lastDebugColorSplit = false;\r\n\r\n #splitSetups = Array.from({ length: SHADOW_FRUSTUM_COUNT }, () => createSplitSetup());\r\n\r\n /** Creates the logical effect/denoiser state and reserves Carbon's globals. */\r\n constructor()\r\n {\r\n super();\r\n const store = Tr2VariableStore.GlobalStore();\r\n store.RegisterVariable(\"EveSpaceSceneShadowMap\");\r\n store.RegisterVariable(\"EveSpaceSceneCascadedShadowMap\");\r\n }\r\n\r\n /** Applies the atlas element size/count and the one-way denoiser disable. */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"The fixed PerSplitData arrays make split counts above Carbon's 16-slot capacity fail immediately instead of corrupting adjacent native memory.\")\r\n Setup(elementSize, elementCount, useDenoiser)\r\n {\r\n const nextSize = elementSize >>> 0;\r\n const nextCount = elementCount >>> 0;\r\n if (nextCount > SHADOW_FRUSTUM_COUNT)\r\n {\r\n throw new RangeError(`Tr2ShadowMap supports at most ${SHADOW_FRUSTUM_COUNT} splits.`);\r\n }\r\n if (this.size !== nextSize || this.splitCount !== nextCount)\r\n {\r\n this.size = nextSize;\r\n this.splitCount = nextCount;\r\n this.perSplitData.SplitInfo[0] = nextCount;\r\n }\r\n this.#useDenoiser = Boolean(useDenoiser);\r\n if (!this.#useDenoiser)\r\n {\r\n this.denoiser = null;\r\n }\r\n }\r\n\r\n /** Applies Carbon's notification consequences from the current owned state. */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"CjsModel notifications expose settled state rather than Be::Var identity, so this compares the two notify-backed values against their cached state.\")\r\n OnModified()\r\n {\r\n if (this.debugColorSplit !== this.#lastDebugColorSplit)\r\n {\r\n this.cascadeEffect.SetOption(\"SHADOW_DEBUG_MODE\", this.debugColorSplit ? \"SDM_COLOR\" : \"SDM_NONE\");\r\n this.#lastDebugColorSplit = this.debugColorSplit;\r\n }\r\n\r\n if (this.shadowSplitMode !== this.#lastShadowSplitMode)\r\n {\r\n if (this.shadowSplitMode === Tr2ShadowMap.ShadowSplitMode.STATIC)\r\n {\r\n this.#SetStaticShadowSplits();\r\n }\r\n else if (this.shadowSplitMode === Tr2ShadowMap.ShadowSplitMode.DYNAMIC)\r\n {\r\n this.#lastNearClip = 0;\r\n this.#lastFarClip = 0;\r\n }\r\n this.#lastShadowSplitMode = this.shadowSplitMode;\r\n }\r\n\r\n this.perSplitData.SplitInfo[0] = this.splitCount;\r\n return true;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Changes whether an existing denoiser should be used for future results. */\r\n ShouldUseDenoiser(value)\r\n {\r\n this.#useDenoiser = Boolean(value);\r\n }\r\n\r\n /** Engine-facing read of Carbon's private denoiser-use switch. */\r\n @impl.custom\r\n @impl.reason(\"The nominal engine executor needs Carbon's private denoiser-use decision without reading implementation fields.\")\r\n GetUseDenoiser()\r\n {\r\n return this.#useDenoiser;\r\n }\r\n\r\n /** Recomputes geometric dynamic split endpoints when the clip range changes. */\r\n @carbon.method\r\n @impl.implemented\r\n UpdateSplitValues(nearClip, farClip)\r\n {\r\n if (this.shadowSplitMode !== Tr2ShadowMap.ShadowSplitMode.DYNAMIC) return;\r\n if (this.#lastNearClip === nearClip && this.#lastFarClip === farClip) return;\r\n\r\n this.#lastNearClip = nearClip;\r\n this.#lastFarClip = farClip;\r\n const logNear = Math.log2(nearClip);\r\n const logFar = Math.log2(farClip);\r\n for (let index = 0; index < this.splitCount; index++)\r\n {\r\n this.#SetSplitValue(index, Math.pow(2, logNear + (logFar - logNear) * ((index + 1) / this.splitCount)));\r\n }\r\n }\r\n\r\n /**\r\n * Transforms the D3D clip cube through projection inverse, inverse view and\r\n * light view, returning its light-space bounds and writing all eight corners.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"The caller supplies owned JS output containers; matrix bytes stay in logical gl-matrix form and are never pre-transposed.\")\r\n static CalculateAABB(\r\n projection,\r\n invViewTransform,\r\n lightView,\r\n corners,\r\n out = { min: vec3.create(), max: vec3.create() }\r\n )\r\n {\r\n mat4.invert(INVERSE_PROJECTION_SCRATCH, projection);\r\n const min = out.min;\r\n const max = out.max;\r\n min[0] = min[1] = min[2] = Infinity;\r\n max[0] = max[1] = max[2] = -Infinity;\r\n\r\n for (let index = 0; index < DX_UNIT_CUBE.length; index++)\r\n {\r\n const source = DX_UNIT_CUBE[index];\r\n TRANSFORMED_SCRATCH[0] = source[0];\r\n TRANSFORMED_SCRATCH[1] = source[1];\r\n TRANSFORMED_SCRATCH[2] = source[2];\r\n TRANSFORMED_SCRATCH[3] = 1;\r\n vec4.transformMat4(TRANSFORMED_SCRATCH, TRANSFORMED_SCRATCH, INVERSE_PROJECTION_SCRATCH);\r\n const inverseW = 1 / TRANSFORMED_SCRATCH[3];\r\n WORLD_SCRATCH[0] = TRANSFORMED_SCRATCH[0] * inverseW;\r\n WORLD_SCRATCH[1] = TRANSFORMED_SCRATCH[1] * inverseW;\r\n WORLD_SCRATCH[2] = TRANSFORMED_SCRATCH[2] * inverseW;\r\n vec3.transformMat4(WORLD_SCRATCH, WORLD_SCRATCH, invViewTransform);\r\n vec3.transformMat4(corners[index], WORLD_SCRATCH, lightView);\r\n\r\n const corner = corners[index];\r\n min[0] = Math.min(min[0], corner[0]);\r\n min[1] = Math.min(min[1], corner[1]);\r\n min[2] = Math.min(min[2], corner[2]);\r\n max[0] = Math.max(max[0], corner[0]);\r\n max[1] = Math.max(max[1], corner[1]);\r\n max[2] = Math.max(max[2], corner[2]);\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * Builds one logical light-view-projection split and its shader data.\r\n *\r\n * The returned object is an allocation-free borrowed view for this split and\r\n * is overwritten the next time the same split index is prepared.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"Carbon stores Transpose(lightViewProjection) and returns SplitSetup by value; Trinity stores the logical matrix for RawData's terminal transpose and reuses one allocation-free result per split.\")\r\n SetupShadowSplit(splitIndex, invViewTransform, lightDirection, zNear, leftDivNear, rightDivNear, topDivNear, bottomDivNear)\r\n {\r\n if (!Number.isInteger(splitIndex) || splitIndex < 0 || splitIndex >= this.splitCount)\r\n {\r\n throw new RangeError(\"Tr2ShadowMap.SetupShadowSplit received an invalid split index.\");\r\n }\r\n\r\n const setup = this.#splitSetups[splitIndex];\r\n if (splitIndex === 0) this.#oldZFar = zNear;\r\n const zFar = this.#GetSplitValue(splitIndex);\r\n this.perSplitData.ShadowMapValues[splitIndex >> 2][splitIndex & 3] = zFar;\r\n\r\n const left = leftDivNear * this.#oldZFar;\r\n const right = rightDivNear * this.#oldZFar;\r\n const top = topDivNear * this.#oldZFar;\r\n const bottom = bottomDivNear * this.#oldZFar;\r\n writePerspectiveOffCenter(PROJECTION_SCRATCH, left, right, bottom, top, this.#oldZFar, zFar);\r\n this.#oldZFar = zFar;\r\n\r\n mat4.invert(INVERSE_PROJECTION_SCRATCH, PROJECTION_SCRATCH);\r\n // Carbon inverseProjection * inverseView; gl-matrix reverses the operands.\r\n mat4.multiply(setup.invViewProj, invViewTransform, INVERSE_PROJECTION_SCRATCH);\r\n\r\n LIGHT_DIRECTION_SCRATCH[0] = -lightDirection[0];\r\n LIGHT_DIRECTION_SCRATCH[1] = -lightDirection[1];\r\n LIGHT_DIRECTION_SCRATCH[2] = -lightDirection[2];\r\n writeOrthoNormalBasisZ(BASIS_SCRATCH, LIGHT_DIRECTION_SCRATCH);\r\n mat4.invert(LIGHT_VIEW_SCRATCH, BASIS_SCRATCH);\r\n\r\n Tr2ShadowMap.CalculateAABB(\r\n PROJECTION_SCRATCH,\r\n invViewTransform,\r\n LIGHT_VIEW_SCRATCH,\r\n setup.corners,\r\n setup.aabb\r\n );\r\n\r\n const min = setup.aabb.min;\r\n const max = setup.aabb.max;\r\n if (this.disableShimmer)\r\n {\r\n let maxDistance = 0;\r\n for (let first = 0; first < setup.corners.length; first++)\r\n {\r\n for (let second = first + 1; second < setup.corners.length; second++)\r\n {\r\n const a = setup.corners[first];\r\n const b = setup.corners[second];\r\n maxDistance = Math.max(maxDistance, Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]));\r\n }\r\n }\r\n\r\n const radius = Math.ceil(maxDistance / 2);\r\n const texelSize = radius * 2 / this.size;\r\n const centerX = Math.floor(((min[0] + max[0]) * 0.5) / texelSize + 0.5) * texelSize;\r\n const centerY = Math.floor(((min[1] + max[1]) * 0.5) / texelSize + 0.5) * texelSize;\r\n const centerZ = (min[2] + max[2]) * 0.5;\r\n min[0] = centerX - radius;\r\n min[1] = centerY - radius;\r\n min[2] = centerZ - radius;\r\n max[0] = centerX + radius;\r\n max[1] = centerY + radius;\r\n max[2] = centerZ + radius;\r\n }\r\n\r\n writeOrthoOffCenter(ORTHO_SCRATCH, max[0], min[0], max[1], min[1], -max[2], -min[2]);\r\n // Carbon lightView * ortho; gl-matrix reverses the operands.\r\n mat4.multiply(setup.lightViewProjection, ORTHO_SCRATCH, LIGHT_VIEW_SCRATCH);\r\n\r\n const range = this.perSplitData.CascadeRanges[splitIndex];\r\n range[0] = max[0] - min[0];\r\n range[1] = max[1] - min[1];\r\n range[2] = max[2] - min[2];\r\n range[3] = 0;\r\n mat4.copy(this.perSplitData.ShadowMatrixVal[splitIndex], setup.lightViewProjection);\r\n setup.shadowFrustum.DeriveFrustum(LIGHT_VIEW_SCRATCH, min, max);\r\n return setup;\r\n }\r\n\r\n /**\r\n * Allocates the cascaded depth surface and makes it the render target.\r\n *\r\n * @param {object} gpuResourcePool The pool to borrow the surface from.\r\n * @param {object} renderContext The context to set state on.\r\n * @returns {object|null} The borrowed depth texture, or null when the pool\r\n * could not supply one - which Carbon notes happens on a lost device.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n PrepareShadowRendering(gpuResourcePool, renderContext)\r\n {\r\n const cascadedShadowDepth = gpuResourcePool.GetTempTexture(\"cascadedShadowDepth\", {\r\n width: this.size * this.#width,\r\n height: this.size * this.#height,\r\n format: PixelFormat.PIXEL_FORMAT_D32_FLOAT,\r\n gpuUsage: Tr2GpuUsage.DEPTH_STENCIL | Tr2GpuUsage.SHADER_RESOURCE\r\n });\r\n\r\n if (!cascadedShadowDepth || !cascadedShadowDepth.IsValid()) return null;\r\n\r\n const esm = renderContext.GetEffectStateManager();\r\n\r\n // The depth stencil IS the shadow map, so the colour target is pushed EMPTY -\r\n // Carbon passes a default-constructed Tr2TextureAL and comments it \"empty\r\n // texture\" (`cpp:238`). Null is that argument here. Omitting it would only\r\n // save the slot and leave the scene's colour target bound underneath the\r\n // whole shadow pass, which is what this line used to do.\r\n esm.PushViewport();\r\n esm.PushRenderTarget(null);\r\n esm.PushDepthStencilBuffer(cascadedShadowDepth);\r\n esm.UpdateRenderTargetViewport(cascadedShadowDepth.Get().GetWidth(), cascadedShadowDepth.Get().GetHeight());\r\n\r\n // Carbon wants a clean depth buffer for this pass and says so.\r\n renderContext.Clear({ depth: true, clearDepth: 1, clearStencil: 0 });\r\n renderContext.SetReadOnlyDepth(false);\r\n\r\n return cascadedShadowDepth;\r\n }\r\n\r\n /**\r\n * Points the viewport at one split's cell in the atlas.\r\n *\r\n * Eight cells per row: splits 0-7 fill the top row and 8 onward wrap to a\r\n * second, which is why the row index is `splitIndex % 8` and the y offset is\r\n * either zero or one cell down.\r\n *\r\n * @param {object} renderContext The context to set the viewport on.\r\n * @param {number} splitIndex Which cascade split.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n BeginShadowRendering(renderContext, splitIndex)\r\n {\r\n const esm = renderContext.GetEffectStateManager();\r\n const topRow = splitIndex < 8;\r\n\r\n esm.SetViewport({\r\n width: this.size,\r\n height: this.size,\r\n x: (topRow ? splitIndex : splitIndex % 8) * this.size,\r\n y: topRow ? 0 : this.size,\r\n minZ: 0,\r\n maxZ: 1\r\n });\r\n }\r\n\r\n /**\r\n * Unwinds everything `PrepareShadowRendering` pushed, in reverse.\r\n *\r\n * @param {object} renderContext The context to restore.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n EndShadowRendering(renderContext)\r\n {\r\n renderContext.SetReadOnlyDepth(false);\r\n\r\n const esm = renderContext.GetEffectStateManager();\r\n\r\n esm.PopRenderTarget();\r\n esm.PopDepthStencilBuffer();\r\n esm.PopViewport();\r\n }\r\n\r\n /**\r\n * Resolves the cascaded depth into a screen-space shadow factor.\r\n *\r\n * Carbon `DrawToShadowMapResult` (`cpp:278-305`). Borrow an R8 target the\r\n * size of the scene depth, bind it, run the shadow effect over a fullscreen\r\n * quad with the atlas and the depth map bound, then optionally denoise.\r\n *\r\n * THE DEPTH BUFFER IS PUSHED EMPTY, not merely saved. Carbon passes a\r\n * default-constructed Tr2TextureAL (`cpp:285`), which unbinds it - this pass\r\n * writes a full-screen factor and must not be depth-tested against the very\r\n * buffer it is reading.\r\n *\r\n * THE EFFECT'S TEXTURES ARE CLEARED IMMEDIATELY AFTER THE DRAW, as Carbon\r\n * does (`cpp:290-291`), so a later pass cannot inherit the atlas or the\r\n * scene depth from this one.\r\n *\r\n * `cascadeEffect` is Carbon's `m_shadowEffect` under our name - same\r\n * ShadowDepth.fx path, same two parameters (`cpp:39-42`).\r\n *\r\n * @param {object} renderContext The context to draw against.\r\n * @param {object} gpuResourcePool The pool to borrow the result target from.\r\n * @param {object} depthMap The scene depth.\r\n * @param {object} cascadedShadowDepth The atlas produced by this pass.\r\n * @param {number} upscaling The denoiser's upscaling factor.\r\n * @param {object} renderer The renderer owning the blitter.\r\n * @returns {object|null} The shadow-factor target, or null without a pool.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"Carbon reaches the blitter and the reversed-depth projection through static Tr2Renderer; ours are an instance and the render context, so the renderer is passed in.\")\r\n DrawToShadowMapResult(renderContext, gpuResourcePool, depthMap, cascadedShadowDepth, upscaling, renderer)\r\n {\r\n let shadowMapResult = gpuResourcePool.GetTempTexture(\"shadowMapResult\", {\r\n type: TextureType.TEX_TYPE_2D,\r\n width: depthMap.GetWidth(),\r\n height: depthMap.GetHeight(),\r\n depth: 1,\r\n mipCount: 1,\r\n format: PixelFormat.PIXEL_FORMAT_R8_UNORM,\r\n gpuUsage: Tr2GpuUsage.RENDER_TARGET | Tr2GpuUsage.SHADER_RESOURCE\r\n });\r\n\r\n const esm = renderContext.GetEffectStateManager();\r\n\r\n esm.PushRenderTarget(shadowMapResult.Get());\r\n esm.PushDepthStencilBuffer(null);\r\n\r\n try\r\n {\r\n this.cascadeEffect.SetParameter(\"EveSpaceSceneCascadedShadowMap\", cascadedShadowDepth);\r\n this.cascadeEffect.SetParameter(\"DepthMap\", depthMap);\r\n renderer.DrawScreenQuad(renderContext, this.cascadeEffect);\r\n this.cascadeEffect.SetParameter(\"EveSpaceSceneCascadedShadowMap\", null);\r\n this.cascadeEffect.SetParameter(\"DepthMap\", null);\r\n\r\n // Carbon gates on all three (`cpp:296`). Setup() nulls the denoiser when\r\n // it is disabled, so the useDenoiser flag and a present denoiser are not\r\n // the same question.\r\n if (this.denoiser && this.#useDenoiser && depthMap.IsValid())\r\n {\r\n shadowMapResult = this.denoiser.Apply(\r\n shadowMapResult,\r\n depthMap,\r\n null,\r\n renderContext.GetReversedDepthProjectionTransform(),\r\n upscaling,\r\n gpuResourcePool,\r\n renderContext,\r\n renderer\r\n );\r\n }\r\n\r\n return shadowMapResult;\r\n }\r\n finally\r\n {\r\n esm.PopRenderTarget();\r\n esm.PopDepthStencilBuffer();\r\n }\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Returns the number of active cascade splits. */\r\n GetShadowSplitCount()\r\n {\r\n return this.splitCount;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Returns the square pixel size of one atlas cell. */\r\n GetShadowMapSize()\r\n {\r\n return this.size;\r\n }\r\n\r\n /** Returns the fixed number of atlas columns. */\r\n @impl.custom\r\n @impl.reason(\"The nominal engine executor needs Carbon's private fixed atlas width without reading implementation fields.\")\r\n GetShadowMapWidth()\r\n {\r\n return this.#width;\r\n }\r\n\r\n /** Returns the fixed number of atlas rows. */\r\n @impl.custom\r\n @impl.reason(\"The nominal engine executor needs Carbon's private fixed atlas height without reading implementation fields.\")\r\n GetShadowMapHeight()\r\n {\r\n return this.#height;\r\n }\r\n\r\n /** Returns the stable owned record consumed by scene per-frame packing. */\r\n @impl.custom\r\n @impl.reason(\"The scene needs a nominal direct accessor to Carbon's public PerSplitData without structural probing.\")\r\n GetPerSplitData()\r\n {\r\n return this.perSplitData;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Returns the logical effect used to resolve the screen-space shadow mask. */\r\n GetShadowEffect()\r\n {\r\n return this.cascadeEffect;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Reports whether cascade-debug colouring is enabled. */\r\n GetDebugSplitValue()\r\n {\r\n return this.debugColorSplit;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Returns Carbon's packed debug colour for a cascade colour index. */\r\n GetDebugColors(switchCase)\r\n {\r\n switch (switchCase)\r\n {\r\n case 0: return 0xffffffff;\r\n case 1: return 0xffff0000;\r\n case 2: return 0xff00ff00;\r\n case 3: return 0xff0000ff;\r\n case 4: return 0xffffff00;\r\n case 5: return 0xff00ffff;\r\n case 6: return 0x2200ffff;\r\n case 7: return 0xff555555;\r\n case 8: return 0xff888888;\r\n default: return undefined;\r\n }\r\n }\r\n\r\n /** Restores the sixteen fixed Carbon cascade endpoints. */\r\n #SetStaticShadowSplits()\r\n {\r\n for (let index = 0; index < STATIC_SPLITS.length; index++)\r\n {\r\n this.#SetSplitValue(index, STATIC_SPLITS[index]);\r\n }\r\n }\r\n\r\n /** Writes one authored/dynamic split endpoint to its public field. */\r\n #SetSplitValue(index, value)\r\n {\r\n this[`SplitNr${index}`] = value;\r\n }\r\n\r\n /** Reads one split endpoint from its public field. */\r\n #GetSplitValue(index)\r\n {\r\n return this[`SplitNr${index}`];\r\n }\r\n\r\n static ShadowSplitMode = Object.freeze({\r\n STATIC: 0,\r\n DYNAMIC: 1,\r\n MANUAL: 2\r\n });\r\n}\r\n\r\n// Registered as Carbon registers it (trinity/trinity/Tr2ShadowMap_Blue.cpp:14).\r\nblue.enums.RegisterEnum(\"trinity.Tr2ShadowMap.ShadowSplitMode\", Tr2ShadowMap.ShadowSplitMode, {\r\n source: \"trinity/trinity/Tr2ShadowMap.h\", family: \"trinityCore\", line: 102,\r\n exposedName: \"ShadowSplitModeChooser\", exposure: EnumRegistrationType.ENUM_REG_ENUM_OBJECT_ON_MODULE,\r\n chooserSource: \"trinity/trinity/Tr2ShadowMap_Blue.cpp:8\",\r\n chooser: [\r\n { name: \"Static\", value: Tr2ShadowMap.ShadowSplitMode.STATIC, description: \"Staticly computed splits for the shadow map\" },\r\n { name: \"Dynamic\", value: Tr2ShadowMap.ShadowSplitMode.DYNAMIC, description: \"Dynamic splits that are generated based on near and far planes\" },\r\n { name: \"Manual\", value: Tr2ShadowMap.ShadowSplitMode.MANUAL, description: \"Manual mode for use in graphite for debugging\" }\r\n ]\r\n});\r\n"],"names":["SHADOW_FRUSTUM_COUNT","SHADOW_MAP_WIDTH","SHADOW_MAP_HEIGHT","STATIC_SPLITS","Object","freeze","DX_UNIT_CUBE","PROJECTION_SCRATCH","mat4","create","INVERSE_PROJECTION_SCRATCH","BASIS_SCRATCH","LIGHT_VIEW_SCRATCH","ORTHO_SCRATCH","TRANSFORMED_SCRATCH","vec4","WORLD_SCRATCH","vec3","LIGHT_DIRECTION_SCRATCH","createPerSplitData","ShadowMapValues","Array","from","length","ShadowMatrixVal","CascadeRanges","SplitInfo","createSplitSetup","shadowFrustum","TriFrustumOrtho","lightViewProjection","invViewProj","aabb","min","max","corners","createShadowEffect","effect","Tr2Effect","SetEffectPathName","SetParameter","writePerspectiveOffCenter","out","left","right","bottom","top","near","far","fill","writeOrthoNormalBasisZ","z","identity","Math","hypot","zx","zy","zz","xx","abs","xy","yx","yy","yz","yLength","writeOrthoOffCenter","_Tr2ShadowMap","_identity","Tr2ShadowMap","CjsModel","e","_init_shadowSplitMode","_init_extra_shadowSplitMode","_init_denoiser","_init_extra_denoiser","_init_cascadeEffect","_init_extra_cascadeEffect","_init_splitCount","_init_extra_splitCount","_init_debugColorSplit","_init_extra_debugColorSplit","_init_SplitNr","_init_extra_SplitNr","_init_SplitNr2","_init_extra_SplitNr2","_init_SplitNr3","_init_extra_SplitNr3","_init_SplitNr4","_init_extra_SplitNr4","_init_SplitNr5","_init_extra_SplitNr5","_init_SplitNr6","_init_extra_SplitNr6","_init_SplitNr7","_init_extra_SplitNr7","_init_SplitNr8","_init_extra_SplitNr8","_init_SplitNr9","_init_extra_SplitNr9","_init_SplitNr0","_init_extra_SplitNr0","_init_SplitNr1","_init_extra_SplitNr1","_init_SplitNr10","_init_extra_SplitNr10","_init_SplitNr11","_init_extra_SplitNr11","_init_SplitNr12","_init_extra_SplitNr12","_init_SplitNr13","_init_extra_SplitNr13","_init_SplitNr14","_init_extra_SplitNr14","_init_disableShimmer","_init_extra_disableShimmer","_init_size","_init_extra_size","_initProto","_initStatic","c","_initClass","_applyDecs","type","define","className","family","edit","notify","readwrite","persist","int32","enum","objectRef","read","uint32","boolean","float32","carbon","method","impl","adapted","reason","implemented","custom","shadowSplitMode","denoiser","Tr2Denoiser","cascadeEffect","splitCount","debugColorSplit","SplitNr15","SplitNr8","SplitNr6","SplitNr5","SplitNr14","SplitNr10","SplitNr13","SplitNr4","SplitNr3","SplitNr7","SplitNr1","SplitNr9","SplitNr0","SplitNr11","SplitNr12","SplitNr2","disableShimmer","size","perSplitData","ShadowSplitMode","STATIC","constructor","store","Tr2VariableStore","GlobalStore","RegisterVariable","Setup","elementSize","elementCount","useDenoiser","nextSize","nextCount","RangeError","Boolean","OnModified","SetOption","DYNAMIC","ShouldUseDenoiser","value","GetUseDenoiser","UpdateSplitValues","nearClip","farClip","logNear","log2","logFar","index","pow","CalculateAABB","projection","invViewTransform","lightView","invert","Infinity","source","transformMat4","inverseW","corner","SetupShadowSplit","splitIndex","lightDirection","zNear","leftDivNear","rightDivNear","topDivNear","bottomDivNear","Number","isInteger","setup","zFar","multiply","maxDistance","first","second","a","b","radius","ceil","texelSize","centerX","floor","centerY","centerZ","range","copy","DeriveFrustum","PrepareShadowRendering","gpuResourcePool","renderContext","cascadedShadowDepth","GetTempTexture","width","height","format","PixelFormat","PIXEL_FORMAT_D32_FLOAT","gpuUsage","Tr2GpuUsage","DEPTH_STENCIL","SHADER_RESOURCE","IsValid","esm","GetEffectStateManager","PushViewport","PushRenderTarget","PushDepthStencilBuffer","UpdateRenderTargetViewport","Get","GetWidth","GetHeight","Clear","depth","clearDepth","clearStencil","SetReadOnlyDepth","BeginShadowRendering","topRow","SetViewport","x","y","minZ","maxZ","EndShadowRendering","PopRenderTarget","PopDepthStencilBuffer","PopViewport","DrawToShadowMapResult","depthMap","upscaling","renderer","shadowMapResult","TextureType","TEX_TYPE_2D","mipCount","PIXEL_FORMAT_R8_UNORM","RENDER_TARGET","DrawScreenQuad","Apply","GetReversedDepthProjectionTransform","GetShadowSplitCount","GetShadowMapSize","GetShadowMapWidth","GetShadowMapHeight","GetPerSplitData","GetShadowEffect","GetDebugSplitValue","GetDebugColors","switchCase","undefined","#SetStaticShadowSplits","#SetSplitValue","#GetSplitValue","MANUAL","blue","enums","RegisterEnum","line","exposedName","exposure","EnumRegistrationType","ENUM_REG_ENUM_OBJECT_ON_MODULE","chooserSource","chooser","name","description"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tr2ShadowMap.js","sources":["../../../../src/trinity/core/Tr2ShadowMap.js"],"sourcesContent":["// Source: trinity/trinity/Tr2ShadowMap.h\r\n// trinity/trinity/Tr2ShadowMap.cpp\r\nimport { carbon, impl, edit, type } from \"#schema\";\r\nimport { CjsModel } from \"#model\";\r\nimport { mat4 } from \"#math/mat4\";\r\nimport { vec3 } from \"#math/vec3\";\r\nimport { vec4 } from \"#math/vec4\";\r\nimport { PixelFormat, TextureType, Tr2GpuUsage } from \"#consts/render-context\";\r\nimport { Tr2Effect } from \"../shader/Tr2Effect.js\";\r\nimport { Tr2Denoiser } from \"./Tr2Denoiser.js\";\r\nimport { Tr2VariableStore } from \"./variable/Tr2VariableStore.js\";\r\nimport { TriFrustumOrtho } from \"./view/TriFrustumOrtho.js\";\r\nimport { blue, EnumRegistrationType } from \"#blue\";\r\n\r\nconst SHADOW_FRUSTUM_COUNT = 16;\r\nconst SHADOW_MAP_WIDTH = 8;\r\nconst SHADOW_MAP_HEIGHT = 2;\r\n\r\nconst STATIC_SPLITS = Object.freeze([\r\n 25, 75, 150, 300,\r\n 600, 1200, 2400, 4800,\r\n 9600, 19200, 38400, 76800,\r\n 153600, 307200, 614400, 1228800\r\n]);\r\n\r\nconst DX_UNIT_CUBE = Object.freeze([\r\n Object.freeze([ -1, -1, 0 ]), Object.freeze([ -1, 1, 0 ]),\r\n Object.freeze([ 1, 1, 0 ]), Object.freeze([ 1, -1, 0 ]),\r\n Object.freeze([ -1, -1, 1 ]), Object.freeze([ -1, 1, 1 ]),\r\n Object.freeze([ 1, 1, 1 ]), Object.freeze([ 1, -1, 1 ])\r\n]);\r\n\r\nconst PROJECTION_SCRATCH = mat4.create();\r\nconst INVERSE_PROJECTION_SCRATCH = mat4.create();\r\nconst BASIS_SCRATCH = mat4.create();\r\nconst LIGHT_VIEW_SCRATCH = mat4.create();\r\nconst ORTHO_SCRATCH = mat4.create();\r\nconst TRANSFORMED_SCRATCH = vec4.create();\r\nconst WORLD_SCRATCH = vec3.create();\r\nconst LIGHT_DIRECTION_SCRATCH = vec3.create();\r\n\r\nfunction createPerSplitData()\r\n{\r\n return {\r\n ShadowMapValues: Array.from({ length: 4 }, () => vec4.create()),\r\n ShadowMatrixVal: Array.from({ length: SHADOW_FRUSTUM_COUNT }, () => mat4.create()),\r\n CascadeRanges: Array.from({ length: SHADOW_FRUSTUM_COUNT }, () => vec4.create()),\r\n SplitInfo: vec4.create()\r\n };\r\n}\r\n\r\nfunction createSplitSetup()\r\n{\r\n return {\r\n shadowFrustum: new TriFrustumOrtho(),\r\n lightViewProjection: mat4.create(),\r\n invViewProj: mat4.create(),\r\n aabb: { min: vec3.create(), max: vec3.create() },\r\n corners: Array.from({ length: 8 }, () => vec3.create())\r\n };\r\n}\r\n\r\nfunction createShadowEffect()\r\n{\r\n const effect = new Tr2Effect();\r\n\r\n effect.SetEffectPathName(\"res:/graphics/effect/managed/space/system/ShadowDepth.fx\");\r\n\r\n // DECLARED BY CLEARING, which is Carbon (`cpp:41-42`), not by\r\n // AddResourceTexture2D. The difference is not cosmetic: a res-path slot and a\r\n // runtime slot are different classes, so declaring the res-path kind here left\r\n // SetParameter unable to find a runtime slot to update - it added a new one on\r\n // every call, and a per-frame resolve grew the resource list without bound.\r\n effect.SetParameter(\"EveSpaceSceneCascadedShadowMap\", null);\r\n effect.SetParameter(\"DepthMap\", null);\r\n return effect;\r\n}\r\n\r\n/** Carbon PerspectiveOffCenterMatrix: D3D zero-to-one depth. */\r\nfunction writePerspectiveOffCenter(out, left, right, bottom, top, near, far)\r\n{\r\n out.fill(0);\r\n out[0] = 2 * near / (right - left);\r\n out[5] = -2 * near / (bottom - top);\r\n out[8] = 1 + 2 * left / (right - left);\r\n out[9] = -1 - 2 * top / (bottom - top);\r\n out[10] = far / (near - far);\r\n out[11] = -1;\r\n out[14] = near * far / (near - far);\r\n return out;\r\n}\r\n\r\n/** Carbon OrthoNormalBasisZ. Flat matrix bytes match gl-matrix storage. */\r\nfunction writeOrthoNormalBasisZ(out, z)\r\n{\r\n mat4.identity(out);\r\n const length = Math.hypot(z[0], z[1], z[2]);\r\n const zx = z[0] / length;\r\n const zy = z[1] / length;\r\n const zz = z[2] / length;\r\n out[8] = zx;\r\n out[9] = zy;\r\n out[10] = zz;\r\n\r\n const xx = Math.abs(zx) > 0.99 ? 0 : 1;\r\n const xy = Math.abs(zx) > 0.99 ? 1 : 0;\r\n let yx = xy * zz;\r\n let yy = -xx * zz;\r\n let yz = xx * zy - xy * zx;\r\n const yLength = Math.hypot(yx, yy, yz);\r\n yx /= yLength;\r\n yy /= yLength;\r\n yz /= yLength;\r\n\r\n out[4] = yx;\r\n out[5] = yy;\r\n out[6] = yz;\r\n out[0] = yy * zz - yz * zy;\r\n out[1] = yz * zx - yx * zz;\r\n out[2] = yx * zy - yy * zx;\r\n return out;\r\n}\r\n\r\n/** Carbon OrthoOffCenterMatrix: D3D zero-to-one depth. */\r\nfunction writeOrthoOffCenter(out, left, right, bottom, top, near, far)\r\n{\r\n mat4.identity(out);\r\n out[0] = 2 / (right - left);\r\n out[5] = 2 / (top - bottom);\r\n out[10] = 1 / (near - far);\r\n out[12] = -1 - 2 * left / (right - left);\r\n out[13] = 1 + 2 * top / (bottom - top);\r\n out[14] = near / (near - far);\r\n return out;\r\n}\r\n\r\n/** Cascaded-shadow split producer. Its GPU operations are not ported yet. */\r\n@type.define({ className: \"Tr2ShadowMap\", family: \"trinityCore\" })\r\nexport class Tr2ShadowMap extends CjsModel\r\n{\r\n @edit.notify\r\n @edit.readwrite\r\n @edit.persist\r\n @type.int32\r\n @type.enum(\"trinity.Tr2ShadowMap.ShadowSplitMode\")\r\n shadowSplitMode = 0;\r\n\r\n @edit.readwrite\r\n @type.objectRef(\"Tr2Denoiser\")\r\n denoiser = new Tr2Denoiser();\r\n\r\n @edit.readwrite\r\n @type.objectRef(\"Tr2Effect\")\r\n cascadeEffect = createShadowEffect();\r\n\r\n @edit.notify\r\n @edit.read\r\n @type.uint32\r\n splitCount = SHADOW_FRUSTUM_COUNT;\r\n\r\n @edit.notify\r\n @edit.readwrite\r\n @type.boolean\r\n debugColorSplit = false;\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr15 = STATIC_SPLITS[15];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr8 = STATIC_SPLITS[8];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr6 = STATIC_SPLITS[6];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr5 = STATIC_SPLITS[5];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr14 = STATIC_SPLITS[14];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr10 = STATIC_SPLITS[10];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr13 = STATIC_SPLITS[13];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr4 = STATIC_SPLITS[4];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr3 = STATIC_SPLITS[3];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr7 = STATIC_SPLITS[7];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr1 = STATIC_SPLITS[1];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr9 = STATIC_SPLITS[9];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr0 = STATIC_SPLITS[0];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr11 = STATIC_SPLITS[11];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr12 = STATIC_SPLITS[12];\r\n\r\n @edit.readwrite\r\n @type.float32\r\n SplitNr2 = STATIC_SPLITS[2];\r\n\r\n @edit.notify\r\n @edit.readwrite\r\n @type.boolean\r\n disableShimmer = true;\r\n\r\n @edit.readwrite\r\n @type.uint32\r\n size = 2048;\r\n\r\n /**\r\n * Carbon's `PerSplitData` record. `ShadowMatrixVal` holds each cascade's\r\n * logical gl-matrix light view-projection, untransposed. The scene composes\r\n * it with the inverse view and the atlas cell, and\r\n * `RawData.SetAndTransposeIndex` performs the single packing transpose;\r\n * engines must not transpose or rebuild these matrices.\r\n */\r\n perSplitData = createPerSplitData();\r\n\r\n #width = SHADOW_MAP_WIDTH;\r\n\r\n #height = SHADOW_MAP_HEIGHT;\r\n\r\n #oldZFar = 0;\r\n\r\n #useDenoiser = true;\r\n\r\n #lastNearClip = 0;\r\n\r\n #lastFarClip = 0;\r\n\r\n #lastShadowSplitMode = Tr2ShadowMap.ShadowSplitMode.STATIC;\r\n\r\n #lastDebugColorSplit = false;\r\n\r\n #splitSetups = Array.from({ length: SHADOW_FRUSTUM_COUNT }, () => createSplitSetup());\r\n\r\n /** Creates the logical effect/denoiser state and reserves Carbon's globals. */\r\n constructor()\r\n {\r\n super();\r\n const store = Tr2VariableStore.GlobalStore();\r\n store.RegisterVariable(\"EveSpaceSceneShadowMap\");\r\n store.RegisterVariable(\"EveSpaceSceneCascadedShadowMap\");\r\n }\r\n\r\n /** Applies the atlas element size/count and the one-way denoiser disable. */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"The fixed PerSplitData arrays make split counts above Carbon's 16-slot capacity fail immediately instead of corrupting adjacent native memory.\")\r\n Setup(elementSize, elementCount, useDenoiser)\r\n {\r\n const nextSize = elementSize >>> 0;\r\n const nextCount = elementCount >>> 0;\r\n if (nextCount > SHADOW_FRUSTUM_COUNT)\r\n {\r\n throw new RangeError(`Tr2ShadowMap supports at most ${SHADOW_FRUSTUM_COUNT} splits.`);\r\n }\r\n if (this.size !== nextSize || this.splitCount !== nextCount)\r\n {\r\n this.size = nextSize;\r\n this.splitCount = nextCount;\r\n this.perSplitData.SplitInfo[0] = nextCount;\r\n }\r\n this.#useDenoiser = Boolean(useDenoiser);\r\n if (!this.#useDenoiser)\r\n {\r\n this.denoiser = null;\r\n }\r\n }\r\n\r\n /** Applies Carbon's notification consequences from the current owned state. */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"CjsModel notifications expose settled state rather than Be::Var identity, so this compares the two notify-backed values against their cached state.\")\r\n OnModified()\r\n {\r\n if (this.debugColorSplit !== this.#lastDebugColorSplit)\r\n {\r\n this.cascadeEffect.SetOption(\"SHADOW_DEBUG_MODE\", this.debugColorSplit ? \"SDM_COLOR\" : \"SDM_NONE\");\r\n this.#lastDebugColorSplit = this.debugColorSplit;\r\n }\r\n\r\n if (this.shadowSplitMode !== this.#lastShadowSplitMode)\r\n {\r\n if (this.shadowSplitMode === Tr2ShadowMap.ShadowSplitMode.STATIC)\r\n {\r\n this.#SetStaticShadowSplits();\r\n }\r\n else if (this.shadowSplitMode === Tr2ShadowMap.ShadowSplitMode.DYNAMIC)\r\n {\r\n this.#lastNearClip = 0;\r\n this.#lastFarClip = 0;\r\n }\r\n this.#lastShadowSplitMode = this.shadowSplitMode;\r\n }\r\n\r\n this.perSplitData.SplitInfo[0] = this.splitCount;\r\n return true;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Changes whether an existing denoiser should be used for future results. */\r\n ShouldUseDenoiser(value)\r\n {\r\n this.#useDenoiser = Boolean(value);\r\n }\r\n\r\n /** Engine-facing read of Carbon's private denoiser-use switch. */\r\n @impl.custom\r\n @impl.reason(\"The nominal engine executor needs Carbon's private denoiser-use decision without reading implementation fields.\")\r\n GetUseDenoiser()\r\n {\r\n return this.#useDenoiser;\r\n }\r\n\r\n /** Recomputes geometric dynamic split endpoints when the clip range changes. */\r\n @carbon.method\r\n @impl.implemented\r\n UpdateSplitValues(nearClip, farClip)\r\n {\r\n if (this.shadowSplitMode !== Tr2ShadowMap.ShadowSplitMode.DYNAMIC) return;\r\n if (this.#lastNearClip === nearClip && this.#lastFarClip === farClip) return;\r\n\r\n this.#lastNearClip = nearClip;\r\n this.#lastFarClip = farClip;\r\n const logNear = Math.log2(nearClip);\r\n const logFar = Math.log2(farClip);\r\n for (let index = 0; index < this.splitCount; index++)\r\n {\r\n this.#SetSplitValue(index, Math.pow(2, logNear + (logFar - logNear) * ((index + 1) / this.splitCount)));\r\n }\r\n }\r\n\r\n /**\r\n * Transforms the D3D clip cube through projection inverse, inverse view and\r\n * light view, returning its light-space bounds and writing all eight corners.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"The caller supplies owned JS output containers; matrix bytes stay in logical gl-matrix form and are never pre-transposed.\")\r\n static CalculateAABB(\r\n projection,\r\n invViewTransform,\r\n lightView,\r\n corners,\r\n out = { min: vec3.create(), max: vec3.create() }\r\n )\r\n {\r\n mat4.invert(INVERSE_PROJECTION_SCRATCH, projection);\r\n const min = out.min;\r\n const max = out.max;\r\n min[0] = min[1] = min[2] = Infinity;\r\n max[0] = max[1] = max[2] = -Infinity;\r\n\r\n for (let index = 0; index < DX_UNIT_CUBE.length; index++)\r\n {\r\n const source = DX_UNIT_CUBE[index];\r\n TRANSFORMED_SCRATCH[0] = source[0];\r\n TRANSFORMED_SCRATCH[1] = source[1];\r\n TRANSFORMED_SCRATCH[2] = source[2];\r\n TRANSFORMED_SCRATCH[3] = 1;\r\n vec4.transformMat4(TRANSFORMED_SCRATCH, TRANSFORMED_SCRATCH, INVERSE_PROJECTION_SCRATCH);\r\n const inverseW = 1 / TRANSFORMED_SCRATCH[3];\r\n WORLD_SCRATCH[0] = TRANSFORMED_SCRATCH[0] * inverseW;\r\n WORLD_SCRATCH[1] = TRANSFORMED_SCRATCH[1] * inverseW;\r\n WORLD_SCRATCH[2] = TRANSFORMED_SCRATCH[2] * inverseW;\r\n vec3.transformMat4(WORLD_SCRATCH, WORLD_SCRATCH, invViewTransform);\r\n vec3.transformMat4(corners[index], WORLD_SCRATCH, lightView);\r\n\r\n const corner = corners[index];\r\n min[0] = Math.min(min[0], corner[0]);\r\n min[1] = Math.min(min[1], corner[1]);\r\n min[2] = Math.min(min[2], corner[2]);\r\n max[0] = Math.max(max[0], corner[0]);\r\n max[1] = Math.max(max[1], corner[1]);\r\n max[2] = Math.max(max[2], corner[2]);\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * Builds one logical light-view-projection split and its shader data.\r\n *\r\n * The returned object is an allocation-free borrowed view for this split and\r\n * is overwritten the next time the same split index is prepared.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"Carbon stores Transpose(lightViewProjection) and returns SplitSetup by value; Trinity stores the logical matrix for RawData's terminal transpose and reuses one allocation-free result per split.\")\r\n SetupShadowSplit(splitIndex, invViewTransform, lightDirection, zNear, leftDivNear, rightDivNear, topDivNear, bottomDivNear)\r\n {\r\n if (!Number.isInteger(splitIndex) || splitIndex < 0 || splitIndex >= this.splitCount)\r\n {\r\n throw new RangeError(\"Tr2ShadowMap.SetupShadowSplit received an invalid split index.\");\r\n }\r\n\r\n const setup = this.#splitSetups[splitIndex];\r\n if (splitIndex === 0) this.#oldZFar = zNear;\r\n const zFar = this.#GetSplitValue(splitIndex);\r\n this.perSplitData.ShadowMapValues[splitIndex >> 2][splitIndex & 3] = zFar;\r\n\r\n const left = leftDivNear * this.#oldZFar;\r\n const right = rightDivNear * this.#oldZFar;\r\n const top = topDivNear * this.#oldZFar;\r\n const bottom = bottomDivNear * this.#oldZFar;\r\n writePerspectiveOffCenter(PROJECTION_SCRATCH, left, right, bottom, top, this.#oldZFar, zFar);\r\n this.#oldZFar = zFar;\r\n\r\n mat4.invert(INVERSE_PROJECTION_SCRATCH, PROJECTION_SCRATCH);\r\n // Carbon inverseProjection * inverseView; gl-matrix reverses the operands.\r\n mat4.multiply(setup.invViewProj, invViewTransform, INVERSE_PROJECTION_SCRATCH);\r\n\r\n LIGHT_DIRECTION_SCRATCH[0] = -lightDirection[0];\r\n LIGHT_DIRECTION_SCRATCH[1] = -lightDirection[1];\r\n LIGHT_DIRECTION_SCRATCH[2] = -lightDirection[2];\r\n writeOrthoNormalBasisZ(BASIS_SCRATCH, LIGHT_DIRECTION_SCRATCH);\r\n mat4.invert(LIGHT_VIEW_SCRATCH, BASIS_SCRATCH);\r\n\r\n Tr2ShadowMap.CalculateAABB(\r\n PROJECTION_SCRATCH,\r\n invViewTransform,\r\n LIGHT_VIEW_SCRATCH,\r\n setup.corners,\r\n setup.aabb\r\n );\r\n\r\n const min = setup.aabb.min;\r\n const max = setup.aabb.max;\r\n if (this.disableShimmer)\r\n {\r\n let maxDistance = 0;\r\n for (let first = 0; first < setup.corners.length; first++)\r\n {\r\n for (let second = first + 1; second < setup.corners.length; second++)\r\n {\r\n const a = setup.corners[first];\r\n const b = setup.corners[second];\r\n maxDistance = Math.max(maxDistance, Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]));\r\n }\r\n }\r\n\r\n const radius = Math.ceil(maxDistance / 2);\r\n const texelSize = radius * 2 / this.size;\r\n const centerX = Math.floor(((min[0] + max[0]) * 0.5) / texelSize + 0.5) * texelSize;\r\n const centerY = Math.floor(((min[1] + max[1]) * 0.5) / texelSize + 0.5) * texelSize;\r\n const centerZ = (min[2] + max[2]) * 0.5;\r\n min[0] = centerX - radius;\r\n min[1] = centerY - radius;\r\n min[2] = centerZ - radius;\r\n max[0] = centerX + radius;\r\n max[1] = centerY + radius;\r\n max[2] = centerZ + radius;\r\n }\r\n\r\n writeOrthoOffCenter(ORTHO_SCRATCH, max[0], min[0], max[1], min[1], -max[2], -min[2]);\r\n // Carbon lightView * ortho; gl-matrix reverses the operands.\r\n mat4.multiply(setup.lightViewProjection, ORTHO_SCRATCH, LIGHT_VIEW_SCRATCH);\r\n\r\n const range = this.perSplitData.CascadeRanges[splitIndex];\r\n range[0] = max[0] - min[0];\r\n range[1] = max[1] - min[1];\r\n range[2] = max[2] - min[2];\r\n range[3] = 0;\r\n mat4.copy(this.perSplitData.ShadowMatrixVal[splitIndex], setup.lightViewProjection);\r\n setup.shadowFrustum.DeriveFrustum(LIGHT_VIEW_SCRATCH, min, max);\r\n return setup;\r\n }\r\n\r\n /**\r\n * Allocates the cascaded depth surface and makes it the render target.\r\n *\r\n * @param {object} gpuResourcePool The pool to borrow the surface from.\r\n * @param {object} renderContext The context to set state on.\r\n * @returns {object|null} The borrowed depth texture, or null when the pool\r\n * could not supply one - which Carbon notes happens on a lost device.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n PrepareShadowRendering(gpuResourcePool, renderContext)\r\n {\r\n // Carbon's GetTempTexture( name, width, height, format, usage ) overload:\r\n // a 2D texture of one mip.\r\n const cascadedShadowDepth = gpuResourcePool.GetTempTexture(\"cascadedShadowDepth\", {\r\n type: TextureType.TEX_TYPE_2D,\r\n width: this.size * this.#width,\r\n height: this.size * this.#height,\r\n depth: 1,\r\n mipCount: 1,\r\n format: PixelFormat.PIXEL_FORMAT_D32_FLOAT,\r\n gpuUsage: Tr2GpuUsage.DEPTH_STENCIL | Tr2GpuUsage.SHADER_RESOURCE\r\n });\r\n\r\n if (!cascadedShadowDepth || !cascadedShadowDepth.IsValid()) return null;\r\n\r\n const esm = renderContext.GetEffectStateManager();\r\n\r\n // The depth stencil IS the shadow map, so the colour target is pushed EMPTY -\r\n // Carbon passes a default-constructed Tr2TextureAL and comments it \"empty\r\n // texture\" (`cpp:238`). Null is that argument here. Omitting it would only\r\n // save the slot and leave the scene's colour target bound underneath the\r\n // whole shadow pass, which is what this line used to do.\r\n esm.PushViewport();\r\n esm.PushRenderTarget(null);\r\n esm.PushDepthStencilBuffer(cascadedShadowDepth.Get());\r\n esm.UpdateRenderTargetViewport(cascadedShadowDepth.Get().GetWidth(), cascadedShadowDepth.Get().GetHeight());\r\n\r\n // Carbon wants a clean depth buffer for this pass and says so.\r\n renderContext.Clear({ depth: true, clearDepth: 1, clearStencil: 0 });\r\n renderContext.SetReadOnlyDepth(false);\r\n\r\n return cascadedShadowDepth;\r\n }\r\n\r\n /**\r\n * Points the viewport at one split's cell in the atlas.\r\n *\r\n * Eight cells per row: splits 0-7 fill the top row and 8 onward wrap to a\r\n * second, which is why the row index is `splitIndex % 8` and the y offset is\r\n * either zero or one cell down.\r\n *\r\n * @param {object} renderContext The context to set the viewport on.\r\n * @param {number} splitIndex Which cascade split.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n BeginShadowRendering(renderContext, splitIndex)\r\n {\r\n const esm = renderContext.GetEffectStateManager();\r\n const topRow = splitIndex < 8;\r\n\r\n esm.SetViewport({\r\n width: this.size,\r\n height: this.size,\r\n x: (topRow ? splitIndex : splitIndex % 8) * this.size,\r\n y: topRow ? 0 : this.size,\r\n minZ: 0,\r\n maxZ: 1\r\n });\r\n }\r\n\r\n /**\r\n * Unwinds everything `PrepareShadowRendering` pushed, in reverse.\r\n *\r\n * @param {object} renderContext The context to restore.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n EndShadowRendering(renderContext)\r\n {\r\n renderContext.SetReadOnlyDepth(false);\r\n\r\n const esm = renderContext.GetEffectStateManager();\r\n\r\n esm.PopRenderTarget();\r\n esm.PopDepthStencilBuffer();\r\n esm.PopViewport();\r\n }\r\n\r\n /**\r\n * Resolves the cascaded depth into a screen-space shadow factor.\r\n *\r\n * Carbon `DrawToShadowMapResult` (`cpp:278-305`). Borrow an R8 target the\r\n * size of the scene depth, bind it, run the shadow effect over a fullscreen\r\n * quad with the atlas and the depth map bound, then optionally denoise.\r\n *\r\n * THE DEPTH BUFFER IS PUSHED EMPTY, not merely saved. Carbon passes a\r\n * default-constructed Tr2TextureAL (`cpp:285`), which unbinds it - this pass\r\n * writes a full-screen factor and must not be depth-tested against the very\r\n * buffer it is reading.\r\n *\r\n * THE EFFECT'S TEXTURES ARE CLEARED IMMEDIATELY AFTER THE DRAW, as Carbon\r\n * does (`cpp:290-291`), so a later pass cannot inherit the atlas or the\r\n * scene depth from this one.\r\n *\r\n * `cascadeEffect` is Carbon's `m_shadowEffect` under our name - same\r\n * ShadowDepth.fx path, same two parameters (`cpp:39-42`).\r\n *\r\n * @param {object} renderContext The context to draw against.\r\n * @param {object} gpuResourcePool The pool to borrow the result target from.\r\n * @param {object} depthMap The scene depth.\r\n * @param {object} cascadedShadowDepth The atlas produced by this pass.\r\n * @param {number} upscaling The denoiser's upscaling factor.\r\n * @param {object} renderer The renderer owning the blitter.\r\n * @returns {object|null} The shadow-factor target, or null without a pool.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n @impl.reason(\"Carbon reaches the blitter and the reversed-depth projection through static Tr2Renderer; ours are an instance and the render context, so the renderer is passed in.\")\r\n DrawToShadowMapResult(renderContext, gpuResourcePool, depthMap, cascadedShadowDepth, upscaling, renderer)\r\n {\r\n let shadowMapResult = gpuResourcePool.GetTempTexture(\"shadowMapResult\", {\r\n type: TextureType.TEX_TYPE_2D,\r\n width: depthMap.GetWidth(),\r\n height: depthMap.GetHeight(),\r\n depth: 1,\r\n mipCount: 1,\r\n format: PixelFormat.PIXEL_FORMAT_R8_UNORM,\r\n gpuUsage: Tr2GpuUsage.RENDER_TARGET | Tr2GpuUsage.SHADER_RESOURCE\r\n });\r\n\r\n const esm = renderContext.GetEffectStateManager();\r\n\r\n esm.PushRenderTarget(shadowMapResult.Get());\r\n esm.PushDepthStencilBuffer(null);\r\n\r\n try\r\n {\r\n this.cascadeEffect.SetParameter(\"EveSpaceSceneCascadedShadowMap\", cascadedShadowDepth);\r\n this.cascadeEffect.SetParameter(\"DepthMap\", depthMap);\r\n renderer.DrawScreenQuad(renderContext, this.cascadeEffect);\r\n this.cascadeEffect.SetParameter(\"EveSpaceSceneCascadedShadowMap\", null);\r\n this.cascadeEffect.SetParameter(\"DepthMap\", null);\r\n\r\n // Carbon gates on all three (`cpp:296`). Setup() nulls the denoiser when\r\n // it is disabled, so the useDenoiser flag and a present denoiser are not\r\n // the same question.\r\n if (this.denoiser && this.#useDenoiser && depthMap.IsValid())\r\n {\r\n shadowMapResult = this.denoiser.Apply(\r\n shadowMapResult,\r\n depthMap,\r\n null,\r\n renderContext.GetReversedDepthProjectionTransform(),\r\n upscaling,\r\n gpuResourcePool,\r\n renderContext,\r\n renderer\r\n );\r\n }\r\n\r\n return shadowMapResult;\r\n }\r\n finally\r\n {\r\n esm.PopRenderTarget();\r\n esm.PopDepthStencilBuffer();\r\n }\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Returns the number of active cascade splits. */\r\n GetShadowSplitCount()\r\n {\r\n return this.splitCount;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Returns the square pixel size of one atlas cell. */\r\n GetShadowMapSize()\r\n {\r\n return this.size;\r\n }\r\n\r\n /** Returns the fixed number of atlas columns. */\r\n @impl.custom\r\n @impl.reason(\"The nominal engine executor needs Carbon's private fixed atlas width without reading implementation fields.\")\r\n GetShadowMapWidth()\r\n {\r\n return this.#width;\r\n }\r\n\r\n /** Returns the fixed number of atlas rows. */\r\n @impl.custom\r\n @impl.reason(\"The nominal engine executor needs Carbon's private fixed atlas height without reading implementation fields.\")\r\n GetShadowMapHeight()\r\n {\r\n return this.#height;\r\n }\r\n\r\n /** Returns the stable owned record consumed by scene per-frame packing. */\r\n @impl.custom\r\n @impl.reason(\"The scene needs a nominal direct accessor to Carbon's public PerSplitData without structural probing.\")\r\n GetPerSplitData()\r\n {\r\n return this.perSplitData;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Returns the logical effect used to resolve the screen-space shadow mask. */\r\n GetShadowEffect()\r\n {\r\n return this.cascadeEffect;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Reports whether cascade-debug colouring is enabled. */\r\n GetDebugSplitValue()\r\n {\r\n return this.debugColorSplit;\r\n }\r\n\r\n @carbon.method\r\n @impl.implemented\r\n /** Returns Carbon's packed debug colour for a cascade colour index. */\r\n GetDebugColors(switchCase)\r\n {\r\n switch (switchCase)\r\n {\r\n case 0: return 0xffffffff;\r\n case 1: return 0xffff0000;\r\n case 2: return 0xff00ff00;\r\n case 3: return 0xff0000ff;\r\n case 4: return 0xffffff00;\r\n case 5: return 0xff00ffff;\r\n case 6: return 0x2200ffff;\r\n case 7: return 0xff555555;\r\n case 8: return 0xff888888;\r\n default: return undefined;\r\n }\r\n }\r\n\r\n /** Restores the sixteen fixed Carbon cascade endpoints. */\r\n #SetStaticShadowSplits()\r\n {\r\n for (let index = 0; index < STATIC_SPLITS.length; index++)\r\n {\r\n this.#SetSplitValue(index, STATIC_SPLITS[index]);\r\n }\r\n }\r\n\r\n /** Writes one authored/dynamic split endpoint to its public field. */\r\n #SetSplitValue(index, value)\r\n {\r\n this[`SplitNr${index}`] = value;\r\n }\r\n\r\n /** Reads one split endpoint from its public field. */\r\n #GetSplitValue(index)\r\n {\r\n return this[`SplitNr${index}`];\r\n }\r\n\r\n static ShadowSplitMode = Object.freeze({\r\n STATIC: 0,\r\n DYNAMIC: 1,\r\n MANUAL: 2\r\n });\r\n}\r\n\r\n// Registered as Carbon registers it (trinity/trinity/Tr2ShadowMap_Blue.cpp:14).\r\nblue.enums.RegisterEnum(\"trinity.Tr2ShadowMap.ShadowSplitMode\", Tr2ShadowMap.ShadowSplitMode, {\r\n source: \"trinity/trinity/Tr2ShadowMap.h\", family: \"trinityCore\", line: 102,\r\n exposedName: \"ShadowSplitModeChooser\", exposure: EnumRegistrationType.ENUM_REG_ENUM_OBJECT_ON_MODULE,\r\n chooserSource: \"trinity/trinity/Tr2ShadowMap_Blue.cpp:8\",\r\n chooser: [\r\n { name: \"Static\", value: Tr2ShadowMap.ShadowSplitMode.STATIC, description: \"Staticly computed splits for the shadow map\" },\r\n { name: \"Dynamic\", value: Tr2ShadowMap.ShadowSplitMode.DYNAMIC, description: \"Dynamic splits that are generated based on near and far planes\" },\r\n { name: \"Manual\", value: Tr2ShadowMap.ShadowSplitMode.MANUAL, description: \"Manual mode for use in graphite for debugging\" }\r\n ]\r\n});\r\n"],"names":["SHADOW_FRUSTUM_COUNT","SHADOW_MAP_WIDTH","SHADOW_MAP_HEIGHT","STATIC_SPLITS","Object","freeze","DX_UNIT_CUBE","PROJECTION_SCRATCH","mat4","create","INVERSE_PROJECTION_SCRATCH","BASIS_SCRATCH","LIGHT_VIEW_SCRATCH","ORTHO_SCRATCH","TRANSFORMED_SCRATCH","vec4","WORLD_SCRATCH","vec3","LIGHT_DIRECTION_SCRATCH","createPerSplitData","ShadowMapValues","Array","from","length","ShadowMatrixVal","CascadeRanges","SplitInfo","createSplitSetup","shadowFrustum","TriFrustumOrtho","lightViewProjection","invViewProj","aabb","min","max","corners","createShadowEffect","effect","Tr2Effect","SetEffectPathName","SetParameter","writePerspectiveOffCenter","out","left","right","bottom","top","near","far","fill","writeOrthoNormalBasisZ","z","identity","Math","hypot","zx","zy","zz","xx","abs","xy","yx","yy","yz","yLength","writeOrthoOffCenter","_Tr2ShadowMap","_identity","Tr2ShadowMap","CjsModel","e","_init_shadowSplitMode","_init_extra_shadowSplitMode","_init_denoiser","_init_extra_denoiser","_init_cascadeEffect","_init_extra_cascadeEffect","_init_splitCount","_init_extra_splitCount","_init_debugColorSplit","_init_extra_debugColorSplit","_init_SplitNr","_init_extra_SplitNr","_init_SplitNr2","_init_extra_SplitNr2","_init_SplitNr3","_init_extra_SplitNr3","_init_SplitNr4","_init_extra_SplitNr4","_init_SplitNr5","_init_extra_SplitNr5","_init_SplitNr6","_init_extra_SplitNr6","_init_SplitNr7","_init_extra_SplitNr7","_init_SplitNr8","_init_extra_SplitNr8","_init_SplitNr9","_init_extra_SplitNr9","_init_SplitNr0","_init_extra_SplitNr0","_init_SplitNr1","_init_extra_SplitNr1","_init_SplitNr10","_init_extra_SplitNr10","_init_SplitNr11","_init_extra_SplitNr11","_init_SplitNr12","_init_extra_SplitNr12","_init_SplitNr13","_init_extra_SplitNr13","_init_SplitNr14","_init_extra_SplitNr14","_init_disableShimmer","_init_extra_disableShimmer","_init_size","_init_extra_size","_initProto","_initStatic","c","_initClass","_applyDecs","type","define","className","family","edit","notify","readwrite","persist","int32","enum","objectRef","read","uint32","boolean","float32","carbon","method","impl","adapted","reason","implemented","custom","shadowSplitMode","denoiser","Tr2Denoiser","cascadeEffect","splitCount","debugColorSplit","SplitNr15","SplitNr8","SplitNr6","SplitNr5","SplitNr14","SplitNr10","SplitNr13","SplitNr4","SplitNr3","SplitNr7","SplitNr1","SplitNr9","SplitNr0","SplitNr11","SplitNr12","SplitNr2","disableShimmer","size","perSplitData","ShadowSplitMode","STATIC","constructor","store","Tr2VariableStore","GlobalStore","RegisterVariable","Setup","elementSize","elementCount","useDenoiser","nextSize","nextCount","RangeError","Boolean","OnModified","SetOption","DYNAMIC","ShouldUseDenoiser","value","GetUseDenoiser","UpdateSplitValues","nearClip","farClip","logNear","log2","logFar","index","pow","CalculateAABB","projection","invViewTransform","lightView","invert","Infinity","source","transformMat4","inverseW","corner","SetupShadowSplit","splitIndex","lightDirection","zNear","leftDivNear","rightDivNear","topDivNear","bottomDivNear","Number","isInteger","setup","zFar","multiply","maxDistance","first","second","a","b","radius","ceil","texelSize","centerX","floor","centerY","centerZ","range","copy","DeriveFrustum","PrepareShadowRendering","gpuResourcePool","renderContext","cascadedShadowDepth","GetTempTexture","TextureType","TEX_TYPE_2D","width","height","depth","mipCount","format","PixelFormat","PIXEL_FORMAT_D32_FLOAT","gpuUsage","Tr2GpuUsage","DEPTH_STENCIL","SHADER_RESOURCE","IsValid","esm","GetEffectStateManager","PushViewport","PushRenderTarget","PushDepthStencilBuffer","Get","UpdateRenderTargetViewport","GetWidth","GetHeight","Clear","clearDepth","clearStencil","SetReadOnlyDepth","BeginShadowRendering","topRow","SetViewport","x","y","minZ","maxZ","EndShadowRendering","PopRenderTarget","PopDepthStencilBuffer","PopViewport","DrawToShadowMapResult","depthMap","upscaling","renderer","shadowMapResult","PIXEL_FORMAT_R8_UNORM","RENDER_TARGET","DrawScreenQuad","Apply","GetReversedDepthProjectionTransform","GetShadowSplitCount","GetShadowMapSize","GetShadowMapWidth","GetShadowMapHeight","GetPerSplitData","GetShadowEffect","GetDebugSplitValue","GetDebugColors","switchCase","undefined","#SetStaticShadowSplits","#SetSplitValue","#GetSplitValue","MANUAL","blue","enums","RegisterEnum","line","exposedName","exposure","EnumRegistrationType","ENUM_REG_ENUM_OBJECT_ON_MODULE","chooserSource","chooser","name","description"],"mappings":"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"}
|
|
@@ -453,6 +453,18 @@ new class extends _identity {
|
|
|
453
453
|
return this.#requireAL("RenderPassHint").RenderPassHint(...attachments);
|
|
454
454
|
}
|
|
455
455
|
|
|
456
|
+
/**
|
|
457
|
+
* Ends the pass a hint declared, so the next work opens a new one; a
|
|
458
|
+
* pending hint or clear still runs, in a pass of its own. Forwards, as
|
|
459
|
+
* RenderPassHint does (Carbon calls it where the platform supports hints,
|
|
460
|
+
* `EveSpaceScene.cpp:2311-2313`).
|
|
461
|
+
*
|
|
462
|
+
* @returns {*} Whatever the backend reports.
|
|
463
|
+
*/
|
|
464
|
+
EndRenderPassHint() {
|
|
465
|
+
return this.#requireAL("EndRenderPassHint").EndRenderPassHint();
|
|
466
|
+
}
|
|
467
|
+
|
|
456
468
|
/**
|
|
457
469
|
* The projection with its depth range reversed.
|
|
458
470
|
*
|
|
@@ -478,6 +490,37 @@ new class extends _identity {
|
|
|
478
490
|
return out;
|
|
479
491
|
}
|
|
480
492
|
|
|
493
|
+
/**
|
|
494
|
+
* The front clip, Carbon `Tr2Renderer::GetFrontClip` (`Tr2Renderer.cpp:510-513`),
|
|
495
|
+
* derived from the projection as `UpdateProjectionParameters` derives it
|
|
496
|
+
* (`Tr2Renderer.cpp:81`): `_43 / _33`, zero when `_33` is. Relocated here
|
|
497
|
+
* with the projection it is read from. For a reversed-depth projection the
|
|
498
|
+
* formula yields the far plane, which is why CORTAO reads its near plane
|
|
499
|
+
* from the BACK clip.
|
|
500
|
+
*
|
|
501
|
+
* @returns {number} The front clip, or zero before a projection is set.
|
|
502
|
+
*/
|
|
503
|
+
GetFrontClip() {
|
|
504
|
+
const projection = this.#projection;
|
|
505
|
+
if (!projection) return 0;
|
|
506
|
+
|
|
507
|
+
// Carbon's _33 and _43 are 10 and 14 in column-major.
|
|
508
|
+
return projection[10] ? projection[14] / projection[10] : 0;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* The back clip, Carbon `Tr2Renderer::GetBackClip` (`Tr2Renderer.cpp:515-518`),
|
|
513
|
+
* derived as `UpdateProjectionParameters` does (`Tr2Renderer.cpp:82`):
|
|
514
|
+
* `_43 / ( 1 + _33 )`.
|
|
515
|
+
*
|
|
516
|
+
* @returns {number} The back clip, or zero before a projection is set.
|
|
517
|
+
*/
|
|
518
|
+
GetBackClip() {
|
|
519
|
+
const projection = this.#projection;
|
|
520
|
+
if (!projection) return 0;
|
|
521
|
+
return projection[14] / (1 + projection[10]);
|
|
522
|
+
}
|
|
523
|
+
|
|
481
524
|
/**
|
|
482
525
|
* What the installed backend can do.
|
|
483
526
|
*
|