add some missing javadoc (13 files in com.jme3.math)

master
Stephen Gold 5 years ago
parent 32ab16e026
commit 03673ac1f7
  1. 35
      jme3-core/src/main/java/com/jme3/math/AbstractTriangle.java
  2. 24
      jme3-core/src/main/java/com/jme3/math/ColorRGBA.java
  3. 27
      jme3-core/src/main/java/com/jme3/math/Easing.java
  4. 45
      jme3-core/src/main/java/com/jme3/math/Eigen3f.java
  5. 23
      jme3-core/src/main/java/com/jme3/math/FastMath.java
  6. 36
      jme3-core/src/main/java/com/jme3/math/Line.java
  7. 114
      jme3-core/src/main/java/com/jme3/math/LineSegment.java
  8. 23
      jme3-core/src/main/java/com/jme3/math/MathUtils.java
  9. 71
      jme3-core/src/main/java/com/jme3/math/Matrix3f.java
  10. 176
      jme3-core/src/main/java/com/jme3/math/Matrix4f.java
  11. 40
      jme3-core/src/main/java/com/jme3/math/Plane.java
  12. 77
      jme3-core/src/main/java/com/jme3/math/Quaternion.java
  13. 30
      jme3-core/src/main/java/com/jme3/math/Ray.java

