221 lines
7.5 KiB
C#
221 lines
7.5 KiB
C#
//pipelinedefine
|
|
#define H_URP
|
|
|
|
using HTraceWSGI.Scripts.Data.Private;
|
|
using UnityEngine;
|
|
|
|
|
|
namespace HTraceWSGI.Scripts.Services.VoxelCameras
|
|
{
|
|
[ExecuteInEditMode]
|
|
internal class VoxelOctantCamera : MonoBehaviour
|
|
{
|
|
public Camera Camera
|
|
{
|
|
get { return _camera; }
|
|
}
|
|
|
|
private Camera _camera;
|
|
|
|
public void Initialize()
|
|
{
|
|
VoxelizationRuntimeData.OctantIndex = OctantIndex.OctantA;
|
|
CreateCamera();
|
|
}
|
|
|
|
public void UpdateCamera()
|
|
{
|
|
transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity);
|
|
}
|
|
|
|
public void ExecuteUpdate()
|
|
{
|
|
// float scale = VoxelizationRuntimeData.OctantIndex == OctantIndex.DynamicObjects ? 1f : 2f;
|
|
// if (_camera.orthographicSize * scale < VoxelizationRuntimeData.OffsetWorldPosition.AxisXPos
|
|
// || _camera.orthographicSize * scale < VoxelizationRuntimeData.OffsetWorldPosition.AxisXNeg)
|
|
// Debug.Log($"Culling camera size X axis less than OffsetWorldPosition.X");
|
|
// if (_camera.farClipPlane * scale < VoxelizationRuntimeData.OffsetWorldPosition.AxisYPos
|
|
// || _camera.farClipPlane * scale < VoxelizationRuntimeData.OffsetWorldPosition.AxisYNeg)
|
|
// Debug.Log($"Culling camera size Y axis less than OffsetWorldPosition.Y");
|
|
// if (_camera.orthographicSize * _camera.aspect * scale < VoxelizationRuntimeData.OffsetWorldPosition.AxisZPos
|
|
// || _camera.orthographicSize * _camera.aspect * scale < VoxelizationRuntimeData.OffsetWorldPosition.AxisZNeg)
|
|
// Debug.Log($"Culling camera size Y axis less than OffsetWorldPosition.Y");
|
|
|
|
SetParams(VoxelizationRuntimeData.OctantIndex);
|
|
OctantTransformCamera();
|
|
}
|
|
|
|
private void OctantTransformCamera()
|
|
{
|
|
transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity);
|
|
|
|
switch (VoxelizationRuntimeData.OffsetAxisIndex)
|
|
{
|
|
case OffsetAxisIndex.AxisXPos:
|
|
MoveAxisX(1f);
|
|
break;
|
|
case OffsetAxisIndex.AxisXNeg:
|
|
MoveAxisX(-1f);
|
|
break;
|
|
case OffsetAxisIndex.AxisYPos:
|
|
MoveAxisY(1f);
|
|
break;
|
|
case OffsetAxisIndex.AxisYNeg:
|
|
MoveAxisY(-1f);
|
|
break;
|
|
case OffsetAxisIndex.AxisZPos:
|
|
MoveAxisZ(1f);
|
|
break;
|
|
case OffsetAxisIndex.AxisZNeg:
|
|
MoveAxisZ(-1f);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void MoveAxisX(float offset)
|
|
{
|
|
Vector3 finalPos = Vector3.zero;
|
|
switch (VoxelizationRuntimeData.OctantIndex)
|
|
{
|
|
case OctantIndex.OctantA:
|
|
finalPos.x += -offset * HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += -HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.OctantB:
|
|
finalPos.x += -offset * HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.OctantC:
|
|
finalPos.x += -offset * HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += -HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += -HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.OctantD:
|
|
finalPos.x += -offset * HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += -HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.DynamicObjects:
|
|
break;
|
|
}
|
|
|
|
transform.localPosition += finalPos;
|
|
}
|
|
|
|
private void MoveAxisY(float offset)
|
|
{
|
|
Vector3 finalPos = Vector3.zero;
|
|
switch (VoxelizationRuntimeData.OctantIndex)
|
|
{
|
|
case OctantIndex.OctantA:
|
|
finalPos.x += HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += -HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += offset * HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.OctantB:
|
|
finalPos.x += HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += offset * HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.OctantC:
|
|
finalPos.x += -HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += -HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += offset * HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.OctantD:
|
|
finalPos.x += -HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += offset * HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.DynamicObjects:
|
|
break;
|
|
}
|
|
|
|
transform.localPosition += finalPos;
|
|
}
|
|
|
|
private void MoveAxisZ(float offset)
|
|
{
|
|
Vector3 finalPos = Vector3.zero;
|
|
switch (VoxelizationRuntimeData.OctantIndex)
|
|
{
|
|
case OctantIndex.OctantA:
|
|
finalPos.x += -HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += offset * HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.OctantB:
|
|
finalPos.x += HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += offset * HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.OctantC:
|
|
finalPos.x += -HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += offset * HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += -HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.OctantD:
|
|
finalPos.x += HSettings.VoxelizationSettings.ExactData.Bounds.x / 4;
|
|
finalPos.y += offset * HSettings.VoxelizationSettings.ExactData.Bounds.y / 4;
|
|
finalPos.z += -HSettings.VoxelizationSettings.ExactData.Bounds.z / 4;
|
|
break;
|
|
case OctantIndex.DynamicObjects:
|
|
break;
|
|
}
|
|
|
|
transform.localPosition += finalPos;
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
private void OnDrawGizmos()
|
|
{
|
|
if (HSettings.DebugSettings.EnableCamerasVisualization == false)
|
|
return;
|
|
|
|
var color = Gizmos.color;
|
|
Gizmos.color = new Color(1, 1, 1, 0.2f);
|
|
|
|
Vector3 position = _camera.transform.position;
|
|
|
|
// Size = height / 2
|
|
// Aspect = width / height
|
|
//
|
|
// height = 2f * size;
|
|
// width = height * aspect;
|
|
Vector3 size = new Vector3(2f * _camera.orthographicSize, _camera.farClipPlane * 2f, 2f * _camera.orthographicSize * _camera.aspect);
|
|
|
|
Gizmos.DrawCube(position, size);
|
|
|
|
Gizmos.color = color;
|
|
}
|
|
|
|
#endif
|
|
|
|
private void SetParams(OctantIndex octantIndex)
|
|
{
|
|
float scale = octantIndex == OctantIndex.DynamicObjects ? 1f : 2f;
|
|
_camera.cullingMask = ~0; //voxelizationData.VoxelizationMask;
|
|
_camera.orthographic = true;
|
|
_camera.farClipPlane = HSettings.VoxelizationSettings.ExactData.Bounds.z / (2 * scale);
|
|
_camera.nearClipPlane = -HSettings.VoxelizationSettings.ExactData.Bounds.z / (2 * scale);
|
|
_camera.orthographicSize = .5f * HSettings.VoxelizationSettings.ExactData.Bounds.x / scale;
|
|
_camera.aspect = 1;
|
|
}
|
|
|
|
private void CreateCamera()
|
|
{
|
|
if (_camera == null)
|
|
{
|
|
_camera = gameObject.AddComponent<Camera>();
|
|
_camera.aspect = 1f;
|
|
_camera.orthographic = true;
|
|
_camera.enabled = false;
|
|
_camera.hideFlags = HideFlags.HideInHierarchy;
|
|
}
|
|
}
|
|
}
|
|
}
|