Files
HauntedBloodlines/Assets/HTraceWSGI/Scripts/Structs/VoxelizationRuntimeData.cs
2025-05-29 22:31:40 +03:00

129 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
using HTraceWSGI.Scripts.VoxelCameras;
using UnityEngine;
namespace HTraceWSGI.Scripts.Structs
{
internal enum OffsetAxisIndex
{
AxisXPos = 0,
AxisYPos = 1,
AxisZPos = 2,
AxisXNeg = 3,
AxisYNeg = 4,
AxisZNeg = 5,
}
internal enum OctantIndex
{
None = 0,
OctantA = 1,
OctantB = 2,
OctantC = 3,
OctantD = 4,
DynamicObjects = 5,
}
[Serializable]
internal static class VoxelizationRuntimeData
{
public static VoxelCamera VoxelCamera { get; set; } = null;
public static VoxelCullingCamera CullingCamera { get; set; } = null;
public static VoxelOctantCamera VoxelOctantCamera { get; set; } = null;
public static HTraceDirectionalCamera FakeDirectionalCamera { get; set; } = null;
public static OffsetWorldPosition OffsetWorldPosition = OffsetWorldPosition.zero;
public static OctantIndex OctantIndex = OctantIndex.None;
public static OffsetAxisIndex OffsetAxisIndex = OffsetAxisIndex.AxisXPos;
public static bool FullVoxelization;
public static uint FrameCount;
public static bool EvaluateHitLighting;
public static bool VoxelizationModeChanged; //When we switch mode we got many errors with non alloc textures
[SerializeField] private static float _prevDensityUI = 0f;
[SerializeField] private static int _prevVoxelBoundsUI = 0;
[SerializeField] private static int _prevOverrideBoundsHeightUI = 0;
public static Action OnReallocTextures;
public static void SetParamsForApplyButton(float prevDensityUI, int prevVoxelBoundsUI, int prevOverrideBoundsHeightUI)
{
_prevDensityUI = prevDensityUI;
_prevVoxelBoundsUI = prevVoxelBoundsUI;
_prevOverrideBoundsHeightUI = prevOverrideBoundsHeightUI;
}
public static bool CheckBounds(float voxelDensity, int voxelBounds, int overrideBoundsHeight)
{
return Mathf.Abs(voxelDensity - _prevDensityUI) > Mathf.Epsilon || voxelBounds != _prevVoxelBoundsUI || overrideBoundsHeight != _prevOverrideBoundsHeightUI;
}
}
internal struct OffsetWorldPosition
{
public float AxisXPos;
public float AxisYPos;
public float AxisZPos;
public float AxisXNeg;
public float AxisYNeg;
public float AxisZNeg;
public OffsetWorldPosition(float axisXPos, float axisYPos, float axisZPos, float axisXNeg, float axisYNeg, float axisZNeg)
{
AxisXPos = axisXPos;
AxisYPos = axisYPos;
AxisZPos = axisZPos;
AxisXNeg = axisXNeg;
AxisYNeg = axisYNeg;
AxisZNeg = axisZNeg;
}
public static OffsetWorldPosition zero
{
get => OffsetWorldPosition.zeroVector;
}
private static readonly OffsetWorldPosition zeroVector = new OffsetWorldPosition(0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f);
public static OffsetWorldPosition operator +(OffsetWorldPosition a, OffsetWorldPosition b)
{
return new OffsetWorldPosition(
a.AxisXPos + b.AxisXPos,
a.AxisYPos + b.AxisYPos,
a.AxisZPos + b.AxisZPos,
a.AxisXNeg + b.AxisXNeg,
a.AxisYNeg + b.AxisYNeg,
a.AxisZNeg + b.AxisZNeg
);
}
public OffsetAxisIndex MaxAxisOffset()
{
Dictionary<OffsetAxisIndex, float> dictionary = new Dictionary<OffsetAxisIndex, float>()
{
{OffsetAxisIndex.AxisXPos, AxisXPos},
{OffsetAxisIndex.AxisYPos, AxisYPos},
{OffsetAxisIndex.AxisZPos, AxisZPos},
{OffsetAxisIndex.AxisXNeg, AxisXNeg},
{OffsetAxisIndex.AxisYNeg, AxisYNeg},
{OffsetAxisIndex.AxisZNeg, AxisZNeg},
};
float maxValue = -1;
OffsetAxisIndex axisIndex = OffsetAxisIndex.AxisXPos;
foreach (var element in dictionary)
{
if (element.Value > maxValue)
{
axisIndex = element.Key;
maxValue = element.Value;
}
}
return axisIndex;
}
}
}