VR4RoboticArm2/VR4RoboticArm/Library/PackageCache/com.meta.xr.sdk.interaction/Editor/Surfaces/CylinderSurfaceEditor.cs
IonutMocanu d7aba243a2 Main
2025-09-08 11:04:02 +03:00

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;
}
}
}