From 9df1189ca77962e4b1087ef416ce8d5d83f11c09 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Sun, 12 Jul 2015 17:27:33 -0500 Subject: [PATCH] Optimized SWGObject's getWorldLocation function to not make extra location copies --- src/resources/Location.java | 44 ++++++++++------------------ src/resources/objects/SWGObject.java | 6 ++-- 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/src/resources/Location.java b/src/resources/Location.java index faba87ce6..7860d7cc0 100644 --- a/src/resources/Location.java +++ b/src/resources/Location.java @@ -116,6 +116,20 @@ public class Location implements Serializable { this.oW += oW; } + public void translateLocation(Location l) { + double k0 = l.oW * l.oW - 0.5f; + double k1 = x * l.oX + y * l.oY + z * l.oZ; + double rx = l.x + 2 * (x * k0 + l.oX * k1 + l.oW * (l.oY * z - l.oZ * y)); + double ry = l.y + 2 * (y * k0 + l.oY * k1 + l.oW * (z * x - l.oX * z)); + double rz = l.z + 2 * (z * k0 + l.oZ * k1 + l.oW * (l.oX * y - l.oY * x)); + double row = l.oW*oW - l.oX*oX - l.oY*oY - l.oZ*oZ; + double rox = l.oW*oX + l.oX*oW + l.oY*oZ - l.oZ*oY; + double roy = l.oW*oY + l.oY*oW + l.oZ*oX - l.oX*oZ; + double roz = l.oW*oZ + l.oZ*oW + l.oX*oY - l.oY*oX; + setPosition(rx, ry, rz); + setOrientation(rox, roy, roz, row); + } + public Location translate(double x, double y, double z) { Location loc = new Location(this); loc.translatePosition(x, y, z); @@ -124,35 +138,7 @@ public class Location implements Serializable { public Location translate(Location l) { Location ret = new Location(this); - double k0 = l.oW * l.oW - 0.5f; - double k1; - double rx, ry, rz; - - // k1 = Q.V - k1 = x * l.oX; - k1 += y * l.oY; - k1 += z * l.oZ; - - // (qq-1/2)V+(Q.V)Q - rx = x * k0 + l.oX * k1; - ry = y * k0 + l.oY * k1; - rz = z * k0 + l.oZ * k1; - - // (Q.V)Q+(qq-1/2)V+q(QxV) - rx += l.oW * (l.oY * z - l.oZ * y); - ry += l.oW * (z * x - l.oX * z); - rz += l.oW * (l.oX * y - l.oY * x); - - // 2((Q.V)Q+(qq-1/2)V+q(QxV)) - rx += rx; - ry += ry; - rz += rz; - ret.setPosition(rx, ry, rz); - ret.translatePosition(l.x, l.y, l.z); - ret.setOrientationW(l.oW*oW - l.oX*oX - l.oY*oY - l.oZ*oZ); - ret.setOrientationX(l.oW*oX + l.oX*oW + l.oY*oZ - l.oZ*oY); - ret.setOrientationY(l.oW*oY + l.oY*oW + l.oZ*oX - l.oX*oZ); - ret.setOrientationZ(l.oW*oZ + l.oZ*oW + l.oX*oY - l.oY*oX); + ret.translateLocation(l); return ret; } diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 9273e0b46..3c1942d4d 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -433,7 +433,7 @@ public abstract class SWGObject implements Serializable, Comparable { } public Location getLocation() { - return location; + return new Location(location); } public Location getWorldLocation() { @@ -441,7 +441,7 @@ public abstract class SWGObject implements Serializable, Comparable { SWGObject parent = getParent(); while (parent != null) { Location l = parent.location; - loc.translatePosition(l.getX(), l.getY(), l.getZ()); // Have to access privately to avoid copies + loc.translateLocation(l); // Have to access privately to avoid copies parent = parent.getParent(); } return loc; @@ -818,8 +818,6 @@ public abstract class SWGObject implements Serializable, Comparable { // Now create the contained objects for (SWGObject containedObject : containedObjects.values()) { if (containedObject != null && !sentObjects.contains(containedObject)) { - //Log.i("ChildrenObjects", "Sending containedObj " + containedObject + " to " + target); - //Log.d("SWGObject", "Sending to location " + containedObject.getLocation()); containedObject.createObject(target); } }