using RobocraftX.Common; using RobocraftX.Physics; using Svelto.ECS; using Unity.Mathematics; using Unity.Physics; using UnityEngine; namespace GamecraftModdingAPI { /// /// A rigid body (like a cluster of connected blocks) during simulation. /// public class SimBody { public EGID Id { get; } public SimBody(EGID id) { Id = id; } public SimBody(uint id) : this(new EGID(id, CommonExclusiveGroups.SIMULATION_BODIES_GROUP)) { } public float3 Position { get => GetStruct().position; set => GetStruct().position = value; } public float3 Velocity { get => GetStruct().velocity; set => GetStruct().velocity = value; } public float3 AngularVelocity { get => GetStruct().angularVelocity; set => GetStruct().angularVelocity = value; } public float3 DeltaVelocity { get => GetStruct().deltaVelocity; set => GetStruct().deltaVelocity = value; } public float3 DeltaAngularVelocity { get => GetStruct().deltaAngularVelocity; set => GetStruct().deltaAngularVelocity = value; } public float3 Rotation { get => ((Quaternion) GetStruct().rotation).eulerAngles; set { ref var str = ref GetStruct(); Quaternion quaternion = str.rotation; quaternion.eulerAngles = value; str.rotation = quaternion; } } public float Mass { get => math.rcp(GetStruct().physicsMass.InverseMass); set => GetStruct().physicsMass.InverseMass = math.rcp(value); } /// /// Whether the body can be moved or static /// public bool Static { get => Block.BlockEngine.GetBlockInfo(Id).isStatic; set => Block.BlockEngine.GetBlockInfo(Id).isStatic = value; } private ref RigidBodyEntityStruct GetStruct() { return ref Block.BlockEngine.GetBlockInfo(Id); } } }