/** * @param center the center of the circle-shaped plateau * @param targetHeight the height level of the plateau * @param innerRadius the radius of the flat plateau * @param outerRadius the radius of the affected (smoothened) area */ public PlateauProvider(BaseVector2i center, float targetHeight, float innerRadius, float outerRadius) { Preconditions.checkArgument(innerRadius >= 0, "innerRadius must be >= 0"); Preconditions.checkArgument(outerRadius > innerRadius, "outerRadius must be larger than innerRadius"); this.centerPos = ImmutableVector2i.createOrUse(center); this.targetHeight = targetHeight; this.innerRadius = innerRadius; this.outerRadius = outerRadius; }
private Texture generateTexture(ResourceUrn urn) { ByteBuffer buffer = ByteBuffer.allocateDirect(size.x() * size.y() * Integer.BYTES); ByteBuffer[] mipmaps = new ByteBuffer[]{buffer}; TextureData data = new TextureData(size.x(), size.y(), mipmaps, Texture.WrapMode.CLAMP, Texture.FilterMode.NEAREST); return Assets.generateAsset(urn, data, Texture.class); }
private Region createRegion(ImmutableVector2i chunkPos) { int vertChunks = 4; // 4 chunks high (relevant for trees, etc) int minX = chunkPos.getX() * TILE_SIZE_X; int minZ = chunkPos.getY() * TILE_SIZE_Y; int height = vertChunks * ChunkConstants.SIZE_Y; Region3i area3d = Region3i.createFromMinAndSize(new Vector3i(minX, 0, minZ), new Vector3i(TILE_SIZE_X, height, TILE_SIZE_Y)); World world = worldGenerator.getWorld(); Region region = world.getWorldData(area3d); return region; }
for (int z = tileArea.minY(); z < tileArea.maxY(); z++) { for (int x = tileArea.minX(); x < tileArea.maxX(); x++) { ImmutableVector2i pos = new ImmutableVector2i(x, z); imageFutures.put(pos, threadPool.submit(() -> { Region createRegion = createRegion(pos); ImmutableVector2i pos = new ImmutableVector2i(x, z); try { BufferedImage tileImage = imageFutures.get(pos).get();
@Override protected WorldBuilder createWorld() { int seaLevel = 32; ImmutableVector2i spawnPos = new ImmutableVector2i(0, 0); // as used by the spawner return new WorldBuilder(worldGeneratorPluginLibrary) .setSeaLevel(seaLevel) .addProvider(new SeaLevelProvider(seaLevel)) .addProvider(new PerlinHumidityProvider()) .addProvider(new PerlinSurfaceTemperatureProvider()) .addProvider(new PerlinBaseSurfaceProvider()) .addProvider(new PerlinRiverProvider()) .addProvider(new PerlinOceanProvider()) .addProvider(new PerlinHillsAndMountainsProvider()) .addProvider(new BiomeProvider()) .addProvider(new SurfaceToDensityProvider()) .addProvider(new DefaultFloraProvider()) .addProvider(new DefaultTreeProvider()) .addProvider(new PlateauProvider(spawnPos, seaLevel + 4, 10, 30)) //.addRasterizer(new GroundRasterizer(blockManager)) .addRasterizer(new SolidRasterizer()) .addPlugins() .addRasterizer(new FloraRasterizer()) .addRasterizer(new TreeRasterizer()); } }
@Override public void bindFrame() { vp = BufferUtils.createIntBuffer(16); GL11.glGetInteger(GL11.GL_VIEWPORT, vp); GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frame); GL11.glViewport(0, 0, size.x(), size.y()); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, size.x(), size.y(), 0, 0, 2048f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } }
public LwjglFrameBufferObject(ResourceUrn urn, BaseVector2i size) { this.size = ImmutableVector2i.createOrUse(size); IntBuffer fboId = BufferUtils.createIntBuffer(1); GL30.glGenFramebuffers(fboId); frame = fboId.get(0); Texture texture = generateTexture(urn); GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frame); GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture.getId(), 0); int result = GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER); if (result != GL30.GL_FRAMEBUFFER_COMPLETE) { throw new IllegalStateException("Something went wrong with framebuffer! " + result); } GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); }
@Override public void process(GeneratingRegion region) { Region3i reg = region.getRegion(); Rect2i rc = Rect2i.createFromMinAndMax(reg.minX(), reg.minZ(), reg.maxX(), reg.maxZ()); if (rc.distanceSquared(centerPos.x(), centerPos.y()) <= outerRadius * outerRadius) { SurfaceHeightFacet facet = region.getRegionFacet(SurfaceHeightFacet.class); // update the surface height for (BaseVector2i pos : facet.getWorldRegion().contents()) { float originalValue = facet.getWorld(pos); int distSq = pos.distanceSquared(centerPos); if (distSq <= innerRadius * innerRadius) { facet.setWorld(pos, targetHeight); } else if (distSq <= outerRadius * outerRadius) { double dist = pos.distance(centerPos) - innerRadius; float norm = (float) dist / (outerRadius - innerRadius); facet.setWorld(pos, TeraMath.lerp(targetHeight, originalValue, norm)); } } } } }