Start using new extension methods, code cleanup
Removed all of the different block property getter methods
This commit is contained in:
parent
2d99d1d478
commit
61184145a9
5 changed files with 55 additions and 179 deletions
|
@ -254,10 +254,10 @@ namespace TechbloxModdingAPI
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float3 Position
|
public float3 Position
|
||||||
{
|
{
|
||||||
get => MovementEngine.GetPosition(Id, InitData);
|
get => MovementEngine.GetPosition(this);
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
MovementEngine.MoveBlock(Id, InitData, value);
|
MovementEngine.MoveBlock(this, value);
|
||||||
if (blockGroup != null)
|
if (blockGroup != null)
|
||||||
blockGroup.PosAndRotCalculated = false;
|
blockGroup.PosAndRotCalculated = false;
|
||||||
BlockEngine.UpdateDisplayedBlock(Id);
|
BlockEngine.UpdateDisplayedBlock(Id);
|
||||||
|
@ -269,10 +269,10 @@ namespace TechbloxModdingAPI
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float3 Rotation
|
public float3 Rotation
|
||||||
{
|
{
|
||||||
get => RotationEngine.GetRotation(Id, InitData);
|
get => RotationEngine.GetRotation(this);
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
RotationEngine.RotateBlock(Id, InitData, value);
|
RotationEngine.RotateBlock(this, value);
|
||||||
if (blockGroup != null)
|
if (blockGroup != null)
|
||||||
blockGroup.PosAndRotCalculated = false;
|
blockGroup.PosAndRotCalculated = false;
|
||||||
BlockEngine.UpdateDisplayedBlock(Id);
|
BlockEngine.UpdateDisplayedBlock(Id);
|
||||||
|
|
|
@ -70,75 +70,9 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
: entitiesDB.QueryEntity<PaletteEntryEntityStruct>(index,
|
: entitiesDB.QueryEntity<PaletteEntryEntityStruct>(index,
|
||||||
CommonExclusiveGroups.COLOUR_PALETTE_GROUP).Colour;
|
CommonExclusiveGroups.COLOUR_PALETTE_GROUP).Colour;
|
||||||
|
|
||||||
public OptionalRef<T> GetBlockInfo<T>(EGID blockID) where T : unmanaged, IEntityComponent
|
public OptionalRef<T> GetBlockInfo<T>(Block block) where T : unmanaged, IEntityComponent
|
||||||
{
|
{
|
||||||
return entitiesDB.TryQueryEntitiesAndIndex<T>(blockID, out uint index, out var array)
|
return entitiesDB.QueryEntityOptional<T>(block);
|
||||||
? new OptionalRef<T>(array, index)
|
|
||||||
: new OptionalRef<T>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ref T GetBlockInfoViewStruct<T>(EGID blockID) where T : struct, INeedEGID, IEntityViewComponent
|
|
||||||
{
|
|
||||||
if (entitiesDB.Exists<T>(blockID))
|
|
||||||
return ref entitiesDB.QueryEntity<T>(blockID);
|
|
||||||
T[] structHolder = new T[1]; //Create something that can be referenced
|
|
||||||
return ref structHolder[0]; //Gets a default value automatically
|
|
||||||
}
|
|
||||||
|
|
||||||
public U GetBlockInfo<T, U>(Block block, Func<T, U> getter,
|
|
||||||
U def = default) where T : unmanaged, IEntityComponent
|
|
||||||
{
|
|
||||||
if (entitiesDB.Exists<T>(block.Id))
|
|
||||||
return getter(entitiesDB.QueryEntity<T>(block.Id));
|
|
||||||
return GetBlockInitInfo(block, getter, def);
|
|
||||||
}
|
|
||||||
|
|
||||||
public U GetBlockInfoViewStruct<T, U>(Block block, Func<T, U> getter,
|
|
||||||
U def = default) where T : struct, IEntityViewComponent
|
|
||||||
{
|
|
||||||
if (entitiesDB.Exists<T>(block.Id))
|
|
||||||
return getter(entitiesDB.QueryEntity<T>(block.Id));
|
|
||||||
return GetBlockInitInfo(block, getter, def);
|
|
||||||
}
|
|
||||||
|
|
||||||
private U GetBlockInitInfo<T, U>(Block block, Func<T, U> getter, U def) where T : struct, IEntityComponent
|
|
||||||
{
|
|
||||||
if (block.InitData.Group == null) return def;
|
|
||||||
var initializer = new EntityInitializer(block.Id, block.InitData.Group, block.InitData.Reference);
|
|
||||||
if (initializer.Has<T>())
|
|
||||||
return getter(initializer.Get<T>());
|
|
||||||
return def;
|
|
||||||
}
|
|
||||||
|
|
||||||
public delegate void Setter<T, U>(ref T component, U value) where T : struct, IEntityComponent;
|
|
||||||
|
|
||||||
public void SetBlockInfoViewStruct<T, U>(Block block, Setter<T, U> setter, U value) where T : struct, IEntityViewComponent
|
|
||||||
{
|
|
||||||
if (entitiesDB.Exists<T>(block.Id))
|
|
||||||
setter(ref entitiesDB.QueryEntity<T>(block.Id), value);
|
|
||||||
else
|
|
||||||
SetBlockInitInfo(block, setter, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetBlockInfo<T, U>(Block block, Setter<T, U> setter, U value) where T : unmanaged, IEntityComponent
|
|
||||||
{
|
|
||||||
if (entitiesDB.Exists<T>(block.Id))
|
|
||||||
setter(ref entitiesDB.QueryEntity<T>(block.Id), value);
|
|
||||||
else
|
|
||||||
SetBlockInitInfo(block, setter, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetBlockInitInfo<T, U>(Block block, Setter<T, U> setter, U value)
|
|
||||||
where T : struct, IEntityComponent
|
|
||||||
{
|
|
||||||
if (block.InitData.Group != null)
|
|
||||||
{
|
|
||||||
var initializer = new EntityInitializer(block.Id, block.InitData.Group, block.InitData.Reference);
|
|
||||||
T component = initializer.Has<T>() ? initializer.Get<T>() : default;
|
|
||||||
ref T structRef = ref component;
|
|
||||||
setter(ref structRef, value);
|
|
||||||
initializer.Init(structRef);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateDisplayedBlock(EGID id)
|
public void UpdateDisplayedBlock(EGID id)
|
||||||
|
@ -153,7 +87,8 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
internal void UpdatePrefab(Block block, ushort type, byte material, bool flipped)
|
internal void UpdatePrefab(Block block, ushort type, byte material, bool flipped)
|
||||||
{
|
{
|
||||||
uint pid = PrefabsID.GetOrCreatePrefabID(type, material, 0, flipped);
|
uint pid = PrefabsID.GetOrCreatePrefabID(type, material, 0, flipped);
|
||||||
entitiesDB.QueryEntityOrDefault<GFXPrefabEntityStructGPUI>()
|
entitiesDB.QueryEntityOrDefault<GFXPrefabEntityStructGPUI>(block).prefabID = pid;
|
||||||
|
entitiesDB.QueryEntityOrDefault<PhysicsPrefabEntityStruct>(block) = new PhysicsPrefabEntityStruct(pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool BlockExists(EGID blockID)
|
public bool BlockExists(EGID blockID)
|
||||||
|
@ -161,16 +96,6 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
return entitiesDB.Exists<DBEntityStruct>(blockID);
|
return entitiesDB.Exists<DBEntityStruct>(blockID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool GetBlockInfoExists<T>(Block block) where T : struct, IEntityComponent
|
|
||||||
{
|
|
||||||
if (entitiesDB.Exists<T>(block.Id))
|
|
||||||
return true;
|
|
||||||
if (block.InitData.Group == null)
|
|
||||||
return false;
|
|
||||||
var init = new EntityInitializer(block.Id, block.InitData.Group, block.InitData.Reference);
|
|
||||||
return init.Has<T>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimBody[] GetSimBodiesFromID(byte id)
|
public SimBody[] GetSimBodiesFromID(byte id)
|
||||||
{
|
{
|
||||||
var ret = new FasterList<SimBody>(4);
|
var ret = new FasterList<SimBody>(4);
|
||||||
|
|
|
@ -34,21 +34,12 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
|
|
||||||
// implementations for Movement static class
|
// implementations for Movement static class
|
||||||
|
|
||||||
internal float3 MoveBlock(EGID blockID, BlockEngine.BlockInitData data, float3 vector)
|
internal float3 MoveBlock(Block block, float3 vector)
|
||||||
{
|
{
|
||||||
if (!entitiesDB.Exists<PositionEntityStruct>(blockID))
|
ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntityOrDefault<PositionEntityStruct>(block);
|
||||||
{
|
ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntityOrDefault<GridRotationStruct>(block);
|
||||||
if (data.Group == null) return float3.zero;
|
ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntityOrDefault<LocalTransformEntityStruct>(block);
|
||||||
var init = new EntityInitializer(blockID, data.Group, data.Reference);
|
ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntityOrDefault<UECSPhysicsEntityStruct>(block);
|
||||||
init.GetOrCreate<PositionEntityStruct>().position = vector;
|
|
||||||
init.GetOrCreate<GridRotationStruct>().position = vector;
|
|
||||||
init.GetOrCreate<LocalTransformEntityStruct>().position = vector;
|
|
||||||
return vector;
|
|
||||||
}
|
|
||||||
ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntity<PositionEntityStruct>(blockID);
|
|
||||||
ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity<GridRotationStruct>(blockID);
|
|
||||||
ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity<LocalTransformEntityStruct>(blockID);
|
|
||||||
ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntity<UECSPhysicsEntityStruct>(blockID);
|
|
||||||
// main (persistent) position
|
// main (persistent) position
|
||||||
posStruct.position = vector;
|
posStruct.position = vector;
|
||||||
// placement grid position
|
// placement grid position
|
||||||
|
@ -56,24 +47,21 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
// rendered position
|
// rendered position
|
||||||
transStruct.position = vector;
|
transStruct.position = vector;
|
||||||
// collision position
|
// collision position
|
||||||
|
if (phyStruct.ID != EGID.Empty)
|
||||||
|
{ //It exists
|
||||||
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Translation
|
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Translation
|
||||||
{
|
{
|
||||||
Value = posStruct.position
|
Value = posStruct.position
|
||||||
});
|
});
|
||||||
entitiesDB.QueryEntity<GridConnectionsEntityStruct>(blockID).isProcessed = false;
|
}
|
||||||
|
|
||||||
|
entitiesDB.QueryEntityOrDefault<GridConnectionsEntityStruct>(block).isProcessed = false;
|
||||||
return posStruct.position;
|
return posStruct.position;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal float3 GetPosition(EGID blockID, BlockEngine.BlockInitData data)
|
internal float3 GetPosition(Block block)
|
||||||
{
|
{
|
||||||
if (!entitiesDB.Exists<PositionEntityStruct>(blockID))
|
return entitiesDB.QueryEntityOrDefault<PositionEntityStruct>(block).position;
|
||||||
{
|
|
||||||
if (data.Group == null) return float3.zero;
|
|
||||||
var init = new EntityInitializer(blockID, data.Group, data.Reference);
|
|
||||||
return init.Has<PositionEntityStruct>() ? init.Get<PositionEntityStruct>().position : float3.zero;
|
|
||||||
}
|
|
||||||
ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntity<PositionEntityStruct>(blockID);
|
|
||||||
return posStruct.position;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,55 +34,38 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
|
|
||||||
// implementations for Rotation static class
|
// implementations for Rotation static class
|
||||||
|
|
||||||
internal float3 RotateBlock(EGID blockID, BlockEngine.BlockInitData data, Vector3 vector)
|
internal float3 RotateBlock(Block block, Vector3 vector)
|
||||||
{
|
{
|
||||||
if (!entitiesDB.Exists<RotationEntityStruct>(blockID))
|
ref RotationEntityStruct rotStruct = ref this.entitiesDB.QueryEntityOrDefault<RotationEntityStruct>(block);
|
||||||
{
|
ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntityOrDefault<GridRotationStruct>(block);
|
||||||
if (data.Group == null) return float3.zero;
|
ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntityOrDefault<LocalTransformEntityStruct>(block);
|
||||||
var init = new EntityInitializer(blockID, data.Group, data.Reference);
|
ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntityOrDefault<UECSPhysicsEntityStruct>(block);
|
||||||
init.GetOrCreate<RotationEntityStruct>().rotation = Quaternion.Euler(vector);
|
// main (persistent) rotation
|
||||||
init.GetOrCreate<GridRotationStruct>().rotation = Quaternion.Euler(vector);
|
|
||||||
init.GetOrCreate<LocalTransformEntityStruct>().rotation = Quaternion.Euler(vector);
|
|
||||||
return vector;
|
|
||||||
}
|
|
||||||
ref RotationEntityStruct rotStruct = ref this.entitiesDB.QueryEntity<RotationEntityStruct>(blockID);
|
|
||||||
ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity<GridRotationStruct>(blockID);
|
|
||||||
ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity<LocalTransformEntityStruct>(blockID);
|
|
||||||
ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntity<UECSPhysicsEntityStruct>(blockID);
|
|
||||||
// main (persistent) position
|
|
||||||
Quaternion newRotation = rotStruct.rotation;
|
Quaternion newRotation = rotStruct.rotation;
|
||||||
newRotation.eulerAngles = vector;
|
newRotation.eulerAngles = vector;
|
||||||
rotStruct.rotation = newRotation;
|
rotStruct.rotation = newRotation;
|
||||||
// placement grid rotation
|
// placement grid rotation
|
||||||
Quaternion newGridRotation = gridStruct.rotation;
|
gridStruct.rotation = newRotation;
|
||||||
newGridRotation.eulerAngles = vector;
|
// rendered rotation
|
||||||
gridStruct.rotation = newGridRotation;
|
transStruct.rotation = newRotation;
|
||||||
// rendered position
|
// collision rotation
|
||||||
Quaternion newTransRotation = rotStruct.rotation;
|
if (phyStruct.ID != EGID.Empty)
|
||||||
newTransRotation.eulerAngles = vector;
|
{ //It exists
|
||||||
transStruct.rotation = newTransRotation;
|
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity,
|
||||||
// collision position
|
new Unity.Transforms.Rotation
|
||||||
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Unity.Transforms.Rotation
|
|
||||||
{
|
{
|
||||||
Value = rotStruct.rotation
|
Value = rotStruct.rotation
|
||||||
});
|
});
|
||||||
entitiesDB.QueryEntity<GridConnectionsEntityStruct>(blockID).isProcessed = false;
|
}
|
||||||
|
|
||||||
|
entitiesDB.QueryEntityOrDefault<GridConnectionsEntityStruct>(block).isProcessed = false;
|
||||||
return ((Quaternion)rotStruct.rotation).eulerAngles;
|
return ((Quaternion)rotStruct.rotation).eulerAngles;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal float3 GetRotation(EGID blockID, BlockEngine.BlockInitData data)
|
internal float3 GetRotation(Block block)
|
||||||
{
|
{
|
||||||
if (!entitiesDB.Exists<RotationEntityStruct>(blockID))
|
ref RotationEntityStruct rotStruct = ref entitiesDB.QueryEntityOrDefault<RotationEntityStruct>(block);
|
||||||
{
|
|
||||||
if (data.Group == null) return float3.zero;
|
|
||||||
var init = new EntityInitializer(blockID, data.Group, data.Reference);
|
|
||||||
return init.Has<RotationEntityStruct>()
|
|
||||||
? (float3) ((Quaternion) init.Get<RotationEntityStruct>().rotation).eulerAngles
|
|
||||||
: float3.zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
ref RotationEntityStruct rotStruct = ref entitiesDB.QueryEntity<RotationEntityStruct>(blockID);
|
|
||||||
return ((Quaternion) rotStruct.rotation).eulerAngles;
|
return ((Quaternion) rotStruct.rotation).eulerAngles;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ using Svelto.ECS;
|
||||||
using Svelto.DataStructures;
|
using Svelto.DataStructures;
|
||||||
using Gamecraft.Wires;
|
using Gamecraft.Wires;
|
||||||
using TechbloxModdingAPI.Engines;
|
using TechbloxModdingAPI.Engines;
|
||||||
|
using TechbloxModdingAPI.Utility;
|
||||||
|
|
||||||
namespace TechbloxModdingAPI.Blocks
|
namespace TechbloxModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
|
@ -87,8 +88,8 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
|
|
||||||
public ref PortEntityStruct GetPortByOffset(Block block, byte portNumber, bool input)
|
public ref PortEntityStruct GetPortByOffset(Block block, byte portNumber, bool input)
|
||||||
{
|
{
|
||||||
BlockPortsStruct bps = GetFromDbOrInitData<BlockPortsStruct>(block, block.Id, out bool exists);
|
var bps = entitiesDB.QueryEntityOptional<BlockPortsStruct>(block);
|
||||||
if (!exists)
|
if (!bps)
|
||||||
{
|
{
|
||||||
throw new BlockException("Block does not exist");
|
throw new BlockException("Block does not exist");
|
||||||
}
|
}
|
||||||
|
@ -208,8 +209,9 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
|
|
||||||
public EGID MatchBlockInputToPort(Block block, byte portUsage, out bool exists)
|
public EGID MatchBlockInputToPort(Block block, byte portUsage, out bool exists)
|
||||||
{
|
{
|
||||||
BlockPortsStruct ports = GetFromDbOrInitData<BlockPortsStruct>(block, block.Id, out exists);
|
var ports = entitiesDB.QueryEntityOptional<BlockPortsStruct>(block);
|
||||||
return new EGID(ports.firstInputID + portUsage, NamedExclusiveGroup<InputPortsGroup>.Group);
|
exists = ports;
|
||||||
|
return new EGID(ports.Get().firstInputID + portUsage, NamedExclusiveGroup<InputPortsGroup>.Group);
|
||||||
}
|
}
|
||||||
|
|
||||||
public EGID MatchBlockInputToPort(EGID block, byte portUsage, out bool exists)
|
public EGID MatchBlockInputToPort(EGID block, byte portUsage, out bool exists)
|
||||||
|
@ -226,8 +228,9 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
|
|
||||||
public EGID MatchBlockOutputToPort(Block block, byte portUsage, out bool exists)
|
public EGID MatchBlockOutputToPort(Block block, byte portUsage, out bool exists)
|
||||||
{
|
{
|
||||||
BlockPortsStruct ports = GetFromDbOrInitData<BlockPortsStruct>(block, block.Id, out exists);
|
var ports = entitiesDB.QueryEntityOptional<BlockPortsStruct>(block);
|
||||||
return new EGID(ports.firstOutputID + portUsage, NamedExclusiveGroup<OutputPortsGroup>.Group);
|
exists = ports;
|
||||||
|
return new EGID(ports.Get().firstOutputID + portUsage, NamedExclusiveGroup<OutputPortsGroup>.Group);
|
||||||
}
|
}
|
||||||
|
|
||||||
public EGID MatchBlockOutputToPort(EGID block, byte portUsage, out bool exists)
|
public EGID MatchBlockOutputToPort(EGID block, byte portUsage, out bool exists)
|
||||||
|
@ -385,29 +388,6 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
return results.ToArray();
|
return results.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ref T GetFromDbOrInitData<T>(Block block, EGID id, out bool exists) where T : unmanaged, IEntityComponent
|
|
||||||
{
|
|
||||||
T[] defRef = new T[1];
|
|
||||||
if (entitiesDB.Exists<T>(id))
|
|
||||||
{
|
|
||||||
exists = true;
|
|
||||||
return ref entitiesDB.QueryEntity<T>(id);
|
|
||||||
}
|
|
||||||
if (block == null || block.InitData.Group == null)
|
|
||||||
{
|
|
||||||
exists = false;
|
|
||||||
return ref defRef[0];
|
|
||||||
}
|
|
||||||
EntityInitializer initializer = new EntityInitializer(block.Id, block.InitData.Group, block.InitData.Reference);
|
|
||||||
if (initializer.Has<T>())
|
|
||||||
{
|
|
||||||
exists = true;
|
|
||||||
return ref initializer.Get<T>();
|
|
||||||
}
|
|
||||||
exists = false;
|
|
||||||
return ref defRef[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
private EntityCollection<ChannelDataStruct> GetSignalStruct(uint signalID, out uint index, bool input = true)
|
private EntityCollection<ChannelDataStruct> GetSignalStruct(uint signalID, out uint index, bool input = true)
|
||||||
{
|
{
|
||||||
ExclusiveGroup group = input
|
ExclusiveGroup group = input
|
||||||
|
|
Loading…
Reference in a new issue