perf: rewrite landscape rendering#1959
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughRefactors terrain sampling into a unified, mask-driven stochastic sampling API: adds SampleHeightUnified and ComputeActiveMask, replaces per-branch dx/dy with an activeMask + StochasticOffsets/Gradients, adds mipLevel compensation, and provides sampling stubs for absent Terrain Variation. Changes
Sequence Diagram(s)sequenceDiagram
participant VS as Vertex Shader
participant PS as Pixel Shader
participant TV as TerrainVariation
participant EM as ExtendedMaterials
participant TX as Texture/Atlas
rect rgba(200,200,255,0.5)
VS->>TV: ComputeStochasticOffsets(landscapeUV)
VS->>TV: ComputeStochasticGradients(uv)
VS->>PS: pass sharedOffset, sharedGrad
end
rect rgba(200,255,200,0.5)
PS->>EM: ComputeActiveMask(weights)
PS->>EM: Compute mipLevel (+ SharedData::MipBias)
PS->>EM: SampleHeightUnified(tex,samp,coords,mipLevel,sharedOffset)
EM->>TX: SampleLevel / SampleBias (texture fetch)
EM-->>PS: heights, weights
end
rect rgba(255,200,200,0.5)
PS->>TV: SampleTerrain(enabled, tex, samp, uv, offsets, layerWeight)
TV-->>PS: stochastic or fallback sample
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
No actionable suggestions for changed features. |
Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details.
There was a problem hiding this comment.
🧹 Nitpick comments (4)
package/Shaders/Lighting.hlsl (1)
1206-1213: Consider combining initialization for clarity.The initialization is correct, but lines 1207 and 1209 could be combined for brevity:
- bool useTerrainVariation = false; StochasticOffsets sharedOffset = (StochasticOffsets)0; - useTerrainVariation = SharedData::terrainVariationSettings.enableTilingFix; + bool useTerrainVariation = SharedData::terrainVariationSettings.enableTilingFix;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@package/Shaders/Lighting.hlsl` around lines 1206 - 1213, Combine the declaration and initialization for clarity: replace the separate declarations of useTerrainVariation and sharedOffset followed by setting useTerrainVariation = SharedData::terrainVariationSettings.enableTilingFix; with a single statement that initializes useTerrainVariation from SharedData::terrainVariationSettings.enableTilingFix, and then conditionally assigns sharedOffset via ComputeStochasticOffsets(input.TexCoord0.zw) inside the existing [branch] if (useTerrainVariation) block; keep the type names (bool useTerrainVariation, StochasticOffsets sharedOffset) and the call to ComputeStochasticOffsets unchanged.features/Terrain Variation/Shaders/TerrainVariation/TerrainVariation.hlsli (2)
131-137: Consider using offsetsLOD.weights for the blend factor.The hardcoded
0.65matchesoffsetsLOD.weights.xfromComputeStochasticOffsetsLOD, but using the struct value would improve maintainability:♻️ Suggested refactor
inline float4 StochasticSampleLOD(float rnd, Texture2D tex, SamplerState samp, float2 uv, StochasticOffsets offsetsLOD) { float2 dir1 = float2(rnd - 0.5, frac(rnd * 1.618) - 0.5); float4 s1 = tex.SampleBias(samp, uv + (offsetsLOD.offset1 + dir1) * 0.01, SharedData::MipBias); float4 s2 = tex.SampleBias(samp, uv + (offsetsLOD.offset2 + float2(dir1.y, -dir1.x)) * 0.01, SharedData::MipBias); - return lerp(s2, s1, 0.65); + return lerp(s2, s1, offsetsLOD.weights.x); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@features/Terrain` Variation/Shaders/TerrainVariation/TerrainVariation.hlsli around lines 131 - 137, In StochasticSampleLOD, replace the hardcoded blend factor 0.65 with the corresponding value from the offsetsLOD struct (use offsetsLOD.weights.x) so the blending matches ComputeStochasticOffsetsLOD; update the lerp call in StochasticSampleLOD to use offsetsLOD.weights.x as the third parameter to keep the weighting driven by the offsetsLOD data rather than a magic constant.
144-155: Verify division safety in weight calculation.The
rcp(w1 + w2)at line 154 could be problematic if both weights are very small. Given that:
offsets.weights.x >= offsets.weights.y >= offsets.weights.z(sorted)- Barycentric weights sum to 1.0
weights.xshould always be >= 1/3 after sortingThis should be safe in practice, but consider adding a small epsilon for robustness:
🛡️ Optional defensive fix
- return lerp(s2, s1, w1 * rcp(w1 + w2)); + return lerp(s2, s1, w1 * rcp(max(w1 + w2, 1e-5)));🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@features/Terrain` Variation/Shaders/TerrainVariation/TerrainVariation.hlsli around lines 144 - 155, The weight normalization can divide by a near-zero sum; in StochasticEffect compute the denominator as (w1 + w2) guarded by a small epsilon and use that safe denominator for rcp to avoid infinities/NaNs — e.g. define a small constant EPS (or reuse an existing epsilon) and replace rcp(w1 + w2) with rcp(max(w1 + w2, EPS)) (referencing StochasticEffect, local variables w1/w2 and HEIGHT_INFLUENCE) so the lerp call uses a stable normalized weight.features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli (1)
179-189: Single-layer fast path - verify height scaling behavior.The fast path optimization is a good performance improvement. However, note that when only one layer is active,
layerWeights[layerIdx]should be close to 1.0 after weight normalization (line 1193-1196 in Lighting.hlsl). The multiplicationheights[layerIdx] * layerWeights[layerIdx]may produce slightly different results than the fullProcessTerrainHeightWeightspath due to the height-blending power adjustments.Consider whether this is intentional behavior or if the fast path should simply return
heights[layerIdx]when the single layer's weight is effectively 1.0.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@features/Extended` Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli around lines 179 - 189, The single-layer fast path currently returns heights[layerIdx] * layerWeights[layerIdx], which can differ from the full ProcessTerrainHeightWeights behavior when layerWeights is effectively 1.0; modify the fast-path in the block guarded by activeMask countbits==1 (using variables activeMask, layerIdx, layerWeights, heights) to detect when layerWeights[layerIdx] is effectively 1.0 (e.g., >= 0.999) and in that case return heights[layerIdx] (applying the same SharedData::terrainVariationSettings.enableTilingFix multiplier if present), otherwise keep the existing heights[layerIdx] * layerWeights[layerIdx] path so behavior matches the full weighting path when weights are not fully normalized.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@features/Extended`
Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli:
- Around line 179-189: The single-layer fast path currently returns
heights[layerIdx] * layerWeights[layerIdx], which can differ from the full
ProcessTerrainHeightWeights behavior when layerWeights is effectively 1.0;
modify the fast-path in the block guarded by activeMask countbits==1 (using
variables activeMask, layerIdx, layerWeights, heights) to detect when
layerWeights[layerIdx] is effectively 1.0 (e.g., >= 0.999) and in that case
return heights[layerIdx] (applying the same
SharedData::terrainVariationSettings.enableTilingFix multiplier if present),
otherwise keep the existing heights[layerIdx] * layerWeights[layerIdx] path so
behavior matches the full weighting path when weights are not fully normalized.
In `@features/Terrain` Variation/Shaders/TerrainVariation/TerrainVariation.hlsli:
- Around line 131-137: In StochasticSampleLOD, replace the hardcoded blend
factor 0.65 with the corresponding value from the offsetsLOD struct (use
offsetsLOD.weights.x) so the blending matches ComputeStochasticOffsetsLOD;
update the lerp call in StochasticSampleLOD to use offsetsLOD.weights.x as the
third parameter to keep the weighting driven by the offsetsLOD data rather than
a magic constant.
- Around line 144-155: The weight normalization can divide by a near-zero sum;
in StochasticEffect compute the denominator as (w1 + w2) guarded by a small
epsilon and use that safe denominator for rcp to avoid infinities/NaNs — e.g.
define a small constant EPS (or reuse an existing epsilon) and replace rcp(w1 +
w2) with rcp(max(w1 + w2, EPS)) (referencing StochasticEffect, local variables
w1/w2 and HEIGHT_INFLUENCE) so the lerp call uses a stable normalized weight.
In `@package/Shaders/Lighting.hlsl`:
- Around line 1206-1213: Combine the declaration and initialization for clarity:
replace the separate declarations of useTerrainVariation and sharedOffset
followed by setting useTerrainVariation =
SharedData::terrainVariationSettings.enableTilingFix; with a single statement
that initializes useTerrainVariation from
SharedData::terrainVariationSettings.enableTilingFix, and then conditionally
assigns sharedOffset via ComputeStochasticOffsets(input.TexCoord0.zw) inside the
existing [branch] if (useTerrainVariation) block; keep the type names (bool
useTerrainVariation, StochasticOffsets sharedOffset) and the call to
ComputeStochasticOffsets unchanged.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 8f051fc9-9a34-4b4b-a9e8-fcf1d9de8f29
📒 Files selected for processing (3)
features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlslifeatures/Terrain Variation/Shaders/TerrainVariation/TerrainVariation.hlslipackage/Shaders/Lighting.hlsl
Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli (2)
160-169: Consider the fast-path weight multiplication edge case.The fast path applies different logic depending on whether the layer weight is ≥0.999:
float total = layerWeights[layerIdx] >= 0.999 ? heights[layerIdx] : heights[layerIdx] * layerWeights[layerIdx];When a layer weight crosses the 0.999 threshold (e.g., transitioning from 0.998 to 1.0), the multiplication factor jumps discontinuously from
heights * 0.998toheights * 1.0. This is a ~0.2% discontinuity, which may be imperceptible in practice, but worth verifying there are no visible seams.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@features/Extended` Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli around lines 160 - 169, The ternary in the single-layer fast path creates a discontinuous jump at the 0.999 threshold (in the block that uses activeMask, firstbitlow, layerWeights and heights), which can produce seams; replace the abrupt branch with a continuous computation: either always use heights[layerIdx] * layerWeights[layerIdx] (and then apply the tiling fix via SharedData::terrainVariationSettings.enableTilingFix) or implement a small smooth blend (e.g., a smoothstep or linear lerp over a narrow band near 0.999) between heights[layerIdx] * weight and heights[layerIdx] to remove the discontinuity. Ensure you update the code in the fast-path block that currently sets total using the ternary and preserve the tilingFix multiplication.
185-211: Inconsistent branching hints between layers 0-2 and 3-5.Layers 0–2 use plain
if (activeMask & Xu)while layers 3–5 use[branch] if ((activeMask & Xu) && ...)withelse if. This inconsistency could affect shader compilation behavior and readability.Consider unifying the style — either all use
[branch]for consistency with the displacement flag checks, or all use plainifif the compiler handles it well.Example unified style (using [branch] throughout)
- if (activeMask & 1u) { + [branch] if (activeMask & 1u) { [branch] if ((Permutation::ExtraFeatureDescriptor & Permutation::ExtraFeatureFlags::THLand0HasDisplacement) != 0) heights[0] = ScaleDisplacement(SampleHeightUnified(TexLandTHDisp0Sampler, SampTerrainParallaxSampler, coords, mipLevels[0], sharedOffset).x, params[0]); else heights[0] = ScaleDisplacement(SampleHeightUnified(TexColorSampler, SampTerrainParallaxSampler, coords, mipLevels[0], sharedOffset).w, params[0]); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@features/Extended` Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli around lines 185 - 211, The branching hints are inconsistent: height sampling for layers 0–2 uses plain "if (activeMask & ...)" while layers 3–5 use "[branch] if ((activeMask & ...) && (Permutation::ExtraFeatureDescriptor & ...))" with else-if; unify them by applying the same branch hint style across all layers. Update the checks that set heights[0..2] to use the [branch] attribute (or remove [branch] from 3..5 if you prefer the opposite) and ensure the conditional structure matches the pattern used by SampleHeightUnified/ScaleDisplacement calls and Permutation::ExtraFeatureFlags checks so each layer (heights[0]..heights[5]) consistently tests activeMask and the THLand#HasDisplacement flag before choosing the TexLandTHDisp#Sampler vs TexLandColor#Sampler path.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@package/Shaders/Lighting.hlsl`:
- Around line 944-970: Remove the duplicated conditional block that re-declares
the TerrainVariation include guard and the stub structs/functions
(StochasticOffsets, StochasticGradients, ComputeStochasticOffsets,
ComputeStochasticGradients, ComputeStochasticOffsetsLOD, StochasticSampleLOD,
StochasticEffectParallax, SampleTerrain) — keep the original definitions already
present earlier and delete the second copy to avoid confusion; ensure only the
first occurrence of the `#if` defined(TERRAIN_VARIATION) ... `#endif` block remains.
---
Nitpick comments:
In `@features/Extended`
Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli:
- Around line 160-169: The ternary in the single-layer fast path creates a
discontinuous jump at the 0.999 threshold (in the block that uses activeMask,
firstbitlow, layerWeights and heights), which can produce seams; replace the
abrupt branch with a continuous computation: either always use heights[layerIdx]
* layerWeights[layerIdx] (and then apply the tiling fix via
SharedData::terrainVariationSettings.enableTilingFix) or implement a small
smooth blend (e.g., a smoothstep or linear lerp over a narrow band near 0.999)
between heights[layerIdx] * weight and heights[layerIdx] to remove the
discontinuity. Ensure you update the code in the fast-path block that currently
sets total using the ternary and preserve the tilingFix multiplication.
- Around line 185-211: The branching hints are inconsistent: height sampling for
layers 0–2 uses plain "if (activeMask & ...)" while layers 3–5 use "[branch] if
((activeMask & ...) && (Permutation::ExtraFeatureDescriptor & ...))" with
else-if; unify them by applying the same branch hint style across all layers.
Update the checks that set heights[0..2] to use the [branch] attribute (or
remove [branch] from 3..5 if you prefer the opposite) and ensure the conditional
structure matches the pattern used by SampleHeightUnified/ScaleDisplacement
calls and Permutation::ExtraFeatureFlags checks so each layer
(heights[0]..heights[5]) consistently tests activeMask and the
THLand#HasDisplacement flag before choosing the TexLandTHDisp#Sampler vs
TexLandColor#Sampler path.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: e3966223-9ab2-4758-95b6-a0eaa35122ca
📒 Files selected for processing (3)
features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlslifeatures/Terrain Variation/Shaders/TerrainVariation/TerrainVariation.hlslipackage/Shaders/Lighting.hlsl
There was a problem hiding this comment.
🧹 Nitpick comments (2)
package/Shaders/Lighting.hlsl (1)
1205-1212: Redundant initialization ofuseTerrainVariation.The variable is initialized to
falseon line 1206 and immediately reassigned on line 1208. Consider combining into a single declaration.♻️ Simplified initialization
- bool useTerrainVariation = false; - StochasticOffsets sharedOffset = (StochasticOffsets)0; - useTerrainVariation = SharedData::terrainVariationSettings.enableTilingFix; + bool useTerrainVariation = SharedData::terrainVariationSettings.enableTilingFix; + StochasticOffsets sharedOffset = (StochasticOffsets)0;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@package/Shaders/Lighting.hlsl` around lines 1205 - 1212, Combine the redundant declaration and assignment by declaring useTerrainVariation once and initializing it from SharedData::terrainVariationSettings.enableTilingFix; also ensure sharedOffset (type StochasticOffsets) is initialized consistently before the [branch] block and only set via ComputeStochasticOffsets(input.TexCoord0.zw) when useTerrainVariation is true — update the lines that declare useTerrainVariation and sharedOffset near the ComputeStochasticOffsets call to remove the unnecessary initial false assignment.features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli (1)
185-211: Inconsistent branching pattern between layers 0-2 and layers 3-5.Layers 0-2 use
if (activeMask & Xu) { [branch] if (hasDisplacement) ... else ... }while layers 3-5 use[branch] if ((activeMask & Xu) && hasDisplacement) ... else if (activeMask & Xu) ....Both patterns are functionally correct, but the inconsistency may cause slightly different shader compilation behavior. Consider unifying the pattern for consistency, though this is a minor style concern.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@features/Extended` Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli around lines 185 - 211, The branching pattern is inconsistent between layers 0–2 and 3–5; update layers 3–5 to match the outer-mask-first style used for 0–2. For the blocks that set heights[3], heights[4], heights[5], wrap each in if (activeMask & Xu) { [branch] if ((Permutation::ExtraFeatureDescriptor & Permutation::ExtraFeatureFlags::THLand3HasDisplacement) != 0) heights[3] = ScaleDisplacement(SampleHeightUnified(TexLandTHDisp3Sampler, ...).x, params[3]); else heights[3] = ScaleDisplacement(SampleHeightUnified(TexLandColor4Sampler, ...).w, params[3]); } (and similarly use THLand4HasDisplacement/THLand5HasDisplacement, TexLandTHDisp4Sampler/TexLandTHDisp5Sampler and TexLandColor5Sampler/TexLandColor6Sampler) so the control flow matches the pattern used by heights[0..2] and uses the same SampleHeightUnified/ScaleDisplacement calls.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@features/Extended`
Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli:
- Around line 185-211: The branching pattern is inconsistent between layers 0–2
and 3–5; update layers 3–5 to match the outer-mask-first style used for 0–2. For
the blocks that set heights[3], heights[4], heights[5], wrap each in if
(activeMask & Xu) { [branch] if ((Permutation::ExtraFeatureDescriptor &
Permutation::ExtraFeatureFlags::THLand3HasDisplacement) != 0) heights[3] =
ScaleDisplacement(SampleHeightUnified(TexLandTHDisp3Sampler, ...).x, params[3]);
else heights[3] = ScaleDisplacement(SampleHeightUnified(TexLandColor4Sampler,
...).w, params[3]); } (and similarly use
THLand4HasDisplacement/THLand5HasDisplacement,
TexLandTHDisp4Sampler/TexLandTHDisp5Sampler and
TexLandColor5Sampler/TexLandColor6Sampler) so the control flow matches the
pattern used by heights[0..2] and uses the same
SampleHeightUnified/ScaleDisplacement calls.
In `@package/Shaders/Lighting.hlsl`:
- Around line 1205-1212: Combine the redundant declaration and assignment by
declaring useTerrainVariation once and initializing it from
SharedData::terrainVariationSettings.enableTilingFix; also ensure sharedOffset
(type StochasticOffsets) is initialized consistently before the [branch] block
and only set via ComputeStochasticOffsets(input.TexCoord0.zw) when
useTerrainVariation is true — update the lines that declare useTerrainVariation
and sharedOffset near the ComputeStochasticOffsets call to remove the
unnecessary initial false assignment.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 30fe9d89-d1ca-4953-a1fa-ec78b51aca5e
📒 Files selected for processing (3)
features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlslifeatures/Terrain Variation/Shaders/TerrainVariation/TerrainVariation.hlslipackage/Shaders/Lighting.hlsl
There was a problem hiding this comment.
Pull request overview
Refactors terrain variation sampling and integrates it more tightly with landscape/parallax paths to reduce tiling artifacts while improving performance (importance sampling / fewer samples) and keeping parallax/shadows consistent across render scales.
Changes:
- Updated
Lighting.hlsllandscape sampling to use unifiedSampleTerrain(...)helpers and centralized stochastic offset computation (with stub fallbacks when TV isn’t compiled for a permutation). - Reworked
TerrainVariation.hlslito a 2-sample stochastic approach with weight-sorted offsets and updated LOD/parallax sampling. - Refactored
ExtendedMaterials.hlsliterrain-parallax height/shadow sampling into a unified pathway, added upscaler mip compensation, and introduced an active-layer mask + single-layer fast path.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| package/Shaders/Lighting.hlsl | Integrates new terrain variation sampling/fallbacks into LANDSCAPE/LOD terrain sampling and EMAT terrain parallax/shadows. |
| features/Terrain Variation/Shaders/TerrainVariation/TerrainVariation.hlsli | Rewrites terrain variation sampling to 2-sample importance-style blending and updates parallax/LOD sampling helpers. |
| features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli | Unifies terrain height sampling + shadowing, adds mip compensation for upscalers, and adds active-layer optimizations. |
Comments suppressed due to low confidence (1)
features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli:403
dot(max(0, sh - sh0), 1.0)passes a scalar as the second operand. HLSLdotexpects both operands to have the same dimension, and even if this compiles via implicit splat it changes semantics to summing all 4 taps (quickly saturating). Use an explicit float4 weight (e.g., average/desired weighting) to avoid compilation/logic issues.
float4 sh = 0;
sh = AdjustDisplacementNormalized(tex.SampleLevel(texSampler, coords + rayDir * multipliers.x, mipLevel)[channel], params);
if (quality > 0.25)
sh.y = AdjustDisplacementNormalized(tex.SampleLevel(texSampler, coords + rayDir * multipliers.y, mipLevel)[channel], params);
if (quality > 0.5)
sh.z = AdjustDisplacementNormalized(tex.SampleLevel(texSampler, coords + rayDir * multipliers.z, mipLevel)[channel], params);
Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details.
Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details.
Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details.
Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details.
Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details.
Automated formatting by clang-format, prettier, and other hooks. See https://pre-commit.ci for details.
|
@copilot resolve the merge conflicts in this pull request |
full rewrite of lighting terrain layers, emat, parallax, terrain variation.
Done as a wholistic rewrite so that each file can reuse the same helpers and systems to reduce line count and increase perf
Summary by CodeRabbit
New Features
Refactor
Documentation