From 33638eadd70d66636c7ece45c27f4d6e7dab1344 Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Sat, 15 Aug 2026 13:21:11 -0400 Subject: [PATCH] height-bound samples --- .../art/arcane/iris/engine/IrisComplex.java | 4 ++ .../IrisComplexGridBoundsCacheTest.java | 37 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/core/src/main/java/art/arcane/iris/engine/IrisComplex.java b/core/src/main/java/art/arcane/iris/engine/IrisComplex.java index 89dbd0156..028022c06 100644 --- a/core/src/main/java/art/arcane/iris/engine/IrisComplex.java +++ b/core/src/main/java/art/arcane/iris/engine/IrisComplex.java @@ -426,6 +426,10 @@ public class IrisComplex implements DataProvider { double fz = (z - gz) / grid; long b00 = cornerBounds(cache, engine, interpolator, interpolatorIndex, generators, gx, gz); + if (fx == 0D && fz == 0D) { + return new NoiseBounds(boundsLow(b00), boundsHigh(b00)); + } + long b10 = cornerBounds(cache, engine, interpolator, interpolatorIndex, generators, gx + grid, gz); long b01 = cornerBounds(cache, engine, interpolator, interpolatorIndex, generators, gx, gz + grid); long b11 = cornerBounds(cache, engine, interpolator, interpolatorIndex, generators, gx + grid, gz + grid); diff --git a/core/src/test/java/art/arcane/iris/engine/IrisComplexGridBoundsCacheTest.java b/core/src/test/java/art/arcane/iris/engine/IrisComplexGridBoundsCacheTest.java index 8083f72f3..a97aeda8b 100644 --- a/core/src/test/java/art/arcane/iris/engine/IrisComplexGridBoundsCacheTest.java +++ b/core/src/test/java/art/arcane/iris/engine/IrisComplexGridBoundsCacheTest.java @@ -48,6 +48,19 @@ public class IrisComplexGridBoundsCacheTest { assertEquals(1, interpolator.getInvocations()); } + @Test + public void alignedGridSampleUsesOnlyTheContributingCorner() throws Exception { + IrisComplex complex = createComplex(); + Method gridSampleBounds = gridSampleBoundsMethod(); + CountingInterpolator interpolator = new CountingInterpolator(3.5D, 7.25D); + + NoiseBounds bounds = invokeGridSampleBounds(complex, gridSampleBounds, interpolator, 64D, -32D); + + assertEquals(3.5F, bounds.min(), 0D); + assertEquals(7.25F, bounds.max(), 0D); + assertEquals(1, interpolator.getInvocations()); + } + private IrisComplex createComplex() throws Exception { IrisComplex complex = mock(IrisComplex.class, CALLS_REAL_METHODS); @@ -89,6 +102,20 @@ public class IrisComplexGridBoundsCacheTest { return method; } + private Method gridSampleBoundsMethod() throws Exception { + Method method = IrisComplex.class.getDeclaredMethod( + "gridSampleBounds", + Engine.class, + IrisInterpolator.class, + int.class, + IrisGenerator[].class, + double.class, + double.class + ); + method.setAccessible(true); + return method; + } + private long invokeCornerBounds(IrisComplex complex, Method method, IrisInterpolator interpolator, int x, int z) throws Exception { Field gridBoundsCache = IrisComplex.class.getDeclaredField("gridBoundsCache"); gridBoundsCache.setAccessible(true); @@ -96,6 +123,16 @@ public class IrisComplexGridBoundsCacheTest { return (long) method.invoke(complex, cache.get(), null, interpolator, 0, new IrisGenerator[0], x, z); } + private NoiseBounds invokeGridSampleBounds( + IrisComplex complex, + Method method, + IrisInterpolator interpolator, + double x, + double z + ) throws Exception { + return (NoiseBounds) method.invoke(complex, null, interpolator, 0, new IrisGenerator[0], x, z); + } + private float unpackLow(long packed) { return Float.intBitsToFloat((int) (packed >>> 32)); }