/* * Java port of Bullet (c) 2008 Martin Dvorak <jezek2@advel.cz> * * Bullet Continuous Collision Detection and Physics Library * Copyright (c) 2003-2008 Erwin Coumans http://www.bulletphysics.com/ * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from * the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ package com.bulletphysics.linearmath; import javax.vecmath.Vector3f; import javax.vecmath.Vector4f; /** * Utility functions for vectors. * * @author jezek2 */ public class VectorUtil { public static int maxAxis(Vector3f v) { int maxIndex = -1; float maxVal = -1e30f; if (v.x > maxVal) { maxIndex = 0; maxVal = v.x; } if (v.y > maxVal) { maxIndex = 1; maxVal = v.y; } if (v.z > maxVal) { maxIndex = 2; maxVal = v.z; } return maxIndex; } public static int maxAxis4(Vector4f v) { int maxIndex = -1; float maxVal = -1e30f; if (v.x > maxVal) { maxIndex = 0; maxVal = v.x; } if (v.y > maxVal) { maxIndex = 1; maxVal = v.y; } if (v.z > maxVal) { maxIndex = 2; maxVal = v.z; } if (v.w > maxVal) { maxIndex = 3; maxVal = v.w; } return maxIndex; } public static int closestAxis4(Vector4f vec) { Vector4f tmp = new Vector4f(vec); tmp.absolute(); return maxAxis4(tmp); } public static float getCoord(Vector3f vec, int num) { switch (num) { case 0: return vec.x; case 1: return vec.y; case 2: return vec.z; default: throw new InternalError(); } } public static void setCoord(Vector3f vec, int num, float value) { switch (num) { case 0: vec.x = value; break; case 1: vec.y = value; break; case 2: vec.z = value; break; default: throw new InternalError(); } } public static void mulCoord(Vector3f vec, int num, float value) { switch (num) { case 0: vec.x *= value; break; case 1: vec.y *= value; break; case 2: vec.z *= value; break; default: throw new InternalError(); } } public static void setInterpolate3(Vector3f dest, Vector3f v0, Vector3f v1, float rt) { float s = 1f - rt; dest.x = s * v0.x + rt * v1.x; dest.y = s * v0.y + rt * v1.y; dest.z = s * v0.z + rt * v1.z; // don't do the unused w component // m_co[3] = s * v0[3] + rt * v1[3]; } public static void add(Vector3f dest, Vector3f v1, Vector3f v2) { dest.x = v1.x + v2.x; dest.y = v1.y + v2.y; dest.z = v1.z + v2.z; } public static void add(Vector3f dest, Vector3f v1, Vector3f v2, Vector3f v3) { dest.x = v1.x + v2.x + v3.x; dest.y = v1.y + v2.y + v3.y; dest.z = v1.z + v2.z + v3.z; } public static void add(Vector3f dest, Vector3f v1, Vector3f v2, Vector3f v3, Vector3f v4) { dest.x = v1.x + v2.x + v3.x + v4.x; dest.y = v1.y + v2.y + v3.y + v4.y; dest.z = v1.z + v2.z + v3.z + v4.z; } public static void mul(Vector3f dest, Vector3f v1, Vector3f v2) { dest.x = v1.x * v2.x; dest.y = v1.y * v2.y; dest.z = v1.z * v2.z; } public static void div(Vector3f dest, Vector3f v1, Vector3f v2) { dest.x = v1.x / v2.x; dest.y = v1.y / v2.y; dest.z = v1.z / v2.z; } public static void setMin(Vector3f a, Vector3f b) { a.x = Math.min(a.x, b.x); a.y = Math.min(a.y, b.y); a.z = Math.min(a.z, b.z); } public static void setMax(Vector3f a, Vector3f b) { a.x = Math.max(a.x, b.x); a.y = Math.max(a.y, b.y); a.z = Math.max(a.z, b.z); } public static float dot3(Vector4f v0, Vector3f v1) { return (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z); } public static float dot3(Vector4f v0, Vector4f v1) { return (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z); } public static float dot3(Vector3f v0, Vector4f v1) { return (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z); } public static float lengthSquared3(Vector4f v) { return (v.x*v.x + v.y*v.y + v.z*v.z); } public static void normalize3(Vector4f v) { float norm = (float)(1.0/Math.sqrt(v.x*v.x + v.y*v.y + v.z*v.z)); v.x *= norm; v.y *= norm; v.z *= norm; } public static void cross3(Vector3f dest, Vector4f v1, Vector4f v2) { float x,y; x = v1.y*v2.z - v1.z*v2.y; y = v2.x*v1.z - v2.z*v1.x; dest.z = v1.x*v2.y - v1.y*v2.x; dest.x = x; dest.y = y; } }