using GarmentButton.CameraGeneral;
using Unity.Burst;
using Unity.Entities;
using Unity.Mathematics;
using UnityEngine;
namespace GarmentButton.Culling
{
public partial struct CameraFrustumAuthoringSystem : ISystem
{
[BurstCompile]
public void OnCreate(ref SystemState state)
{
state.RequireForUpdate<CameraReferenceProperty>();
state.RequireForUpdate<CameraFrustumPlanes>();
state.RequireForUpdate<VisibleTag>();
}
public void OnUpdate(ref SystemState state)
{
var camera = SystemAPI.GetSingleton<CameraReferenceProperty>().Value.Value;
// Unity provides frustum planes via GeometryUtility (managed), but we can still use it here
var planes = GeometryUtility.CalculateFrustumPlanes(camera);
// Convert to float4 (n, d)
var frustum = SystemAPI.GetSingletonRW<CameraFrustumPlanes>();
frustum.ValueRW.P0 = PlaneToFloat4(planes[0]);
frustum.ValueRW.P1 = PlaneToFloat4(planes[1]);
frustum.ValueRW.P2 = PlaneToFloat4(planes[2]);
frustum.ValueRW.P3 = PlaneToFloat4(planes[3]);
frustum.ValueRW.P4 = PlaneToFloat4(planes[4]);
frustum.ValueRW.P5 = PlaneToFloat4(planes[5]);
}
private float4 PlaneToFloat4(Plane p)
{
// Unity Plane: normal, distance where plane equation is dot(n, x) + distance = 0
// For "inside" test we want dot(n, x) + d >= 0, which matches Unity’s distance sign here.
return new float4(p.normal.x, p.normal.y, p.normal.z, p.distance);
}
}
}