Search in sources :

Example 1 with TreeFacet

use of org.terasology.core.world.generator.facets.TreeFacet in project Terasology by MovingBlocks.

the class DefaultTreeProvider method process.

@Override
public void process(GeneratingRegion region) {
    SurfaceHeightFacet surface = region.getRegionFacet(SurfaceHeightFacet.class);
    BiomeFacet biome = region.getRegionFacet(BiomeFacet.class);
    List<Predicate<Vector3i>> filters = getFilters(region);
    // these value are derived from the maximum tree extents as
    // computed by the TreeTests class. Birch is the highest with 32
    // and Pine has 13 radius.
    // These values must be identical in the class annotations.
    int maxRad = 13;
    int maxHeight = 32;
    Border3D borderForTreeFacet = region.getBorderForFacet(TreeFacet.class);
    TreeFacet facet = new TreeFacet(region.getRegion(), borderForTreeFacet.extendBy(0, maxHeight, maxRad));
    populateFacet(facet, surface, biome, filters);
    region.setRegionFacet(TreeFacet.class, facet);
}
Also used : SurfaceHeightFacet(org.terasology.world.generation.facets.SurfaceHeightFacet) Border3D(org.terasology.world.generation.Border3D) TreeFacet(org.terasology.core.world.generator.facets.TreeFacet) BiomeFacet(org.terasology.core.world.generator.facets.BiomeFacet) Predicate(com.google.common.base.Predicate)

Example 2 with TreeFacet

use of org.terasology.core.world.generator.facets.TreeFacet 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();
}
Also used : Color(java.awt.Color) TreeFacet(org.terasology.core.world.generator.facets.TreeFacet) BaseVector3i(org.terasology.math.geom.BaseVector3i) Graphics2D(java.awt.Graphics2D) TreeGenerator(org.terasology.core.world.generator.trees.TreeGenerator)

Example 3 with TreeFacet

use of org.terasology.core.world.generator.facets.TreeFacet 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(", "));
}
Also used : Color(java.awt.Color) Region(org.terasology.world.generation.Region) Region3i(org.terasology.math.Region3i) BufferedImage(java.awt.image.BufferedImage) TreeGenerator(org.terasology.core.world.generator.trees.TreeGenerator) Set(java.util.Set) RenderingHints(java.awt.RenderingHints) Vector2f(org.terasology.math.geom.Vector2f) CirclePickerAll(org.terasology.world.viewer.picker.CirclePickerAll) Renders(org.terasology.world.viewer.layers.Renders) Function(java.util.function.Function) Collectors(java.util.stream.Collectors) AbstractFacetLayer(org.terasology.world.viewer.layers.AbstractFacetLayer) Stream(java.util.stream.Stream) TreeFacet(org.terasology.core.world.generator.facets.TreeFacet) BaseVector3i(org.terasology.math.geom.BaseVector3i) Graphics2D(java.awt.Graphics2D) Map(java.util.Map) Entry(java.util.Map.Entry) CirclePicker(org.terasology.world.viewer.picker.CirclePicker) ZOrder(org.terasology.world.viewer.layers.ZOrder) CirclePickerAll(org.terasology.world.viewer.picker.CirclePickerAll) TreeFacet(org.terasology.core.world.generator.facets.TreeFacet) TreeGenerator(org.terasology.core.world.generator.trees.TreeGenerator) Entry(java.util.Map.Entry) Vector2f(org.terasology.math.geom.Vector2f) BaseVector3i(org.terasology.math.geom.BaseVector3i) Region3i(org.terasology.math.Region3i)

Example 4 with TreeFacet

use of org.terasology.core.world.generator.facets.TreeFacet in project Terasology by MovingBlocks.

the class TreeRasterizer method generateChunk.

@Override
public void generateChunk(CoreChunk chunk, Region chunkRegion) {
    TreeFacet facet = chunkRegion.getFacet(TreeFacet.class);
    for (Map.Entry<BaseVector3i, TreeGenerator> entry : facet.getRelativeEntries().entrySet()) {
        BaseVector3i pos = entry.getKey();
        TreeGenerator treeGen = entry.getValue();
        int seed = relativeToWorld(facet, pos).hashCode();
        Random random = new FastRandom(seed);
        treeGen.generate(blockManager, chunk, random, pos.x(), pos.y(), pos.z());
    }
}
Also used : FastRandom(org.terasology.utilities.random.FastRandom) Random(org.terasology.utilities.random.Random) TreeFacet(org.terasology.core.world.generator.facets.TreeFacet) BaseVector3i(org.terasology.math.geom.BaseVector3i) FastRandom(org.terasology.utilities.random.FastRandom) Map(java.util.Map) TreeGenerator(org.terasology.core.world.generator.trees.TreeGenerator)

Aggregations

TreeFacet (org.terasology.core.world.generator.facets.TreeFacet)4 TreeGenerator (org.terasology.core.world.generator.trees.TreeGenerator)3 BaseVector3i (org.terasology.math.geom.BaseVector3i)3 Color (java.awt.Color)2 Graphics2D (java.awt.Graphics2D)2 Map (java.util.Map)2 Predicate (com.google.common.base.Predicate)1 RenderingHints (java.awt.RenderingHints)1 BufferedImage (java.awt.image.BufferedImage)1 Entry (java.util.Map.Entry)1 Set (java.util.Set)1 Function (java.util.function.Function)1 Collectors (java.util.stream.Collectors)1 Stream (java.util.stream.Stream)1 BiomeFacet (org.terasology.core.world.generator.facets.BiomeFacet)1 Region3i (org.terasology.math.Region3i)1 Vector2f (org.terasology.math.geom.Vector2f)1 FastRandom (org.terasology.utilities.random.FastRandom)1 Random (org.terasology.utilities.random.Random)1 Border3D (org.terasology.world.generation.Border3D)1