more light manager updates
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-09-19 14:51:30 -04:00
parent dc52e375e3
commit 980d6813c4
10 changed files with 319 additions and 13 deletions

View File

@ -530,6 +530,17 @@
"maxHealth" : 100,
"onDamageIFrames" : 30
},
"pointLight" : {
"const": 1.0,
"linear": 0.7,
"quadratic": 0.35,
"radius": 1.0,
"color": {
"x": 0.3,
"y": 0.3,
"z": 0.3
}
},
"idleData": {
"animation": {
"nameFirstPerson" : "Idle",

View File

@ -414,6 +414,17 @@
"maxHealth" : 60,
"onDamageIFrames" : 30
},
"pointLight" : {
"const": 1.0,
"linear": 0.7,
"quadratic": 0.35,
"radius": 1.0,
"color": {
"x": 0.3,
"y": 0.3,
"z": 0.3
}
},
"idleData": {
"animation": {
"nameFirstPerson" : "Idle",

View File

@ -27,6 +27,8 @@ public class ClientEntityUtils {
* @param entity the entity to destroy
*/
public static void destroyEntity(Entity entity){
//check for client-specific stuff
//deregister all behavior trees
EntityUtils.cleanUpEntity(entity);
}

View File

@ -259,6 +259,11 @@ public class EntityDataStrings {
public static final String EQUIP_INVENTORY = "equipInventory";
public static final String TREE_SERVEREQUIPSTATE = "treeServerEquipState";
/*
Light state
*/
public static final String TREE_CLIENTLIGHTSTATE = "treeClientLightState";
/*
Inventory in general
*/

View File

@ -0,0 +1,90 @@
package electrosphere.entity.state.light;
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.btree.BehaviorTree;
import electrosphere.entity.state.equip.ClientEquipState;
import electrosphere.game.data.common.light.PointLightDescription;
import electrosphere.renderer.light.PointLight;
/**
* Keeps the point light attached to the entity
*/
public class ClientPointLightComponent implements BehaviorTree {
/**
* The parent entity
*/
Entity parent;
/**
* The description of the point light
*/
PointLightDescription description;
/**
* The point light itself
*/
PointLight light;
@Override
public void simulate(float deltaTime) {
Vector3d entityPos = EntityUtils.getPosition(parent);
light.setPosition(new Vector3f((float)entityPos.x,(float)entityPos.y,(float)entityPos.z));
}
/**
* Private constructor
* @param parent
* @param params
*/
private ClientPointLightComponent(Entity parent, Object ... params){
this.parent = parent;
description = (PointLightDescription)params[0];
light = Globals.renderingEngine.getLightManager().createPointLight(parent, description);
}
/**
* <p>
* Attaches this tree to the entity.
* </p>
* @param entity The entity to attach to
* @param tree The behavior tree to attach
* @param params Optional parameters that will be provided to the constructor
*/
public static ClientPointLightComponent attachTree(Entity parent, Object ... params){
ClientPointLightComponent rVal = new ClientPointLightComponent(parent,params);
//!!WARNING!! from here below should not be touched
//This was generated automatically to properly alert various systems that the btree exists and should be tracked
parent.putData(EntityDataStrings.TREE_CLIENTLIGHTSTATE, rVal);
Globals.clientSceneWrapper.getScene().registerBehaviorTree(rVal);
return rVal;
}
/**
* <p>
* Detatches this tree from the entity.
* </p>
* @param entity The entity to detach to
* @param tree The behavior tree to detach
*/
public static void detachTree(Entity entity, BehaviorTree tree){
}
/**
* <p>
* Gets the ClientEquipState of the entity
* </p>
* @param entity the entity
* @return The ClientEquipState
*/
public static ClientEquipState getClientEquipState(Entity entity){
return (ClientEquipState)entity.getData(EntityDataStrings.TREE_CLIENTEQUIPSTATE);
}
}

View File

@ -34,6 +34,7 @@ import electrosphere.entity.state.inventory.ServerInventoryState;
import electrosphere.entity.state.inventory.UnrelationalInventoryState;
import electrosphere.entity.state.life.ClientLifeTree;
import electrosphere.entity.state.life.ServerLifeTree;
import electrosphere.entity.state.light.ClientPointLightComponent;
import electrosphere.entity.state.movement.fall.ClientFallTree;
import electrosphere.entity.state.movement.fall.ServerFallTree;
import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree;
@ -246,6 +247,16 @@ public class CommonEntityUtils {
}
}
}
//
//
// Light generation
//
//
if(rawType.getPointLight() != null){
ClientPointLightComponent.attachTree(entity, rawType.getPointLight());
}
if(rawType.getEquipPoints() != null && rawType.getEquipPoints().size() > 0){
ClientEquipState.attachTree(entity, rawType.getEquipPoints());
entity.putData(EntityDataStrings.EQUIP_INVENTORY, RelationalInventoryState.buildRelationalInventoryStateFromEquipList(rawType.getEquipPoints()));

View File

@ -4,6 +4,7 @@ import java.util.List;
import electrosphere.game.data.collidable.CollidableTemplate;
import electrosphere.game.data.collidable.HitboxData;
import electrosphere.game.data.common.light.PointLightDescription;
import electrosphere.game.data.creature.type.HealthSystem;
import electrosphere.game.data.creature.type.IdleData;
import electrosphere.game.data.creature.type.LookAtSystem;
@ -131,6 +132,11 @@ public class CommonEntityType {
*/
GraphicsTemplate graphicsTemplate;
/**
* The point light assigned to the entity
*/
PointLightDescription pointLight;
/**
* Gets the id for this creature type
* @return The id
@ -307,4 +313,12 @@ public class CommonEntityType {
return ambientAudio;
}
/**
* Gets the point light data
* @return The point light data
*/
public PointLightDescription getPointLight(){
return pointLight;
}
}

View File

@ -0,0 +1,115 @@
package electrosphere.game.data.common.light;
import org.joml.Vector3f;
/**
* Description of a point light
*/
public class PointLightDescription {
/**
* The constant attenuation factor
*/
float constant;
/**
* The linear attenuation factor
*/
float linear;
/**
* The quadratic attenuation factor
*/
float quadratic;
/**
* The radius of the light
*/
float radius;
/**
* The color of the light
*/
Vector3f color;
/**
* Sets the constant attenuation factor
* @param constant The constant attenuation factor
*/
public void setConstant(float constant) {
this.constant = constant;
}
/**
* Sets the linear attenuation factor
* @param linear The linear attenuation factor
*/
public void setLinear(float linear) {
this.linear = linear;
}
/**
* Sets the quadratic attenuation factor
* @param quadratic The quadratic attenuation factor
*/
public void setQuadratic(float quadratic) {
this.quadratic = quadratic;
}
/**
* Sets the radius of the light
* @param radius The radius of the light
*/
public void setRadius(float radius){
this.radius = radius;
}
/**
* Sets the color of the light
* @param color The color of the light
*/
public void setColor(Vector3f color){
this.color = color;
}
/**
* Gets the constant attenuation factor
* @return The constant attenuation factor
*/
public float getConstant() {
return constant;
}
/**
* Gets the linear attenuation factor
* @return The linear attenuation factor
*/
public float getLinear() {
return linear;
}
/**
* Gets the quadratic attenuation factor
* @return The quadratic attenuation factor
*/
public float getQuadratic() {
return quadratic;
}
/**
* Gets the color of the light
* @return The color of the light
*/
public Vector3f getColor(){
return color;
}
/**
* Gets the radius of the light
* @return The radius of the light
*/
public float getRadius(){
return radius;
}
}

View File

@ -3,7 +3,6 @@ package electrosphere.renderer.light;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.joml.Matrix4d;
import org.joml.Vector3f;
@ -13,7 +12,7 @@ import electrosphere.client.entity.camera.CameraEntityUtils;
import electrosphere.engine.Globals;
import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityCreationUtils;
import electrosphere.game.data.common.light.PointLightDescription;
import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
@ -175,15 +174,6 @@ public class LightManager {
rVal.entityPointLightMap = new HashMap<Entity,PointLight>();
rVal.pointLightSSBO = new ShaderStorageBuffer(POINT_LIGHT_BUFFER_SIZE, BufferUsage.DYNAMIC, BufferAccess.DRAW);
//create a shit ton of point lights
Random rand = new Random(0);
for(int i = 0; i < 500; i++){
PointLight newLight = new PointLight(new Vector3f(rand.nextFloat(32),rand.nextFloat(),rand.nextFloat(32)));
newLight.setRadius(1);
newLight.setColor(new Vector3f(rand.nextFloat(),rand.nextFloat(),rand.nextFloat()).normalize());
rVal.entityPointLightMap.put(EntityCreationUtils.createClientSpatialEntity(),newLight);
}
//
//create direct light ssbo
rVal.dirLightSSBO = new ShaderStorageBuffer(DIRECT_LIGHT_BUFFER_SIZE, BufferUsage.DYNAMIC, BufferAccess.DRAW);
@ -334,6 +324,49 @@ public class LightManager {
return directionalLight;
}
/**
* Checks if the light manager has a light attached to the provided entity
* @param entity The entity
* @return true if there is an attached light, false otherwise
*/
public boolean hasAttachedLight(Entity entity){
return this.entityPointLightMap.containsKey(entity);
}
/**
* Gets the point light associated with a given entity
* @param entity The entity
* @return The point light if it exists, null otherwise
*/
public PointLight getPointLight(Entity entity){
return entityPointLightMap.get(entity);
}
/**
* Destroys the light attached to an entity if one is attached
* @param entity The entity
*/
public void destroyPointLight(Entity entity){
if(entityPointLightMap.containsKey(entity)){
entityPointLightMap.remove(entity);
}
}
/**
* Creates a point light from a description.
* <p>
* Note: If there is a light already assigned to the entity, it will be overwritten by the new light
* </p>
* @param entity The entity to assign the light to
* @param description The description
* @return The light
*/
public PointLight createPointLight(Entity entity, PointLightDescription description){
PointLight light = new PointLight(description);
this.entityPointLightMap.put(entity, light);
return light;
}
}

View File

@ -2,6 +2,8 @@ package electrosphere.renderer.light;
import org.joml.Vector3f;
import electrosphere.game.data.common.light.PointLightDescription;
/**
* Data about a point light
*/
@ -61,7 +63,7 @@ public class PointLight {
return radius;
}
public PointLight(Vector3f position){
protected PointLight(Vector3f position){
this.position = position;
radius = 1;
constant = 1.0f;
@ -70,7 +72,7 @@ public class PointLight {
color = new Vector3f(1.0f);
}
public PointLight(Vector3f position, Vector3f color){
protected PointLight(Vector3f position, Vector3f color){
this.position = position;
radius = 1;
constant = 1.0f;
@ -78,4 +80,16 @@ public class PointLight {
quadratic = 1.8f;
this.color = color;
}
/**
* Creates a point light from a light description
* @param description The description
*/
protected PointLight(PointLightDescription description){
this.radius = description.getRadius();
this.constant = description.getConstant();
this.linear = description.getLinear();
this.quadratic = description.getQuadratic();
this.color = description.getColor();
}
}