From c6bf724f40a5a1f4fa3dc80288e63e4d0899cc57 Mon Sep 17 00:00:00 2001 From: NGnius Date: Tue, 19 Nov 2019 12:05:08 -0500 Subject: [PATCH] Fix MoveLastBlock command (it now works most of the time) --- extracommands/ExtraCommands.csproj | 6 +++ extracommands/MoveBlocksCommandEngine.cs | 49 ++++++++++++++++++------ 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/extracommands/ExtraCommands.csproj b/extracommands/ExtraCommands.csproj index ba954b4..28dabd7 100644 --- a/extracommands/ExtraCommands.csproj +++ b/extracommands/ExtraCommands.csproj @@ -28,7 +28,13 @@ ..\ref\RobocraftX.Common.dll + + ..\ref\RobocraftX.Blocks.dll + + ..\ref\RobocraftX.Character.dll + + ..\ref\RobocraftX.Input.dll diff --git a/extracommands/MoveBlocksCommandEngine.cs b/extracommands/MoveBlocksCommandEngine.cs index 1a13bde..07fd2ba 100644 --- a/extracommands/MoveBlocksCommandEngine.cs +++ b/extracommands/MoveBlocksCommandEngine.cs @@ -7,12 +7,12 @@ using Svelto.ECS; using Svelto.ECS.EntityStructs; using Unity.Entities; using Svelto.Context; -using Svelto.DataStructures; using Svelto.Tasks; using RobocraftX; using RobocraftX.SimulationModeState; using RobocraftX.UECS; using Unity.Transforms; +using Unity.Mathematics; namespace ExtraCommands.Building { @@ -51,13 +51,13 @@ namespace ExtraCommands.Building // Move block with highest index by vector (x,y,z) private void MoveLastBlockCommand(float x, float y, float z) { + uint count = entitiesDB.Count(CommonExclusiveGroups.OWNED_BLOCKS_GROUP); ref SimulationModeStateEntityStruct simMode = ref this.entitiesDB.QueryUniqueEntity(SimulationModeStateExclusiveGroups.GAME_STATE_GROUP); if (simMode.simulationMode != SimulationMode.Build) { uREPL.Log.Error("Blocks can only be moved in Build Mode"); return; } - uint count = this.entitiesDB.Count(CommonExclusiveGroups.OWNED_BLOCKS_GROUP); float3 newPos = TranslateConnectedBlocks(count-1, new float3(x,y,z)); uREPL.Log.Output($"Moved block to ({newPos.x},{newPos.y},{newPos.z})"); } @@ -66,9 +66,9 @@ namespace ExtraCommands.Building private float3 TranslateSingleBlock(uint blockID, float3 translationVector) { ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); - ref GridRotationStruct gridStructs = this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); - ref LocalTransformEntityStruct transStructs = this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); - ref UECSPhysicsEntityStruct phyStructs = this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); + ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); + ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); + ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); // main (persistent) position posStruct.position.x += translationVector.x; posStruct.position.y += translationVector.y; @@ -91,16 +91,41 @@ namespace ExtraCommands.Building private float3 TranslateConnectedBlocks(uint blockID, float3 translationVector) { - newPosition = TranslateSingleBlock(blockID, translationVector); - uint count = this.entitiesDB.Count(CommonExclusiveGroups.OWNED_BLOCKS_GROUP); - Stack cubeStack = new Stack(count); - FasterList cubeList = new FasterList(count); - ConnectedCubesUtility.TreeTraversal.GetConnectedCubes(this.entitiesDB, blockID, cubeStack, cubeList, false /*unused*/); - foreach (uint id in FasterList.ToArrayFast(cubeList)) + //float3 newPosition = TranslateSingleBlock(blockID, translationVector); + HashSet processedCubes = new HashSet(); + Stack cubeStack = new Stack(); + cubeStack.Push(blockID); + uint count; + GridConnectionsEntityStruct blockConnections; + MachineGraphConnectionEntityStruct[] connections; + + while (cubeStack.Count > 0) // find all inter-connected blocks + { + uint connectedBlockID = cubeStack.Pop(); + processedCubes.Add(connectedBlockID); + ScalingEntityStruct scale = entitiesDB.QueryEntity(connectedBlockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); + uREPL.Log.Output($"Catching {connectedBlockID} with scale {scale.scale}"); + blockConnections = entitiesDB.QueryEntity(connectedBlockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP); + connections = entitiesDB.QueryEntities(blockConnections.connectionGroup, out count); + + foreach (MachineGraphConnectionEntityStruct conn in connections) + { + if (!processedCubes.Contains(conn.connectedBlock.entityID) + && blockConnections.isConnectionGroupAssigned + && (conn.oppositeConnectionEgid.entityID != 0u + || conn.oppositeConnectionEgid.entityID != conn.connectedBlock.entityID)) + { + uREPL.Log.Output($"Block {connectedBlockID} connects to {conn.connectedBlock.entityID} (opposite {conn.oppositeConnectionEgid.entityID})"); + cubeStack.Push(conn.connectedBlock.entityID); + } + } + } + foreach (uint id in processedCubes) { TranslateSingleBlock(id, translationVector); } - return newPosition; + uREPL.Log.Output($"Found {processedCubes.Count} connected blocks"); + return this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP).position; } // unused; for future reference