/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.pepsoft.worldpainter.layers.trees; import java.util.Random; import org.pepsoft.minecraft.Material; import org.pepsoft.util.MathUtils; import org.pepsoft.worldpainter.Dimension; import org.pepsoft.worldpainter.exporting.MinecraftWorld; /** * * @author pepijn */ public abstract class DeciduousTree extends TreeType { protected DeciduousTree(Material trunkMaterial, Material leafMaterial) { super(trunkMaterial, leafMaterial); } @Override public void renderTree(int blockInWorldX, int blockInWorldY, int height, int strength, MinecraftWorld minecraftWorld, Dimension dimension, Random random) { int size = Math.min(2 + strength / 3, 5) + random.nextInt(3); if ((height + size) >= minecraftWorld.getMaxHeight()) { // Tree won't fit under the sky return; } renderTrunk(blockInWorldX, blockInWorldY, height, size, minecraftWorld); renderCanopy(blockInWorldX, blockInWorldY, height, size, minecraftWorld, random); } protected void renderCanopy(int blockInWorldX, int blockInWorldY, int height, int size, MinecraftWorld minecraftWorld, Random random) { int r = Math.max(1, Math.min(size / 2 + 1, 4)); int maxZ = minecraftWorld.getMaxHeight() - 1; for (int z = 0; z <= size + r; z++) { if (height + z > maxZ) { break; } float distance = Math.abs(z - size - 1); if (z > size) { maybePlaceLeaves(blockInWorldX, blockInWorldY, height + z, r, distance, minecraftWorld, random); } int maxDistance = Math.min(4 - Math.abs(z - size), r); for (int d = 1; d <= maxDistance; d++) { for (int i = 0; i < d; i++) { distance = MathUtils.getDistance(d - i, i, z - size - 1); maybePlaceLeaves(blockInWorldX - d + i, blockInWorldY - i, height + z, r, distance, minecraftWorld, random); maybePlaceLeaves(blockInWorldX + i, blockInWorldY - d + i, height + z, r, distance, minecraftWorld, random); maybePlaceLeaves(blockInWorldX + d - i, blockInWorldY + i, height + z, r, distance, minecraftWorld, random); maybePlaceLeaves(blockInWorldX - i, blockInWorldY + d - i, height + z, r, distance, minecraftWorld, random); } } } } private static final long serialVersionUID = 1L; }