summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWesley Wolfe <weswolf@aol.com>2012-02-29 16:07:47 -0600
committerEvilSeph <evilseph@gmail.com>2012-02-29 20:13:05 -0500
commit337860b7c0f26e296827bca6c4e79f1ec27437f9 (patch)
treeb0e2d644ac4b25704c92b0d34daa8180667a20ef /src
parent2fc2f8109c4c56fd60fad5b7b78ceac328827e2c (diff)
downloadbukkit-337860b7c0f26e296827bca6c4e79f1ec27437f9.tar
bukkit-337860b7c0f26e296827bca6c4e79f1ec27437f9.tar.gz
bukkit-337860b7c0f26e296827bca6c4e79f1ec27437f9.tar.lz
bukkit-337860b7c0f26e296827bca6c4e79f1ec27437f9.tar.xz
bukkit-337860b7c0f26e296827bca6c4e79f1ec27437f9.zip
[Bleeding] Optimized locToBlock. Addresses BUKKIT-815
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/bukkit/Location.java3
-rw-r--r--src/main/java/org/bukkit/util/BlockIterator.java14
-rw-r--r--src/main/java/org/bukkit/util/NumberConversions.java9
-rw-r--r--src/main/java/org/bukkit/util/Vector.java6
4 files changed, 22 insertions, 10 deletions
diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java
index fe7c4b09..bcc963bf 100644
--- a/src/main/java/org/bukkit/Location.java
+++ b/src/main/java/org/bukkit/Location.java
@@ -1,6 +1,7 @@
package org.bukkit;
import org.bukkit.block.Block;
+import org.bukkit.util.NumberConversions;
import org.bukkit.util.Vector;
/**
@@ -485,6 +486,6 @@ public class Location implements Cloneable {
* @return Block coordinate
*/
public static int locToBlock(double loc) {
- return (int) Math.floor(loc);
+ return NumberConversions.floor(loc);
}
}
diff --git a/src/main/java/org/bukkit/util/BlockIterator.java b/src/main/java/org/bukkit/util/BlockIterator.java
index dbb5e39a..67836098 100644
--- a/src/main/java/org/bukkit/util/BlockIterator.java
+++ b/src/main/java/org/bukkit/util/BlockIterator.java
@@ -1,5 +1,7 @@
package org.bukkit.util;
+import static org.bukkit.util.NumberConversions.*;
+
import org.bukkit.World;
import org.bukkit.Location;
import org.bukkit.block.Block;
@@ -66,7 +68,7 @@ public class BlockIterator implements Iterator<Block> {
double secondPosition = 0;
double thirdPosition = 0;
- Block startBlock = this.world.getBlockAt((int) Math.floor(startClone.getX()), (int) Math.floor(startClone.getY()), (int) Math.floor(startClone.getZ()));
+ Block startBlock = this.world.getBlockAt(floor(startClone.getX()), floor(startClone.getY()), floor(startClone.getZ()));
if (getXLength(direction) > mainDirection) {
mainFace = getXFace(direction);
@@ -117,10 +119,10 @@ public class BlockIterator implements Iterator<Block> {
// Guarantee that the ray will pass though the start block.
// It is possible that it would miss due to rounding
// This should only move the ray by 1 grid position
- secondError = (int) (Math.floor(secondd * gridSize));
- secondStep = (int) (Math.round(secondDirection / mainDirection * gridSize));
- thirdError = (int) (Math.floor(thirdd * gridSize));
- thirdStep = (int) (Math.round(thirdDirection / mainDirection * gridSize));
+ secondError = floor(secondd * gridSize);
+ secondStep = round(secondDirection / mainDirection * gridSize);
+ thirdError = floor(thirdd * gridSize);
+ thirdStep = round(thirdDirection / mainDirection * gridSize);
if (secondError + secondStep <= 0) {
secondError = -secondStep + 1;
@@ -168,7 +170,7 @@ public class BlockIterator implements Iterator<Block> {
}
// Calculate the number of planes passed to give max distance
- maxDistanceInt = (int) Math.round(maxDistance / (Math.sqrt(mainDirection * mainDirection + secondDirection * secondDirection + thirdDirection * thirdDirection) / mainDirection));
+ maxDistanceInt = round(maxDistance / (Math.sqrt(mainDirection * mainDirection + secondDirection * secondDirection + thirdDirection * thirdDirection) / mainDirection));
}
diff --git a/src/main/java/org/bukkit/util/NumberConversions.java b/src/main/java/org/bukkit/util/NumberConversions.java
index 9c0b132f..e482ceeb 100644
--- a/src/main/java/org/bukkit/util/NumberConversions.java
+++ b/src/main/java/org/bukkit/util/NumberConversions.java
@@ -6,6 +6,15 @@ package org.bukkit.util;
public final class NumberConversions {
private NumberConversions() {}
+ public static int floor(double num) {
+ final int floor = (int) num;
+ return floor == num ? floor : floor - (int) (Double.doubleToRawLongBits(num) >>> 63);
+ }
+
+ public static int round(double num) {
+ return floor(num + 0.5d);
+ }
+
public static int toInt(Object object) {
if (object instanceof Number) {
return ((Number) object).intValue();
diff --git a/src/main/java/org/bukkit/util/Vector.java b/src/main/java/org/bukkit/util/Vector.java
index 9b1376bf..af4d5770 100644
--- a/src/main/java/org/bukkit/util/Vector.java
+++ b/src/main/java/org/bukkit/util/Vector.java
@@ -365,7 +365,7 @@ public class Vector implements Cloneable, ConfigurationSerializable {
* @return block X
*/
public int getBlockX() {
- return (int) Math.floor(x);
+ return NumberConversions.floor(x);
}
/**
@@ -384,7 +384,7 @@ public class Vector implements Cloneable, ConfigurationSerializable {
* @return block y
*/
public int getBlockY() {
- return (int) Math.floor(y);
+ return NumberConversions.floor(y);
}
/**
@@ -403,7 +403,7 @@ public class Vector implements Cloneable, ConfigurationSerializable {
* @return block z
*/
public int getBlockZ() {
- return (int) Math.floor(z);
+ return NumberConversions.floor(z);
}
/**