Renderer/src/main/java/electrosphere/entity/state/collidable/ClientCollidableTree.java
austin a5c1667d9f
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
Move physics to ODE-side
2024-03-23 17:45:46 -04:00

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);
}
}