use of org.terasology.utilities.collection.CharSequenceIterator in project Terasology by MovingBlocks.
the class TreeGeneratorLSystem method generate.
@Override
public void generate(BlockManager blockManager, CoreChunk view, Random rand, int posX, int posY, int posZ) {
Vector3f position = new Vector3f(0f, 0f, 0f);
Matrix4f rotation = new Matrix4f(new Quat4f(new Vector3f(0f, 0f, 1f), (float) Math.PI / 2f), Vector3f.ZERO, 1.0f);
float angleOffset = rand.nextFloat(-MAX_ANGLE_OFFSET, MAX_ANGLE_OFFSET);
Block bark = blockManager.getBlock(barkType);
Block leaf = blockManager.getBlock(leafType);
recursiveGenerator.recurse(view, rand, posX, posY, posZ, angleOffset, new CharSequenceIterator(initialAxiom), position, rotation, bark, leaf, 0, this);
}
use of org.terasology.utilities.collection.CharSequenceIterator in project Terasology by MovingBlocks.
the class RecursiveTreeGeneratorLSystem method recurse.
public void recurse(CoreChunk view, Random rand, int posX, int posY, int posZ, float angleOffset, CharSequenceIterator axiomIterator, Vector3f position, Matrix4f rotation, Block bark, Block leaf, int depth, AbstractTreeGenerator treeGenerator) {
Matrix4f tempRotation = new Matrix4f();
while (axiomIterator.hasNext()) {
char c = axiomIterator.nextChar();
switch(c) {
case 'G':
case 'F':
// Tree trunk
treeGenerator.safelySetBlock(view, posX + (int) position.x + 1, posY + (int) position.y, posZ + (int) position.z, bark);
treeGenerator.safelySetBlock(view, posX + (int) position.x - 1, posY + (int) position.y, posZ + (int) position.z, bark);
treeGenerator.safelySetBlock(view, posX + (int) position.x, posY + (int) position.y, posZ + (int) position.z + 1, bark);
treeGenerator.safelySetBlock(view, posX + (int) position.x, posY + (int) position.y, posZ + (int) position.z - 1, bark);
// Generate leaves
if (depth > 1) {
int size = 1;
for (int x = -size; x <= size; x++) {
for (int y = -size; y <= size; y++) {
for (int z = -size; z <= size; z++) {
if (Math.abs(x) == size && Math.abs(y) == size && Math.abs(z) == size) {
continue;
}
treeGenerator.safelySetBlock(view, posX + (int) position.x + x + 1, posY + (int) position.y + y, posZ + z + (int) position.z, leaf);
treeGenerator.safelySetBlock(view, posX + (int) position.x + x - 1, posY + (int) position.y + y, posZ + z + (int) position.z, leaf);
treeGenerator.safelySetBlock(view, posX + (int) position.x + x, posY + (int) position.y + y, posZ + z + (int) position.z + 1, leaf);
treeGenerator.safelySetBlock(view, posX + (int) position.x + x, posY + (int) position.y + y, posZ + z + (int) position.z - 1, leaf);
}
}
}
}
Vector3f dir = new Vector3f(1f, 0f, 0f);
rotation.transformVector(dir);
position.add(dir);
break;
case '[':
recurse(view, rand, posX, posY, posZ, angleOffset, axiomIterator, new Vector3f(position), new Matrix4f(rotation), bark, leaf, depth, treeGenerator);
break;
case ']':
return;
case '+':
tempRotation = new Matrix4f(new Quat4f(new Vector3f(0f, 0f, 1f), angle + angleOffset), Vector3f.ZERO, 1.0f);
rotation.mul(tempRotation);
break;
case '-':
tempRotation = new Matrix4f(new Quat4f(new Vector3f(0f, 0f, -1f), angle + angleOffset), Vector3f.ZERO, 1.0f);
rotation.mul(tempRotation);
break;
case '&':
tempRotation = new Matrix4f(new Quat4f(new Vector3f(0f, 1f, 0f), angle + angleOffset), Vector3f.ZERO, 1.0f);
rotation.mul(tempRotation);
break;
case '^':
tempRotation = new Matrix4f(new Quat4f(new Vector3f(0f, -1f, 0f), angle + angleOffset), Vector3f.ZERO, 1.0f);
rotation.mul(tempRotation);
break;
case '*':
tempRotation = new Matrix4f(new Quat4f(new Vector3f(1f, 0f, 0f), angle), Vector3f.ZERO, 1.0f);
rotation.mul(tempRotation);
break;
case '/':
tempRotation = new Matrix4f(new Quat4f(new Vector3f(-1f, 0f, 0f), angle), Vector3f.ZERO, 1.0f);
rotation.mul(tempRotation);
break;
default:
// If we have already reached the maximum depth, don't ever bother to lookup in the map
if (depth == maxDepth - 1) {
break;
}
LSystemRule rule = ruleSet.get(c);
if (rule == null) {
break;
}
float weightedFailureProbability = TeraMath.pow(1f - rule.getProbability(), maxDepth - depth);
if (rand.nextFloat() < weightedFailureProbability) {
break;
}
recurse(view, rand, posX, posY, posZ, angleOffset, new CharSequenceIterator(rule.getAxiom()), position, rotation, bark, leaf, depth + 1, treeGenerator);
}
}
}
Aggregations