@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; }
/** @author Immortius */ @API public final class ChunkConstants { public static final int SIZE_X = 32; public static final int SIZE_Y = 64; public static final int SIZE_Z = 32; public static final int INNER_CHUNK_POS_FILTER_X = TeraMath.ceilPowerOfTwo(SIZE_X) - 1; public static final int INNER_CHUNK_POS_FILTER_Y = TeraMath.ceilPowerOfTwo(SIZE_Y) - 1; public static final int INNER_CHUNK_POS_FILTER_Z = TeraMath.ceilPowerOfTwo(SIZE_Z) - 1; public static final int POWER_X = TeraMath.sizeOfPower(SIZE_X); public static final int POWER_Y = TeraMath.sizeOfPower(SIZE_Y); public static final int POWER_Z = TeraMath.sizeOfPower(SIZE_Z); public static final byte MAX_LIGHT = 0x0f; public static final byte MAX_SUNLIGHT = 0x0f; public static final byte MAX_SUNLIGHT_REGEN = 63; public static final byte SUNLIGHT_REGEN_THRESHOLD = 48; public static final Vector3i CHUNK_POWER = new Vector3i(POWER_X, POWER_Y, POWER_Z); public static final Vector3i CHUNK_SIZE = new Vector3i(SIZE_X, SIZE_Y, SIZE_Z); public static final Vector3i INNER_CHUNK_POS_FILTER = new Vector3i(INNER_CHUNK_POS_FILTER_X, INNER_CHUNK_POS_FILTER_Y, INNER_CHUNK_POS_FILTER_Z); public static final Region3i CHUNK_REGION = Region3i.createFromMinAndSize(Vector3i.zero(), CHUNK_SIZE); public static final Vector3i LOCAL_REGION_EXTENTS = new Vector3i(1, 1, 1); private ChunkConstants() {} }
@Test public void borderCalculation() { WorldBuilder worldBuilder = new WorldBuilder(12L); 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()); }
@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 boolean makeChunkAvailable(final ReadyChunkInfo readyChunkInfo) { final Chunk chunk = nearCache.get(readyChunkInfo.getPos()); if (chunk == null) { return false; } for (Vector3i pos : Region3i.createFromCenterExtents(readyChunkInfo.getPos(), 1)) { if (nearCache.get(pos) == null) { return false; } } lightMerger.beginMerge(chunk, readyChunkInfo); return true; }
private ChunkViewCore createWorldView(Region3i region, Vector3i offset) { Chunk[] chunks = new Chunk[region.sizeX() * region.sizeY() * region.sizeZ()]; for (Vector3i chunkPos : region) { Chunk chunk = nearCache.get(chunkPos); if (chunk == null || !chunk.isReady()) { return null; } chunkPos.sub(region.minX(), region.minY(), region.minZ()); int index = TeraMath.calculate3DArrayIndex(chunkPos, region.size()); chunks[index] = chunk; } return new ChunkViewCoreImpl( chunks, region, offset, blockManager.getBlock(BlockManager.AIR_ID)); }
@Override public ChunkViewCore getSubviewAroundBlock(Vector3i blockPos, int extent) { Region3i region = ChunkMath.getChunkRegionAroundWorldPos(blockPos, extent); return createWorldView(region, new Vector3i(-region.min().x, -region.min().y, -region.min().z)); }