using GarmentButton.PhysicFillters;
using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using Unity.Jobs;
using Unity.Mathematics;
using Unity.Physics;
using UnityEngine;
namespace GarmentButton.PathFinding
{
public partial struct DebugMouseHitSystem : ISystem
{
public void OnCreate(ref SystemState state)
{
state.RequireForUpdate<EndSimulationEntityCommandBufferSystem.Singleton>();
state.RequireForUpdate<PhysicsWorldSingleton>();
state.RequireForUpdate<EndPointPath>();
state.RequireForUpdate<MouseSelectEndPosition>();
}
public void OnUpdate(ref SystemState state)
{
if (!Input.GetMouseButtonDown(0))
return;
var physic = SystemAPI.GetSingleton<PhysicsWorldSingleton>();
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
var newRay = new Unity.Physics.RaycastInput
{
Start = ray.origin,
End = ray.origin + ray.direction * 300,
Filter = new CollisionFilter()
{
CollidesWith = (uint)CollisionLayer.Ground,
BelongsTo = (uint)CollisionLayer.Defualt,
},
};
var hitCast = physic.PhysicsWorld.CastRay(newRay, out var hit);
if (!hitCast)
return;
//Update path for enemies
state.Dependency = new ImplementMousePosition
{
HitPosition = hit.Position,
}.ScheduleParallel(state.Dependency)
;
//Update Grid
var ecb = SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>().CreateCommandBuffer(state.WorldUnmanaged);
state.Dependency = new ImplementMousePositionUpdateGrid
{
HitPosition = hit.Position,
ECB = ecb,
}.Schedule(1,state.Dependency);
;
}
}
[BurstCompile]
[WithDisabled(typeof(EndPointPath))]
public partial struct ImplementMousePosition : IJobEntity
{
[ReadOnly] public float3 HitPosition;
public void Execute([ChunkIndexInQuery] int sortKey, EnabledRefRW<EndPointPath> enable, ref EndPointPath data)
{
data.Position = HitPosition;
enable.ValueRW = true;
}
}
[BurstCompile]
public partial struct ImplementMousePositionUpdateGrid : IJobFor
{
[ReadOnly] public float3 HitPosition;
public EntityCommandBuffer ECB;
public void Execute(int index)
{
var entity = ECB.CreateEntity();
ECB.AddComponent(entity, new RequireUpdatePosition
{
Value = HitPosition.xz,
});
}
}
}