private boolean makeChunkAvailable(final Chunk chunk) { for (Vector3i pos : Region3i.createFromCenterExtents(chunk.getPosition(), 1)) { if (chunkCache.get(pos) == null) { return false; } } lightMerger.beginMerge(chunk, chunk); return true; }
private void reviewRelevantChunks(Vector3i distance) { Vector3i extents = new Vector3i(distance.x / 2, distance.y / 2, distance.z / 2); Region3i retainRegion = Region3i.createFromCenterExtents(center, extents); Iterator<Vector3i> iter = relevantChunks.iterator(); while (iter.hasNext()) { Vector3i pos = iter.next(); if (!retainRegion.encompasses(pos)) { sendChunkIrrelevant(pos); iter.remove(); } } }
private Region3i calculateRenderableRegion(ViewDistance newViewDistance) { Vector3i cameraCoordinates = calcCameraCoordinatesInChunkUnits(); Vector3i renderableRegionSize = newViewDistance.getChunkDistance(); Vector3i renderableRegionExtents = new Vector3i(renderableRegionSize.x / 2, renderableRegionSize.y / 2, renderableRegionSize.z / 2); return Region3i.createFromCenterExtents(cameraCoordinates, renderableRegionExtents); }
@Override public ChunkViewCore getLocalView(Vector3i centerChunkPos) { Region3i region = Region3i.createFromCenterExtents(centerChunkPos, ChunkConstants.LOCAL_REGION_EXTENTS); if (getChunk(centerChunkPos) != null) { return createWorldView(region, Vector3i.one()); } return null; }
@Override public ChunkViewCore getLocalView(Vector3i centerChunkPos) { Region3i region = Region3i.createFromCenterExtents(centerChunkPos, ChunkConstants.LOCAL_REGION_EXTENTS); if (getChunk(centerChunkPos) != null) { return createWorldView(region, Vector3i.one()); } return null; }
private Region3i calculateRegion() { LocationComponent loc = entity.getComponent(LocationComponent.class); if (loc != null) { Vector3i extents = new Vector3i(relevanceDistance.x / 2, relevanceDistance.y / 2, relevanceDistance.z / 2); return Region3i.createFromCenterExtents(ChunkMath.calcChunkPos(loc.getWorldPosition()), extents); } return Region3i.empty(); }
private boolean makeChunkAvailable(final ReadyChunkInfo readyChunkInfo) { final Chunk chunk = chunkCache.get(readyChunkInfo.getPos()); if (chunk == null) { return false; } for (Vector3i pos : Region3i.createFromCenterExtents(readyChunkInfo.getPos(), 1)) { if (chunkCache.get(pos) == null) { return false; } } chunkFinalizer.beginFinalization(chunk, readyChunkInfo); return true; }
@Override public ChunkViewCore getSubviewAroundChunk(Vector3i chunkPos) { Region3i region = Region3i.createFromCenterExtents(chunkPos, ChunkConstants.LOCAL_REGION_EXTENTS); if (getChunk(chunkPos) != null) { return createWorldView(region, new Vector3i(-region.min().x, -region.min().y, -region.min().z)); } return null; }
@Override public ChunkViewCore getSubviewAroundChunk(Vector3i chunkPos) { Region3i region = Region3i.createFromCenterExtents(chunkPos, ChunkConstants.LOCAL_REGION_EXTENTS); if (getChunk(chunkPos) != null) { return createWorldView(region, new Vector3i(-region.min().x, -region.min().y, -region.min().z)); } return null; }
@Test public void testSimpleWorldView() { Chunk chunk = createChunk(0, 0, 0); chunk.setBlock(new Vector3i(0, 0, 0), solidBlock); ChunkViewCore chunkView = new ChunkViewCoreImpl(new Chunk[]{chunk}, Region3i.createFromCenterExtents(Vector3i.zero(), Vector3i.zero()), new Vector3i(), airBlock); assertEquals(solidBlock, chunkView.getBlock(0, 0, 0)); }
@Test public void testOffsetWorldViewBeforeMainChunk() { Chunk chunk = createChunk(0, 0, 0); chunk.setBlock(new Vector3i(ChunkConstants.SIZE_X - 1, 0, ChunkConstants.SIZE_Z - 1), solidBlock); Chunk[] chunks = new Chunk[]{chunk, createChunk(0, 0, -1), createChunk(1, 0, -1), createChunk(-1, 0, 0), createChunk(0, 0, 0), createChunk(1, 0, 0), createChunk(-1, 0, 1), createChunk(0, 0, 1), createChunk(1, 0, 1)}; ChunkViewCore chunkView = new ChunkViewCoreImpl(chunks, Region3i.createFromCenterExtents(new Vector3i(0, 0, 0), new Vector3i(1, 0, 1)), new Vector3i(1, 0, 1), airBlock); assertEquals(solidBlock, chunkView.getBlock(-1, 0, -1)); }
@Test public void testOffsetChunksWorldView() { Chunk chunk = createChunk(1, 0, 1); chunk.setBlock(new Vector3i(0, 0, 0), solidBlock); Chunk[] chunks = new Chunk[]{createChunk(0, 0, 0), createChunk(1, 0, 0), createChunk(2, 0, 0), createChunk(0, 0, 1), chunk, createChunk(2, 0, 1), createChunk(0, 0, 2), createChunk(1, 0, 2), createChunk(2, 0, 2)}; ChunkViewCore chunkView = new ChunkViewCoreImpl(chunks, Region3i.createFromCenterExtents(new Vector3i(1, 0, 1), new Vector3i(1, 0, 1)), new Vector3i(1, 0, 1), airBlock); assertEquals(solidBlock, chunkView.getBlock(0, 0, 0)); }
@Test public void testOffsetWorldView() { Chunk chunk = createChunk(0, 0, 0); chunk.setBlock(new Vector3i(0, 0, 0), solidBlock); Chunk[] chunks = new Chunk[]{createChunk(-1, 0, -1), createChunk(0, 0, -1), createChunk(1, 0, -1), createChunk(-1, 0, 0), chunk, createChunk(1, 0, 0), createChunk(-1, 0, 1), createChunk(0, 0, 1), createChunk(1, 0, 1)}; ChunkViewCore chunkView = new ChunkViewCoreImpl(chunks, Region3i.createFromCenterExtents(new Vector3i(0, 0, 0), new Vector3i(1, 0, 1)), new Vector3i(1, 0, 1), airBlock); assertEquals(solidBlock, chunkView.getBlock(0, 0, 0)); }
@Test public void testOffsetWorldViewAfterMainChunk() { Chunk chunk = createChunk(0, 0, 0); chunk.setBlock(new Vector3i(0, 0, 0), solidBlock); Chunk[] chunks = new Chunk[]{createChunk(-1, 0, -1), createChunk(0, 0, -1), createChunk(1, 0, -1), createChunk(-1, 0, 0), createChunk(0, 0, 0), createChunk(1, 0, 0), createChunk(-1, 0, 1), createChunk(0, 0, 1), chunk}; ChunkViewCore chunkView = new ChunkViewCoreImpl(chunks, Region3i.createFromCenterExtents(new Vector3i(0, 0, 0), new Vector3i(1, 0, 1)), new Vector3i(1, 0, 1), airBlock); assertEquals(solidBlock, chunkView.getBlock(ChunkConstants.SIZE_X, 0, ChunkConstants.SIZE_Z)); }
@Test public void testBorderCalculation() { WorldBuilder worldBuilder = new WorldBuilder(context.get(WorldGeneratorPluginLibrary.class)); worldBuilder.setSeed(12); worldBuilder.addProvider(new Facet1Provider()); worldBuilder.addProvider(new Facet2Provider()); World world = worldBuilder.build(); Region3i regionToGenerate = Region3i.createFromCenterExtents(new Vector3i(), 1); Region regionData = world.getWorldData(regionToGenerate); Facet1 facet1 = regionData.getFacet(Facet1.class); assertEquals(regionToGenerate, facet1.getWorldRegion()); Facet2 facet2 = regionData.getFacet(Facet2.class); assertEquals(Region3i.createFromMinAndSize(new Vector3i(-3, -1, -3), new Vector3i(7, 3, 7)), facet2.getWorldRegion()); }
@Test public void testLocalToWorld() { Chunk chunk = createChunk(1, 0, 1); chunk.setBlock(new Vector3i(0, 0, 0), solidBlock); Chunk[] chunks = new Chunk[]{createChunk(0, 0, 0), createChunk(1, 0, 0), createChunk(2, 0, 0), createChunk(0, 0, 1), chunk, createChunk(2, 0, 1), createChunk(0, 0, 2), createChunk(1, 0, 2), createChunk(2, 0, 2)}; ChunkViewCoreImpl chunkView = new ChunkViewCoreImpl(chunks, Region3i.createFromCenterExtents(new Vector3i(1, 0, 1), new Vector3i(1, 0, 1)), new Vector3i(1, 1, 1), airBlock); assertEquals(new Vector3i(ChunkConstants.SIZE_X, ChunkConstants.SIZE_Y, ChunkConstants.SIZE_Z), chunkView.toWorldPos(Vector3i.zero())); }
@Test public void testRemoveSolidAllowsLight() { 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); propagator.process(new BlockChange(new Vector3i(1, 0, 0), solid, air)); assertEquals(14, worldView.getValueAt(new Vector3i(1, 0, 0))); assertEquals(13, worldView.getValueAt(new Vector3i(2, 0, 0))); }
@Test public void testMultiplePathsBorderCalculation() { WorldBuilder worldBuilder = new WorldBuilder(context.get(WorldGeneratorPluginLibrary.class)); worldBuilder.setSeed(12); worldBuilder.addProvider(new Facet1Provider()); worldBuilder.addProvider(new Facet2Provider()); worldBuilder.addProvider(new Facet4Provider()); World world = worldBuilder.build(); Region3i regionToGenerate = Region3i.createFromCenterExtents(new Vector3i(), 1); Region regionData = world.getWorldData(regionToGenerate); Facet1 facet1 = regionData.getFacet(Facet1.class); assertEquals(regionToGenerate, facet1.getWorldRegion()); Facet4 facet4 = regionData.getFacet(Facet4.class); assertEquals(regionToGenerate, facet4.getWorldRegion()); Facet2 facet2 = regionData.getFacet(Facet2.class); assertEquals(Region3i.createFromMinAndSize(new Vector3i(-4, -1, -4), new Vector3i(9, 3, 9)), facet2.getWorldRegion()); }
@Test public void testCumulativeBorderCalculation() { WorldBuilder worldBuilder = new WorldBuilder(context.get(WorldGeneratorPluginLibrary.class)); worldBuilder.setSeed(12); worldBuilder.addProvider(new Facet1Provider()); worldBuilder.addProvider(new Facet2Provider()); worldBuilder.addProvider(new Facet3Provider()); World world = worldBuilder.build(); Region3i regionToGenerate = Region3i.createFromCenterExtents(new Vector3i(), 1); Region regionData = world.getWorldData(regionToGenerate); Facet3 facet3 = regionData.getFacet(Facet3.class); assertEquals(regionToGenerate, facet3.getWorldRegion()); Facet1 facet1 = regionData.getFacet(Facet1.class); assertEquals(Region3i.createFromMinAndSize(new Vector3i(-2, -1, -2), new Vector3i(5, 3, 5)), facet1.getWorldRegion()); Facet2 facet2 = regionData.getFacet(Facet2.class); assertEquals(Region3i.createFromMinAndSize(new Vector3i(-4, -1, -4), new Vector3i(9, 3, 9)), facet2.getWorldRegion()); }
@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)); } } }