您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

141 行
6.6 KiB

using System;
using System.Collections.Generic;
using UnityEditorInternal;
using UnityEngine;
using UnityEngine.Perception.GroundTruth;
namespace UnityEditor.Perception.GroundTruth
{
[CustomEditor(typeof(PerceptionCamera))]
sealed class PerceptionCameraEditor : Editor
{
Dictionary<SerializedProperty, CameraLabelerDrawer> m_CameraLabelerDrawers = new Dictionary<SerializedProperty, CameraLabelerDrawer>();
ReorderableList m_LabelersList;
SerializedProperty labelersProperty => this.serializedObject.FindProperty("m_Labelers");
PerceptionCamera perceptionCamera => ((PerceptionCamera)this.target);
public void OnEnable()
{
m_LabelersList = new ReorderableList(this.serializedObject, labelersProperty, true, false, true, true);
m_LabelersList.drawHeaderCallback = (rect) =>
{
EditorGUI.LabelField(rect, "Camera Labelers", EditorStyles.largeLabel);
};
m_LabelersList.elementHeightCallback = GetElementHeight;
m_LabelersList.drawElementCallback = DrawElement;
m_LabelersList.onAddCallback += OnAdd;
m_LabelersList.onRemoveCallback += OnRemove;
}
float GetElementHeight(int index)
{
var serializedProperty = labelersProperty;
var element = serializedProperty.GetArrayElementAtIndex(index);
var editor = GetCameraLabelerDrawer(element, index);
return editor.GetElementHeight(element);
}
void DrawElement(Rect rect, int index, bool isactive, bool isfocused)
{
var element = labelersProperty.GetArrayElementAtIndex(index);
var editor = GetCameraLabelerDrawer(element, index);
editor.OnGUI(rect, element);
}
void OnRemove(ReorderableList list)
{
labelersProperty.DeleteArrayElementAtIndex(list.index);
serializedObject.ApplyModifiedProperties();
}
void OnAdd(ReorderableList list)
{
Undo.RegisterCompleteObjectUndo(target, "Remove camera labeler");
var labelers = labelersProperty;
var dropdownOptions = TypeCache.GetTypesDerivedFrom<CameraLabeler>();
var menu = new GenericMenu();
foreach (var option in dropdownOptions)
{
var localOption = option;
menu.AddItem(new GUIContent(option.Name),
false,
() => AddLabeler(localOption));
}
menu.ShowAsContext();
}
void AddLabeler(Type labelerType)
{
var labeler = (CameraLabeler)Activator.CreateInstance(labelerType);
labeler.enabled = true;
perceptionCamera.AddLabeler(labeler);
serializedObject.ApplyModifiedProperties();
}
public override void OnInspectorGUI()
{
using(new EditorGUI.DisabledScope(EditorApplication.isPlaying))
{
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(perceptionCamera.description)), new GUIContent("Description", "Provide a description for this perception camera (optional)."));
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(perceptionCamera.period)), new GUIContent("Capture Interval", "The interval at which the perception camera should render and capture (seconds)."));
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(perceptionCamera.startTime)), new GUIContent("Start Time","Time at which this perception camera starts rendering and capturing (seconds)."));
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(perceptionCamera.showVisualizations)), new GUIContent("Show Labeler Visualizations", "Display realtime visualizations for labelers that are currently active on this perception camera."));
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(perceptionCamera.captureRgbImages)),new GUIContent("Save Camera Output to Disk", "For each captured frame, save an RGB image of the perception camera's output to disk."));
serializedObject.ApplyModifiedProperties();
//EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(PerceptionCamera.labelers)));
m_LabelersList.DoLayoutList();
}
if (EditorSettings.asyncShaderCompilation)
{
EditorGUILayout.HelpBox("Asynchronous shader compilation may result in invalid data in beginning frames. " +
"This can be disabled in Project Settings -> Edtior -> Asynchronous Shader Compilation", MessageType.Warning);
}
#if HDRP_PRESENT
var hdRenderPipelineAsset = UnityEngine.Rendering.GraphicsSettings.renderPipelineAsset as UnityEngine.Rendering.HighDefinition.HDRenderPipelineAsset;
if (hdRenderPipelineAsset != null &&
hdRenderPipelineAsset.currentPlatformRenderPipelineSettings.supportedLitShaderMode ==
UnityEngine.Rendering.HighDefinition.RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly)
{
EditorGUILayout.HelpBox("Deferred Only shader mode is not supported by rendering-based labelers. " +
"For correct labeler output, switch Lit Shader Mode to Both or Forward Only in your HD Render Pipeline Asset", MessageType.Error);
}
#endif
}
CameraLabelerDrawer GetCameraLabelerDrawer(SerializedProperty element, int listIndex)
{
CameraLabelerDrawer drawer;
if (m_CameraLabelerDrawers.TryGetValue(element, out drawer))
return drawer;
var labeler = perceptionCamera.labelers[listIndex];
foreach (var drawerType in TypeCache.GetTypesWithAttribute(typeof(CameraLabelerDrawerAttribute)))
{
var attr = (CameraLabelerDrawerAttribute)drawerType.GetCustomAttributes(typeof(CameraLabelerDrawerAttribute), true)[0];
if (attr.targetLabelerType == labeler.GetType())
{
drawer = (CameraLabelerDrawer)Activator.CreateInstance(drawerType);
drawer.cameraLabeler = labeler;
break;
}
if (attr.targetLabelerType.IsAssignableFrom(labeler.GetType()))
{
drawer = (CameraLabelerDrawer)Activator.CreateInstance(drawerType);
drawer.cameraLabeler = labeler;
}
}
m_CameraLabelerDrawers[element] = drawer;
return drawer;
}
}
}