/*
|
* Java port of Bullet (c) 2008 Martin Dvorak <jezek2@advel.cz>
|
*
|
* Bullet Continuous Collision Detection and Physics Library
|
* Copyright (c) 2003-2008 Erwin Coumans http://www.bulletphysics.com/
|
*
|
* This software is provided 'as-is', without any express or implied warranty.
|
* In no event will the authors be held liable for any damages arising from
|
* the use of this software.
|
*
|
* Permission is granted to anyone to use this software for any purpose,
|
* including commercial applications, and to alter it and redistribute it
|
* freely, subject to the following restrictions:
|
*
|
* 1. The origin of this software must not be misrepresented; you must not
|
* claim that you wrote the original software. If you use this software
|
* in a product, an acknowledgment in the product documentation would be
|
* appreciated but is not required.
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
* misrepresented as being the original software.
|
* 3. This notice may not be removed or altered from any source distribution.
|
*/
|
|
package com.bulletphysics.collision.narrowphase;
|
|
import javax.vecmath.Vector3f;
|
|
/**
|
* ManifoldPoint collects and maintains persistent contactpoints. Used to improve
|
* stability and performance of rigidbody dynamics response.
|
*
|
* @author jezek2
|
*/
|
public class ManifoldPoint implements java.io.Serializable {
|
|
public final Vector3f localPointA = new Vector3f();
|
public final Vector3f localPointB = new Vector3f();
|
public final Vector3f positionWorldOnB = new Vector3f();
|
///m_positionWorldOnA is redundant information, see getPositionWorldOnA(), but for clarity
|
public final Vector3f positionWorldOnA = new Vector3f();
|
public final Vector3f normalWorldOnB = new Vector3f();
|
|
public float distance1;
|
public float combinedFriction;
|
public float combinedRestitution;
|
|
// BP mod, store contact triangles.
|
public int partId0;
|
public int partId1;
|
public int index0;
|
public int index1;
|
|
public Object userPersistentData;
|
public float appliedImpulse;
|
|
public boolean lateralFrictionInitialized;
|
public float appliedImpulseLateral1;
|
public float appliedImpulseLateral2;
|
public int lifeTime; //lifetime of the contactpoint in frames
|
|
public final Vector3f lateralFrictionDir1 = new Vector3f();
|
public final Vector3f lateralFrictionDir2 = new Vector3f();
|
|
public ManifoldPoint() {
|
this.userPersistentData = null;
|
this.appliedImpulse = 0f;
|
this.lateralFrictionInitialized = false;
|
this.lifeTime = 0;
|
}
|
|
public ManifoldPoint(Vector3f pointA, Vector3f pointB, Vector3f normal, float distance) {
|
init(pointA, pointB, normal, distance);
|
}
|
|
public void init(Vector3f pointA, Vector3f pointB, Vector3f normal, float distance) {
|
this.localPointA.set(pointA);
|
this.localPointB.set(pointB);
|
this.normalWorldOnB.set(normal);
|
this.distance1 = distance;
|
this.combinedFriction = 0f;
|
this.combinedRestitution = 0f;
|
this.userPersistentData = null;
|
this.appliedImpulse = 0f;
|
this.lateralFrictionInitialized = false;
|
this.appliedImpulseLateral1 = 0f;
|
this.appliedImpulseLateral2 = 0f;
|
this.lifeTime = 0;
|
}
|
|
public float getDistance() {
|
return distance1;
|
}
|
|
public int getLifeTime() {
|
return lifeTime;
|
}
|
|
public void set(ManifoldPoint p) {
|
localPointA.set(p.localPointA);
|
localPointB.set(p.localPointB);
|
positionWorldOnA.set(p.positionWorldOnA);
|
positionWorldOnB.set(p.positionWorldOnB);
|
normalWorldOnB.set(p.normalWorldOnB);
|
distance1 = p.distance1;
|
combinedFriction = p.combinedFriction;
|
combinedRestitution = p.combinedRestitution;
|
partId0 = p.partId0;
|
partId1 = p.partId1;
|
index0 = p.index0;
|
index1 = p.index1;
|
userPersistentData = p.userPersistentData;
|
appliedImpulse = p.appliedImpulse;
|
lateralFrictionInitialized = p.lateralFrictionInitialized;
|
appliedImpulseLateral1 = p.appliedImpulseLateral1;
|
appliedImpulseLateral2 = p.appliedImpulseLateral2;
|
lifeTime = p.lifeTime;
|
lateralFrictionDir1.set(p.lateralFrictionDir1);
|
lateralFrictionDir2.set(p.lateralFrictionDir2);
|
}
|
|
public Vector3f getPositionWorldOnA(Vector3f out) {
|
out.set(positionWorldOnA);
|
return out;
|
//return m_positionWorldOnB + m_normalWorldOnB * m_distance1;
|
}
|
|
public Vector3f getPositionWorldOnB(Vector3f out) {
|
out.set(positionWorldOnB);
|
return out;
|
}
|
|
public void setDistance(float dist) {
|
distance1 = dist;
|
}
|
|
}
|