furniture placement cursor
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2025-05-14 19:47:36 -04:00
parent 7229a86dda
commit 4a2aecf9c8
5 changed files with 87 additions and 0 deletions

View File

@ -1777,6 +1777,8 @@ Break out collidable template edit into dedicated component
Fix virtual scrollable
Fix engine not closing when X button is hit on main menu
Sorting imgui debug windows
Grid alignment cursor
Furniture spawner items triggers grid alignment cursor

View File

@ -10,6 +10,7 @@ import electrosphere.client.entity.camera.CameraEntityUtils;
import electrosphere.client.interact.select.AreaSelection;
import electrosphere.collision.CollisionEngine;
import electrosphere.data.block.BlockFab;
import electrosphere.data.grident.GridAlignedData;
import electrosphere.data.item.Item;
import electrosphere.engine.Globals;
import electrosphere.engine.assetmanager.AssetDataStrings;
@ -50,6 +51,11 @@ public class CursorState {
*/
public static final String CURSOR_FAB_TOKEN = "CURSOR_FAB";
/**
* Cursor that displays a grid-aligned model
*/
public static final String CURSOR_GRID_ALIGNED_TOKEN = "CURSOR_GRID_ALIGNED";
/**
* Minimum size of the block cursor
*/
@ -91,6 +97,16 @@ public class CursorState {
*/
static Entity playerFabCursor;
/**
* The grid-aligned cursor
*/
static Entity playerGridAlignedCursor;
/**
* Data for the grid alignment
*/
private GridAlignedData gridAlignmentData;
/**
* Maximum value to rotate to
*/
@ -151,6 +167,14 @@ public class CursorState {
fabCursorActor.addTextureMask(new ActorTextureMask("cube", Arrays.asList(new String[]{AssetDataStrings.TEXTURE_RED_TRANSPARENT})));
DrawableUtils.makeEntityTransparent(playerFabCursor);
Globals.clientSceneWrapper.getScene().removeEntityFromTag(playerFabCursor, EntityTags.DRAWABLE);
//player's grid-aligned cursor
playerGridAlignedCursor = EntityCreationUtils.createClientSpatialEntity();
EntityCreationUtils.makeEntityDrawable(playerGridAlignedCursor, AssetDataStrings.UNITCUBE);
Actor gridAlignedCursorActor = EntityUtils.getActor(playerGridAlignedCursor);
gridAlignedCursorActor.addTextureMask(new ActorTextureMask("cube", Arrays.asList(new String[]{AssetDataStrings.TEXTURE_RED_TRANSPARENT})));
DrawableUtils.makeEntityTransparent(playerGridAlignedCursor);
Globals.clientSceneWrapper.getScene().removeEntityFromTag(playerGridAlignedCursor, EntityTags.DRAWABLE);
}
/**
@ -180,6 +204,10 @@ public class CursorState {
EntityUtils.getPosition(Globals.playerBlockCursor).set(cursorPos);
cursorPos.sub(BlockChunkData.BLOCK_SIZE_MULTIPLIER / 2.0,BlockChunkData.BLOCK_SIZE_MULTIPLIER / 2.0,BlockChunkData.BLOCK_SIZE_MULTIPLIER / 2.0);
EntityUtils.getPosition(CursorState.playerFabCursor).set(cursorPos);
if(gridAlignmentData != null){
CursorState.nudgeGridAlignment(cursorPos,gridAlignmentData);
}
EntityUtils.getPosition(CursorState.playerGridAlignedCursor).set(cursorPos);
}
}
@ -219,6 +247,17 @@ public class CursorState {
Globals.cursorState.fabCursorRotation = 0;
}
/**
* Makes the grid-aligned placement cursor visible
*/
public static void makeGridAlignedVisible(String modelPath){
CursorState.hide();
Globals.cursorState.setClampToExistingBlock(true);
Globals.clientSceneWrapper.getScene().registerEntityToTag(CursorState.playerGridAlignedCursor, EntityTags.DRAWABLE);
EntityCreationUtils.makeEntityDrawable(playerGridAlignedCursor, modelPath);
Globals.cursorState.fabCursorRotation = 0;
}
/**
* Hides the cursor
*/
@ -227,6 +266,7 @@ public class CursorState {
Globals.clientSceneWrapper.getScene().removeEntityFromTag(Globals.playerBlockCursor, EntityTags.DRAWABLE);
Globals.clientSceneWrapper.getScene().removeEntityFromTag(Globals.playerAreaCursor, EntityTags.DRAWABLE);
Globals.clientSceneWrapper.getScene().removeEntityFromTag(CursorState.playerFabCursor, EntityTags.DRAWABLE);
Globals.clientSceneWrapper.getScene().removeEntityFromTag(CursorState.playerGridAlignedCursor, EntityTags.DRAWABLE);
}
/**
@ -301,6 +341,23 @@ public class CursorState {
return new Vector3d(x,y,z);
}
/**
* Nudges the position to align with the grid alignment data
* @param position The position
* @param data The data
*/
private static void nudgeGridAlignment(Vector3d position, GridAlignedData data){
if(data.getWidth() / 2 == 1){
position.x = position.x + BlockChunkData.BLOCK_SIZE_MULTIPLIER / 2.0f;
}
if(data.getHeight() / 2 == 1){
position.y = position.y + BlockChunkData.BLOCK_SIZE_MULTIPLIER / 2.0f;
}
if(data.getLength() / 2 == 1){
position.z = position.z + BlockChunkData.BLOCK_SIZE_MULTIPLIER / 2.0f;
}
}
/**
* Gets the block cursor position
* @return The block cursor position
@ -536,5 +593,13 @@ public class CursorState {
public int getFabCursorRotation(){
return this.fabCursorRotation;
}
/**
* Sets the grid alignment data
* @param gridAlignedData The grid alignment data
*/
public void setGridAlignmentData(GridAlignedData gridAlignedData){
this.gridAlignmentData = gridAlignedData;
}
}

View File

@ -443,6 +443,14 @@ public class CommonEntityType {
return gridAlignedData;
}
/**
* Sets the grid-aligned data
* @param data The grid-aligned data
*/
public void setGridAlignedData(GridAlignedData data){
this.gridAlignedData = data;
}
/**
* Gets the data for furniture behaviors
* @return The data for furniture behaviors

View File

@ -113,6 +113,11 @@ public class Item extends CommonEntityType {
rVal.setMaxStack(Item.SPAWN_ITEM_DEFAULT_MAX_STACK);
}
//grid-alignment data
if(objectData.getGridAlignedData() != null){
rVal.setGridAlignedData(objectData.getGridAlignedData());
}
if(description.getItemIcon() != null){
rVal.iconPath = description.getItemIcon();

View File

@ -197,6 +197,13 @@ public class ClientToolbarState implements BehaviorTree {
Globals.cursorState.setSelectedFab(BlockFab.read(FileUtils.getAssetFile(itemData.getFabData().getFabPath())));
Globals.cursorState.setSelectedFabPath(FileUtils.getAssetFileString(itemData.getFabData().getFabPath()));
CursorState.makeFabVisible();
} else if(itemData.getGridAlignedData() != null){
String modelPath = AssetDataStrings.UNITCUBE;
if(itemData.getGraphicsTemplate() != null && itemData.getGraphicsTemplate().getModel() != null){
modelPath = itemData.getGraphicsTemplate().getModel().getPath();
}
Globals.cursorState.setGridAlignmentData(itemData.getGridAlignedData());
CursorState.makeGridAlignedVisible(modelPath);
}
}
}