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(); state.RequireForUpdate(); state.RequireForUpdate(); } public void OnUpdate(ref SystemState state) { var camera = SystemAPI.GetSingleton().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(); 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); } } }