furniture placement cursor
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
7229a86dda
commit
4a2aecf9c8
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user