Renderer/src/main/java/electrosphere/entity/state/foliage/AmbientFoliage.java
2023-06-23 14:09:03 -04:00

83 lines
2.8 KiB
Java

package electrosphere.entity.state.foliage;
import org.joml.Vector3d;
import org.joml.Vector3f;
import electrosphere.engine.Globals;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.BehaviorTree;
import electrosphere.entity.types.camera.CameraEntityUtils;
/**
* Behavior tree for ambient foliage. Controls regrowing, wind movement, etc
*/
public class AmbientFoliage implements BehaviorTree {
//the parent entity
Entity parent;
//The current offset by wind (used to snap back to 0)
float windOffset = 0;
//The current growth level
float growthLevel = MAX_GROWTH_LEVEL;
//The increment to increase growth level to until 1
float growthRate = MAX_GROWTH_LEVEL;
//the maximum growth level
static final float MAX_GROWTH_LEVEL = 1;
/**
* Constructor
* @param parent The parent entity
* @param regrowFactor The initial growth level
* @param growthRate The growth rate
*/
private AmbientFoliage(Entity parent, float growthLevel, float growthRate){
this.growthLevel = growthLevel;
this.growthRate = growthRate;
this.parent = parent;
}
@Override
public void simulate(float deltaTime) {
//increase growth factor if relevant
if(growthLevel < MAX_GROWTH_LEVEL){
growthLevel = growthLevel + growthRate;
if(growthLevel > MAX_GROWTH_LEVEL){
growthLevel = MAX_GROWTH_LEVEL;
}
}
EntityUtils.getScale(parent).set(growthLevel);
//rotate to face cameras
// Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
// EntityUtils.getRotation(parent).rotateTo(new Vector3d(1,0,0), new Vector3d(cameraEyeVector));
//TODO: simulate wind offset
}
/**
* Attaches an ambient foliage behavior tree to the provided entity
* @param parent The entity
* @param growthLevel The initial growth level of the foliage
* @param growthRate The rate of growth of the foliage
*/
public static void attachAmbientFoliageTree(Entity parent, float growthLevel, float growthRate){
AmbientFoliage tree = new AmbientFoliage(parent, growthLevel, growthRate);
parent.putData(EntityDataStrings.FOLIAGE_AMBIENT_TREE, tree);
Globals.clientSceneWrapper.getScene().registerBehaviorTree(tree);
}
/**
* Gets the ambient foliage tree on a given entity if it exists
* @param entity The entity
* @return The ambient foliage tree if it exists, null otherwise
*/
public static AmbientFoliage getAmbientFoliageTree(Entity entity){
return (AmbientFoliage) entity.getData(EntityDataStrings.FOLIAGE_AMBIENT_TREE);
}
}