2025-01-03 13:42:53 +08:00

397 lines
16 KiB
C#

//////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2007-2016 , Inc. All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////
using System;
using System.Collections;
using System.Reflection;
using UnityEditor;
using UnityEngine;
namespace GCSeries.zView
{
[CustomEditor(typeof(ZView))]
public class ZViewEditor : Editor
{
//////////////////////////////////////////////////////////////////
// Serialized Properties
//////////////////////////////////////////////////////////////////
SerializedProperty StandardModeIgnoreLayersProperty;
SerializedProperty ARModeIgnoreLayersProperty;
SerializedProperty ARModeEnvironmentLayersProperty;
SerializedProperty ARModeMaskLayerProperty;
SerializedProperty ARModeMaskRenderQueueProperty;
SerializedProperty ARModeMaskSizeProperty;
SerializedProperty ARModeShowMaskProperty;
SerializedProperty ARModeEnableTransparencyProperty;
SerializedProperty ActiveZCameraProperty;
//////////////////////////////////////////////////////////////////
// Unity Callbacks
//////////////////////////////////////////////////////////////////
void OnEnable()
{
this.LoadIconTextures();
this.FindSerializedProperties();
}
void OnDisable()
{
}
public override void OnInspectorGUI()
{
this.InitializeGUIStyles();
this.UpdateLayerNames();
this.serializedObject.Update();
EditorGUILayout.Space();
EditorGUILayout.Space();
this.CheckZViewInitialized();
this.DrawInfoSection();
this.DrawStandardModeSection();
this.DrawARModeSection();
this.DrawConnectionsSection();
this.serializedObject.ApplyModifiedProperties();
}
//////////////////////////////////////////////////////////////////
// Section Draw Helpers
//////////////////////////////////////////////////////////////////
private void CheckZViewInitialized()
{
ZView zView = (ZView)this.target;
if (!zView.IsInitialized())
{
EditorGUILayout.HelpBox(
"Failed to properly initialize the zView SDK. As a result, most " +
"zView functionality will be disabled. Please make sure that the zView " +
"SDK runtime has been properly installed on your machine.",
MessageType.Error);
EditorGUILayout.Space();
}
}
private void DrawInfoSection()
{
ZView zView = (ZView)this.target;
_isInfoSectionExpanded = this.DrawSectionHeader("General Info", _infoIconTexture, _isInfoSectionExpanded);
if (_isInfoSectionExpanded)
{
string pluginVersion = zView.GetPluginVersion();
string runtimeVersion = zView.IsInitialized() ? zView.GetRuntimeVersion() : "Unknown";
EditorGUILayout.LabelField("Plugin Version: " + pluginVersion);
EditorGUILayout.LabelField("Runtime Version: " + runtimeVersion);
EditorGUILayout.Space();
}
}
private void DrawStandardModeSection()
{
_isStandardModeSectionExpanded = this.DrawSectionHeader("Standard Mode", _standardModeIconTexture, _isStandardModeSectionExpanded);
if (_isStandardModeSectionExpanded)
{
this.DrawLayerMask("Ignore Layers", this.StandardModeIgnoreLayersProperty);
EditorGUILayout.Space();
}
}
private void DrawARModeSection()
{
_isARModeSectionExpanded = this.DrawSectionHeader("Augmented Reality Mode", _arModeIconTexture, _isARModeSectionExpanded);
if (_isARModeSectionExpanded)
{
this.DrawLayerMask("Ignore Layers", this.ARModeIgnoreLayersProperty);
this.DrawLayerMask("Environment Layers", this.ARModeEnvironmentLayersProperty);
EditorGUILayout.Space();
this.DrawLayerField("Mask Layer", this.ARModeMaskLayerProperty);
this.DrawIntField("Mask Render Queue", this.ARModeMaskRenderQueueProperty);
this.DrawVector3Field("Mask Size", this.ARModeMaskSizeProperty);
EditorGUILayout.Space();
this.DrawToggleLeft("Show Mask", this.ARModeShowMaskProperty);
this.DrawToggleLeft("Enable Transparency", this.ARModeEnableTransparencyProperty);
EditorGUILayout.Space();
EditorGUILayout.PropertyField(this.ActiveZCameraProperty,
new GUIContent("Active ZCamera",
"ZView requires a reference to the active ZCamera. " +
"ZView will try to find an instance of ZCamera on awake if " +
"left unassigned. If the ZCamera is destroyed during the " +
"life of the current scene, this value must be assigned " +
"manually."));
if (this.ARModeEnableTransparencyProperty.boolValue)
{
EditorGUILayout.HelpBox(
"Enabling transparency may produce visual artifacts when rendering the " +
"augmented reality overlay. If enabled, please ensure that all materials " +
"associated with opaque geometry have their alpha channel set to 1.0 and " +
"that all shaders associated with transparent geometry properly write their " +
"alpha channel to the frame buffer.",
MessageType.Warning);
}
EditorGUILayout.Space();
}
}
private void DrawConnectionsSection()
{
ZView zView = (ZView)this.target;
_isConnectionsSectionExpanded = this.DrawSectionHeader("Connections", _connectionsIconTexture, _isConnectionsSectionExpanded, true);
if (_isConnectionsSectionExpanded)
{
bool doActiveConnectionsExist = false;
try
{
// For each connection:
int numConnections = zView.GetNumConnections();
for (int i = 0; i < numConnections; ++i)
{
// Get the connection.
IntPtr connection = zView.GetConnection(i);
// Get the connection's state.
ZView.ConnectionState connectionState = zView.GetConnectionState(connection);
if (connectionState != ZView.ConnectionState.Error)
{
// Display the connection's information.
int connectionNumber = i + 1;
string initiationStatusString = zView.WasConnectionLocallyInitiated(connection) ? "locally" : "remotely";
EditorGUILayout.LabelField(string.Format("Connection {0} (initiated {1})", connectionNumber, initiationStatusString));
EditorGUI.indentLevel++;
{
EditorGUILayout.LabelField("Name: " + zView.GetConnectedNodeName(connection));
EditorGUILayout.LabelField("Status: " + zView.GetConnectedNodeStatus(connection));
EditorGUILayout.LabelField("State: " + connectionState);
IntPtr mode = zView.GetConnectionMode(connection);
string modeString = "Unknown";
if (mode == IntPtr.Zero)
{
modeString = "None";
}
else if (mode == zView.GetStandardMode())
{
modeString = "Standard";
}
else if (mode == zView.GetAugmentedRealityMode())
{
modeString = "Augmented Reality";
}
EditorGUILayout.LabelField("Mode: " + modeString);
}
EditorGUI.indentLevel--;
EditorGUILayout.Space();
doActiveConnectionsExist = true;
}
}
}
catch
{
// TODO: Add warning.
}
if (!doActiveConnectionsExist)
{
EditorGUILayout.LabelField("No active connections");
EditorGUILayout.Space();
}
}
}
//////////////////////////////////////////////////////////////////
// Private Helper Methods
//////////////////////////////////////////////////////////////////
private void LoadIconTextures()
{
if (_refreshIconTexture == null)
{
_refreshIconTexture = this.LoadIconTexture("RefreshIcon.png");
}
if (_infoIconTexture == null)
{
_infoIconTexture = this.LoadIconTexture("InfoIcon.png");
}
if (_standardModeIconTexture == null)
{
_standardModeIconTexture = this.LoadIconTexture("StandardModeIcon.png");
}
if (_arModeIconTexture == null)
{
_arModeIconTexture = this.LoadIconTexture("ARModeIcon.png");
}
if (_connectionsIconTexture == null)
{
_connectionsIconTexture = this.LoadIconTexture("ConnectionsIcon.png");
}
}
private Texture2D LoadIconTexture(string iconName)
{
return AssetDatabase.LoadAssetAtPath(INSPECTOR_ICON_PATH + iconName, typeof(Texture2D)) as Texture2D;
}
private void FindSerializedProperties()
{
this.StandardModeIgnoreLayersProperty = this.serializedObject.FindProperty("StandardModeIgnoreLayers");
this.ARModeIgnoreLayersProperty = this.serializedObject.FindProperty("ARModeIgnoreLayers");
this.ARModeEnvironmentLayersProperty = this.serializedObject.FindProperty("ARModeEnvironmentLayers");
this.ARModeMaskLayerProperty = this.serializedObject.FindProperty("ARModeMaskLayer");
this.ARModeMaskRenderQueueProperty = this.serializedObject.FindProperty("ARModeMaskRenderQueue");
this.ARModeMaskSizeProperty = this.serializedObject.FindProperty("ARModeMaskSize");
this.ARModeShowMaskProperty = this.serializedObject.FindProperty("ARModeShowMask");
this.ARModeEnableTransparencyProperty = this.serializedObject.FindProperty("ARModeEnableTransparency");
this.ActiveZCameraProperty = this.serializedObject.FindProperty("ActiveZCamera");
}
private void InitializeGUIStyles()
{
if (_foldoutStyle == null)
{
_foldoutStyle = new GUIStyle(EditorStyles.foldout);
_foldoutStyle.fontStyle = FontStyle.Bold;
_foldoutStyle.fixedWidth = 2000.0f;
}
if (_lineStyle == null)
{
_lineStyle = new GUIStyle(GUI.skin.box);
_lineStyle.border.top = 1;
_lineStyle.border.bottom = 1;
_lineStyle.margin.top = 1;
_lineStyle.margin.bottom = 1;
_lineStyle.padding.top = 1;
_lineStyle.padding.bottom = 1;
}
}
private void UpdateLayerNames()
{
for (int i = 0; i < NUM_LAYERS; ++i)
{
_layerNames[i] = LayerMask.LayerToName(i);
if (_layerNames[i] == string.Empty)
{
string layerType = (i < 8) ? "Builtin" : "User";
_layerNames[i] = string.Format("{0} Layer {1}", layerType, i);
}
}
}
private bool DrawSectionHeader(string name, Texture2D icon, bool isExpanded)
{
return this.DrawSectionHeader(name, icon, isExpanded, false);
}
private bool DrawSectionHeader(string name, Texture2D icon, bool isExpanded, bool enableRefresh)
{
// Create the divider line.
GUILayout.Box(GUIContent.none, _lineStyle, GUILayout.ExpandWidth(true), GUILayout.Height(1.0f));
EditorGUILayout.BeginHorizontal();
{
// Create the foldout (AKA expandable section).
Rect position = GUILayoutUtility.GetRect(40.0f, 2000.0f, 16.0f, 16.0f, _foldoutStyle);
isExpanded = EditorGUI.Foldout(position, isExpanded, new GUIContent(" " + name, icon), true, _foldoutStyle);
// Create the refresh button if enabled.
if (enableRefresh && isExpanded)
{
GUILayout.Button(
new GUIContent(_refreshIconTexture, "Refresh " + name),
GUIStyle.none,
GUILayout.Width(15.0f),
GUILayout.Height(15.5f));
}
}
EditorGUILayout.EndHorizontal();
return isExpanded;
}
private void DrawToggleRight(string label, SerializedProperty property)
{
property.boolValue = EditorGUILayout.Toggle(new GUIContent(label), property.boolValue);
}
private void DrawToggleLeft(string label, SerializedProperty property)
{
property.boolValue = EditorGUILayout.ToggleLeft(new GUIContent(" " + label), property.boolValue);
}
private void DrawLayerMask(string label, SerializedProperty property)
{
property.intValue = EditorGUILayout.MaskField(label, property.intValue, _layerNames);
}
private void DrawLayerField(string label, SerializedProperty property)
{
property.intValue = EditorGUILayout.LayerField(label, property.intValue);
}
private void DrawIntField(string label, SerializedProperty property)
{
property.intValue = EditorGUILayout.IntField(label, property.intValue);
}
private void DrawVector3Field(string label, SerializedProperty property)
{
property.vector3Value = EditorGUILayout.Vector3Field(label, property.vector3Value);
}
//////////////////////////////////////////////////////////////////
// Private Members
//////////////////////////////////////////////////////////////////
private static readonly string INSPECTOR_ICON_PATH = "Assets//zView/Editor/Icons/";
private static readonly int NUM_LAYERS = 32;
private Texture2D _refreshIconTexture = null;
private Texture2D _infoIconTexture = null;
private Texture2D _standardModeIconTexture = null;
private Texture2D _arModeIconTexture = null;
private Texture2D _connectionsIconTexture = null;
private GUIStyle _foldoutStyle = null;
private GUIStyle _lineStyle = null;
private bool _isInfoSectionExpanded = true;
private bool _isStandardModeSectionExpanded = true;
private bool _isARModeSectionExpanded = true;
private bool _isConnectionsSectionExpanded = true;
private string[] _layerNames = new string[NUM_LAYERS];
}
}