/*
|
* 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;
|
}
|
|
}
|