diff options
| author | yum <yum.food.vr@gmail.com> | 2025-11-04 18:03:09 -0800 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-11-04 18:03:09 -0800 |
| commit | ac78ce59232f698dfd721b0048336cd346612613 (patch) | |
| tree | b5399380d9aaff85353dd07185bfbfd417ba396f /ray_marching.cginc | |
| parent | c9324a804c15cf3db403833e67935762eb45cb80 (diff) | |
domain repetition now offsets correctly for even counts
Diffstat (limited to 'ray_marching.cginc')
| -rw-r--r-- | ray_marching.cginc | 29 |
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); } |
