work on chest furniture
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
This commit is contained in:
parent
5c91104961
commit
cb98eac750
@ -203,8 +203,8 @@
|
||||
"collidable": {
|
||||
"type" : "CUBE",
|
||||
"dimension1" : 1.0,
|
||||
"dimension2" : 1.0,
|
||||
"dimension3" : 2.0,
|
||||
"dimension2" : 0.85,
|
||||
"dimension3" : 1.12,
|
||||
"rotX": 0,
|
||||
"rotY": 0,
|
||||
"rotZ": 0,
|
||||
@ -255,20 +255,7 @@
|
||||
}
|
||||
},
|
||||
"buttonInteraction" : {
|
||||
"onInteract" : "inventory",
|
||||
"interactionShape" : {
|
||||
"type" : "CUBE",
|
||||
"dimension1" : 0.3,
|
||||
"dimension2" : 0.3,
|
||||
"dimension3" : 0.3,
|
||||
"rotX": 0,
|
||||
"rotY": 0,
|
||||
"rotZ": 0,
|
||||
"rotW": 1,
|
||||
"offsetX" : 0.0,
|
||||
"offsetY" : 0.1,
|
||||
"offsetZ" : 0.0
|
||||
}
|
||||
"onInteract" : "inventory"
|
||||
},
|
||||
"gridAlignedData" : {
|
||||
"width" : 10,
|
||||
|
||||
@ -1771,6 +1771,9 @@ Recipes for spawn items defined in parent entity
|
||||
Spawn items have stack/charge
|
||||
Spawn items respect charge state
|
||||
Chest furniture
|
||||
Interaction editing debug menu
|
||||
Fix chest physics&interaction data
|
||||
Break out collidable template edit into dedicated component
|
||||
|
||||
|
||||
|
||||
|
||||
@ -309,6 +309,33 @@ public class ClientInteractionEngine {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the entity has an interaction body or not
|
||||
* @param entity The entity
|
||||
* @return true if it has an interaction body, false otherwise
|
||||
*/
|
||||
public static boolean hasInteractionBody(Entity entity){
|
||||
return entity.containsKey(EntityDataStrings.INTERACTION_BODY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the interaction body on the entity
|
||||
* @param entity The entity
|
||||
* @return The body if it exists, null otherwise
|
||||
*/
|
||||
public static DBody getInteractionBody(Entity entity){
|
||||
return (DBody)entity.getData(EntityDataStrings.INTERACTION_BODY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the template for the interaction body
|
||||
* @param entity The entity
|
||||
* @return The tempalte if it exists, null otherwise
|
||||
*/
|
||||
public static CollidableTemplate getInteractionTemplate(Entity entity){
|
||||
return (CollidableTemplate)entity.getData(EntityDataStrings.INTERACTION_TEMPLATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of interactibles on the client
|
||||
* @return The number of interactibles
|
||||
|
||||
@ -0,0 +1,126 @@
|
||||
package electrosphere.client.ui.components.imgui;
|
||||
|
||||
import org.ode4j.ode.DBody;
|
||||
import org.ode4j.ode.DBox;
|
||||
import org.ode4j.ode.DCylinder;
|
||||
import org.ode4j.ode.DGeom;
|
||||
import org.ode4j.ode.DMass;
|
||||
|
||||
import electrosphere.data.collidable.CollidableTemplate;
|
||||
import imgui.ImGui;
|
||||
|
||||
/**
|
||||
* Block for editing collidable data
|
||||
*/
|
||||
public class CollidableEditBlock {
|
||||
|
||||
/**
|
||||
* The minimum offset
|
||||
*/
|
||||
static final float MIN_OFFSET = -10;
|
||||
|
||||
/**
|
||||
* The maximum offset
|
||||
*/
|
||||
static final float MAX_OFFSET = 10;
|
||||
|
||||
/**
|
||||
* Min scale
|
||||
*/
|
||||
static final float MIN_SCALE = 0.001f;
|
||||
|
||||
/**
|
||||
* Max scale
|
||||
*/
|
||||
static final float MAX_SCALE = 10f;
|
||||
|
||||
/**
|
||||
* Minimum mass value
|
||||
*/
|
||||
static final float MIN_MASS = 0;
|
||||
|
||||
/**
|
||||
* Maximum mass value
|
||||
*/
|
||||
static final float MAX_MASS = 1.0f;
|
||||
|
||||
/**
|
||||
* Storage for the modified scale of the collidable
|
||||
*/
|
||||
static float[] scale = new float[3];
|
||||
|
||||
/**
|
||||
* Storage for the modified offset of the collidable
|
||||
*/
|
||||
static float[] offset = new float[3];
|
||||
|
||||
/**
|
||||
* Radius slider
|
||||
*/
|
||||
static float[] radius = new float[1];
|
||||
|
||||
/**
|
||||
* Length slider
|
||||
*/
|
||||
static float[] length = new float[1];
|
||||
|
||||
/**
|
||||
* Mass slider
|
||||
*/
|
||||
static float[] mass = new float[1];
|
||||
|
||||
/**
|
||||
* Draws collidable editing controls
|
||||
* @param physicsBody The body to edit
|
||||
* @param template The template data to edit
|
||||
*/
|
||||
public static void drawCollidableEdit(DBody physicsBody, CollidableTemplate template){
|
||||
if(physicsBody != null && physicsBody.getFirstGeom() != null && ImGui.collapsingHeader("Modify")){
|
||||
DGeom geom = physicsBody.getFirstGeom();
|
||||
if(geom instanceof DBox){
|
||||
DBox box = (DBox)geom;
|
||||
if(ImGui.sliderFloat3("Offset", offset, MIN_OFFSET, MAX_OFFSET)){
|
||||
box.setOffsetPosition(offset[0], offset[1], offset[2]);
|
||||
template.setOffsetX(offset[0]);
|
||||
template.setOffsetY(offset[1]);
|
||||
template.setOffsetZ(offset[2]);
|
||||
}
|
||||
if(ImGui.sliderFloat3("Scale",scale,MIN_SCALE,MAX_SCALE)){
|
||||
box.setLengths(scale[0], scale[1], scale[2]);
|
||||
template.setDimension1(scale[0]);
|
||||
template.setDimension2(scale[1]);
|
||||
template.setDimension3(scale[2]);
|
||||
}
|
||||
if(physicsBody.getMass() instanceof DMass && ImGui.sliderFloat("Mass",mass,MIN_MASS,MAX_MASS)){
|
||||
DMass massObj = (DMass)physicsBody.getMass();
|
||||
float adjusted = (float)Math.log(mass[0] + 1);
|
||||
massObj.setMass(adjusted);
|
||||
}
|
||||
} else if(geom instanceof DCylinder){
|
||||
DCylinder cylinder = (DCylinder)geom;
|
||||
if(ImGui.sliderFloat3("Offset", offset, MIN_OFFSET, MAX_OFFSET)){
|
||||
cylinder.setOffsetPosition(offset[0], offset[1], offset[2]);
|
||||
template.setOffsetX(offset[0]);
|
||||
template.setOffsetY(offset[1]);
|
||||
template.setOffsetZ(offset[2]);
|
||||
}
|
||||
if(ImGui.sliderFloat("Radius",radius,MIN_SCALE,MAX_SCALE)){
|
||||
cylinder.setParams(radius[0], cylinder.getLength());
|
||||
template.setDimension1(radius[0]);
|
||||
}
|
||||
if(ImGui.sliderFloat("Length",length,MIN_SCALE,MAX_SCALE)){
|
||||
cylinder.setParams(cylinder.getRadius(), length[0]);
|
||||
template.setDimension2(length[0]);
|
||||
}
|
||||
if(physicsBody.getMass() instanceof DMass && ImGui.sliderFloat("Mass",mass,MIN_MASS,MAX_MASS)){
|
||||
DMass massObj = (DMass)physicsBody.getMass();
|
||||
float adjusted = (float)Math.log(mass[0] + 1);
|
||||
massObj.setMass(adjusted);
|
||||
}
|
||||
} else {
|
||||
throw new Error("Unsupported geom type! " + geom);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
package electrosphere.client.ui.menu.debug.entity;
|
||||
|
||||
import org.ode4j.ode.DBody;
|
||||
|
||||
import electrosphere.client.interact.ClientInteractionEngine;
|
||||
import electrosphere.client.ui.components.imgui.CollidableEditBlock;
|
||||
import electrosphere.data.collidable.CollidableTemplate;
|
||||
import electrosphere.entity.Entity;
|
||||
import imgui.ImGui;
|
||||
|
||||
/**
|
||||
* Tab for interaction engine data
|
||||
*/
|
||||
public class ImGuiEntityInteractionTab {
|
||||
|
||||
/**
|
||||
* Interaction view
|
||||
*/
|
||||
protected static void drawInteractionTab(boolean show, Entity detailViewEntity){
|
||||
if(detailViewEntity == null){
|
||||
return;
|
||||
}
|
||||
if(show && ImGui.collapsingHeader("Interaction Data")){
|
||||
ImGui.indent();
|
||||
if(ClientInteractionEngine.getInteractionBody(detailViewEntity) != null){
|
||||
DBody body = ClientInteractionEngine.getInteractionBody(detailViewEntity);
|
||||
CollidableTemplate template = ClientInteractionEngine.getInteractionTemplate(detailViewEntity);
|
||||
CollidableEditBlock.drawCollidableEdit(body, template);
|
||||
}
|
||||
ImGui.unindent();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -9,6 +9,7 @@ import org.joml.Vector3d;
|
||||
import org.ode4j.ode.DBody;
|
||||
|
||||
import electrosphere.client.entity.debug.DebugVisualizerUtils;
|
||||
import electrosphere.client.interact.ClientInteractionEngine;
|
||||
import electrosphere.collision.PhysicsEntityUtils;
|
||||
import electrosphere.data.creature.equip.EquipPoint;
|
||||
import electrosphere.data.foliage.FoliageType;
|
||||
@ -75,6 +76,7 @@ public class ImGuiEntityMacros {
|
||||
private static boolean showFoliageTab = false; //show foliage data
|
||||
private static boolean showToolbarTab = false; //show toolbar data
|
||||
private static boolean showInventoryTab = false; //show inventory data
|
||||
private static boolean showInteractionTab = false; //show inventory data
|
||||
private static boolean showDebugActionsTab = false; //show debug actions
|
||||
|
||||
/**
|
||||
@ -201,6 +203,9 @@ public class ImGuiEntityMacros {
|
||||
if(ClientToolbarState.getClientToolbarState(detailViewEntity) != null && ImGui.checkbox("Toolbar Data", showToolbarTab)){
|
||||
showToolbarTab = !showToolbarTab;
|
||||
}
|
||||
if(ClientInteractionEngine.hasInteractionBody(detailViewEntity) && ImGui.checkbox("Interaction Data", showInteractionTab)){
|
||||
showInteractionTab = !showInteractionTab;
|
||||
}
|
||||
if(
|
||||
(InventoryUtils.hasNaturalInventory(detailViewEntity) || InventoryUtils.hasEquipInventory(detailViewEntity) || InventoryUtils.hasToolbarInventory(detailViewEntity)) &&
|
||||
ImGui.checkbox("Inventory Data", showInventoryTab)
|
||||
@ -226,6 +231,7 @@ public class ImGuiEntityMacros {
|
||||
ImGuiEntityFoliageTab.drawFoliageView(showFoliageTab, detailViewEntity);
|
||||
ImGuiEntityToolbarTab.drawToolbarTab(showToolbarTab, detailViewEntity);
|
||||
ImGuiEntityInventoryTab.drawInventoryTab(showInventoryTab, detailViewEntity);
|
||||
ImGuiEntityInteractionTab.drawInteractionTab(showInteractionTab, detailViewEntity);
|
||||
ImGuiEntityDebugActions.drawDebugActions(showDebugActionsTab, detailViewEntity);
|
||||
ImGuiEntityMacros.drawDataView();
|
||||
}
|
||||
|
||||
@ -1,11 +1,8 @@
|
||||
package electrosphere.client.ui.menu.debug.entity;
|
||||
|
||||
import org.ode4j.ode.DBody;
|
||||
import org.ode4j.ode.DBox;
|
||||
import org.ode4j.ode.DCylinder;
|
||||
import org.ode4j.ode.DGeom;
|
||||
import org.ode4j.ode.DMass;
|
||||
|
||||
import electrosphere.client.ui.components.imgui.CollidableEditBlock;
|
||||
import electrosphere.collision.PhysicsEntityUtils;
|
||||
import electrosphere.data.collidable.CollidableTemplate;
|
||||
import electrosphere.engine.Globals;
|
||||
@ -20,51 +17,6 @@ import imgui.ImGui;
|
||||
* Tab for both exploring and editing physics on this entity
|
||||
*/
|
||||
public class ImGuiEntityPhysicsTab {
|
||||
|
||||
/**
|
||||
* The minimum offset
|
||||
*/
|
||||
static final float MIN_OFFSET = -10;
|
||||
|
||||
/**
|
||||
* The maximum offset
|
||||
*/
|
||||
static final float MAX_OFFSET = 10;
|
||||
|
||||
/**
|
||||
* Minimum mass value
|
||||
*/
|
||||
static final float MIN_MASS = 0;
|
||||
|
||||
/**
|
||||
* Maximum mass value
|
||||
*/
|
||||
static final float MAX_MASS = 1.0f;
|
||||
|
||||
/**
|
||||
* Storage for the modified scale of the collidable
|
||||
*/
|
||||
static float[] scale = new float[3];
|
||||
|
||||
/**
|
||||
* Storage for the modified offset of the collidable
|
||||
*/
|
||||
static float[] offset = new float[3];
|
||||
|
||||
/**
|
||||
* Radius slider
|
||||
*/
|
||||
static float[] radius = new float[1];
|
||||
|
||||
/**
|
||||
* Length slider
|
||||
*/
|
||||
static float[] length = new float[1];
|
||||
|
||||
/**
|
||||
* Mass slider
|
||||
*/
|
||||
static float[] mass = new float[1];
|
||||
|
||||
/**
|
||||
* Physics view
|
||||
@ -133,51 +85,8 @@ public class ImGuiEntityPhysicsTab {
|
||||
}
|
||||
//Collidable editing
|
||||
if(physicsBody != null && physicsBody.getFirstGeom() != null && ImGui.collapsingHeader("Modify")){
|
||||
DGeom geom = physicsBody.getFirstGeom();
|
||||
CollidableTemplate template = (CollidableTemplate)detailViewEntity.getData(EntityDataStrings.PHYSICS_MODEL_TEMPLATE);
|
||||
if(geom instanceof DBox){
|
||||
DBox box = (DBox)geom;
|
||||
if(ImGui.sliderFloat3("Offset", offset, MIN_OFFSET, MAX_OFFSET)){
|
||||
box.setOffsetPosition(offset[0], offset[1], offset[2]);
|
||||
template.setOffsetX(offset[0]);
|
||||
template.setOffsetY(offset[1]);
|
||||
template.setOffsetZ(offset[2]);
|
||||
}
|
||||
if(ImGui.sliderFloat3("Scale",scale,MIN_OFFSET,MAX_OFFSET)){
|
||||
box.setLengths(scale[0], scale[1], scale[2]);
|
||||
template.setDimension1(scale[0]);
|
||||
template.setDimension2(scale[1]);
|
||||
template.setDimension3(scale[2]);
|
||||
}
|
||||
if(physicsBody.getMass() instanceof DMass && ImGui.sliderFloat("Mass",mass,MIN_MASS,MAX_MASS)){
|
||||
DMass massObj = (DMass)physicsBody.getMass();
|
||||
float adjusted = (float)Math.log(mass[0] + 1);
|
||||
massObj.setMass(adjusted);
|
||||
}
|
||||
} else if(geom instanceof DCylinder){
|
||||
DCylinder cylinder = (DCylinder)geom;
|
||||
if(ImGui.sliderFloat3("Offset", offset, MIN_OFFSET, MAX_OFFSET)){
|
||||
cylinder.setOffsetPosition(offset[0], offset[1], offset[2]);
|
||||
template.setOffsetX(offset[0]);
|
||||
template.setOffsetY(offset[1]);
|
||||
template.setOffsetZ(offset[2]);
|
||||
}
|
||||
if(ImGui.sliderFloat("Radius",radius,MIN_OFFSET,MAX_OFFSET)){
|
||||
cylinder.setParams(radius[0], cylinder.getLength());
|
||||
template.setDimension1(radius[0]);
|
||||
}
|
||||
if(ImGui.sliderFloat("Length",length,MIN_OFFSET,MAX_OFFSET)){
|
||||
cylinder.setParams(cylinder.getRadius(), length[0]);
|
||||
template.setDimension2(length[0]);
|
||||
}
|
||||
if(physicsBody.getMass() instanceof DMass && ImGui.sliderFloat("Mass",mass,MIN_MASS,MAX_MASS)){
|
||||
DMass massObj = (DMass)physicsBody.getMass();
|
||||
float adjusted = (float)Math.log(mass[0] + 1);
|
||||
massObj.setMass(adjusted);
|
||||
}
|
||||
} else {
|
||||
throw new Error("Unsupported geom type! " + geom);
|
||||
}
|
||||
CollidableEditBlock.drawCollidableEdit(physicsBody, template);
|
||||
}
|
||||
}
|
||||
ImGui.unindent();
|
||||
|
||||
@ -12,6 +12,7 @@ import org.ode4j.ode.DGeom;
|
||||
import org.ode4j.ode.DSphere;
|
||||
|
||||
import electrosphere.client.entity.camera.CameraEntityUtils;
|
||||
import electrosphere.collision.CollisionEngine;
|
||||
import electrosphere.collision.PhysicsUtils;
|
||||
import electrosphere.collision.collidable.Collidable;
|
||||
import electrosphere.data.collidable.CollidableTemplate;
|
||||
@ -181,7 +182,8 @@ public class DebugContentPipeline implements RenderPipeline {
|
||||
|
||||
if(Globals.userSettings.graphicsDebugDrawPhysicsObjects()){
|
||||
Model physicsGraphicsModel;
|
||||
for(Collidable collidable : Globals.clientSceneWrapper.getCollisionEngine().getCollidables()){
|
||||
CollisionEngine engine = Globals.clientSceneWrapper.getCollisionEngine();
|
||||
for(Collidable collidable : engine.getCollidables()){
|
||||
Entity physicsEntity = collidable.getParent();
|
||||
if((boolean)physicsEntity.getData(EntityDataStrings.DATA_STRING_DRAW) && physicsEntity.getData(EntityDataStrings.PHYSICS_MODEL_TEMPLATE) != null){
|
||||
CollidableTemplate template = (CollidableTemplate)physicsEntity.getData(EntityDataStrings.PHYSICS_MODEL_TEMPLATE);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user