Feature: added support for linear and constant interpolation types for
ipo curves.
This commit is contained in:
parent
a5c98a59be
commit
15ec285b1a
@ -1,10 +1,11 @@
|
||||
package com.jme3.scene.plugins.blender.curves;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.jme3.math.Vector3f;
|
||||
import com.jme3.scene.plugins.blender.file.DynamicArray;
|
||||
import com.jme3.scene.plugins.blender.file.Structure;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A class that helps to calculate the bezier curves calues. It uses doubles for performing calculations to minimize
|
||||
@ -12,21 +13,26 @@ import java.util.List;
|
||||
* @author Marcin Roguski (Kaelthas)
|
||||
*/
|
||||
public class BezierCurve {
|
||||
private static final int IPO_CONSTANT = 0;
|
||||
private static final int IPO_LINEAR = 1;
|
||||
private static final int IPO_BEZIER = 2;
|
||||
|
||||
public static final int X_VALUE = 0;
|
||||
public static final int Y_VALUE = 1;
|
||||
public static final int Z_VALUE = 2;
|
||||
public static final int X_VALUE = 0;
|
||||
public static final int Y_VALUE = 1;
|
||||
public static final int Z_VALUE = 2;
|
||||
/**
|
||||
* The type of the curve. Describes the data it modifies.
|
||||
* Used in ipos calculations.
|
||||
*/
|
||||
private int type;
|
||||
private int type;
|
||||
/** The dimension of the curve. */
|
||||
private int dimension;
|
||||
private int dimension;
|
||||
/** A table of the bezier points. */
|
||||
private double[][][] bezierPoints;
|
||||
private double[][][] bezierPoints;
|
||||
/** Array that stores a radius for each bezier triple. */
|
||||
private double[] radiuses;
|
||||
private double[] radiuses;
|
||||
/** Interpolation types of the bezier triples. */
|
||||
private int[] interpolations;
|
||||
|
||||
public BezierCurve(final int type, final List<Structure> bezTriples, final int dimension) {
|
||||
this(type, bezTriples, dimension, false);
|
||||
@ -44,6 +50,7 @@ public class BezierCurve {
|
||||
// the third index specifies the coordinates of the specific point in a bezier triple
|
||||
bezierPoints = new double[bezTriples.size()][3][dimension];
|
||||
radiuses = new double[bezTriples.size()];
|
||||
interpolations = new int[bezTriples.size()];
|
||||
int i = 0, j, k;
|
||||
for (Structure bezTriple : bezTriples) {
|
||||
DynamicArray<Number> vec = (DynamicArray<Number>) bezTriple.getFieldValue("vec");
|
||||
@ -57,7 +64,8 @@ public class BezierCurve {
|
||||
bezierPoints[i][j][1] = temp;
|
||||
}
|
||||
}
|
||||
radiuses[i++] = ((Number) bezTriple.getFieldValue("radius")).floatValue();
|
||||
radiuses[i] = ((Number) bezTriple.getFieldValue("radius")).floatValue();
|
||||
interpolations[i++] = ((Number) bezTriple.getFieldValue("ipo", IPO_BEZIER)).intValue();
|
||||
}
|
||||
}
|
||||
|
||||
@ -75,10 +83,19 @@ public class BezierCurve {
|
||||
for (int i = 0; i < bezierPoints.length - 1; ++i) {
|
||||
if (frame >= bezierPoints[i][1][0] && frame <= bezierPoints[i + 1][1][0]) {
|
||||
double t = (frame - bezierPoints[i][1][0]) / (bezierPoints[i + 1][1][0] - bezierPoints[i][1][0]);
|
||||
double oneMinusT = 1.0f - t;
|
||||
double oneMinusT2 = oneMinusT * oneMinusT;
|
||||
double t2 = t * t;
|
||||
return bezierPoints[i][1][valuePart] * oneMinusT2 * oneMinusT + 3.0f * bezierPoints[i][2][valuePart] * t * oneMinusT2 + 3.0f * bezierPoints[i + 1][0][valuePart] * t2 * oneMinusT + bezierPoints[i + 1][1][valuePart] * t2 * t;
|
||||
switch (interpolations[i]) {
|
||||
case IPO_BEZIER:
|
||||
double oneMinusT = 1.0f - t;
|
||||
double oneMinusT2 = oneMinusT * oneMinusT;
|
||||
double t2 = t * t;
|
||||
return bezierPoints[i][1][valuePart] * oneMinusT2 * oneMinusT + 3.0f * bezierPoints[i][2][valuePart] * t * oneMinusT2 + 3.0f * bezierPoints[i + 1][0][valuePart] * t2 * oneMinusT + bezierPoints[i + 1][1][valuePart] * t2 * t;
|
||||
case IPO_LINEAR:
|
||||
return (1f - t) * bezierPoints[i][1][valuePart] + t * bezierPoints[i + 1][1][valuePart];
|
||||
case IPO_CONSTANT:
|
||||
return bezierPoints[i][1][valuePart];
|
||||
default:
|
||||
throw new IllegalStateException("Unknown interpolation type for curve: " + interpolations[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (frame < bezierPoints[0][1][0]) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user