Protfolio-Emanuel-Polsky / Assets / _Project / Code / Culling / CameraFrustumAuthoringSystem.cs
CameraFrustumAuthoringSystem.cs
Raw
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);
        }
    }
}