use of org.terasology.math.geom.BaseVector3i in project Terasology by MovingBlocks.
the class TreeRasterizer method relativeToWorld.
// TODO: JAVA8 - move the two conversion methods from SparseFacet3D to default methods in WorldFacet3D
protected final Vector3i relativeToWorld(SparseFacet3D facet, BaseVector3i pos) {
Region3i worldRegion = facet.getWorldRegion();
Region3i relativeRegion = facet.getRelativeRegion();
return new Vector3i(pos.x() - relativeRegion.minX() + worldRegion.minX(), pos.y() - relativeRegion.minY() + worldRegion.minY(), pos.z() - relativeRegion.minZ() + worldRegion.minZ());
}
use of org.terasology.math.geom.BaseVector3i in project Terasology by MovingBlocks.
the class FloraFacetLayer method getWorldText.
@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-";
}
use of org.terasology.math.geom.BaseVector3i in project Terasology by MovingBlocks.
the class TreeFacetLayer method render.
@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();
}
use of org.terasology.math.geom.BaseVector3i in project Terasology by MovingBlocks.
the class TreeFacetLayer method getWorldText.
@Override
public String getWorldText(Region region, int wx, int wy) {
TreeFacet treeFacet = region.getFacet(TreeFacet.class);
Region3i worldRegion = treeFacet.getWorldRegion();
Region3i relativeRegion = treeFacet.getRelativeRegion();
int rx = wx - worldRegion.minX() + relativeRegion.minX();
int rz = wy - worldRegion.minZ() + relativeRegion.minZ();
Vector2f relCursor = new Vector2f(rx, rz);
CirclePicker<TreeGenerator> picker = new CirclePickerAll<>(relCursor, radiusFunc);
for (Entry<BaseVector3i, TreeGenerator> entry : treeFacet.getRelativeEntries().entrySet()) {
TreeGenerator treeGen = entry.getValue();
BaseVector3i treePos = entry.getKey();
picker.offer(treePos.getX(), treePos.getZ(), treeGen);
}
Set<TreeGenerator> picked = picker.getAll();
// try to exit early first
if (picked.isEmpty()) {
return null;
}
if (picked.size() == 1) {
TreeGenerator first = picked.iterator().next();
return labelFunc.apply(first);
}
// convert to a stream of labels
Stream<String> labels = picked.stream().map(labelFunc);
// collect identical String elements and collect the count in a map
Map<String, Long> counters = labels.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// define a mapping from a map entry to a String representation
// TODO: treat 1x occurrences like above (e.g. Tree instead of 1x Tree)
Function<Entry<String, Long>, String> toStringFunc = e -> String.format("%dx %s", e.getValue(), e.getKey());
// apply that mapping and join the Strings with a comma
return counters.entrySet().stream().map(toStringFunc).collect(Collectors.joining(", "));
}
use of org.terasology.math.geom.BaseVector3i in project Terasology by MovingBlocks.
the class SparseObjectFacet3D method getWorldEntries.
/**
* @return a <b>new</b> map with world-based position entries
*/
public Map<BaseVector3i, T> getWorldEntries() {
Map<BaseVector3i, T> result = Maps.newLinkedHashMap();
for (Entry<BaseVector3i, T> entry : relData.entrySet()) {
BaseVector3i relPos = entry.getKey();
BaseVector3i worldPos = relativeToWorld(relPos.x(), relPos.y(), relPos.z());
result.put(worldPos, entry.getValue());
}
return result;
}
Aggregations