99 lines
3.7 KiB
C#
99 lines
3.7 KiB
C#
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
* All rights reserved.
|
|
*
|
|
* Licensed under the Oculus SDK License Agreement (the "License");
|
|
* you may not use the Oculus SDK except in compliance with the License,
|
|
* which is provided at the time of installation or download, or which
|
|
* otherwise accompanies this software in either electronic or hard copy form.
|
|
*
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://developer.oculus.com/licenses/oculussdk/
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, the Oculus SDK
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using Oculus.Interaction.Surfaces;
|
|
|
|
namespace Oculus.Interaction.Editor
|
|
{
|
|
[CustomEditor(typeof(CylinderSurface))]
|
|
public class CylinderSurfaceEditor : UnityEditor.Editor
|
|
{
|
|
private const int NUM_SEGMENTS = 30;
|
|
|
|
private static readonly Color ValidColor = Color.green * 0.8f;
|
|
|
|
private static readonly Color InvalidColor = Color.red * 0.8f;
|
|
|
|
public void OnSceneGUI()
|
|
{
|
|
CylinderSurface cylinder = target as CylinderSurface;
|
|
|
|
if (cylinder.Cylinder != null)
|
|
{
|
|
Draw(cylinder);
|
|
}
|
|
}
|
|
|
|
public static void Draw(CylinderSurface cylinderSurface)
|
|
{
|
|
Color prevColor = Handles.color;
|
|
Handles.color = cylinderSurface.IsValid ? ValidColor : InvalidColor;
|
|
|
|
float gizmoHeight = cylinderSurface.Height;
|
|
float camYOffset = 0;
|
|
bool infiniteHeight = cylinderSurface.Height <= 0;
|
|
|
|
if (infiniteHeight && SceneView.lastActiveSceneView?.camera != null)
|
|
{
|
|
gizmoHeight = 1000f;
|
|
Vector3 sceneCamPos = SceneView.lastActiveSceneView.camera.transform.position;
|
|
camYOffset = cylinderSurface.Cylinder.transform.InverseTransformPoint(sceneCamPos).y;
|
|
}
|
|
|
|
for (int i = 0; i < 2; ++i)
|
|
{
|
|
bool isTop = i == 1;
|
|
float y = isTop ? gizmoHeight / 2 : -gizmoHeight / 2;
|
|
int numSegments = (int)(NUM_SEGMENTS * Mathf.Max(cylinderSurface.Radius / 2, 1));
|
|
Vector3 prevSegmentWorld = Vector3.zero;
|
|
|
|
for (int seg = 0; seg <= numSegments; ++seg)
|
|
{
|
|
float ratio = (float)seg / numSegments * Mathf.PI * 2;
|
|
float x = Mathf.Cos(ratio) * cylinderSurface.Radius;
|
|
float z = Mathf.Sin(ratio) * cylinderSurface.Radius;
|
|
Vector3 curSegmentLocal = new Vector3(x, y + camYOffset, z);
|
|
Vector3 curSegmentWorld = cylinderSurface.Cylinder.transform.TransformPoint(curSegmentLocal);
|
|
|
|
if (isTop) // Draw connecting lines from top circle
|
|
{
|
|
Vector3 bottomVert = new Vector3(curSegmentLocal.x,
|
|
curSegmentLocal.y - gizmoHeight,
|
|
curSegmentLocal.z);
|
|
bottomVert = cylinderSurface.Cylinder.transform.TransformPoint(bottomVert);
|
|
Handles.DrawLine(curSegmentWorld, bottomVert);
|
|
}
|
|
|
|
if (seg > 0 && !infiniteHeight)
|
|
{
|
|
Handles.DrawLine(curSegmentWorld, prevSegmentWorld);
|
|
}
|
|
|
|
prevSegmentWorld = curSegmentWorld;
|
|
}
|
|
}
|
|
|
|
Handles.color = prevColor;
|
|
}
|
|
}
|
|
}
|