package de.fau.cs.mad.fly.game;
import java.util.HashMap;
import java.util.Map;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.physics.bullet.collision.btCollisionShape;
import com.badlogic.gdx.physics.bullet.dynamics.btRigidBody;
import com.badlogic.gdx.physics.bullet.dynamics.btRigidBody.btRigidBodyConstructionInfo;
import com.badlogic.gdx.utils.Disposable;
/**
* Manager for the btRigidBodyConstructionInfo.
* <p>
* Creates, stores and disposes all used rigid body construction infos.
*
* @author Tobias Zangl
*/
public class RigidBodyInfoManager implements Disposable {
/**
* Map to save the different rigid body construction infos.
*/
Map<String, btRigidBodyConstructionInfo> rigidBodyInfoMap;
public RigidBodyInfoManager() {
rigidBodyInfoMap = new HashMap<String, btRigidBodyConstructionInfo>();
}
/**
* Getter for a rigid body construction info.
*
* @param mass
* The id of the needed rigid body construction info.
* @return btRigidBodyConstructionInfo
*/
public btRigidBodyConstructionInfo getRigidBodyInfo(String infoId) {
return rigidBodyInfoMap.get(infoId);
}
/**
* Creates a new rigid body construction info if its not already created.
*
* @param infoId
* The id of the needed rigid body construction info.
* @param shape
* The used shape to calculate the local inertia.
* @param mass
* The mass of the object.
* @return btRigidBodyConstructionInfo
*/
public btRigidBodyConstructionInfo createRigidBodyInfo(String infoId, btCollisionShape shape, float mass) {
btRigidBodyConstructionInfo constructionInfo = rigidBodyInfoMap.get(infoId);
if (constructionInfo != null) {
return constructionInfo;
}
Vector3 localInertia = new Vector3();
if (mass > 0f) {
shape.calculateLocalInertia(mass, localInertia);
} else {
localInertia.set(0.0f, 0.0f, 0.0f);
}
constructionInfo = new btRigidBody.btRigidBodyConstructionInfo(mass, null, shape, localInertia);
// Gdx.app.log("RigidBodyInfoManager", "Created rigid body info: " +
// infoId + " with mass " + mass);
rigidBodyInfoMap.put(infoId, constructionInfo);
return constructionInfo;
}
@Override
public void dispose() {
for (btRigidBodyConstructionInfo info : rigidBodyInfoMap.values()) {
info.dispose();
}
rigidBodyInfoMap.clear();
}
}