@ -34,13 +34,48 @@ package com.jme3.math;
import com.jme3.collision.Collidable; import com.jme3.collision.Collidable;
import com.jme3.collision.CollisionResults; import com.jme3.collision.CollisionResults;
/**
* A Collidable with a triangular shape.
*/
public abstract class AbstractTriangle implements Collidable { public abstract class AbstractTriangle implements Collidable {
/**
* Determine the location of the first vertex.
*
* @return a location vector
*/
public abstract Vector3f get1(); public abstract Vector3f get1();
/**
* Determine the location of the 2nd vertex.
*
* @return a location vector
*/
public abstract Vector3f get2(); public abstract Vector3f get2();
/**
* Determine the location of the 3rd vertex.
*
* @return a location vector
*/
public abstract Vector3f get3(); public abstract Vector3f get3();
/**
* Alter all 3 vertex locations.
*
* @param v1 the location for the first vertex
* @param v2 the location for the 2nd vertex
* @param v3 the location for the 3rd vertex
*/
public abstract void set(Vector3f v1, Vector3f v2, Vector3f v3); public abstract void set(Vector3f v1, Vector3f v2, Vector3f v3);
/**
* Generate collision results for this triangle with another Collidable.
*
* @param other the other Collidable
* @param results storage for collision results
* @return the number of collisions found
*/
@Override @Override
public int collideWith(Collidable other, CollisionResults results){ public int collideWith(Collidable other, CollisionResults results){
return other.collideWith(this, results); return other.collideWith(this, results);

@ -1,9 +1,10 @@
/* /*
* Copyright (c) 2009-2020 jMonkeyEngine All rights reserved. * Copyright (c) 2009-2020 jMonkeyEngine
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * *
* * Redistributions of source code must retain the above copyright notice, * * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. * this list of conditions and the following disclaimer.
* *
@ -387,6 +388,11 @@ public final class ColorRGBA implements Savable, Cloneable, java.io.Serializable
return "Color[" + r + ", " + g + ", " + b + ", " + a + "]"; return "Color[" + r + ", " + g + ", " + b + ", " + a + "]";
} }
/**
* Create a copy of this color.
*
* @return a new instance, equivalent to this one
*/
@Override @Override
public ColorRGBA clone() { public ColorRGBA clone() {
try { try {
@ -462,6 +468,13 @@ public final class ColorRGBA implements Savable, Cloneable, java.io.Serializable
return hash; return hash;
} }
/**
* Serialize this color to the specified exporter, for example when
* saving to a J3O file.
*
* @param e (not null)
* @throws IOException from the exporter
*/
@Override @Override
public void write(JmeExporter e) throws IOException { public void write(JmeExporter e) throws IOException {
OutputCapsule capsule = e.getCapsule(this); OutputCapsule capsule = e.getCapsule(this);
@ -471,6 +484,13 @@ public final class ColorRGBA implements Savable, Cloneable, java.io.Serializable
capsule.write(a, "a", 0); capsule.write(a, "a", 0);
} }
/**
* De-serialize this color from the specified importer, for example when
* loading from a J3O file.
*
* @param e (not null)
* @throws IOException from the importer
*/
@Override @Override
public void read(JmeImporter e) throws IOException { public void read(JmeImporter e) throws IOException {
InputCapsule capsule = e.getCapsule(this); InputCapsule capsule = e.getCapsule(this);

@ -7,6 +7,9 @@ package com.jme3.math;
public class Easing { public class Easing {
/**
* a function that always returns 0
*/
public static EaseFunction constant = new EaseFunction() { public static EaseFunction constant = new EaseFunction() {
@Override @Override
public float apply(float value) { public float apply(float value) {
@ -23,6 +26,9 @@ public class Easing {
} }
}; };
/**
* a function that returns the square of its input
*/
public static EaseFunction inQuad = new EaseFunction() { public static EaseFunction inQuad = new EaseFunction() {
@Override @Override
public float apply(float value) { public float apply(float value) {
@ -30,6 +36,9 @@ public class Easing {
} }
}; };
/**
* a function that returns the cube of its input
*/
public static EaseFunction inCubic = new EaseFunction() { public static EaseFunction inCubic = new EaseFunction() {
@Override @Override
public float apply(float value) { public float apply(float value) {
@ -37,6 +46,9 @@ public class Easing {
} }
}; };
/**
* a function that returns the 4th power of its input
*/
public static EaseFunction inQuart = new EaseFunction() { public static EaseFunction inQuart = new EaseFunction() {
@Override @Override
public float apply(float value) { public float apply(float value) {
@ -44,6 +56,9 @@ public class Easing {
} }
}; };
/**
* a function that returns the 5th power of its input
*/
public static EaseFunction inQuint = new EaseFunction() { public static EaseFunction inQuint = new EaseFunction() {
@Override @Override
public float apply(float value) { public float apply(float value) {
@ -62,6 +77,9 @@ public class Easing {
} }
}; };
/**
* a function that starts quickly, then bounces several times
*/
public static EaseFunction outBounce = new EaseFunction() { public static EaseFunction outBounce = new EaseFunction() {
@Override @Override
public float apply(float value) { public float apply(float value) {
@ -81,6 +99,9 @@ public class Easing {
* In Elastic and bounce * In Elastic and bounce
*/ */
public static EaseFunction inElastic = new Invert(outElastic); public static EaseFunction inElastic = new Invert(outElastic);
/**
* a function containing a series of increasing bounces
*/
public static EaseFunction inBounce = new Invert(outBounce); public static EaseFunction inBounce = new Invert(outBounce);
/** /**
@ -128,6 +149,12 @@ public class Easing {
private EaseFunction in; private EaseFunction in;
private EaseFunction out; private EaseFunction out;
/**
* Instantiate a function that blends 2 pre-existing functions.
*
* @param in the function to use at value=0
* @param out the function to use at value=1
*/
public InOut(EaseFunction in, EaseFunction out) { public InOut(EaseFunction in, EaseFunction out) {
this.in = in; this.in = in;
this.out = out; this.out = out;

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009-2012 jMonkeyEngine * Copyright (c) 2009-2020 jMonkeyEngine
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -34,6 +34,9 @@ package com.jme3.math;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
/**
* A calculator for the eigenvectors and eigenvalues of a Matrix3f.
*/
public class Eigen3f implements java.io.Serializable { public class Eigen3f implements java.io.Serializable {
static final long serialVersionUID = 1; static final long serialVersionUID = 1;
@ -48,14 +51,27 @@ public class Eigen3f implements java.io.Serializable {
static final double ROOT_THREE_DOUBLE = Math.sqrt(3.0); static final double ROOT_THREE_DOUBLE = Math.sqrt(3.0);
/**
* Instantiate an empty calculator.
*/
public Eigen3f() { public Eigen3f() {
} }
/**
* Calculate the eigenvalues and eigenvectors of the specified matrix.
*
* @param data the input Matrix3f
*/
public Eigen3f(Matrix3f data) { public Eigen3f(Matrix3f data) {
calculateEigen(data); calculateEigen(data);
} }
/**
* Calculate the eigenvalues and eigenvectors of the specified matrix.
*
* @param data the input Matrix3f
*/
public void calculateEigen(Matrix3f data) { public void calculateEigen(Matrix3f data) {
// prep work... // prep work...
eigenVectors[0] = new Vector3f(); eigenVectors[0] = new Vector3f();
@ -378,6 +394,11 @@ public class Eigen3f implements java.io.Serializable {
} }
} }
/**
* Test the Eigen3f class.
*
* @param args ignored
*/
public static void main(String[] args) { public static void main(String[] args) {
Matrix3f mat = new Matrix3f(2, 1, 1, 1, 2, 1, 1, 1, 2); Matrix3f mat = new Matrix3f(2, 1, 1, 1, 2, 1, 1, 1, 2);
Eigen3f eigenSystem = new Eigen3f(mat); Eigen3f eigenSystem = new Eigen3f(mat);
@ -402,18 +423,40 @@ public class Eigen3f implements java.io.Serializable {
// -0.816485 0.004284 0.577350 // -0.816485 0.004284 0.577350
} }
/**
* Read the indexed eigenvalue.
*
* @param i which value to read (0, 1, or 2)
* @return the previously calculated eigenvalue
*/
public float getEigenValue(int i) { public float getEigenValue(int i) {
return eigenValues[i]; return eigenValues[i];
} }
/**
* Access the indexed eigenvector.
*
* @param i which vector to read (0, 1, or 2)
* @return the pre-existing eigenvector
*/
public Vector3f getEigenVector(int i) { public Vector3f getEigenVector(int i) {
return eigenVectors[i]; return eigenVectors[i];
} }
/**
* Access the array of eigenvalues.
*
* @return the pre-existing array
*/
public float[] getEigenValues() { public float[] getEigenValues() {
return eigenValues; return eigenValues;
} }
/**
* Access the array of eigenvectors.
*
* @return the pre-existing array of vectors
*/
public Vector3f[] getEigenVectors() { public Vector3f[] getEigenVectors() {
return eigenVectors; return eigenVectors;
} }

@ -55,6 +55,9 @@ final public class FastMath {
* A "close to zero" float epsilon value for use * A "close to zero" float epsilon value for use
*/ */
public static final float ZERO_TOLERANCE = 0.0001f; public static final float ZERO_TOLERANCE = 0.0001f;
/**
* The value 1/3, as a float.
*/
public static final float ONE_THIRD = 1f / 3f; public static final float ONE_THIRD = 1f / 3f;
/** /**
* The value PI as a float. (180 degrees) * The value PI as a float. (180 degrees)
@ -612,6 +615,12 @@ final public class FastMath {
return (float) (1.0f / Math.sqrt(fValue)); return (float) (1.0f / Math.sqrt(fValue));
} }
/**
* Quickly estimate 1/sqrt(fValue).
*
* @param x the input value (≥0)
* @return an approximate value for 1/sqrt(x)
*/
public static float fastInvSqrt(float x) { public static float fastInvSqrt(float x) {
float xhalf = 0.5f * x; float xhalf = 0.5f * x;
int i = Float.floatToIntBits(x); // get bits for floating value int i = Float.floatToIntBits(x); // get bits for floating value
@ -830,6 +839,12 @@ final public class FastMath {
return (int) (nextRandomFloat() * (max - min + 1)) + min; return (int) (nextRandomFloat() * (max - min + 1)) + min;
} }
/**
* Choose a pseudo-random, uniformly-distributed integer value from
* the shared generator.
*
* @return the next integer value
*/
public static int nextRandomInt() { public static int nextRandomInt() {
return rand.nextInt(); return rand.nextInt();
} }
@ -1025,6 +1040,14 @@ final public class FastMath {
} }
} }
/**
* Convert a single-precision (32-bit) floating-point value
* to half precision.
*
* @param flt the input value (not a NaN)
* @return a near-equivalent value in half precision
* @throws UnsupportedOperationException if flt is a NaN
*/
public static short convertFloatToHalf(float flt) { public static short convertFloatToHalf(float flt) {
if (Float.isNaN(flt)) { if (Float.isNaN(flt)) {
throw new UnsupportedOperationException("NaN to half conversion not supported!"); throw new UnsupportedOperationException("NaN to half conversion not supported!");

@ -108,6 +108,12 @@ public class Line implements Savable, Cloneable, java.io.Serializable {
this.direction = direction; this.direction = direction;
} }
/**
* Calculate the squared distance from this line to the specified point.
*
* @param point location vector of the input point (not null, unaffected)
* @return the square of the minimum distance (≥0)
*/
public float distanceSquared(Vector3f point) { public float distanceSquared(Vector3f point) {
TempVars vars = TempVars.get(); TempVars vars = TempVars.get();
@ -123,10 +129,21 @@ public class Line implements Savable, Cloneable, java.io.Serializable {
return len; return len;
} }
/**
* Calculate the distance from this line to the specified point.
*
* @param point location vector of the input point (not null, unaffected)
* @return the minimum distance (≥0)
*/
public float distance(Vector3f point) { public float distance(Vector3f point) {
return FastMath.sqrt(distanceSquared(point)); return FastMath.sqrt(distanceSquared(point));
} }
/**
* Fit this line to the specified points.
*
* @param points a buffer containing location vectors, or null
*/
public void orthogonalLineFit(FloatBuffer points) { public void orthogonalLineFit(FloatBuffer points) {
if (points == null) { if (points == null) {
return; return;
@ -213,6 +230,13 @@ public class Line implements Savable, Cloneable, java.io.Serializable {
return result; return result;
} }
/**
* Serialize this line to the specified exporter, for example when
* saving to a J3O file.
*
* @param e (not null)
* @throws IOException from the exporter
*/
@Override @Override
public void write(JmeExporter e) throws IOException { public void write(JmeExporter e) throws IOException {
OutputCapsule capsule = e.getCapsule(this); OutputCapsule capsule = e.getCapsule(this);
@ -220,6 +244,13 @@ public class Line implements Savable, Cloneable, java.io.Serializable {
capsule.write(direction, "direction", Vector3f.ZERO); capsule.write(direction, "direction", Vector3f.ZERO);
} }
/**
* De-serialize this line from the specified importer, for example when
* loading from a J3O file.
*
* @param e (not null)
* @throws IOException from the importer
*/
@Override @Override
public void read(JmeImporter e) throws IOException { public void read(JmeImporter e) throws IOException {
InputCapsule capsule = e.getCapsule(this); InputCapsule capsule = e.getCapsule(this);
@ -227,6 +258,11 @@ public class Line implements Savable, Cloneable, java.io.Serializable {
direction = (Vector3f) capsule.readSavable("direction", Vector3f.ZERO.clone()); direction = (Vector3f) capsule.readSavable("direction", Vector3f.ZERO.clone());
} }
/**
* Create a copy of this line.
*
* @return a new instance, equivalent to this one
*/
@Override @Override
public Line clone() { public Line clone() {
try { try {

@ -57,11 +57,19 @@ public class LineSegment implements Cloneable, Savable, java.io.Serializable {
private Vector3f direction; private Vector3f direction;
private float extent; private float extent;
/**
* Instantiate a zero-length segment at the origin.
*/
public LineSegment() { public LineSegment() {
origin = new Vector3f(); origin = new Vector3f();
direction = new Vector3f(); direction = new Vector3f();
} }
/**
* Instantiate a copy of the specified segment.
*
* @param ls the LineSegment to copy (not null, unaffected)
*/
public LineSegment(LineSegment ls) { public LineSegment(LineSegment ls) {
this.origin = new Vector3f(ls.getOrigin()); this.origin = new Vector3f(ls.getOrigin());
this.direction = new Vector3f(ls.getDirection()); this.direction = new Vector3f(ls.getDirection());
@ -89,24 +97,54 @@ public class LineSegment implements Cloneable, Savable, java.io.Serializable {
direction.normalizeLocal(); direction.normalizeLocal();
} }
/**
* Copy the specified segment to this one.
*
* @param ls the LineSegment to copy (not null, unaffected)
*/
public void set(LineSegment ls) { public void set(LineSegment ls) {
this.origin = new Vector3f(ls.getOrigin()); this.origin = new Vector3f(ls.getOrigin());
this.direction = new Vector3f(ls.getDirection()); this.direction = new Vector3f(ls.getDirection());
this.extent = ls.getExtent(); this.extent = ls.getExtent();
} }
/**
* Calculate the distance between this segment and the specified point.
*
* @param point a location vector (not null, unaffected)
* @return the minimum distance (≥0)
*/
public float distance(Vector3f point) { public float distance(Vector3f point) {
return FastMath.sqrt(distanceSquared(point)); return FastMath.sqrt(distanceSquared(point));
} }
/**
* Calculate the distance between this segment and another.
*
* @param ls the other LineSegment (not null, unaffected)
* @return the minimum distance (≥0)
*/
public float distance(LineSegment ls) { public float distance(LineSegment ls) {
return FastMath.sqrt(distanceSquared(ls)); return FastMath.sqrt(distanceSquared(ls));
} }
/**
* Calculate the distance between this segment and the specified Ray.
*
* @param r the input Ray (not null, unaffected)
* @return the minimum distance (≥0)
*/
public float distance(Ray r) { public float distance(Ray r) {
return FastMath.sqrt(distanceSquared(r)); return FastMath.sqrt(distanceSquared(r));
} }
/**
* Calculate the squared distance between this segment and the specified
* point.
*
* @param point location vector of the input point (not null, unaffected)
* @return the square of the minimum distance (≥0)
*/
public float distanceSquared(Vector3f point) { public float distanceSquared(Vector3f point) {
TempVars vars = TempVars.get(); TempVars vars = TempVars.get();
Vector3f compVec1 = vars.vect1; Vector3f compVec1 = vars.vect1;
@ -131,6 +169,12 @@ public class LineSegment implements Cloneable, Savable, java.io.Serializable {
return len; return len;
} }
/**
* Calculate the squared distance between this segment and another.
*
* @param test the other LineSegment (not null, unaffected)
* @return the square of the minimum distance (≥0)
*/
public float distanceSquared(LineSegment test) { public float distanceSquared(LineSegment test) {
TempVars vars = TempVars.get(); TempVars vars = TempVars.get();
Vector3f compVec1 = vars.vect1; Vector3f compVec1 = vars.vect1;
@ -416,6 +460,13 @@ public class LineSegment implements Cloneable, Savable, java.io.Serializable {
return FastMath.abs(squareDistance); return FastMath.abs(squareDistance);
} }
/**
* Calculate the squared distance between this segment and the specified
* Ray.
*
* @param r the input Ray (not null, unaffected)
* @return the square of the minimum distance (≥0)
*/
public float distanceSquared(Ray r) { public float distanceSquared(Ray r) {
Vector3f kDiff = r.getOrigin().subtract(origin); Vector3f kDiff = r.getOrigin().subtract(origin);
float fA01 = -r.getDirection().dot(direction); float fA01 = -r.getDirection().dot(direction);
@ -535,31 +586,66 @@ public class LineSegment implements Cloneable, Savable, java.io.Serializable {
return FastMath.abs(fSqrDist); return FastMath.abs(fSqrDist);
} }
/**
* Access the direction of this segment.
*
* @return the pre-existing direction vector
*/
public Vector3f getDirection() { public Vector3f getDirection() {
return direction; return direction;
} }
/**
* Alter the direction of this segment.
*
* @param direction the desired direction vector (alias created!)
*/
public void setDirection(Vector3f direction) { public void setDirection(Vector3f direction) {
this.direction = direction; this.direction = direction;
} }
/**
* Read the extent of this segment.
*
* @return the extent
*/
public float getExtent() { public float getExtent() {
return extent; return extent;
} }
/**
* Alter the extent of this segment.
*
* @param extent the desired extent
*/
public void setExtent(float extent) { public void setExtent(float extent) {
this.extent = extent; this.extent = extent;
} }
/**
* Access the origin of this segment.
*
* @return the pre-existing location vector
*/
public Vector3f getOrigin() { public Vector3f getOrigin() {
return origin; return origin;
} }
/**
* Alter the origin of this segment.
*
* @param origin the desired location vector (alias created!)
*/
public void setOrigin(Vector3f origin) { public void setOrigin(Vector3f origin) {
this.origin = origin; this.origin = origin;
} }
// P+e*D /**
* Determine the location of this segment's positive end.
*
* @param store storage for the result (modified if not null)
* @return a location vector (either store or a new vector)
*/
public Vector3f getPositiveEnd(Vector3f store) { public Vector3f getPositiveEnd(Vector3f store) {
if (store == null) { if (store == null) {
store = new Vector3f(); store = new Vector3f();
@ -567,7 +653,12 @@ public class LineSegment implements Cloneable, Savable, java.io.Serializable {
return origin.add((direction.mult(extent, store)), store); return origin.add((direction.mult(extent, store)), store);
} }
// P-e*D /**
* Determine the location of this segment's negative end.
*
* @param store storage for the result (modified if not null)
* @return a location vector (either store or a new vector)
*/
public Vector3f getNegativeEnd(Vector3f store) { public Vector3f getNegativeEnd(Vector3f store) {
if (store == null) { if (store == null) {
store = new Vector3f(); store = new Vector3f();
@ -575,6 +666,13 @@ public class LineSegment implements Cloneable, Savable, java.io.Serializable {
return origin.subtract((direction.mult(extent, store)), store); return origin.subtract((direction.mult(extent, store)), store);
} }
/**
* Serialize this segment to the specified exporter, for example when
* saving to a J3O file.
*
* @param e (not null)
* @throws IOException from the exporter
*/
@Override @Override
public void write(JmeExporter e) throws IOException { public void write(JmeExporter e) throws IOException {
OutputCapsule capsule = e.getCapsule(this); OutputCapsule capsule = e.getCapsule(this);
@ -583,6 +681,13 @@ public class LineSegment implements Cloneable, Savable, java.io.Serializable {
capsule.write(extent, "extent", 0); capsule.write(extent, "extent", 0);
} }
/**
* De-serialize this segment from the specified importer, for example
* when loading from a J3O file.
*
* @param e (not null)
* @throws IOException from the importer
*/
@Override @Override
public void read(JmeImporter e) throws IOException { public void read(JmeImporter e) throws IOException {
InputCapsule capsule = e.getCapsule(this); InputCapsule capsule = e.getCapsule(this);
@ -591,6 +696,11 @@ public class LineSegment implements Cloneable, Savable, java.io.Serializable {
extent = capsule.readFloat("extent", 0); extent = capsule.readFloat("extent", 0);
} }
/**
* Create a copy of this segment.
*
* @return a new instance, equivalent to this one
*/
@Override @Override
public LineSegment clone() { public LineSegment clone() {
try { try {

@ -8,6 +8,13 @@ import com.jme3.util.TempVars;
*/ */
public class MathUtils { public class MathUtils {
/**
* Calculate the natural logarithm of a unit quaternion.
*
* @param q the input Quaternion (not null, normalized, unaffected)
* @param store storage for the result (not null, modified)
* @return the logarithm (store)
*/
public static Quaternion log(Quaternion q, Quaternion store) { public static Quaternion log(Quaternion q, Quaternion store) {
float a = FastMath.acos(q.w); float a = FastMath.acos(q.w);
float sina = FastMath.sin(a); float sina = FastMath.sin(a);
@ -25,6 +32,13 @@ public class MathUtils {
return store; return store;
} }
/**
* Calculate the exponential of a pure quaternion.
*
* @param q the input Quaternion (not null, w=0, unaffected)
* @param store storage for the result (not null, modified)
* @return the exponential (store)
*/
public static Quaternion exp(Quaternion q, Quaternion store) { public static Quaternion exp(Quaternion q, Quaternion store) {
float len = FastMath.sqrt(q.x * q.x + q.y * q.y + q.z * q.z); float len = FastMath.sqrt(q.x * q.x + q.y * q.y + q.z * q.z);
@ -66,6 +80,15 @@ public class MathUtils {
return store; return store;
} }
/**
* Interpolate between 2 quaternions using Slerp.
*
* @param q1 the desired value for t=0
* @param q2 the desired value for t=1
* @param t the fractional parameter (≥0, ≤1)
* @param store storage for the result (not null, modified)
* @return the interpolated Quaternion (store)
*/
public static Quaternion slerp(Quaternion q1, Quaternion q2, float t, Quaternion store) { public static Quaternion slerp(Quaternion q1, Quaternion q2, float t, Quaternion store) {
float dot = (q1.x * q2.x) + (q1.y * q2.y) + (q1.z * q2.z) float dot = (q1.x * q2.x) + (q1.y * q2.y) + (q1.z * q2.z)

@ -52,10 +52,49 @@ public final class Matrix3f implements Savable, Cloneable, java.io.Serializable
static final long serialVersionUID = 1; static final long serialVersionUID = 1;
private static final Logger logger = Logger.getLogger(Matrix3f.class.getName()); private static final Logger logger = Logger.getLogger(Matrix3f.class.getName());
protected float m00, m01, m02; /**
protected float m10, m11, m12; * the element in row 0, column 0
protected float m20, m21, m22; */
protected float m00;
/**
* the element in row 0, column 1
*/
protected float m01;
/**
* the element in row 0, column 2
*/
protected float m02;
/**
* the element in row 1, column 0
*/
protected float m10;
/**
* the element in row 1, column 1
*/
protected float m11;
/**
* the element in row 1, column 2
*/
protected float m12;
/**
* the element in row 2, column 0
*/
protected float m20;
/**
* the element in row 2, column 1
*/
protected float m21;
/**
* the element in row 2, column 2
*/
protected float m22;
/**
* an instance of the zero matrix (all elements = 0)
*/
public static final Matrix3f ZERO = new Matrix3f(0, 0, 0, 0, 0, 0, 0, 0, 0); public static final Matrix3f ZERO = new Matrix3f(0, 0, 0, 0, 0, 0, 0, 0, 0);
/**
* an instance of the identity matrix (diagonals = 1, other elements = 0)
*/
public static final Matrix3f IDENTITY = new Matrix3f(); public static final Matrix3f IDENTITY = new Matrix3f();
/** /**
@ -444,6 +483,13 @@ public final class Matrix3f implements Savable, Cloneable, java.io.Serializable
return fb; return fb;
} }
/**
* Copy all elements of this matrix to a float array.
*
* @param f the array to fill (not null, length >= 9)
* @param columnMajor
* true → column-major order, false → row-major order
*/
public void fillFloatArray(float[] f, boolean columnMajor) { public void fillFloatArray(float[] f, boolean columnMajor) {
if (columnMajor) { if (columnMajor) {
f[0] = m00; f[0] = m00;
@ -1229,6 +1275,13 @@ public final class Matrix3f implements Savable, Cloneable, java.io.Serializable
return true; return true;
} }
/**
* Serialize this matrix to the specified exporter, for example when
* saving to a J3O file.
*
* @param e (not null)
* @throws IOException from the exporter
*/
@Override @Override
public void write(JmeExporter e) throws IOException { public void write(JmeExporter e) throws IOException {
OutputCapsule cap = e.getCapsule(this); OutputCapsule cap = e.getCapsule(this);
@ -1243,6 +1296,13 @@ public final class Matrix3f implements Savable, Cloneable, java.io.Serializable
cap.write(m22, "m22", 1); cap.write(m22, "m22", 1);
} }
/**
* De-serialize this matrix from the specified importer, for example
* when loading from a J3O file.
*
* @param e (not null)
* @throws IOException from the importer
*/
@Override @Override
public void read(JmeImporter e) throws IOException { public void read(JmeImporter e) throws IOException {
InputCapsule cap = e.getCapsule(this); InputCapsule cap = e.getCapsule(this);
@ -1402,6 +1462,11 @@ public final class Matrix3f implements Savable, Cloneable, java.io.Serializable
return true; return true;
} }
/**
* Create a copy of this matrix.
*
* @return a new instance, equivalent to this one
*/
@Override @Override
public Matrix3f clone() { public Matrix3f clone() {
try { try {

@ -59,11 +59,77 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
static final long serialVersionUID = 1; static final long serialVersionUID = 1;
private static final Logger logger = Logger.getLogger(Matrix4f.class.getName()); private static final Logger logger = Logger.getLogger(Matrix4f.class.getName());
public float m00, m01, m02, m03; /**
public float m10, m11, m12, m13; * the element in row 0, column 0
public float m20, m21, m22, m23; */
public float m30, m31, m32, m33; public float m00;
/**
* the element in row 0, column 1
*/
public float m01;
/**
* the element in row 0, column 2
*/
public float m02;
/**
* the element in row 0, column 3
*/
public float m03;
/**
* the element in row 1, column 0
*/
public float m10;
/**
* the element in row 1, column 1
*/
public float m11;
/**
* the element in row 1, column 2
*/
public float m12;
/**
* the element in row 1, column 3
*/
public float m13;
/**
* the element in row 2, column 0
*/
public float m20;
/**
* the element in row 2, column 1
*/
public float m21;
/**
* the element in row 2, column 2
*/
public float m22;
/**
* the element in row 2, column 3
*/
public float m23;
/**
* the element in row 3, column 0
*/
public float m30;
/**
* the element in row 3, column 1
*/
public float m31;
/**
* the element in row 0, column 2
*/
public float m32;
/**
* the element in row 3, column 3
*/
public float m33;
/**
* an instance of the zero matrix (all elements = 0)
*/
public static final Matrix4f ZERO = new Matrix4f(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); public static final Matrix4f ZERO = new Matrix4f(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
/**
* an instance of the identity matrix (diagonals = 1, other elements = 0)
*/
public static final Matrix4f IDENTITY = new Matrix4f(); public static final Matrix4f IDENTITY = new Matrix4f();
/** /**
@ -640,6 +706,11 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
} }
} }
/**
* Generate the transpose of this matrix.
*
* @return a new Matrix4f with its rows and columns transposed
*/
public Matrix4f transpose() { public Matrix4f transpose() {
float[] tmp = new float[16]; float[] tmp = new float[16];
get(tmp, true); get(tmp, true);
@ -754,6 +825,13 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
return fb; return fb;
} }
/**
* Copy the elements of this matrix to a float array.
*
* @param f the array to fill (not null, length >= 16)
* @param columnMajor
* true → column-major order, false → row-major order
*/
public void fillFloatArray(float[] f, boolean columnMajor) { public void fillFloatArray(float[] f, boolean columnMajor) {
if (columnMajor) { if (columnMajor) {
f[0] = m00; f[0] = m00;
@ -975,6 +1053,12 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
m33 *= scalar; m33 *= scalar;
} }
/**
* Multiply this matrix by a scalar.
*
* @param scalar the scaling factor
* @return a new Matrix4f with every element scaled
*/
public Matrix4f mult(float scalar) { public Matrix4f mult(float scalar) {
Matrix4f out = new Matrix4f(); Matrix4f out = new Matrix4f();
out.set(this); out.set(this);
@ -982,6 +1066,13 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
return out; return out;
} }
/**
* Multiply this matrix by a scalar.
*
* @param scalar the scaling factor
* @param store storage for the result (not null, modified)
* @return a scaled matrix (store)
*/
public Matrix4f mult(float scalar, Matrix4f store) { public Matrix4f mult(float scalar, Matrix4f store) {
store.set(this); store.set(this);
store.multLocal(scalar); store.multLocal(scalar);
@ -1544,6 +1635,14 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
return adjoint(null); return adjoint(null);
} }
/**
* Set this matrix to the specified 3-D coordinate transform. The
* effective sequence of operations is: scale, then rotate, then translate.
*
* @param position the desired translation (not null, unaffected)
* @param scale the desired scaling (not null, unaffected)
* @param rotMat the desired rotation (not null, unaffected)
*/
public void setTransform(Vector3f position, Vector3f scale, Matrix3f rotMat) { public void setTransform(Vector3f position, Vector3f scale, Matrix3f rotMat) {
// Ordering: // Ordering:
// 1. Scale // 1. Scale
@ -1651,6 +1750,12 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
return this; return this;
} }
/**
* Calculate the sum of this matrix and another.
*
* @param mat the Matrix4f to add (not null, unaffected)
* @return a new Matrix4f
*/
public Matrix4f add(Matrix4f mat) { public Matrix4f add(Matrix4f mat) {
Matrix4f result = new Matrix4f(); Matrix4f result = new Matrix4f();
result.m00 = this.m00 + mat.m00; result.m00 = this.m00 + mat.m00;
@ -1697,29 +1802,67 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
m33 += mat.m33; m33 += mat.m33;
} }
/**
* Interpret this matrix as a 3-D coordinate transform and determine its
* translation component.
*
* @return a new translation vector
*/
public Vector3f toTranslationVector() { public Vector3f toTranslationVector() {
return new Vector3f(m03, m13, m23); return new Vector3f(m03, m13, m23);
} }
/**
* Interpret this matrix as a 3-D coordinate transform and determine its
* translation component.
*
* @param vector storage for the result (not null, modified)
* @return the translation vector (vector)
*/
public Vector3f toTranslationVector(Vector3f vector) { public Vector3f toTranslationVector(Vector3f vector) {
return vector.set(m03, m13, m23); return vector.set(m03, m13, m23);
} }
/**
* Interpret this matrix as a 3-D coordinate transform and determine its
* rotation component.
*
* @return a new rotation Quaternion
*/
public Quaternion toRotationQuat() { public Quaternion toRotationQuat() {
Quaternion quat = new Quaternion(); Quaternion quat = new Quaternion();
quat.fromRotationMatrix(toRotationMatrix()); quat.fromRotationMatrix(toRotationMatrix());
return quat; return quat;
} }
/**
* Interpret this matrix as a 3-D coordinate transform and determine its
* rotation component.
*
* @param q storage for the result (not null, modified)
* @return the rotation Quaternion (q)
*/
public Quaternion toRotationQuat(Quaternion q) { public Quaternion toRotationQuat(Quaternion q) {
return q.fromRotationMatrix(m00, m01, m02, m10, return q.fromRotationMatrix(m00, m01, m02, m10,
m11, m12, m20, m21, m22); m11, m12, m20, m21, m22);
} }
/**
* Interpret this matrix as a 3-D coordinate transform and determine its
* rotation component.
*
* @return a new rotation matrix
*/
public Matrix3f toRotationMatrix() { public Matrix3f toRotationMatrix() {
return new Matrix3f(m00, m01, m02, m10, m11, m12, m20, m21, m22); return new Matrix3f(m00, m01, m02, m10, m11, m12, m20, m21, m22);
} }
/**
* Interpret this matrix as a 3-D coordinate transform and determine its
* rotation component.
*
* @param mat storage for the result (not null, modified)
*/
public void toRotationMatrix(Matrix3f mat) { public void toRotationMatrix(Matrix3f mat) {
mat.m00 = m00; mat.m00 = m00;
mat.m01 = m01; mat.m01 = m01;
@ -2041,6 +2184,12 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
vec.z = vx * m02 + vy * m12 + vz * m22; vec.z = vx * m02 + vy * m12 + vz * m22;
} }
/**
* Interpret this matrix as a 3-D coordinate transform and apply its
* rotation component to the specified vector.
*
* @param vec the vector to rotate (not null, modified)
*/
public void rotateVect(Vector3f vec) { public void rotateVect(Vector3f vec) {
float vx = vec.x, vy = vec.y, vz = vec.z; float vx = vec.x, vy = vec.y, vz = vec.z;
@ -2209,6 +2358,13 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
return true; return true;
} }
/**
* Serialize this matrix to the specified exporter, for example when
* saving to a J3O file.
*
* @param e (not null)
* @throws IOException from the exporter
*/
@Override @Override
public void write(JmeExporter e) throws IOException { public void write(JmeExporter e) throws IOException {
OutputCapsule cap = e.getCapsule(this); OutputCapsule cap = e.getCapsule(this);
@ -2230,6 +2386,13 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
cap.write(m33, "m33", 1); cap.write(m33, "m33", 1);
} }
/**
* De-serialize this matrix from the specified importer, for example
* when loading from a J3O file.
*
* @param e (not null)
* @throws IOException from the importer
*/
@Override @Override
public void read(JmeImporter e) throws IOException { public void read(JmeImporter e) throws IOException {
InputCapsule cap = e.getCapsule(this); InputCapsule cap = e.getCapsule(this);
@ -2348,6 +2511,11 @@ public final class Matrix4f implements Savable, Cloneable, java.io.Serializable
multLocal(matrix4f); multLocal(matrix4f);
} }
/**
* Create a copy of this matrix.
*
* @return a new instance, equivalent to this one
*/
@Override @Override
public Matrix4f clone() { public Matrix4f clone() {
try { try {

@ -153,6 +153,13 @@ public class Plane implements Savable, Cloneable, java.io.Serializable {
return constant; return constant;
} }
/**
* Find the point in this plane that's nearest to the specified point.
*
* @param point location vector of the input point (not null, unaffected)
* @param store storage for the result (not null, modififed)
* @return a location in this plane (store)
*/
public Vector3f getClosestPoint(Vector3f point, Vector3f store) { public Vector3f getClosestPoint(Vector3f point, Vector3f store) {
// float t = constant - normal.dot(point); // float t = constant - normal.dot(point);
// return store.set(normal).multLocal(t).addLocal(point); // return store.set(normal).multLocal(t).addLocal(point);
@ -160,10 +167,24 @@ public class Plane implements Savable, Cloneable, java.io.Serializable {
return store.set(normal).multLocal(t).addLocal(point); return store.set(normal).multLocal(t).addLocal(point);
} }
/**
* Find the point in this plane that's nearest to the specified point.
*
* @param point location vector of the input point (not null, unaffected)
* @return a new location vector in this plane
*/
public Vector3f getClosestPoint(Vector3f point) { public Vector3f getClosestPoint(Vector3f point) {
return getClosestPoint(point, new Vector3f()); return getClosestPoint(point, new Vector3f());
} }
/**
* Reflect the specified point in this plane.
*
* @param point location vector of the input point (not null, unaffected)
* @param store storage for the result (modififed if not null)
* @return a location vector for the reflected point (either store or a new
* vector)
*/
public Vector3f reflect(Vector3f point, Vector3f store) { public Vector3f reflect(Vector3f point, Vector3f store) {
if (store == null) { if (store == null) {
store = new Vector3f(); store = new Vector3f();
@ -270,6 +291,13 @@ public class Plane implements Savable, Cloneable, java.io.Serializable {
+ constant + "]"; + constant + "]";
} }
/**
* Serialize this plane to the specified exporter, for example when
* saving to a J3O file.
*
* @param e (not null)
* @throws IOException from the exporter
*/
@Override @Override
public void write(JmeExporter e) throws IOException { public void write(JmeExporter e) throws IOException {
OutputCapsule capsule = e.getCapsule(this); OutputCapsule capsule = e.getCapsule(this);
@ -277,6 +305,13 @@ public class Plane implements Savable, Cloneable, java.io.Serializable {
capsule.write(constant, "constant", 0); capsule.write(constant, "constant", 0);
} }
/**
* De-serialize this plane from the specified importer, for example
* when loading from a J3O file.
*
* @param e (not null)
* @throws IOException from the importer
*/
@Override @Override
public void read(JmeImporter e) throws IOException { public void read(JmeImporter e) throws IOException {
InputCapsule capsule = e.getCapsule(this); InputCapsule capsule = e.getCapsule(this);
@ -284,6 +319,11 @@ public class Plane implements Savable, Cloneable, java.io.Serializable {
constant = capsule.readFloat("constant", 0); constant = capsule.readFloat("constant", 0);
} }
/**
* Create a copy of this plane.
*
* @return a new instance, equivalent to this one
*/
@Override @Override
public Plane clone() { public Plane clone() {
try { try {

@ -57,13 +57,34 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl
* Represents the identity quaternion rotation (0, 0, 0, 1). * Represents the identity quaternion rotation (0, 0, 0, 1).
*/ */
public static final Quaternion IDENTITY = new Quaternion(); public static final Quaternion IDENTITY = new Quaternion();
/**
* another instance of the identity Quaternion (0, 0, 0, 1)
*/
public static final Quaternion DIRECTION_Z = new Quaternion(); public static final Quaternion DIRECTION_Z = new Quaternion();
/**
* The zero quaternion (0, 0, 0, 0) doesn't represent any rotation.
*/
public static final Quaternion ZERO = new Quaternion(0, 0, 0, 0); public static final Quaternion ZERO = new Quaternion(0, 0, 0, 0);
static { static {
DIRECTION_Z.fromAxes(Vector3f.UNIT_X, Vector3f.UNIT_Y, Vector3f.UNIT_Z); DIRECTION_Z.fromAxes(Vector3f.UNIT_X, Vector3f.UNIT_Y, Vector3f.UNIT_Z);
} }
protected float x, y, z, w; /**
* the X component (not an angle!)
*/
protected float x;
/**
* the Y component (not an angle!)
*/
protected float y;
/**
* the Z component (not an angle!)
*/
protected float z;
/**
* the W (real) component (not an angle!)
*/
protected float w;
/** /**
* Constructor instantiates a new <code>Quaternion</code> object * Constructor instantiates a new <code>Quaternion</code> object
@ -93,18 +114,38 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl
this.w = w; this.w = w;
} }
/**
* Determine the X component.
*
* @return x
*/
public float getX() { public float getX() {
return x; return x;
} }
/**
* Determine the Y component.
*
* @return y
*/
public float getY() { public float getY() {
return y; return y;
} }
/**
* Determine the Z component.
*
* @return z
*/
public float getZ() { public float getZ() {
return z; return z;
} }
/**
* Determine the W (real) component.
*
* @return w
*/
public float getW() { public float getW() {
return w; return w;
} }
@ -317,6 +358,21 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl
matrix.m11, matrix.m12, matrix.m20, matrix.m21, matrix.m22); matrix.m11, matrix.m12, matrix.m20, matrix.m21, matrix.m22);
} }
/**
* Set this quaternion based on a rotation matrix with the specified
* elements.
*
* @param m00 the matrix element in row 0, column 0
* @param m01 the matrix element in row 0, column 1
* @param m02 the matrix element in row 0, column 2
* @param m10 the matrix element in row 1, column 0
* @param m11 the matrix element in row 1, column 1
* @param m12 the matrix element in row 1, column 2
* @param m20 the matrix element in row 2, column 0
* @param m21 the matrix element in row 2, column 1
* @param m22 the matrix element in row 2, column 2
* @return this Quaternion
*/
public Quaternion fromRotationMatrix(float m00, float m01, float m02, public Quaternion fromRotationMatrix(float m00, float m01, float m02,
float m10, float m11, float m12, float m20, float m21, float m22) { float m10, float m11, float m12, float m20, float m21, float m22) {
// first normalize the forward (F), up (U) and side (S) vectors of the rotation matrix // first normalize the forward (F), up (U) and side (S) vectors of the rotation matrix
@ -1357,6 +1413,13 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl
return this; return this;
} }
/**
* Serialize this quaternion to the specified exporter, for example when
* saving to a J3O file.
*
* @param e (not null)
* @throws IOException from the exporter
*/
@Override @Override
public void write(JmeExporter e) throws IOException { public void write(JmeExporter e) throws IOException {
OutputCapsule cap = e.getCapsule(this); OutputCapsule cap = e.getCapsule(this);
@ -1366,6 +1429,13 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl
cap.write(w, "w", 1); cap.write(w, "w", 1);
} }
/**
* De-serialize this quaternion from the specified importer, for example
* when loading from a J3O file.
*
* @param e (not null)
* @throws IOException from the importer
*/
@Override @Override
public void read(JmeImporter e) throws IOException { public void read(JmeImporter e) throws IOException {
InputCapsule cap = e.getCapsule(this); InputCapsule cap = e.getCapsule(this);
@ -1413,6 +1483,11 @@ public final class Quaternion implements Savable, Cloneable, java.io.Serializabl
return opposite(this); return opposite(this);
} }
/**
* Create a copy of this quaternion.
*
* @return a new instance, equivalent to this one
*/
@Override @Override
public Quaternion clone() { public Quaternion clone() {
try { try {

@ -63,7 +63,9 @@ public final class Ray implements Savable, Cloneable, Collidable, java.io.Serial
*/ */
public Vector3f direction = new Vector3f(0, 0, 1); public Vector3f direction = new Vector3f(0, 0, 1);
/**
* The length of the ray (defaults to +Infinity).
*/
public float limit = Float.POSITIVE_INFINITY; public float limit = Float.POSITIVE_INFINITY;
/** /**
@ -493,11 +495,25 @@ public final class Ray implements Savable, Cloneable, Collidable, java.io.Serial
direction.set(source.getDirection()); direction.set(source.getDirection());
} }
/**
* Represent this ray as a String. The format is:
*
* Ray [Origin: (X.X, Y.Y, Z.Z), Direction: (X.X, Y.Y, Z.Z)]
*
* @return a descriptive string of text (not null, not empty)
*/
@Override @Override
public String toString() { public String toString() {
return getClass().getSimpleName() + " [Origin: " + origin + ", Direction: " + direction + "]"; return getClass().getSimpleName() + " [Origin: " + origin + ", Direction: " + direction + "]";
} }
/**
* Serialize this ray to the specified exporter, for example when
* saving to a J3O file.
*
* @param e (not null)
* @throws IOException from the exporter
*/
@Override @Override
public void write(JmeExporter e) throws IOException { public void write(JmeExporter e) throws IOException {
OutputCapsule capsule = e.getCapsule(this); OutputCapsule capsule = e.getCapsule(this);
@ -505,6 +521,13 @@ public final class Ray implements Savable, Cloneable, Collidable, java.io.Serial
capsule.write(direction, "direction", Vector3f.ZERO); capsule.write(direction, "direction", Vector3f.ZERO);
} }
/**
* De-serialize this ray from the specified importer, for example
* when loading from a J3O file.
*
* @param e (not null)
* @throws IOException from the importer
*/
@Override @Override
public void read(JmeImporter e) throws IOException { public void read(JmeImporter e) throws IOException {
InputCapsule capsule = e.getCapsule(this); InputCapsule capsule = e.getCapsule(this);
@ -512,6 +535,11 @@ public final class Ray implements Savable, Cloneable, Collidable, java.io.Serial
direction = (Vector3f) capsule.readSavable("direction", Vector3f.ZERO.clone()); direction = (Vector3f) capsule.readSavable("direction", Vector3f.ZERO.clone());
} }
/**
* Create a copy of this ray.
*
* @return a new instance, equivalent to this one
*/
@Override @Override
public Ray clone() { public Ray clone() {
try { try {

Loading…
Cancel
Save