public static Iterable<Vector3i> iterate(final Vector3i origin, final int distance, final int startDistance) { return () -> new Diamond3iIterator(origin, distance, startDistance); }
@Test public void testThreeDistanceOnlyIteration() { Set<Vector3i> iter = Sets.newHashSet(Diamond3iIterator.iterateAtDistance(new Vector3i(), 3)); assertEquals(38, iter.size()); for (Vector3i pos : iter) { assertTrue(pos.gridDistance(new Vector3i()) == 3); } } }
@Test public void testZeroDistanceIteration() { Iterator<Vector3i> iter = Diamond3iIterator.iterate(Vector3i.zero(), 0).iterator(); assertEquals(Lists.newArrayList(Vector3i.zero()), Lists.newArrayList(iter)); }
@Test public void testAddAdjacentLights() { StubPropagatorWorldView worldView = new StubPropagatorWorldView(testingRegion, air); worldView.setBlockAt(new Vector3i(1, 0, 0), mediumLight); worldView.setBlockAt(new Vector3i(0, 0, 0), mediumLight); BatchPropagator propagator = new StandardBatchPropagator(lightRules, worldView); propagator.process(new BlockChange(new Vector3i(1, 0, 0), air, mediumLight), new BlockChange(new Vector3i(0, 0, 0), air, mediumLight)); for (int i = 0; i < fullLight.getLuminance() + 1; ++i) { for (Vector3i pos : Diamond3iIterator.iterateAtDistance(Vector3i.zero(), i)) { int dist = Math.min(Vector3i.zero().gridDistance(pos), new Vector3i(1, 0, 0).gridDistance(pos)); byte expectedLuminance = (byte) Math.max(mediumLight.getLuminance() - dist, 0); assertEquals(expectedLuminance, worldView.getValueAt(pos)); } } }
@Test public void testTwoDistanceIteration() { Set<Vector3i> iter = Sets.newHashSet(Diamond3iIterator.iterate(Vector3i.zero(), 2)); assertEquals(25, iter.size()); for (Vector3i pos : iter) { assertTrue(pos.gridDistance(new Vector3i()) <= 2); } }
@Test public void testRemoveOverlappingLight() { Vector3i lightPos = new Vector3i(5, 0, 0); StubPropagatorWorldView worldView = new StubPropagatorWorldView(testingRegion, air); worldView.setBlockAt(Vector3i.zero(), fullLight); worldView.setBlockAt(lightPos, fullLight); BatchPropagator propagator = new StandardBatchPropagator(lightRules, worldView); propagator.process(new BlockChange(Vector3i.zero(), air, fullLight), new BlockChange(lightPos, air, fullLight)); worldView.setBlockAt(lightPos, air); propagator.process(new BlockChange(lightPos, fullLight, air)); for (int i = 0; i < 16; ++i) { byte expectedLuminance = (byte) Math.max(0, fullLight.getLuminance() - i); for (Vector3i pos : Diamond3iIterator.iterateAtDistance(Vector3i.zero(), i)) { assertEquals(expectedLuminance, worldView.getValueAt(pos)); } } }
@Test public void testOneDistanceIteration() { Iterator<Vector3i> iter = Diamond3iIterator.iterate(Vector3i.zero(), 1).iterator(); Set<Vector3i> expected = Sets.newHashSet(Vector3i.zero(), new Vector3i(1, 0, 0), new Vector3i(-1, 0, 0), new Vector3i(0, 1, 0), new Vector3i(0, -1, 0), new Vector3i(0, 0, 1), new Vector3i(0, 0, -1)); while (iter.hasNext()) { Vector3i next = iter.next(); assertTrue("Received Unexpected: " + next, expected.remove(next)); } assertTrue("Missing: " + expected, expected.isEmpty()); }
public static Iterable<Vector3i> iterateAtDistance(final Vector3i origin, final int distance) { return () -> new Diamond3iIterator(origin, distance, distance - 1); }
@Test public void testAddLightInLight() { StubPropagatorWorldView worldView = new StubPropagatorWorldView(testingRegion, air); worldView.setBlockAt(new Vector3i(2, 0, 0), mediumLight); BatchPropagator propagator = new StandardBatchPropagator(lightRules, worldView); propagator.process(new BlockChange(new Vector3i(2, 0, 0), air, mediumLight)); worldView.setBlockAt(Vector3i.zero(), fullLight); propagator.process(new BlockChange(Vector3i.zero(), air, fullLight)); for (int i = 0; i < fullLight.getLuminance() + 1; ++i) { byte expectedLuminance = (byte) Math.max(0, fullLight.getLuminance() - i); for (Vector3i pos : Diamond3iIterator.iterateAtDistance(Vector3i.zero(), i)) { assertEquals(expectedLuminance, worldView.getValueAt(pos)); } } }
public static Iterable<Vector3i> iterate(final Vector3i origin, final int distance) { return () -> new Diamond3iIterator(origin, distance); }
@Test public void testRemoveLightOverlappingAtEdge() { Vector3i lightPos = new Vector3i(2, 0, 0); StubPropagatorWorldView worldView = new StubPropagatorWorldView(testingRegion, air); worldView.setBlockAt(Vector3i.zero(), weakLight); worldView.setBlockAt(lightPos, weakLight); BatchPropagator propagator = new StandardBatchPropagator(lightRules, worldView); propagator.process(new BlockChange(Vector3i.zero(), air, weakLight), new BlockChange(lightPos, air, weakLight)); worldView.setBlockAt(lightPos, air); propagator.process(new BlockChange(lightPos, weakLight, air)); for (int i = 0; i < weakLight.getLuminance() + 1; ++i) { byte expectedLuminance = (byte) Math.max(0, weakLight.getLuminance() - i); for (Vector3i pos : Diamond3iIterator.iterateAtDistance(Vector3i.zero(), i)) { assertEquals(expectedLuminance, worldView.getValueAt(pos)); } } }
@Test public void testReduceLight() { StubPropagatorWorldView worldView = new StubPropagatorWorldView(testingRegion, air); worldView.setBlockAt(Vector3i.zero(), fullLight); BatchPropagator propagator = new StandardBatchPropagator(lightRules, worldView); propagator.process(new BlockChange(Vector3i.zero(), air, fullLight)); worldView.setBlockAt(Vector3i.zero(), weakLight); propagator.process(new BlockChange(Vector3i.zero(), fullLight, weakLight)); assertEquals(weakLight.getLuminance(), worldView.getValueAt(Vector3i.zero())); for (int i = 1; i < 15; ++i) { byte expectedLuminance = (byte) Math.max(0, weakLight.getLuminance() - i); for (Vector3i pos : Diamond3iIterator.iterateAtDistance(Vector3i.zero(), i)) { assertEquals(expectedLuminance, worldView.getValueAt(pos)); } } }
@Test public void testLightPropagation() { Chunk chunk = new ChunkImpl(0, 0, 0, blockManager, biomeManager, extraDataManager); chunk.setBlock(16, 32, 16, fullLight); InternalLightProcessor.generateInternalLighting(chunk); assertEquals(fullLight.getLuminance(), chunk.getLight(16, 32, 16)); assertEquals(fullLight.getLuminance() - 1, chunk.getLight(new Vector3i(16, 33, 16))); for (int i = 1; i < fullLight.getLuminance(); ++i) { for (Vector3i pos : Diamond3iIterator.iterateAtDistance(new Vector3i(16, 32, 16), i)) { assertEquals(fullLight.getLuminance() - i, chunk.getLight(pos)); } } }
@Test public void testRemoveLightInVacuum() { StubPropagatorWorldView worldView = new StubPropagatorWorldView(testingRegion, air); worldView.setBlockAt(Vector3i.zero(), fullLight); BatchPropagator propagator = new StandardBatchPropagator(lightRules, worldView); propagator.process(new BlockChange(Vector3i.zero(), air, fullLight)); worldView.setBlockAt(Vector3i.zero(), air); propagator.process(new BlockChange(Vector3i.zero(), fullLight, air)); assertEquals(0, worldView.getValueAt(Vector3i.zero())); for (int i = 1; i < fullLight.getLuminance(); ++i) { for (Vector3i pos : Diamond3iIterator.iterateAtDistance(Vector3i.zero(), i)) { assertEquals(0, worldView.getValueAt(pos)); } } }
@Test public void testAddLightInVacuum() { StubPropagatorWorldView worldView = new StubPropagatorWorldView(testingRegion, air); worldView.setBlockAt(Vector3i.zero(), fullLight); BatchPropagator propagator = new StandardBatchPropagator(lightRules, worldView); propagator.process(new BlockChange(Vector3i.zero(), air, fullLight)); assertEquals(fullLight.getLuminance(), worldView.getValueAt(Vector3i.zero())); assertEquals(fullLight.getLuminance() - 1, worldView.getValueAt(new Vector3i(0, 1, 0))); assertEquals(fullLight.getLuminance() - 14, worldView.getValueAt(new Vector3i(0, 14, 0))); for (int i = 1; i < fullLight.getLuminance(); ++i) { for (Vector3i pos : Diamond3iIterator.iterateAtDistance(Vector3i.zero(), i)) { assertEquals(fullLight.getLuminance() - i, worldView.getValueAt(pos)); } } }
@Test public void testRemoveAdjacentLights() { StubPropagatorWorldView worldView = new StubPropagatorWorldView(testingRegion, air); worldView.setBlockAt(new Vector3i(1, 0, 0), mediumLight); worldView.setBlockAt(new Vector3i(0, 0, 0), mediumLight); BatchPropagator propagator = new StandardBatchPropagator(lightRules, worldView); propagator.process(new BlockChange(new Vector3i(1, 0, 0), air, mediumLight), new BlockChange(new Vector3i(0, 0, 0), air, mediumLight)); worldView.setBlockAt(new Vector3i(1, 0, 0), air); worldView.setBlockAt(new Vector3i(0, 0, 0), air); propagator.process(new BlockChange(new Vector3i(1, 0, 0), mediumLight, air), new BlockChange(new Vector3i(0, 0, 0), mediumLight, air)); for (int i = 0; i < fullLight.getLuminance() + 1; ++i) { byte expectedLuminance = (byte) 0; for (Vector3i pos : Diamond3iIterator.iterateAtDistance(Vector3i.zero(), i)) { assertEquals(expectedLuminance, worldView.getValueAt(pos)); } } }
@Test public void testRemoveSolidAndLight() { StubPropagatorWorldView worldView = new StubPropagatorWorldView(testingRegion, air); for (Vector3i pos : Region3i.createFromCenterExtents(new Vector3i(1, 0, 0), new Vector3i(0, 30, 30))) { worldView.setBlockAt(pos, solid); } worldView.setBlockAt(new Vector3i(0, 0, 0), fullLight); BatchPropagator propagator = new StandardBatchPropagator(lightRules, worldView); propagator.process(new BlockChange(new Vector3i(0, 0, 0), air, fullLight)); assertEquals(0, worldView.getValueAt(new Vector3i(1, 0, 0))); worldView.setBlockAt(new Vector3i(1, 0, 0), air); worldView.setBlockAt(new Vector3i(0, 0, 0), air); propagator.process(new BlockChange(new Vector3i(1, 0, 0), solid, air), new BlockChange(new Vector3i(0, 0, 0), fullLight, air)); for (int i = 0; i < fullLight.getLuminance() + 1; ++i) { byte expectedLuminance = (byte) 0; for (Vector3i pos : Diamond3iIterator.iterateAtDistance(Vector3i.zero(), i)) { assertEquals(expectedLuminance, worldView.getValueAt(pos)); } } }