113 lines
4.1 KiB
Java
113 lines
4.1 KiB
Java
package electrosphere.entity.state.collidable;
|
|
|
|
import org.joml.Matrix4d;
|
|
import org.joml.Matrix4f;
|
|
import org.joml.Quaterniond;
|
|
import org.joml.Vector3d;
|
|
import org.joml.Vector3f;
|
|
import org.joml.Vector4d;
|
|
import org.ode4j.ode.DBody;
|
|
|
|
import electrosphere.collision.PhysicsEntityUtils;
|
|
import electrosphere.collision.PhysicsUtils;
|
|
import electrosphere.collision.collidable.Collidable;
|
|
import electrosphere.engine.Globals;
|
|
import electrosphere.entity.Entity;
|
|
import electrosphere.entity.EntityDataStrings;
|
|
import electrosphere.entity.EntityUtils;
|
|
import electrosphere.entity.btree.BehaviorTree;
|
|
import electrosphere.entity.state.gravity.ClientGravityTree;
|
|
import electrosphere.entity.types.collision.CollisionObjUtils;
|
|
import electrosphere.entity.types.item.ItemUtils;
|
|
import electrosphere.game.data.collidable.CollidableTemplate;
|
|
|
|
/**
|
|
*
|
|
* @author amaterasu
|
|
*/
|
|
public class ClientCollidableTree implements BehaviorTree {
|
|
|
|
Entity parent;
|
|
//the ode body for this collidable tree
|
|
DBody body;
|
|
Collidable collidable;
|
|
|
|
boolean applyImpulses = true;
|
|
|
|
public ClientCollidableTree(Entity e, Collidable collidable, DBody body){
|
|
parent = e;
|
|
this.collidable = collidable;
|
|
this.body = body;
|
|
}
|
|
|
|
public ClientCollidableTree(Entity e, Collidable collidable, DBody body, boolean applyImpulses){
|
|
parent = e;
|
|
this.collidable = collidable;
|
|
this.body = body;
|
|
this.applyImpulses = applyImpulses;
|
|
}
|
|
|
|
static int incrementer = 0;
|
|
|
|
public void simulate(float deltaTime){
|
|
Vector3d position = EntityUtils.getPosition(parent);
|
|
Quaterniond rotation = EntityUtils.getRotation(parent);
|
|
Vector3d offsetVector = new Vector3d();
|
|
Vector3d newPosition = new Vector3d(position);
|
|
//have we hit a terrain impulse?
|
|
boolean hitTerrain = false;
|
|
//handle impulses
|
|
for(Impulse impulse : collidable.getImpulses()){
|
|
// collidable.getImpulses().remove(impulse);
|
|
Vector3d impulseForce = new Vector3d(impulse.getDirection()).mul(impulse.getForce());
|
|
if(impulse.type.matches(Collidable.TYPE_TERRAIN)){
|
|
hitTerrain = true;
|
|
// System.out.println("Impulse force: " + impulseForce);
|
|
// System.out.println("Position: " + position);
|
|
}
|
|
if(impulse.type.matches(Collidable.TYPE_ITEM)){
|
|
if(ClientGravityTree.getClientGravityTree(parent)!=null){
|
|
ClientGravityTree.getClientGravityTree(parent).start();
|
|
}
|
|
}
|
|
if(impulse.type.matches(Collidable.TYPE_CREATURE)){
|
|
// System.out.println(System.currentTimeMillis() + " creature hit!");
|
|
if(ClientGravityTree.getClientGravityTree(parent)!=null){
|
|
ClientGravityTree.getClientGravityTree(parent).start();
|
|
}
|
|
}
|
|
}
|
|
//bound to world bounds
|
|
if(newPosition.x < Globals.clientWorldData.getWorldBoundMin().x){
|
|
newPosition.x = Globals.clientWorldData.getWorldBoundMin().x;
|
|
}
|
|
if(newPosition.y < Globals.clientWorldData.getWorldBoundMin().y){
|
|
newPosition.y = Globals.clientWorldData.getWorldBoundMin().y;
|
|
}
|
|
if(newPosition.z < Globals.clientWorldData.getWorldBoundMin().z){
|
|
newPosition.z = Globals.clientWorldData.getWorldBoundMin().z;
|
|
}
|
|
PhysicsUtils.setRigidBodyTransform(Globals.clientSceneWrapper.getCollisionEngine(), newPosition, rotation, body);
|
|
}
|
|
|
|
/**
|
|
* Sets the structures backing this collidable tree
|
|
* @param body The ode body
|
|
* @param collidable The collidable
|
|
*/
|
|
public void setCollisionObject(DBody body, Collidable collidable){
|
|
this.body = body;
|
|
this.collidable = collidable;
|
|
}
|
|
|
|
public static boolean hasClientCollidableTree(Entity e){
|
|
return e.containsKey(EntityDataStrings.CLIENT_COLLIDABLE_TREE);
|
|
}
|
|
|
|
public static ClientCollidableTree getClientCollidableTree(Entity e){
|
|
return (ClientCollidableTree)e.getData(EntityDataStrings.CLIENT_COLLIDABLE_TREE);
|
|
}
|
|
|
|
|
|
}
|