/** * Create a region with center point and x,y,z coordinate extents size * @param center the center point of region * @param extents the extents size of each side of region * @return a new region base on the center point and extents size */ public static Region3i createFromCenterExtents(BaseVector3i center, BaseVector3i extents) { Vector3i min = new Vector3i(center.x() - extents.x(), center.y() - extents.y(), center.z() - extents.z()); Vector3i max = new Vector3i(center.x() + extents.x(), center.y() + extents.y(), center.z() + extents.z()); return createFromMinMax(min, max); }
@Override public void render(BufferedImage img, Region region) { TreeFacet treeFacet = region.getFacet(TreeFacet.class); Graphics2D g = img.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); for (Entry<BaseVector3i, TreeGenerator> entry : treeFacet.getRelativeEntries().entrySet()) { TreeGenerator treeGen = entry.getValue(); int wx = entry.getKey().getX(); int wz = entry.getKey().getZ(); int r = radiusFunc.apply(treeGen); Color color = colorFunc.apply(treeGen); // the fill area is offset by +1/+1 pixel // otherwise it will bleed out at the top left corner g.setColor(color); g.fillOval(wx - r + 1, wz - r + 1, r * 2 - 1, r * 2 - 1); g.setColor(color.darker()); g.drawOval(wx - r, wz - r, r * 2, r * 2); } g.dispose(); }
@Override public void render(BufferedImage img, Region region) { FloraFacet treeFacet = region.getFacet(FloraFacet.class); Graphics2D g = img.createGraphics(); int width = img.getWidth(); ColorModel colorModel = img.getColorModel(); ColorBlender blender = ColorBlenders.forColorModel(ColorModels.RGBA, colorModel); DataBufferInt dataBuffer = (DataBufferInt) img.getRaster().getDataBuffer(); for (Entry<BaseVector3i, FloraType> entry : treeFacet.getRelativeEntries().entrySet()) { FloraType treeGen = entry.getValue(); int wx = entry.getKey().getX(); int wz = entry.getKey().getZ(); Color color = colorFunc.apply(treeGen); int src = color.rgba(); int dst = dataBuffer.getElem(wz * width + wx); int mix = blender.blend(src, dst); dataBuffer.setElem(wz * width + wx, mix); } g.dispose(); }
@Override public String getWorldText(Region region, int wx, int wy) { FloraFacet floraFacet = region.getFacet(FloraFacet.class); Region3i worldRegion = floraFacet.getWorldRegion(); Region3i relativeRegion = floraFacet.getRelativeRegion(); int rx = wx - worldRegion.minX() + relativeRegion.minX(); int rz = wy - worldRegion.minZ() + relativeRegion.minZ(); for (Entry<BaseVector3i, FloraType> entry : floraFacet.getRelativeEntries().entrySet()) { BaseVector3i treePos = entry.getKey(); if (treePos.getX() == rx && treePos.getZ() == rz) { FloraType flora = entry.getValue(); return labelFunc.apply(flora); } } return "-no vegetation-"; }