summaryrefslogtreecommitdiffstats
path: root/ray_marching.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-11-04 18:03:09 -0800
committeryum <yum.food.vr@gmail.com>2025-11-04 18:03:09 -0800
commitac78ce59232f698dfd721b0048336cd346612613 (patch)
treeb5399380d9aaff85353dd07185bfbfd417ba396f /ray_marching.cginc
parentc9324a804c15cf3db403833e67935762eb45cb80 (diff)
domain repetition now offsets correctly for even counts
Diffstat (limited to 'ray_marching.cginc')
-rw-r--r--ray_marching.cginc29
1 files changed, 23 insertions, 6 deletions
diff --git a/ray_marching.cginc b/ray_marching.cginc
index daba713..7b95972 100644
--- a/ray_marching.cginc
+++ b/ray_marching.cginc
@@ -109,15 +109,32 @@ float domain_repeat(inout float3 p) {
float d;
#if defined(_RAY_MARCHING_CART_GRID)
{
- const float3 count = float3(_Ray_Marching_Cart_Grid_Count_X, _Ray_Marching_Cart_Grid_Count_Y, _Ray_Marching_Cart_Grid_Count_Z);
- const float3 span = float3(_Ray_Marching_Cart_Grid_Span_X, _Ray_Marching_Cart_Grid_Span_Y, _Ray_Marching_Cart_Grid_Span_Z);
+ const float3 count = float3(
+ _Ray_Marching_Cart_Grid_Count_X,
+ _Ray_Marching_Cart_Grid_Count_Y,
+ _Ray_Marching_Cart_Grid_Count_Z);
+ const float3 span = float3(
+ _Ray_Marching_Cart_Grid_Span_X,
+ _Ray_Marching_Cart_Grid_Span_Y,
+ _Ray_Marching_Cart_Grid_Span_Z) * 2.0f;
const float3 period = span / count;
- float3 half_period = period*0.5f;
- float3 which = floor((p + half_period) / period);
- if (any(abs(which) > count/2)) {
+ const float3 half_period = period * 0.5f;
+ // count = 2
+ // which = 0 -> ok
+ // which = 1 -> ok
+ // which = -1 -> not ok
+ const float3 max_allowed = count / 2;
+ const float3 min_allowed = -count / 2 + 0.5;
+ const float3 offset = float3(
+ count.x % 2 == 0 ? half_period.x : 0,
+ count.y % 2 == 0 ? half_period.y : 0,
+ count.z % 2 == 0 ? half_period.z : 0);
+ const float3 shifted = p + offset;
+ float3 which = floor((shifted + half_period) / period);
+ if (any(which > max_allowed || which < min_allowed)) {
p = 1e6;
} else {
- p = glsl_mod(p + half_period, period) - half_period;
+ p = glsl_mod(shifted + half_period, period) - half_period;
}
d = map(p);
}