166 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using HTraceWSGI.Scripts.Extensions;
using HTraceWSGI.Scripts.Globals;
using HTraceWSGI.Scripts.Services.VoxelCameras;
using UnityEngine;
namespace HTraceWSGI.Scripts.Data.Private
{
internal enum OffsetAxisIndex
{
AxisXPos = 0,
AxisYPos = 1,
AxisZPos = 2,
AxisXNeg = 3,
AxisYNeg = 4,
AxisZNeg = 5,
}
internal enum OctantIndex
{
FullVoxelization = 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;
private static bool _fullVoxelization;
public static bool FullVoxelization
{
get => _fullVoxelization;
set
{
_fullVoxelization = value;
if (_fullVoxelization == true)
OctantIndex = OctantIndex.FullVoxelization;
}
}
public static OffsetWorldPosition OffsetWorldPosition = OffsetWorldPosition.zero;
public static OctantIndex OctantIndex = OctantIndex.FullVoxelization;
public static OffsetAxisIndex OffsetAxisIndex = OffsetAxisIndex.AxisXPos;
public static int TextureSwapCounter;
public static int TextureOutputCounter;
[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 Initialize()
{
OffsetWorldPosition = OffsetWorldPosition.zero;
OctantIndex = OctantIndex.FullVoxelization;
OffsetAxisIndex = OffsetAxisIndex.AxisXPos;
FullVoxelization = true;
TextureSwapCounter = 0;
TextureOutputCounter = 0;
}
public static void SetParamsForApplyButton(float prevDensityUI, int prevVoxelBoundsUI, int prevOverrideBoundsHeightUI)
{
_prevDensityUI = prevDensityUI;
_prevVoxelBoundsUI = prevVoxelBoundsUI;
_prevOverrideBoundsHeightUI = prevOverrideBoundsHeightUI;
}
public static bool CheckPrevParams(float voxelDensity, int voxelBounds, int overrideBoundsHeight)
{
return Mathf.Abs(voxelDensity - _prevDensityUI) > Mathf.Epsilon || voxelBounds != _prevVoxelBoundsUI || overrideBoundsHeight != _prevOverrideBoundsHeightUI;
}
/// <summary>
/// We update OctantIndex after Voxelization and Shadowmap passes in Render stage, because it may have several calls during the frame?
/// </summary>
public static void UpdateOctantIndex()
{
OctantIndex = OctantIndex == OctantIndex.DynamicObjects ? OctantIndex.OctantA : OctantIndex.Next();
#if UNITY_EDITOR
if (UnityEditor.EditorApplication.isPaused) // Without this check octant counter gets corrupted during any pause and Frame Debugger flickers
{
OctantIndex = OctantIndex.Prev();
}
#endif
}
}
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;
}
}
}