Various minor

Optimize Vector2D
Optimize HeightMap
Optimize biome changes
Reformatting of the MCA classes
This commit is contained in:
Jesse Boyd 2017-03-15 00:42:28 +11:00
parent d052725a7a
commit 54642914e5
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
13 changed files with 207 additions and 124 deletions

View File

@ -8,7 +8,7 @@ import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.util.MainUtil;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.LocalWorld;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.MutableBlockVector2D;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.bukkit.BukkitUtil;
import java.util.ArrayList;
@ -89,12 +89,11 @@ public class BukkitChunk_All extends CharFaweChunk<Chunk, BukkitQueue_All> {
if (biomes != null) {
final LocalWorld lw = BukkitUtil.getLocalWorld(world);
int index = 0;
Vector2D mutable = new Vector2D();
for (int z = 0; z < 16; z++) {
mutable.z = bx + z;
int zz = bx + z;
for (int x = 0; x < 16; x++) {
mutable.x = bz + x;
lw.setBiome(mutable, FaweCache.getBiome(biomes[index++] & 0xFF));
int xx = bz + x;
lw.setBiome(MutableBlockVector2D.get(xx, zz), FaweCache.getBiome(biomes[index++] & 0xFF));
}
}
}

View File

@ -390,6 +390,8 @@ public class MCAChunk extends FaweChunk<Void> {
if (idsLayer == null) {
idsLayer = this.ids[layer] = new byte[4096];
this.data[layer] = new byte[2048];
this.skyLight[layer] = new byte[2048];
this.blockLight[layer] = new byte[2048];
}
int j = FaweCache.CACHE_J[y][z & 15][x & 15];
idsLayer[j] = (byte) id;

View File

@ -263,7 +263,12 @@ public class MCAFile {
return null;
}
FastByteArrayOutputStream baos = new FastByteArrayOutputStream(buffer3);
DeflaterOutputStream deflater = new DeflaterOutputStream(baos, new Deflater(9), 1, true);
// PGZIPOutputStream deflater = new PGZIPOutputStream(baos);
// deflater.setStrategy(Deflater.FILTERED);
Deflater deflate = new Deflater(1);
deflate.setStrategy(Deflater.FILTERED);
DeflaterOutputStream deflater = new DeflaterOutputStream(baos, deflate, 1, true);
fieldBuf5.set(deflater, buffer2);
BufferedOutputStream bos = new BufferedOutputStream(deflater, 1);
fieldBuf6.set(bos, buffer1);
@ -380,7 +385,7 @@ public class MCAFile {
MCAChunk cached = getCachedChunk(cx, cz);
if (cached == null || !cached.isModified()) {
start += size;
written = start;
written = start + size;
continue;
} else {
newBytes = toBytes(cached);
@ -398,26 +403,31 @@ public class MCAFile {
int newSize = (len + 4095) >> 12;
int nextOffset2 = nextOffset;
while (start + len > end) {
int nextLoc = offsetMap.get(nextOffset2);
short nextCXZ = MathMan.unpairX(nextLoc);
int nextCX = MathMan.unpairShortX(nextCXZ);
int nextCZ = MathMan.unpairShortY(nextCXZ);
if (getCachedChunk(nextCX, nextCZ) == null) {
byte[] nextBytes = getChunkCompressedBytes(nextOffset2);
relocate.put(pair, nextBytes);
}
Integer nextLoc = offsetMap.get(nextOffset2);
if (nextLoc != null) {
short nextCXZ = MathMan.unpairX(nextLoc);
int nextCX = MathMan.unpairShortX(nextCXZ);
int nextCZ = MathMan.unpairShortY(nextCXZ);
if (getCachedChunk(nextCX, nextCZ) == null) {
byte[] nextBytes = getChunkCompressedBytes(nextOffset2);
relocate.put(pair, nextBytes);
}
// System.out.println("Relocating " + nextCX + "," + nextCZ);
int nextSize = MathMan.unpairY(nextLoc) << 12;
end += nextSize;
nextOffset2 += nextSize;
int nextSize = MathMan.unpairY(nextLoc) << 12;
end += nextSize;
nextOffset2 += nextSize;
} else {
end = start + len;
break;
}
}
// System.out.println("Writing: " + cx + "," + cz);
writeSafe(start, newBytes);
if (offset != start || end != start + size || oldSize != newSize) {
if (offset != start || end != start + size || oldSize != newSize || true) {
// System.out.println("Header: " + cx + "," + cz + " | " + offset + "," + start + " | " + end + "," + (start + size) + " | " + size + " | " + start);
writeHeader(cx, cz, start >> 12, newSize);
}
written = start + newBytes.length + 6;
written = start + newBytes.length + 5;
start += newSize << 12;
}
raf.setLength(written);

View File

@ -1,6 +1,6 @@
package com.boydti.fawe.object.change;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.MutableBlockVector2D;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.history.UndoContext;
import com.sk89q.worldedit.history.change.Change;
@ -8,29 +8,27 @@ import com.sk89q.worldedit.world.biome.BaseBiome;
public class MutableBiomeChange implements Change {
private Vector2D pos;
private MutableBlockVector2D mutable = new MutableBlockVector2D();
private BaseBiome from;
private BaseBiome to;
public MutableBiomeChange() {
this.from = new BaseBiome(0);
this.to = new BaseBiome(0);
this.pos = new Vector2D();
}
public void setBiome(int x, int z, int from, int to) {
this.pos.x = x;
this.pos.z = z;
mutable.setComponents(x, z);
this.from.setId(from);
this.to.setId(to);
}
@Override
public void undo(UndoContext context) throws WorldEditException {
context.getExtent().setBiome(pos, from);
context.getExtent().setBiome(mutable, from);
}
@Override
public void redo(UndoContext context) throws WorldEditException {
context.getExtent().setBiome(pos, to);
context.getExtent().setBiome(mutable, to);
}
}

View File

@ -1,5 +1,6 @@
package com.boydti.fawe.object.extent;
import com.sk89q.worldedit.MutableBlockVector2D;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.WorldEditException;
@ -9,6 +10,7 @@ import com.sk89q.worldedit.world.biome.BaseBiome;
public class OffsetExtent extends ResettableExtent {
private final int dx, dy, dz;
private MutableBlockVector2D mutable = new MutableBlockVector2D();
public OffsetExtent(Extent parent, int dx, int dy, int dz) {
super(parent);
@ -19,7 +21,7 @@ public class OffsetExtent extends ResettableExtent {
@Override
public boolean setBiome(Vector2D position, BaseBiome biome) {
return super.setBiome(new Vector2D(position.getBlockX() + dx, position.getBlockZ() + dz), biome);
return super.setBiome(mutable.setComponents(position.getBlockX() + dx, position.getBlockZ() + dz), biome);
}
@Override

View File

@ -1,7 +1,7 @@
package com.boydti.fawe.object.pattern;
import com.sk89q.worldedit.MutableBlockVector2D;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.extent.Extent;
@ -10,6 +10,7 @@ import com.sk89q.worldedit.world.biome.BaseBiome;
public class BiomePattern extends ExistingPattern {
private final BaseBiome biome;
private BiomePatternException exception;
private MutableBlockVector2D mutable = new MutableBlockVector2D();
public BiomePattern(Extent extent, BaseBiome biome) {
super(extent);
@ -24,7 +25,7 @@ public class BiomePattern extends ExistingPattern {
@Override
public boolean apply(Extent extent, Vector setPosition, Vector getPosition) throws WorldEditException {
return extent.setBiome(new Vector2D(setPosition.getBlockX(), setPosition.getBlockZ()), biome);
return extent.setBiome(mutable.setComponents(setPosition.getBlockX(), setPosition.getBlockZ()), biome);
}
public class BiomePatternException extends RuntimeException {

View File

@ -3354,11 +3354,12 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting
if (((containsBot2 && containsTop2)) && !containsBot1 && !containsTop1) {
continue;
}
final MutableBlockVector2D mutable = new MutableBlockVector2D();
RunnableVal<Vector2D> r = new RunnableVal<Vector2D>() {
@Override
public void run(Vector2D chunk) {
boolean conNextX = chunks.contains(new Vector2D(cx + 1, cz));
boolean conNextZ = chunks.contains(new Vector2D(cx, cz + 1));
boolean conNextX = chunks.contains(mutable.setComponents(cx + 1, cz));
boolean conNextZ = chunks.contains(mutable.setComponents(cx, cz + 1));
boolean containsAny = false;
if (cuboid && containsBot1 && containsBot2 && containsTop1 && containsTop2 && conNextX && conNextZ) {
containsAny = true;
@ -3393,7 +3394,7 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting
if (!conNextZ) {
setExistingBlocks(new Vector(bx, 0, bz + 16), new Vector(bx + 15, getMaxY(), bz + 31));
}
if (!chunks.contains(new Vector2D(cx + 1, cz + 1)) && !conNextX && !conNextZ) {
if (!chunks.contains(mutable.setComponents(cx + 1, cz + 1)) && !conNextX && !conNextZ) {
setExistingBlocks(new Vector(bx + 16, 0, bz + 16), new Vector(bx + 31, getMaxY(), bz + 31));
}
MutableBlockVector mutable = new MutableBlockVector(0,0,0);

View File

@ -8,7 +8,7 @@ public class MutableBlockVector extends BlockVector {
}
};
public static Vector get(int x, int y, int z) {
public static MutableBlockVector get(int x, int y, int z) {
return MUTABLE_CACHE.get().setComponents(x, y, z);
}
@ -30,10 +30,18 @@ public class MutableBlockVector extends BlockVector {
}
@Override
public Vector setComponents(double x, double y, double z) {
public MutableBlockVector setComponents(double x, double y, double z) {
return this.setComponents((int) x, (int) y, (int) z);
}
@Override
public MutableBlockVector setComponents(int x, int y, int z) {
this.mutX(x);
this.mutY(y);
this.mutZ(z);
return this;
}
@Override
public final void mutX(double x) {
this.x = (int) x;

View File

@ -0,0 +1,67 @@
package com.sk89q.worldedit;
public final class MutableBlockVector2D extends Vector2D {
private static ThreadLocal<MutableBlockVector2D> MUTABLE_CACHE = new ThreadLocal<MutableBlockVector2D>() {
@Override
protected MutableBlockVector2D initialValue() {
return new MutableBlockVector2D();
}
};
public static MutableBlockVector2D get(int x, int z) {
return MUTABLE_CACHE.get().setComponents(x, z);
}
private int x, z;
public MutableBlockVector2D() {
this.x = 0;
this.z = 0;
}
@Override
public double getX() {
return x;
}
@Override
public double getZ() {
return z;
}
@Override
public int getBlockX() {
return x;
}
@Override
public int getBlockZ() {
return z;
}
public MutableBlockVector2D setComponents(int x, int z) {
this.x = x;
this.z = z;
return this;
}
public MutableBlockVector2D setComponents(double x, double z) {
return setComponents((int) x, (int) z);
}
public final void mutX(int x) {
this.x = x;
}
public void mutZ(int z) {
this.z = z;
}
public final void mutX(double x) {
this.x = (int) x;
}
public void mutZ(double z) {
this.z = (int) z;
}
}

View File

@ -30,7 +30,8 @@ public class Vector2D {
public static final Vector2D UNIT_Z = new Vector2D(0, 1);
public static final Vector2D ONE = new Vector2D(1, 1);
public double x, z;
private double x;
private double z;
/**
* Construct an instance.
@ -71,8 +72,8 @@ public class Vector2D {
* @param other the other vector
*/
public Vector2D(Vector2D other) {
this.x = other.x;
this.z = other.z;
this.x = other.getX();
this.z = other.getZ();
}
/**
@ -100,7 +101,7 @@ public class Vector2D {
* @return the x coordinate
*/
public int getBlockX() {
return (int) Math.round(x);
return (int) Math.round(getX());
}
/**
@ -110,7 +111,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D setX(double x) {
return new Vector2D(x, z);
return new Vector2D(x, getZ());
}
/**
@ -120,7 +121,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D setX(int x) {
return new Vector2D(x, z);
return new Vector2D(x, getZ());
}
/**
@ -138,7 +139,7 @@ public class Vector2D {
* @return the z coordinate
*/
public int getBlockZ() {
return (int) Math.round(z);
return (int) Math.round(getZ());
}
/**
@ -148,7 +149,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D setZ(double z) {
return new Vector2D(x, z);
return new Vector2D(getX(), z);
}
/**
@ -158,7 +159,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D setZ(int z) {
return new Vector2D(x, z);
return new Vector2D(getX(), z);
}
/**
@ -168,7 +169,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D add(Vector2D other) {
return new Vector2D(x + other.x, z + other.z);
return new Vector2D(getX() + other.getX(), getZ() + other.getZ());
}
/**
@ -179,7 +180,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D add(double x, double z) {
return new Vector2D(this.x + x, this.z + z);
return new Vector2D(this.getX() + x, this.getZ() + z);
}
/**
@ -190,7 +191,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D add(int x, int z) {
return new Vector2D(this.x + x, this.z + z);
return new Vector2D(this.getX() + x, this.getZ() + z);
}
/**
@ -201,11 +202,11 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D add(Vector2D... others) {
double newX = x, newZ = z;
double newX = getX(), newZ = getZ();
for (Vector2D other : others) {
newX += other.x;
newZ += other.z;
newX += other.getX();
newZ += other.getZ();
}
return new Vector2D(newX, newZ);
@ -219,7 +220,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D subtract(Vector2D other) {
return new Vector2D(x - other.x, z - other.z);
return new Vector2D(getX() - other.getX(), getZ() - other.getZ());
}
/**
@ -231,7 +232,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D subtract(double x, double z) {
return new Vector2D(this.x - x, this.z - z);
return new Vector2D(this.getX() - x, this.getZ() - z);
}
/**
@ -243,7 +244,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D subtract(int x, int z) {
return new Vector2D(this.x - x, this.z - z);
return new Vector2D(this.getX() - x, this.getZ() - z);
}
/**
@ -254,11 +255,11 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D subtract(Vector2D... others) {
double newX = x, newZ = z;
double newX = getX(), newZ = getZ();
for (Vector2D other : others) {
newX -= other.x;
newZ -= other.z;
newX -= other.getX();
newZ -= other.getZ();
}
return new Vector2D(newX, newZ);
@ -271,7 +272,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D multiply(Vector2D other) {
return new Vector2D(x * other.x, z * other.z);
return new Vector2D(getX() * other.getX(), getZ() * other.getZ());
}
/**
@ -282,7 +283,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D multiply(double x, double z) {
return new Vector2D(this.x * x, this.z * z);
return new Vector2D(this.getX() * x, this.getZ() * z);
}
/**
@ -293,7 +294,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D multiply(int x, int z) {
return new Vector2D(this.x * x, this.z * z);
return new Vector2D(this.getX() * x, this.getZ() * z);
}
/**
@ -303,11 +304,11 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D multiply(Vector2D... others) {
double newX = x, newZ = z;
double newX = getX(), newZ = getZ();
for (Vector2D other : others) {
newX *= other.x;
newZ *= other.z;
newX *= other.getX();
newZ *= other.getZ();
}
return new Vector2D(newX, newZ);
@ -320,7 +321,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D multiply(double n) {
return new Vector2D(this.x * n, this.z * n);
return new Vector2D(this.getX() * n, this.getZ() * n);
}
/**
@ -330,7 +331,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D multiply(float n) {
return new Vector2D(this.x * n, this.z * n);
return new Vector2D(this.getX() * n, this.getZ() * n);
}
/**
@ -340,7 +341,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D multiply(int n) {
return new Vector2D(this.x * n, this.z * n);
return new Vector2D(this.getX() * n, this.getZ() * n);
}
/**
@ -350,7 +351,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D divide(Vector2D other) {
return new Vector2D(x / other.x, z / other.z);
return new Vector2D(getX() / other.getX(), getZ() / other.getZ());
}
/**
@ -361,7 +362,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D divide(double x, double z) {
return new Vector2D(this.x / x, this.z / z);
return new Vector2D(this.getX() / x, this.getZ() / z);
}
/**
@ -372,7 +373,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D divide(int x, int z) {
return new Vector2D(this.x / x, this.z / z);
return new Vector2D(this.getX() / x, this.getZ() / z);
}
/**
@ -382,7 +383,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D divide(int n) {
return new Vector2D(x / n, z / n);
return new Vector2D(getX() / n, getZ() / n);
}
/**
@ -392,7 +393,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D divide(double n) {
return new Vector2D(x / n, z / n);
return new Vector2D(getX() / n, getZ() / n);
}
/**
@ -402,7 +403,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D divide(float n) {
return new Vector2D(x / n, z / n);
return new Vector2D(getX() / n, getZ() / n);
}
/**
@ -411,7 +412,7 @@ public class Vector2D {
* @return length
*/
public double length() {
return Math.sqrt(x * x + z * z);
return Math.sqrt(getX() * getX() + getZ() * getZ());
}
/**
@ -420,7 +421,7 @@ public class Vector2D {
* @return length, squared
*/
public double lengthSq() {
return x * x + z * z;
return getX() * getX() + getZ() * getZ();
}
/**
@ -430,7 +431,7 @@ public class Vector2D {
* @return distance
*/
public double distance(Vector2D other) {
return Math.sqrt(Math.pow(other.x - x, 2) + Math.pow(other.z - z, 2));
return Math.sqrt(Math.pow(other.getX() - getX(), 2) + Math.pow(other.getZ() - getZ(), 2));
}
/**
@ -440,8 +441,8 @@ public class Vector2D {
* @return distance
*/
public double distanceSq(Vector2D other) {
return Math.pow(other.x - x, 2) +
Math.pow(other.z - z, 2);
return Math.pow(other.getX() - getX(), 2) +
Math.pow(other.getZ() - getZ(), 2);
}
/**
@ -461,7 +462,7 @@ public class Vector2D {
* @return the dot product of this and the other vector
*/
public double dot(Vector2D other) {
return x * other.x + z * other.z;
return getX() * other.getX() + getZ() * other.getZ();
}
/**
@ -472,8 +473,8 @@ public class Vector2D {
* @return true if the vector is contained
*/
public boolean containedWithin(Vector2D min, Vector2D max) {
return x >= min.x && x <= max.x
&& z >= min.z && z <= max.z;
return getX() >= min.getX() && getX() <= max.getX()
&& getZ() >= min.getZ() && getZ() <= max.getZ();
}
/**
@ -494,7 +495,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D floor() {
return new Vector2D(Math.floor(x), Math.floor(z));
return new Vector2D(Math.floor(getX()), Math.floor(getZ()));
}
/**
@ -503,7 +504,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D ceil() {
return new Vector2D(Math.ceil(x), Math.ceil(z));
return new Vector2D(Math.ceil(getX()), Math.ceil(getZ()));
}
/**
@ -514,7 +515,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D round() {
return new Vector2D(Math.floor(x + 0.5), Math.floor(z + 0.5));
return new Vector2D(Math.floor(getX() + 0.5), Math.floor(getZ() + 0.5));
}
/**
@ -524,7 +525,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector2D positive() {
return new Vector2D(Math.abs(x), Math.abs(z));
return new Vector2D(Math.abs(getX()), Math.abs(getZ()));
}
/**
@ -540,8 +541,8 @@ public class Vector2D {
*/
public Vector2D transform2D(double angle, double aboutX, double aboutZ, double translateX, double translateZ) {
angle = Math.toRadians(angle);
double x = this.x - aboutX;
double z = this.z - aboutZ;
double x = this.getX() - aboutX;
double z = this.getZ() - aboutZ;
double x2 = x * Math.cos(angle) - z * Math.sin(angle);
double z2 = x * Math.sin(angle) + z * Math.cos(angle);
return new Vector2D(
@ -557,28 +558,28 @@ public class Vector2D {
* @return true if collinear
*/
public boolean isCollinearWith(Vector2D other) {
if (x == 0 && z == 0) {
if (getX() == 0 && getZ() == 0) {
// this is a zero vector
return true;
}
final double otherX = other.x;
final double otherZ = other.z;
final double otherX = other.getX();
final double otherZ = other.getZ();
if (otherX == 0 && otherZ == 0) {
// other is a zero vector
return true;
}
if ((x == 0) != (otherX == 0)) return false;
if ((z == 0) != (otherZ == 0)) return false;
if ((getX() == 0) != (otherX == 0)) return false;
if ((getZ() == 0) != (otherZ == 0)) return false;
final double quotientX = otherX / x;
final double quotientX = otherX / getX();
if (!Double.isNaN(quotientX)) {
return other.equals(multiply(quotientX));
}
final double quotientZ = otherZ / z;
final double quotientZ = otherZ / getZ();
if (!Double.isNaN(quotientZ)) {
return other.equals(multiply(quotientZ));
}
@ -601,7 +602,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector toVector() {
return new Vector(x, 0, z);
return new Vector(getX(), 0, getZ());
}
/**
@ -611,7 +612,7 @@ public class Vector2D {
* @return a new vector
*/
public Vector toVector(double y) {
return new Vector(x, y, z);
return new Vector(getX(), y, getZ());
}
@Override
@ -621,19 +622,19 @@ public class Vector2D {
}
Vector2D other = (Vector2D) obj;
return other.x == this.x && other.z == this.z;
return other.getX() == this.getX() && other.getZ() == this.getZ();
}
@Override
public int hashCode() {
return ((new Double(x)).hashCode() >> 13) ^
(new Double(z)).hashCode();
return ((new Double(getX())).hashCode() >> 13) ^
(new Double(getZ())).hashCode();
}
@Override
public String toString() {
return "(" + x + ", " + z + ")";
return "(" + getX() + ", " + getZ() + ")";
}
/**
@ -645,8 +646,8 @@ public class Vector2D {
*/
public static Vector2D getMinimum(Vector2D v1, Vector2D v2) {
return new Vector2D(
Math.min(v1.x, v2.x),
Math.min(v1.z, v2.z)
Math.min(v1.getX(), v2.getX()),
Math.min(v1.getZ(), v2.getZ())
);
}
@ -659,8 +660,8 @@ public class Vector2D {
*/
public static Vector2D getMaximum(Vector2D v1, Vector2D v2) {
return new Vector2D(
Math.max(v1.x, v2.x),
Math.max(v1.z, v2.z)
Math.max(v1.getX(), v2.getX()),
Math.max(v1.getZ(), v2.getZ())
);
}

View File

@ -79,7 +79,7 @@ public class HeightMap {
int x = pos.getBlockX();
int z = pos.getBlockZ();
y = session.getNearestSurfaceLayer(x, z, y, 0, maxY);
data[(z - bz) * width + (x - bx)] = y;
data[(z - bz) * width + (x - bx)] = 7 + (y << 3);
}
} else {
// Store current heightmap data
@ -238,20 +238,13 @@ public class HeightMap {
++blocksChanged;
// Grow -- start from 1 below top replacing airblocks
for (int y = newHeight - 1 - originY; y >= 0; --y) {
for (int y = newHeight - 1 - originY; y >= curHeight; --y) {
int copyFrom = (int) (y * scale);
session.setBlock(xr, originY + y, zr, session.getBlock(xr, originY + copyFrom, zr));
++blocksChanged;
}
}
} else if (curHeight > newHeight) {
// Shrink -- start from bottom
for (int y = 0; y < newHeight - originY; ++y) {
int copyFrom = (int) (y * scale);
session.setBlock(xr, originY + y, zr, session.getBlock(xr, originY + copyFrom, zr));
++blocksChanged;
}
// Set the top block of the column to be the same type
// (this could otherwise go wrong with rounding)
session.setBlock(xr, newHeight, zr, session.getBlock(xr, curHeight, zr));

View File

@ -24,6 +24,7 @@ import com.boydti.fawe.object.collection.LocalBlockVectorSet;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.LocalWorld;
import com.sk89q.worldedit.MutableBlockVector;
import com.sk89q.worldedit.MutableBlockVector2D;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.world.World;
@ -333,7 +334,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
@Override
public Iterator<Vector2D> iterator() {
return new Iterator<Vector2D>() {
private Vector2D pos = new Vector2D(minX, minZ);
private MutableBlockVector2D pos = new MutableBlockVector2D().setComponents(minX, minZ);
@Override
public boolean hasNext() {
return pos != null;
@ -344,9 +345,9 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
Vector2D result = pos;
// calc next
if (pos.getX() < maxX) {
pos = new Vector2D(pos.getX() + 1, pos.getZ());
pos.setComponents(pos.getX() + 1, pos.getZ());
} else if (pos.getZ() < maxZ) {
pos = new Vector2D(minX, pos.getZ() + 1);
pos.setComponents(minX, pos.getZ() + 1);
} else {
pos = null;
}
@ -566,6 +567,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
return new Iterable<Vector2D>() {
@Override
public Iterator<Vector2D> iterator() {
MutableBlockVector2D mutable = new MutableBlockVector2D();
return new Iterator<Vector2D>() {
private Vector min = getMinimumPoint();
private Vector max = getMaximumPoint();
@ -580,11 +582,11 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
@Override
public Vector2D next() {
if (!hasNext()) throw new java.util.NoSuchElementException();
Vector2D answer = new Vector2D(nextX, nextZ);
if (++nextX > max.getBlockX()) {
nextX = min.getBlockX();
if (++nextZ > max.getBlockZ()) {
nextX = Integer.MIN_VALUE;
Vector2D answer = mutable.setComponents(nextX, nextZ);
if (++nextZ > max.getBlockZ()) {
nextZ = min.getBlockZ();
if (++nextX > max.getBlockX()) {
nextZ = Integer.MIN_VALUE;
}
}
return answer;

View File

@ -13,7 +13,7 @@ import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.util.MainUtil;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.LocalWorld;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.MutableBlockVector2D;
import java.io.IOException;
import java.util.Map;
@ -85,12 +85,11 @@ public class NukkitChunk extends CharFaweChunk<BaseFullChunk, NukkitQueue> {
final LocalWorld lw = NukkitUtil.getLocalWorld(world);
final byte[] biomes = getBiomeArray();
int index = 0;
Vector2D mutable = new Vector2D();
for (int z = 0; z < 16; z++) {
mutable.z = Z + z;
int zz = Z + z;
for (int x = 0; x < 16; x++) {
mutable.x = X + x;
lw.setBiome(mutable, FaweCache.getBiome(biomes[index++] & 0xFF));
int xx = X + x;
lw.setBiome(MutableBlockVector2D.get(xx, zz), FaweCache.getBiome(biomes[index++] & 0xFF));
}
}
}