* AudioNode now takes AudioRenderer in its constructor to allow audio.play() functionality git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7333 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
33dac750d7
commit
6196de22f7
@ -1,131 +0,0 @@ |
|||||||
<?xml version="1.0" encoding="UTF-8"?> |
|
||||||
<!-- |
|
||||||
*** GENERATED FROM project.xml - DO NOT EDIT *** |
|
||||||
*** EDIT ../build.xml INSTEAD *** |
|
||||||
|
|
||||||
For the purpose of easier reading the script |
|
||||||
is divided into following sections: |
|
||||||
|
|
||||||
- initialization |
|
||||||
- profiling |
|
||||||
- applet profiling |
|
||||||
|
|
||||||
--> |
|
||||||
<project name="-profiler-impl" default="profile" basedir=".."> |
|
||||||
<target name="default" depends="profile" description="Build and profile the project."/> |
|
||||||
<!-- |
|
||||||
====================== |
|
||||||
INITIALIZATION SECTION |
|
||||||
====================== |
|
||||||
--> |
|
||||||
<target name="profile-init" depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check"/> |
|
||||||
<target name="-profile-pre-init"> |
|
||||||
<!-- Empty placeholder for easier customization. --> |
|
||||||
<!-- You can override this target in the ../build.xml file. --> |
|
||||||
</target> |
|
||||||
<target name="-profile-post-init"> |
|
||||||
<!-- Empty placeholder for easier customization. --> |
|
||||||
<!-- You can override this target in the ../build.xml file. --> |
|
||||||
</target> |
|
||||||
<target name="-profile-init-macrodef-profile"> |
|
||||||
<macrodef name="resolve"> |
|
||||||
<attribute name="name"/> |
|
||||||
<attribute name="value"/> |
|
||||||
<sequential> |
|
||||||
<property name="@{name}" value="${env.@{value}}"/> |
|
||||||
</sequential> |
|
||||||
</macrodef> |
|
||||||
<macrodef name="profile"> |
|
||||||
<attribute name="classname" default="${main.class}"/> |
|
||||||
<element name="customize" optional="true"/> |
|
||||||
<sequential> |
|
||||||
<property environment="env"/> |
|
||||||
<resolve name="profiler.current.path" value="${profiler.info.pathvar}"/> |
|
||||||
<java fork="true" classname="@{classname}" dir="${profiler.info.dir}" jvm="${profiler.info.jvm}"> |
|
||||||
<jvmarg value="${profiler.info.jvmargs.agent}"/> |
|
||||||
<jvmarg line="${profiler.info.jvmargs}"/> |
|
||||||
<env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/> |
|
||||||
<arg line="${application.args}"/> |
|
||||||
<classpath> |
|
||||||
<path path="${run.classpath}"/> |
|
||||||
</classpath> |
|
||||||
<syspropertyset> |
|
||||||
<propertyref prefix="run-sys-prop."/> |
|
||||||
<mapper type="glob" from="run-sys-prop.*" to="*"/> |
|
||||||
</syspropertyset> |
|
||||||
<customize/> |
|
||||||
</java> |
|
||||||
</sequential> |
|
||||||
</macrodef> |
|
||||||
</target> |
|
||||||
<target name="-profile-init-check" depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile"> |
|
||||||
<fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail> |
|
||||||
<fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail> |
|
||||||
</target> |
|
||||||
<!-- |
|
||||||
================= |
|
||||||
PROFILING SECTION |
|
||||||
================= |
|
||||||
--> |
|
||||||
<target name="profile" if="netbeans.home" depends="profile-init,compile" description="Profile a project in the IDE."> |
|
||||||
<nbprofiledirect> |
|
||||||
<classpath> |
|
||||||
<path path="${run.classpath}"/> |
|
||||||
</classpath> |
|
||||||
</nbprofiledirect> |
|
||||||
<profile/> |
|
||||||
</target> |
|
||||||
<target name="profile-single" if="netbeans.home" depends="profile-init,compile-single" description="Profile a selected class in the IDE."> |
|
||||||
<fail unless="profile.class">Must select one file in the IDE or set profile.class</fail> |
|
||||||
<nbprofiledirect> |
|
||||||
<classpath> |
|
||||||
<path path="${run.classpath}"/> |
|
||||||
</classpath> |
|
||||||
</nbprofiledirect> |
|
||||||
<profile classname="${profile.class}"/> |
|
||||||
</target> |
|
||||||
<!-- |
|
||||||
========================= |
|
||||||
APPLET PROFILING SECTION |
|
||||||
========================= |
|
||||||
--> |
|
||||||
<target name="profile-applet" if="netbeans.home" depends="profile-init,compile-single"> |
|
||||||
<nbprofiledirect> |
|
||||||
<classpath> |
|
||||||
<path path="${run.classpath}"/> |
|
||||||
</classpath> |
|
||||||
</nbprofiledirect> |
|
||||||
<profile classname="sun.applet.AppletViewer"> |
|
||||||
<customize> |
|
||||||
<arg value="${applet.url}"/> |
|
||||||
</customize> |
|
||||||
</profile> |
|
||||||
</target> |
|
||||||
<!-- |
|
||||||
========================= |
|
||||||
TESTS PROFILING SECTION |
|
||||||
========================= |
|
||||||
--> |
|
||||||
<target name="profile-test-single" if="netbeans.home" depends="profile-init,compile-test-single"> |
|
||||||
<nbprofiledirect> |
|
||||||
<classpath> |
|
||||||
<path path="${run.test.classpath}"/> |
|
||||||
</classpath> |
|
||||||
</nbprofiledirect> |
|
||||||
<junit showoutput="true" fork="true" dir="${profiler.info.dir}" jvm="${profiler.info.jvm}" failureproperty="tests.failed" errorproperty="tests.failed"> |
|
||||||
<env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/> |
|
||||||
<jvmarg value="${profiler.info.jvmargs.agent}"/> |
|
||||||
<jvmarg line="${profiler.info.jvmargs}"/> |
|
||||||
<test name="${profile.class}"/> |
|
||||||
<classpath> |
|
||||||
<path path="${run.test.classpath}"/> |
|
||||||
</classpath> |
|
||||||
<syspropertyset> |
|
||||||
<propertyref prefix="test-sys-prop."/> |
|
||||||
<mapper type="glob" from="test-sys-prop.*" to="*"/> |
|
||||||
</syspropertyset> |
|
||||||
<formatter type="brief" usefile="false"/> |
|
||||||
<formatter type="xml"/> |
|
||||||
</junit> |
|
||||||
</target> |
|
||||||
</project> |
|
@ -1,885 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2010 jMonkeyEngine |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* * Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
|
||||||
* may be used to endorse or promote products derived from this software |
|
||||||
* without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
package com.jme3.animation; |
|
||||||
|
|
||||||
import com.jme3.asset.AssetManager; |
|
||||||
import com.jme3.export.InputCapsule; |
|
||||||
import com.jme3.export.JmeExporter; |
|
||||||
import com.jme3.export.JmeImporter; |
|
||||||
import com.jme3.export.OutputCapsule; |
|
||||||
import com.jme3.material.Material; |
|
||||||
import com.jme3.math.ColorRGBA; |
|
||||||
import com.jme3.math.FastMath; |
|
||||||
import com.jme3.math.Quaternion; |
|
||||||
import com.jme3.math.Vector3f; |
|
||||||
import com.jme3.renderer.RenderManager; |
|
||||||
import com.jme3.renderer.ViewPort; |
|
||||||
import com.jme3.scene.Geometry; |
|
||||||
import com.jme3.scene.Mesh; |
|
||||||
import com.jme3.scene.Node; |
|
||||||
import com.jme3.scene.Spatial; |
|
||||||
import com.jme3.scene.VertexBuffer; |
|
||||||
import com.jme3.scene.control.AbstractControl; |
|
||||||
import com.jme3.scene.control.Control; |
|
||||||
import com.jme3.scene.shape.Box; |
|
||||||
import java.io.IOException; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.Iterator; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* |
|
||||||
* |
|
||||||
* @deprecated use {@link MotionPath} |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public class AnimationPath extends AbstractControl { |
|
||||||
|
|
||||||
private boolean playing = false; |
|
||||||
private int currentWayPoint; |
|
||||||
private float currentValue; |
|
||||||
private List<Vector3f> wayPoints = new ArrayList<Vector3f>(); |
|
||||||
private Node debugNode; |
|
||||||
private AssetManager assetManager; |
|
||||||
private List<AnimationPathListener> listeners; |
|
||||||
private Vector3f curveDirection; |
|
||||||
private Vector3f lookAt; |
|
||||||
private Vector3f upVector; |
|
||||||
private Quaternion rotation; |
|
||||||
private float duration = 5f; |
|
||||||
private List<Float> segmentsLength; |
|
||||||
private float totalLength; |
|
||||||
private List<Vector3f> CRcontrolPoints; |
|
||||||
private float speed; |
|
||||||
private float curveTension = 0.5f; |
|
||||||
private boolean loop = false; |
|
||||||
private boolean cycle = false; |
|
||||||
|
|
||||||
@Override |
|
||||||
protected void controlUpdate(float tpf) { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected void controlRender(RenderManager rm, ViewPort vp) { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Enum for the different type of target direction behavior |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public enum Direction { |
|
||||||
|
|
||||||
/** |
|
||||||
* the target stay in the starting direction |
|
||||||
*/ |
|
||||||
None, |
|
||||||
/** |
|
||||||
* The target rotates with the direction of the path |
|
||||||
*/ |
|
||||||
Path, |
|
||||||
/** |
|
||||||
* The target rotates with the direction of the path but with the additon of a rtotation |
|
||||||
* you need to use the setRotation mathod when using this Direction |
|
||||||
*/ |
|
||||||
PathAndRotation, |
|
||||||
/** |
|
||||||
* The target rotates with the given rotation |
|
||||||
*/ |
|
||||||
Rotation, |
|
||||||
/** |
|
||||||
* The target looks at a point |
|
||||||
* You need to use the setLookAt method when using this direction |
|
||||||
*/ |
|
||||||
LookAt |
|
||||||
} |
|
||||||
private Direction directionType = Direction.None; |
|
||||||
|
|
||||||
@Deprecated |
|
||||||
public enum PathInterpolation { |
|
||||||
|
|
||||||
/** |
|
||||||
* Compute a linear path between the waypoints |
|
||||||
*/ |
|
||||||
Linear, |
|
||||||
/** |
|
||||||
* Compute a Catmull-Rom spline path between the waypoints |
|
||||||
* see http://www.mvps.org/directx/articles/catmull/
|
|
||||||
*/ |
|
||||||
CatmullRom |
|
||||||
} |
|
||||||
private PathInterpolation pathInterpolation = PathInterpolation.CatmullRom; |
|
||||||
|
|
||||||
/** |
|
||||||
* Create an animation Path for this target |
|
||||||
* @param target |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public AnimationPath(Spatial target) { |
|
||||||
super(); |
|
||||||
this.spatial = target; |
|
||||||
target.addControl(this); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* don't use this contructor use AnimationPath(Spatial target) |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public AnimationPath() { |
|
||||||
super(); |
|
||||||
} |
|
||||||
|
|
||||||
@Deprecated |
|
||||||
public Control cloneForSpatial(Spatial spatial) { |
|
||||||
AnimationPath path = new AnimationPath(spatial); |
|
||||||
for (Iterator<Vector3f> it = wayPoints.iterator(); it.hasNext();) { |
|
||||||
Vector3f vector3f = it.next(); |
|
||||||
path.addWayPoint(vector3f); |
|
||||||
} |
|
||||||
for (Iterator<AnimationPathListener> it = listeners.iterator(); it.hasNext();) { |
|
||||||
AnimationPathListener animationPathListener = it.next(); |
|
||||||
path.addListener(animationPathListener); |
|
||||||
} |
|
||||||
return path; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void setSpatial(Spatial spatial) { |
|
||||||
this.spatial = spatial; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void setEnabled(boolean enabled) { |
|
||||||
this.enabled = enabled; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean isEnabled() { |
|
||||||
return enabled; |
|
||||||
} |
|
||||||
float eps = 0.0001f; |
|
||||||
|
|
||||||
/** |
|
||||||
* Cal each update, don't call this method, it's for internal use only |
|
||||||
* @param tpf |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public void update(float tpf) { |
|
||||||
|
|
||||||
if (enabled) { |
|
||||||
if (playing) { |
|
||||||
spatial.setLocalTranslation(interpolatePath(tpf)); |
|
||||||
computeTargetDirection(); |
|
||||||
|
|
||||||
if (currentValue >= 1.0f) { |
|
||||||
currentValue = 0; |
|
||||||
currentWayPoint++; |
|
||||||
triggerWayPointReach(currentWayPoint); |
|
||||||
} |
|
||||||
if (currentWayPoint == wayPoints.size() - 1) { |
|
||||||
if (loop) { |
|
||||||
currentWayPoint = 0; |
|
||||||
} else { |
|
||||||
stop(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private Vector3f interpolatePath(float tpf) { |
|
||||||
Vector3f temp = null; |
|
||||||
float val; |
|
||||||
switch (pathInterpolation) { |
|
||||||
case CatmullRom: |
|
||||||
|
|
||||||
val = tpf * speed; |
|
||||||
currentValue += eps; |
|
||||||
temp = FastMath.interpolateCatmullRom(currentValue, curveTension, CRcontrolPoints.get(currentWayPoint), CRcontrolPoints.get(currentWayPoint + 1), CRcontrolPoints.get(currentWayPoint + 2), CRcontrolPoints.get(currentWayPoint + 3)); |
|
||||||
float dist = temp.subtract(spatial.getLocalTranslation()).length(); |
|
||||||
|
|
||||||
while (dist < val) { |
|
||||||
currentValue += eps; |
|
||||||
temp = FastMath.interpolateCatmullRom(currentValue, curveTension, CRcontrolPoints.get(currentWayPoint), CRcontrolPoints.get(currentWayPoint + 1), CRcontrolPoints.get(currentWayPoint + 2), CRcontrolPoints.get(currentWayPoint + 3)); |
|
||||||
dist = temp.subtract(spatial.getLocalTranslation()).length(); |
|
||||||
} |
|
||||||
if (directionType == Direction.Path || directionType == Direction.PathAndRotation) { |
|
||||||
curveDirection = temp.subtract(spatial.getLocalTranslation()).normalizeLocal(); |
|
||||||
} |
|
||||||
break; |
|
||||||
case Linear: |
|
||||||
val = duration * segmentsLength.get(currentWayPoint) / totalLength; |
|
||||||
currentValue = Math.min(currentValue + tpf / val, 1.0f); |
|
||||||
temp = FastMath.interpolateLinear(currentValue, wayPoints.get(currentWayPoint), wayPoints.get(currentWayPoint + 1)); |
|
||||||
curveDirection = wayPoints.get(currentWayPoint + 1).subtract(wayPoints.get(currentWayPoint)).normalizeLocal(); |
|
||||||
break; |
|
||||||
default: |
|
||||||
break; |
|
||||||
} |
|
||||||
return temp; |
|
||||||
} |
|
||||||
|
|
||||||
private void computeTargetDirection() { |
|
||||||
switch (directionType) { |
|
||||||
case Path: |
|
||||||
Quaternion q = new Quaternion(); |
|
||||||
q.lookAt(curveDirection, Vector3f.UNIT_Y); |
|
||||||
spatial.setLocalRotation(q); |
|
||||||
break; |
|
||||||
case LookAt: |
|
||||||
if (lookAt != null) { |
|
||||||
spatial.lookAt(lookAt, upVector); |
|
||||||
} |
|
||||||
break; |
|
||||||
case PathAndRotation: |
|
||||||
if (rotation != null) { |
|
||||||
Quaternion q2 = new Quaternion(); |
|
||||||
q2.lookAt(curveDirection, Vector3f.UNIT_Y); |
|
||||||
q2.multLocal(rotation); |
|
||||||
spatial.setLocalRotation(q2); |
|
||||||
} |
|
||||||
break; |
|
||||||
case Rotation: |
|
||||||
if (rotation != null) { |
|
||||||
spatial.setLocalRotation(rotation); |
|
||||||
} |
|
||||||
break; |
|
||||||
case None: |
|
||||||
break; |
|
||||||
default: |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private void attachDebugNode(Node root) { |
|
||||||
if (debugNode == null) { |
|
||||||
debugNode = new Node("AnimationPathFor" + spatial.getName()); |
|
||||||
Material m = assetManager.loadMaterial("Common/Materials/RedColor.j3m"); |
|
||||||
for (Iterator<Vector3f> it = wayPoints.iterator(); it.hasNext();) { |
|
||||||
Vector3f cp = it.next(); |
|
||||||
Geometry geo = new Geometry("box", new Box(cp, 0.3f, 0.3f, 0.3f)); |
|
||||||
geo.setMaterial(m); |
|
||||||
debugNode.attachChild(geo); |
|
||||||
|
|
||||||
} |
|
||||||
switch (pathInterpolation) { |
|
||||||
case CatmullRom: |
|
||||||
debugNode.attachChild(CreateCatmullRomPath()); |
|
||||||
break; |
|
||||||
case Linear: |
|
||||||
debugNode.attachChild(CreateLinearPath()); |
|
||||||
break; |
|
||||||
default: |
|
||||||
debugNode.attachChild(CreateLinearPath()); |
|
||||||
break; |
|
||||||
} |
|
||||||
|
|
||||||
root.attachChild(debugNode); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private Geometry CreateLinearPath() { |
|
||||||
|
|
||||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/WireColor.j3md"); |
|
||||||
mat.setColor("Color", ColorRGBA.Blue); |
|
||||||
|
|
||||||
float[] array = new float[wayPoints.size() * 3]; |
|
||||||
short[] indices = new short[(wayPoints.size() - 1) * 2]; |
|
||||||
int i = 0; |
|
||||||
int cpt = 0; |
|
||||||
int k = 0; |
|
||||||
int j = 0; |
|
||||||
for (Iterator<Vector3f> it = wayPoints.iterator(); it.hasNext();) { |
|
||||||
Vector3f vector3f = it.next(); |
|
||||||
array[i] = vector3f.x; |
|
||||||
i++; |
|
||||||
array[i] = vector3f.y; |
|
||||||
i++; |
|
||||||
array[i] = vector3f.z; |
|
||||||
i++; |
|
||||||
if (it.hasNext()) { |
|
||||||
k = j; |
|
||||||
indices[cpt] = (short) k; |
|
||||||
cpt++; |
|
||||||
k++; |
|
||||||
indices[cpt] = (short) k; |
|
||||||
cpt++; |
|
||||||
j++; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
Mesh lineMesh = new Mesh(); |
|
||||||
lineMesh.setMode(Mesh.Mode.Lines); |
|
||||||
lineMesh.setBuffer(VertexBuffer.Type.Position, 3, array); |
|
||||||
lineMesh.setBuffer(VertexBuffer.Type.Index, (wayPoints.size() - 1) * 2, indices); |
|
||||||
lineMesh.updateBound(); |
|
||||||
lineMesh.updateCounts(); |
|
||||||
|
|
||||||
Geometry lineGeometry = new Geometry("line", lineMesh); |
|
||||||
lineGeometry.setMaterial(mat); |
|
||||||
return lineGeometry; |
|
||||||
} |
|
||||||
|
|
||||||
private Geometry CreateCatmullRomPath() { |
|
||||||
|
|
||||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/WireColor.j3md"); |
|
||||||
mat.setColor("Color", ColorRGBA.Blue); |
|
||||||
int nbSubSegments = 10; |
|
||||||
|
|
||||||
float[] array = new float[(((wayPoints.size() - 1) * nbSubSegments) + 1) * 3]; |
|
||||||
short[] indices = new short[((wayPoints.size() - 1) * nbSubSegments) * 2]; |
|
||||||
int i = 0; |
|
||||||
int cptCP = 0; |
|
||||||
for (Iterator<Vector3f> it = wayPoints.iterator(); it.hasNext();) { |
|
||||||
Vector3f vector3f = it.next(); |
|
||||||
array[i] = vector3f.x; |
|
||||||
i++; |
|
||||||
array[i] = vector3f.y; |
|
||||||
i++; |
|
||||||
array[i] = vector3f.z; |
|
||||||
i++; |
|
||||||
if (it.hasNext()) { |
|
||||||
for (int j = 1; j < nbSubSegments; j++) { |
|
||||||
Vector3f temp = FastMath.interpolateCatmullRom((float) j / nbSubSegments, curveTension, CRcontrolPoints.get(cptCP), |
|
||||||
CRcontrolPoints.get(cptCP + 1), CRcontrolPoints.get(cptCP + 2), CRcontrolPoints.get(cptCP + 3)); |
|
||||||
array[i] = temp.x; |
|
||||||
i++; |
|
||||||
array[i] = temp.y; |
|
||||||
i++; |
|
||||||
array[i] = temp.z; |
|
||||||
i++; |
|
||||||
} |
|
||||||
} |
|
||||||
cptCP++; |
|
||||||
} |
|
||||||
|
|
||||||
i = 0; |
|
||||||
int k = 0; |
|
||||||
for (int j = 0; j < ((wayPoints.size() - 1) * nbSubSegments); j++) { |
|
||||||
k = j; |
|
||||||
indices[i] = (short) k; |
|
||||||
i++; |
|
||||||
k++; |
|
||||||
indices[i] = (short) k; |
|
||||||
i++; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Mesh lineMesh = new Mesh(); |
|
||||||
lineMesh.setMode(Mesh.Mode.Lines); |
|
||||||
lineMesh.setBuffer(VertexBuffer.Type.Position, 3, array); |
|
||||||
lineMesh.setBuffer(VertexBuffer.Type.Index, ((wayPoints.size() - 1) * nbSubSegments) * 2, indices); |
|
||||||
lineMesh.updateBound(); |
|
||||||
lineMesh.updateCounts(); |
|
||||||
|
|
||||||
Geometry lineGeometry = new Geometry("line", lineMesh); |
|
||||||
lineGeometry.setMaterial(mat); |
|
||||||
return lineGeometry; |
|
||||||
} |
|
||||||
|
|
||||||
private void initCatmullRomWayPoints(List<Vector3f> list) { |
|
||||||
if (CRcontrolPoints == null) { |
|
||||||
CRcontrolPoints = new ArrayList<Vector3f>(); |
|
||||||
} else { |
|
||||||
CRcontrolPoints.clear(); |
|
||||||
} |
|
||||||
int nb = list.size() - 1; |
|
||||||
|
|
||||||
if (cycle) { |
|
||||||
CRcontrolPoints.add(list.get(list.size() - 2)); |
|
||||||
} else { |
|
||||||
CRcontrolPoints.add(list.get(0).subtract(list.get(1).subtract(list.get(0)))); |
|
||||||
} |
|
||||||
|
|
||||||
for (Iterator<Vector3f> it = list.iterator(); it.hasNext();) { |
|
||||||
Vector3f vector3f = it.next(); |
|
||||||
CRcontrolPoints.add(vector3f); |
|
||||||
} |
|
||||||
if (cycle) { |
|
||||||
CRcontrolPoints.add(list.get(1)); |
|
||||||
} else { |
|
||||||
CRcontrolPoints.add(list.get(nb).add(list.get(nb).subtract(list.get(nb - 1)))); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void render(RenderManager rm, ViewPort vp) { |
|
||||||
//nothing to render
|
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void write(JmeExporter ex) throws IOException { |
|
||||||
super.write(ex); |
|
||||||
OutputCapsule oc = ex.getCapsule(this); |
|
||||||
oc.writeSavableArrayList((ArrayList) wayPoints, "wayPoints", null); |
|
||||||
oc.write(lookAt, "lookAt", Vector3f.ZERO); |
|
||||||
oc.write(upVector, "upVector", Vector3f.UNIT_Y); |
|
||||||
oc.write(rotation, "rotation", Quaternion.IDENTITY); |
|
||||||
oc.write(duration, "duration", 5f); |
|
||||||
oc.write(directionType, "directionType", Direction.None); |
|
||||||
oc.write(pathInterpolation, "pathInterpolation", PathInterpolation.CatmullRom); |
|
||||||
float list[]=new float[segmentsLength.size()]; |
|
||||||
for (int i=0;i<segmentsLength.size();i++) { |
|
||||||
list[i]=segmentsLength.get(i); |
|
||||||
} |
|
||||||
oc.write(list, "segmentsLength", null); |
|
||||||
|
|
||||||
oc.write(totalLength, "totalLength", 0); |
|
||||||
oc.writeSavableArrayList((ArrayList) CRcontrolPoints, "CRControlPoints", null); |
|
||||||
oc.write(speed, "speed", 0); |
|
||||||
oc.write(curveTension, "curveTension", 0.5f); |
|
||||||
oc.write(cycle, "cycle", false); |
|
||||||
oc.write(loop, "loop", false); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void read(JmeImporter im) throws IOException { |
|
||||||
super.read(im); |
|
||||||
InputCapsule in = im.getCapsule(this); |
|
||||||
|
|
||||||
wayPoints = (ArrayList<Vector3f>) in.readSavableArrayList("wayPoints", null); |
|
||||||
lookAt = (Vector3f) in.readSavable("lookAt", Vector3f.ZERO); |
|
||||||
upVector = (Vector3f) in.readSavable("upVector", Vector3f.UNIT_Y); |
|
||||||
rotation = (Quaternion) in.readSavable("rotation", Quaternion.IDENTITY); |
|
||||||
duration = in.readFloat("duration", 5f); |
|
||||||
float list[]=in.readFloatArray("segmentsLength", null); |
|
||||||
if (list!=null){ |
|
||||||
segmentsLength=new ArrayList<Float>(); |
|
||||||
for (int i=0;i<list.length;i++) { |
|
||||||
segmentsLength.add(new Float(list[i])); |
|
||||||
} |
|
||||||
} |
|
||||||
directionType=in.readEnum("directionType",Direction.class, Direction.None); |
|
||||||
pathInterpolation= in.readEnum("pathInterpolation", PathInterpolation.class,PathInterpolation.CatmullRom); |
|
||||||
totalLength = in.readFloat("totalLength", 0); |
|
||||||
CRcontrolPoints = (ArrayList<Vector3f>) in.readSavableArrayList("CRControlPoints", null); |
|
||||||
speed = in.readFloat("speed", 0); |
|
||||||
curveTension = in.readFloat("curveTension", 0.5f); |
|
||||||
cycle = in.readBoolean("cycle", false); |
|
||||||
loop = in.readBoolean("loop", false); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* plays the animation |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void play() { |
|
||||||
playing = true; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* pauses the animation |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void pause() { |
|
||||||
playing = false; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* stops the animation, next time play() is called the animation will start from the begining. |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void stop() { |
|
||||||
playing = false; |
|
||||||
currentWayPoint = 0; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Addsa waypoint to the path |
|
||||||
* @param wayPoint a position in world space |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void addWayPoint(Vector3f wayPoint) { |
|
||||||
if (wayPoints.size() > 2 && this.cycle) { |
|
||||||
wayPoints.remove(wayPoints.size() - 1); |
|
||||||
} |
|
||||||
wayPoints.add(wayPoint); |
|
||||||
if (wayPoints.size() >= 2 && this.cycle) { |
|
||||||
wayPoints.add(wayPoints.get(0)); |
|
||||||
} |
|
||||||
if (wayPoints.size() > 1) { |
|
||||||
computeTotalLentgh(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void computeTotalLentgh() { |
|
||||||
totalLength = 0; |
|
||||||
float l = 0; |
|
||||||
if (segmentsLength == null) { |
|
||||||
segmentsLength = new ArrayList<Float>(); |
|
||||||
} else { |
|
||||||
segmentsLength.clear(); |
|
||||||
} |
|
||||||
if (pathInterpolation == PathInterpolation.Linear) { |
|
||||||
if (wayPoints.size() > 1) { |
|
||||||
for (int i = 0; i < wayPoints.size() - 1; i++) { |
|
||||||
l = wayPoints.get(i + 1).subtract(wayPoints.get(i)).length(); |
|
||||||
segmentsLength.add(l); |
|
||||||
totalLength += l; |
|
||||||
} |
|
||||||
} |
|
||||||
} else { |
|
||||||
initCatmullRomWayPoints(wayPoints); |
|
||||||
computeCatmulLength(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private void computeCatmulLength() { |
|
||||||
float l = 0; |
|
||||||
if (wayPoints.size() > 1) { |
|
||||||
for (int i = 0; i < wayPoints.size() - 1; i++) { |
|
||||||
l = getCatmullRomP1toP2Length(CRcontrolPoints.get(i), |
|
||||||
CRcontrolPoints.get(i + 1), CRcontrolPoints.get(i + 2), CRcontrolPoints.get(i + 3), 0, 1); |
|
||||||
segmentsLength.add(l); |
|
||||||
totalLength += l; |
|
||||||
} |
|
||||||
} |
|
||||||
speed = totalLength / duration; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* retruns the length of the path in world units |
|
||||||
* @return the length |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public float getLength() { |
|
||||||
return totalLength; |
|
||||||
} |
|
||||||
//Compute lenght of p1 to p2 arc segment
|
|
||||||
//TODO extract to FastMath class
|
|
||||||
|
|
||||||
private float getCatmullRomP1toP2Length(Vector3f p0, Vector3f p1, Vector3f p2, Vector3f p3, float startRange, float endRange) { |
|
||||||
|
|
||||||
float epsilon = 0.001f; |
|
||||||
float middleValue = (startRange + endRange) * 0.5f; |
|
||||||
Vector3f start = p1; |
|
||||||
if (startRange != 0) { |
|
||||||
start = FastMath.interpolateCatmullRom(startRange, curveTension, p0, p1, p2, p3); |
|
||||||
} |
|
||||||
Vector3f end = p2; |
|
||||||
if (endRange != 1) { |
|
||||||
end = FastMath.interpolateCatmullRom(endRange, curveTension, p0, p1, p2, p3); |
|
||||||
} |
|
||||||
Vector3f middle = FastMath.interpolateCatmullRom(middleValue, curveTension, p0, p1, p2, p3); |
|
||||||
float l = end.subtract(start).length(); |
|
||||||
float l1 = middle.subtract(start).length(); |
|
||||||
float l2 = end.subtract(middle).length(); |
|
||||||
float len = l1 + l2; |
|
||||||
if (l + epsilon < len) { |
|
||||||
l1 = getCatmullRomP1toP2Length(p0, p1, p2, p3, startRange, middleValue); |
|
||||||
l2 = getCatmullRomP1toP2Length(p0, p1, p2, p3, middleValue, endRange); |
|
||||||
} |
|
||||||
l = l1 + l2; |
|
||||||
return l; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* returns the waypoint at the given index |
|
||||||
* @param i the index |
|
||||||
* @return returns the waypoint position |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public Vector3f getWayPoint(int i) { |
|
||||||
return wayPoints.get(i); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* remove the waypoint from the path |
|
||||||
* @param wayPoint the waypoint to remove |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void removeWayPoint(Vector3f wayPoint) { |
|
||||||
wayPoints.remove(wayPoint); |
|
||||||
if (wayPoints.size() > 1) { |
|
||||||
computeTotalLentgh(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* remove the waypoint at the given index from the path |
|
||||||
* @param i the index of the waypoint to remove |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void removeWayPoint(int i) { |
|
||||||
removeWayPoint(wayPoints.get(i)); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* returns an iterator on the waypoints collection |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public Iterator<Vector3f> iterator() { |
|
||||||
return wayPoints.iterator(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* return the type of path interpolation for this path |
|
||||||
* @return the path interpolation |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public PathInterpolation getPathInterpolation() { |
|
||||||
return pathInterpolation; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* sets the path interpolation for this path |
|
||||||
* @param pathInterpolation |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void setPathInterpolation(PathInterpolation pathInterpolation) { |
|
||||||
this.pathInterpolation = pathInterpolation; |
|
||||||
computeTotalLentgh(); |
|
||||||
if (debugNode != null) { |
|
||||||
Node parent = debugNode.getParent(); |
|
||||||
debugNode.removeFromParent(); |
|
||||||
debugNode.detachAllChildren(); |
|
||||||
debugNode = null; |
|
||||||
attachDebugNode(parent); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* disable the display of the path and the waypoints |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void disableDebugShape() { |
|
||||||
|
|
||||||
debugNode.detachAllChildren(); |
|
||||||
debugNode = null; |
|
||||||
assetManager = null; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* enable the display of the path and the waypoints |
|
||||||
* @param manager the assetManager |
|
||||||
* @param rootNode the node where the debug shapes must be attached |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void enableDebugShape(AssetManager manager, Node rootNode) { |
|
||||||
assetManager = manager; |
|
||||||
computeTotalLentgh(); |
|
||||||
attachDebugNode(rootNode); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Adds an animation pathListener to the path |
|
||||||
* @param listener the AnimationPathListener to attach |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void addListener(AnimationPathListener listener) { |
|
||||||
if (listeners == null) { |
|
||||||
listeners = new ArrayList<AnimationPathListener>(); |
|
||||||
} |
|
||||||
listeners.add(listener); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* remove the given listener |
|
||||||
* @param listener the listener to remove |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void removeListener(AnimationPathListener listener) { |
|
||||||
if (listeners != null) { |
|
||||||
listeners.remove(listener); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* return the number of waypoints of this path |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public int getNbWayPoints() { |
|
||||||
return wayPoints.size(); |
|
||||||
} |
|
||||||
|
|
||||||
private void triggerWayPointReach(int wayPointIndex) { |
|
||||||
for (Iterator<AnimationPathListener> it = listeners.iterator(); it.hasNext();) { |
|
||||||
AnimationPathListener listener = it.next(); |
|
||||||
listener.onWayPointReach(this, wayPointIndex); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* returns the direction type of the target |
|
||||||
* @return the direction type |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public Direction getDirectionType() { |
|
||||||
return directionType; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Sets the direction type of the target |
|
||||||
* On each update the direction given to the target can have different behavior |
|
||||||
* See the Direction Enum for explanations |
|
||||||
* @param directionType the direction type |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void setDirectionType(Direction directionType) { |
|
||||||
this.directionType = directionType; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Set the lookAt for the target |
|
||||||
* This can be used only if direction Type is Direction.LookAt |
|
||||||
* @param lookAt the position to look at |
|
||||||
* @param upVector the up vector |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void setLookAt(Vector3f lookAt, Vector3f upVector) { |
|
||||||
this.lookAt = lookAt; |
|
||||||
this.upVector = upVector; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* returns the rotation of the target |
|
||||||
* @return the rotation quaternion |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public Quaternion getRotation() { |
|
||||||
return rotation; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* sets the rotation of the target |
|
||||||
* This can be used only if direction Type is Direction.PathAndRotation or Direction.Rotation |
|
||||||
* With PathAndRotation the target will face the direction of the path multiplied by the given Quaternion. |
|
||||||
* With Rotation the rotation of the target will be set with the given Quaternion. |
|
||||||
* @param rotation the rotation quaternion |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void setRotation(Quaternion rotation) { |
|
||||||
this.rotation = rotation; |
|
||||||
} |
|
||||||
|
|
||||||
@Deprecated |
|
||||||
public float getDuration() { |
|
||||||
return duration; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Sets the duration of the animation |
|
||||||
* @param duration |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void setDuration(float duration) { |
|
||||||
this.duration = duration; |
|
||||||
speed = totalLength / duration; |
|
||||||
} |
|
||||||
|
|
||||||
@Deprecated |
|
||||||
public float getCurveTension() { |
|
||||||
return curveTension; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* sets the tension of the curve (only for catmull rom) 0.0 will give a linear curve, 1.0 a round curve |
|
||||||
* @param curveTension |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void setCurveTension(float curveTension) { |
|
||||||
this.curveTension = curveTension; |
|
||||||
computeTotalLentgh(); |
|
||||||
if (debugNode != null) { |
|
||||||
Node parent = debugNode.getParent(); |
|
||||||
debugNode.removeFromParent(); |
|
||||||
debugNode.detachAllChildren(); |
|
||||||
debugNode = null; |
|
||||||
attachDebugNode(parent); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Sets the path to be a cycle |
|
||||||
* @param cycle |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void setCycle(boolean cycle) { |
|
||||||
|
|
||||||
if (wayPoints.size() >= 2) { |
|
||||||
if (this.cycle && !cycle) { |
|
||||||
wayPoints.remove(wayPoints.size() - 1); |
|
||||||
} |
|
||||||
if (!this.cycle && cycle) { |
|
||||||
wayPoints.add(wayPoints.get(0)); |
|
||||||
System.out.println("adding first wp"); |
|
||||||
} |
|
||||||
this.cycle = cycle; |
|
||||||
computeTotalLentgh(); |
|
||||||
if (debugNode != null) { |
|
||||||
Node parent = debugNode.getParent(); |
|
||||||
debugNode.removeFromParent(); |
|
||||||
debugNode.detachAllChildren(); |
|
||||||
debugNode = null; |
|
||||||
attachDebugNode(parent); |
|
||||||
} |
|
||||||
} else { |
|
||||||
this.cycle = cycle; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Deprecated |
|
||||||
public boolean isCycle() { |
|
||||||
return cycle; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* returs true is the animation loops |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public boolean isLoop() { |
|
||||||
return loop; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Loops the animation |
|
||||||
* @param loop |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public void setLoop(boolean loop) { |
|
||||||
this.loop = loop; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String toString() { |
|
||||||
return "AnimationPath{" + "playing=" + playing + "currentWayPoint=" + currentWayPoint + "currentValue=" + currentValue + "wayPoints=" + wayPoints + "debugNode=" + debugNode + "assetManager=" + assetManager + "listeners=" + listeners + "curveDirection=" + curveDirection + "lookAt=" + lookAt + "upVector=" + upVector + "rotation=" + rotation + "duration=" + duration + "segmentsLength=" + segmentsLength + "totalLength=" + totalLength + "CRcontrolPoints=" + CRcontrolPoints + "speed=" + speed + "curveTension=" + curveTension + "loop=" + loop + "cycle=" + cycle + "directionType=" + directionType + "pathInterpolation=" + pathInterpolation + "eps=" + eps + '}'; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
} |
|
@ -1,50 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2010 jMonkeyEngine |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* * Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
|
||||||
* may be used to endorse or promote products derived from this software |
|
||||||
* without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package com.jme3.animation; |
|
||||||
|
|
||||||
/** |
|
||||||
* |
|
||||||
* @author Nehon |
|
||||||
* @deprecated use {@link MotionPathListener} |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public interface AnimationPathListener { |
|
||||||
|
|
||||||
/** |
|
||||||
* Triggers every time the target reach a waypoint on the path |
|
||||||
* @param path the animation path on wich the even has been triggered |
|
||||||
* @param wayPointIndex the index of the way point reached |
|
||||||
*/ |
|
||||||
public void onWayPointReach(AnimationPath path,int wayPointIndex); |
|
||||||
|
|
||||||
} |
|
@ -1,68 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2010 jMonkeyEngine |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* * Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
|
||||||
* may be used to endorse or promote products derived from this software |
|
||||||
* without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
package com.jme3.app; |
|
||||||
|
|
||||||
import com.jme3.bullet.BulletAppState; |
|
||||||
import com.jme3.bullet.PhysicsSpace; |
|
||||||
import com.jme3.bullet.PhysicsTickListener; |
|
||||||
|
|
||||||
/** |
|
||||||
* |
|
||||||
* @author normenhansen |
|
||||||
* @deprecated in favor of using BulletAppState:<br/> |
|
||||||
* <code>stateManager.attach(new BulletAppState());</code> |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public abstract class SimpleBulletApplication extends SimpleApplication implements PhysicsTickListener{ |
|
||||||
BulletAppState bulletAppState; |
|
||||||
|
|
||||||
@Override |
|
||||||
public void initialize() { |
|
||||||
bulletAppState=new BulletAppState(); |
|
||||||
bulletAppState.startPhysics(); |
|
||||||
super.initialize(); |
|
||||||
stateManager.attach(bulletAppState); |
|
||||||
getPhysicsSpace().addTickListener(this); |
|
||||||
} |
|
||||||
|
|
||||||
public void simplePhysicsUpdate(float tpf){ |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
public void physicsTick(PhysicsSpace space, float f) { |
|
||||||
simplePhysicsUpdate(f); |
|
||||||
} |
|
||||||
|
|
||||||
public PhysicsSpace getPhysicsSpace(){ |
|
||||||
return bulletAppState.getPhysicsSpace(); |
|
||||||
} |
|
||||||
} |
|
@ -1,173 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2010 jMonkeyEngine |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* * Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
|
||||||
* may be used to endorse or promote products derived from this software |
|
||||||
* without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package jme3test.collision; |
|
||||||
|
|
||||||
import com.jme3.collision.CollisionResult; |
|
||||||
import com.jme3.collision.CollisionResults; |
|
||||||
import com.jme3.collision.MotionAllowedListener; |
|
||||||
import com.jme3.collision.SweepSphere; |
|
||||||
import com.jme3.math.Plane; |
|
||||||
import com.jme3.math.Ray; |
|
||||||
import com.jme3.math.Vector3f; |
|
||||||
import com.jme3.scene.Spatial; |
|
||||||
|
|
||||||
public class SphereMotionAllowedListener implements MotionAllowedListener { |
|
||||||
|
|
||||||
private Ray ray = new Ray(); |
|
||||||
private SweepSphere ss = new SweepSphere(); |
|
||||||
private CollisionResults results = new CollisionResults(); |
|
||||||
private Spatial scene; |
|
||||||
private Vector3f dimension = new Vector3f(); |
|
||||||
|
|
||||||
private Vector3f newPos = new Vector3f(); |
|
||||||
private Vector3f newVel = new Vector3f(); |
|
||||||
|
|
||||||
private float charHeight; |
|
||||||
private float footHeight; |
|
||||||
private float footStart; |
|
||||||
private float sphHeight; |
|
||||||
private float sphCenter; |
|
||||||
|
|
||||||
final float unitsPerMeter = 100.0f; |
|
||||||
final float unitScale = unitsPerMeter / 100.0f; |
|
||||||
final float veryCloseDist = 0.005f * unitScale; |
|
||||||
|
|
||||||
private int depth = 0; |
|
||||||
|
|
||||||
public SphereMotionAllowedListener(Spatial scene, Vector3f dimension){ |
|
||||||
if (scene == null || dimension == null) |
|
||||||
throw new NullPointerException(); |
|
||||||
|
|
||||||
this.scene = scene; |
|
||||||
|
|
||||||
charHeight = dimension.getY(); |
|
||||||
|
|
||||||
footHeight = charHeight / 3f; |
|
||||||
footStart = -(charHeight / 2f) + footHeight; |
|
||||||
sphHeight = charHeight - footHeight; |
|
||||||
sphCenter = (charHeight / 2f) - (sphHeight / 2f); |
|
||||||
this.dimension.set(dimension); |
|
||||||
this.dimension.setY(sphHeight); |
|
||||||
} |
|
||||||
|
|
||||||
private void collideWithWorld(){ |
|
||||||
if (depth > 3){ |
|
||||||
// System.out.println("DEPTH LIMIT REACHED!!");
|
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if (newVel.length() < veryCloseDist) |
|
||||||
return; |
|
||||||
|
|
||||||
Vector3f destination = newPos.add(0, sphCenter, 0).add(newVel); |
|
||||||
|
|
||||||
ss.setCenter(newPos.add(0, sphCenter, 0)); |
|
||||||
ss.setVelocity(newVel); |
|
||||||
ss.setDimension(dimension); |
|
||||||
|
|
||||||
results.clear(); |
|
||||||
scene.collideWith(ss, results); |
|
||||||
|
|
||||||
if (results.size() == 0){ |
|
||||||
newPos.addLocal(newVel); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
for (int i = 0; i < results.size(); i++){ |
|
||||||
CollisionResult collision = results.getCollision(i); |
|
||||||
// *** collision occured ***
|
|
||||||
// Vector3f destination = newPos.add(newVel);
|
|
||||||
Vector3f contactPoint = collision.getContactPoint().clone(); |
|
||||||
float dist = collision.getDistance(); |
|
||||||
|
|
||||||
if (dist >= veryCloseDist){ |
|
||||||
// P += ||V|| * dist
|
|
||||||
Vector3f tmp = new Vector3f(newVel); |
|
||||||
tmp.normalizeLocal().multLocal(dist - veryCloseDist); |
|
||||||
newPos.addLocal(tmp); |
|
||||||
|
|
||||||
tmp.normalizeLocal(); |
|
||||||
tmp.multLocal(veryCloseDist); |
|
||||||
contactPoint.subtractLocal(tmp); |
|
||||||
} |
|
||||||
|
|
||||||
// Vector3f normal = newPos.subtract(contactPoint).normalizeLocal();
|
|
||||||
Vector3f normal = collision.getContactNormal(); |
|
||||||
|
|
||||||
Plane p = new Plane(); |
|
||||||
p.setOriginNormal(contactPoint, normal); |
|
||||||
|
|
||||||
Vector3f destinationOnPlane = p.getClosestPoint(destination); |
|
||||||
newVel.set(destinationOnPlane).subtractLocal(contactPoint); |
|
||||||
// normal.multLocal(normal.dot(destination) - veryCloseDist);
|
|
||||||
//// normal.multLocal(p.pseudoDistance(destination));
|
|
||||||
// Vector3f newDest = destination.add(normal);
|
|
||||||
// newVel.set(newDest).subtractLocal(contactPoint);
|
|
||||||
|
|
||||||
// recurse:
|
|
||||||
if (newVel.length() < veryCloseDist){ |
|
||||||
return; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
depth = depth + 1; |
|
||||||
collideWithWorld(); |
|
||||||
} |
|
||||||
|
|
||||||
public void checkMotionAllowed(Vector3f position, Vector3f velocity) { |
|
||||||
if (velocity.getX() == 0 && velocity.getZ() == 0) |
|
||||||
return; |
|
||||||
|
|
||||||
depth = 0; |
|
||||||
newPos.set(position); |
|
||||||
newVel.set(velocity); |
|
||||||
velocity.setY(0); |
|
||||||
// newPos.addLocal(velocity);
|
|
||||||
collideWithWorld(); |
|
||||||
|
|
||||||
ray.setOrigin(newPos.add(0, footStart, 0)); |
|
||||||
ray.setDirection(new Vector3f(0, -1, 0)); |
|
||||||
// ray.setLimit(footHeight);
|
|
||||||
|
|
||||||
results.clear(); |
|
||||||
scene.collideWith(ray, results); |
|
||||||
CollisionResult result = results.getClosestCollision(); |
|
||||||
if (result != null){ |
|
||||||
newPos.y = result.getContactPoint().getY() + charHeight / 2f; |
|
||||||
} |
|
||||||
|
|
||||||
position.set(newPos); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue