ZeroVR/ZeroPacientVR/Assets/Octave3D World Builder/Scripts/Rendering/Objects/Object Selection/BoxObjectSelectionRenderer.cs

128 lines
5.5 KiB
C#

#if UNITY_EDITOR
using UnityEngine;
using System.Collections.Generic;
namespace O3DWB
{
public class BoxObjectSelectionRenderer : ObjectSelectionRenderer
{
#region Public Methods
public override void Render(List<GameObject> selectedObjects)
{
ObjectSelectionRenderSettings selectionRenderSettings = ObjectSelectionRenderSettings.Get();
ObjectSelectionBoxRenderModeSettings selectionBoxRenderModeSettings = selectionRenderSettings.BoxRenderModeSettings;
ObjectSelectionBoxCornerEdgesRenderModeSettings selectionBoxCornerEdgesRenderModeSettings = selectionBoxRenderModeSettings.CornerEdgesRenderModeSettings;
Color boxColor = selectionBoxRenderModeSettings.BoxColor;
Color edgeColor = selectionBoxRenderModeSettings.EdgeColor;
float boxScale = selectionBoxRenderModeSettings.BoxScale;
bool renderBoxes = boxColor.a != 0.0f;
bool renderEdges = edgeColor.a != 0.0f;
if (!renderBoxes && !renderEdges) return;
// Note: Code duplication is intentional here in order to avoid further abstractions which may hinder performance.
if(selectionBoxRenderModeSettings.EdgeRenderMode == ObjectSelectionBoxEdgeRenderMode.Wire)
{
if(renderBoxes && renderEdges)
{
foreach (GameObject gameObject in selectedObjects)
{
if (!gameObject.activeInHierarchy) continue;
OrientedBox worldOrientedBox = gameObject.GetWorldOrientedBox();
if (worldOrientedBox.IsValid())
{
worldOrientedBox.Scale *= boxScale;
GizmosEx.RenderOrientedBox(worldOrientedBox, boxColor);
GizmosEx.RenderOrientedBoxEdges(worldOrientedBox, edgeColor);
}
}
}
else
if(renderEdges && !renderBoxes)
{
foreach (GameObject gameObject in selectedObjects)
{
if (!gameObject.activeInHierarchy) continue;
OrientedBox worldOrientedBox = gameObject.GetWorldOrientedBox();
if(worldOrientedBox.IsValid())
{
worldOrientedBox.Scale *= boxScale;
GizmosEx.RenderOrientedBoxEdges(worldOrientedBox, edgeColor);
}
}
}
else
if(renderBoxes && !renderEdges)
{
foreach (GameObject gameObject in selectedObjects)
{
if (!gameObject.activeInHierarchy) continue;
OrientedBox worldOrientedBox = gameObject.GetWorldOrientedBox();
if (worldOrientedBox.IsValid())
{
worldOrientedBox.Scale *= boxScale;
GizmosEx.RenderOrientedBox(worldOrientedBox, boxColor);
}
}
}
}
else
if(selectionBoxRenderModeSettings.EdgeRenderMode == ObjectSelectionBoxEdgeRenderMode.CornerEdges)
{
float cornerEdgeLengthPercentage = selectionBoxCornerEdgesRenderModeSettings.CornerEdgeLengthPercentage;
if (renderBoxes && renderEdges)
{
foreach (GameObject gameObject in selectedObjects)
{
if (!gameObject.activeInHierarchy) continue;
OrientedBox worldOrientedBox = gameObject.GetWorldOrientedBox();
if (worldOrientedBox.IsValid())
{
worldOrientedBox.Scale *= boxScale;
GizmosEx.RenderOrientedBox(worldOrientedBox, boxColor);
GizmosEx.RenderOrientedBoxCornerEdges(worldOrientedBox, cornerEdgeLengthPercentage, edgeColor);
}
}
}
else
if (renderEdges && !renderBoxes)
{
foreach (GameObject gameObject in selectedObjects)
{
if (!gameObject.activeInHierarchy) continue;
OrientedBox worldOrientedBox = gameObject.GetWorldOrientedBox();
if (worldOrientedBox.IsValid())
{
worldOrientedBox.Scale *= boxScale;
GizmosEx.RenderOrientedBoxCornerEdges(worldOrientedBox, cornerEdgeLengthPercentage, edgeColor);
}
}
}
else
if(renderBoxes && !renderEdges)
{
foreach (GameObject gameObject in selectedObjects)
{
if (!gameObject.activeInHierarchy) continue;
OrientedBox worldOrientedBox = gameObject.GetWorldOrientedBox();
if (worldOrientedBox.IsValid())
{
worldOrientedBox.Scale *= boxScale;
GizmosEx.RenderOrientedBox(worldOrientedBox, boxColor);
}
}
}
}
}
#endregion
}
}
#endif