You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
15 KiB
308 lines
15 KiB
//================================================================================================================================
|
|
//
|
|
// Copyright (c) 2015-2019 VisionStar Information Technology (Shanghai) Co., Ltd. All Rights Reserved.
|
|
// EasyAR is the registered trademark or trademark of VisionStar Information Technology (Shanghai) Co., Ltd in China
|
|
// and other countries for the augmented reality technology developed by VisionStar Information Technology (Shanghai) Co., Ltd.
|
|
//
|
|
//================================================================================================================================
|
|
|
|
using System;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace easyar
|
|
{
|
|
[CustomEditor(typeof(ImageTargetController), true)]
|
|
public class ImageTargetControllerEditor : Editor
|
|
{
|
|
public void OnEnable()
|
|
{
|
|
var controller = (ImageTargetController)target;
|
|
UpdateScale(controller, controller.GizmoData.Scale);
|
|
}
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
DrawDefaultInspector();
|
|
var controller = (ImageTargetController)target;
|
|
|
|
switch (controller.SourceType)
|
|
{
|
|
case ImageTargetController.DataSource.ImageFile:
|
|
var imageFileSource = serializedObject.FindProperty("ImageFileSource");
|
|
imageFileSource.isExpanded = EditorGUILayout.Foldout(imageFileSource.isExpanded, "Image File Source");
|
|
EditorGUI.indentLevel += 1;
|
|
if (imageFileSource.isExpanded)
|
|
{
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("ImageFileSource.PathType"), true);
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("ImageFileSource.Path"), true);
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("ImageFileSource.Name"), true);
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("ImageFileSource.Scale"), true);
|
|
}
|
|
EditorGUI.indentLevel -= 1;
|
|
break;
|
|
case ImageTargetController.DataSource.TargetDataFile:
|
|
var targetDataFileSource = serializedObject.FindProperty("TargetDataFileSource");
|
|
targetDataFileSource.isExpanded = EditorGUILayout.Foldout(targetDataFileSource.isExpanded, "Target Data File Source");
|
|
EditorGUI.indentLevel += 1;
|
|
if (targetDataFileSource.isExpanded)
|
|
{
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("TargetDataFileSource.PathType"), true);
|
|
EditorGUILayout.PropertyField(serializedObject.FindProperty("TargetDataFileSource.Path"), true);
|
|
}
|
|
EditorGUI.indentLevel -= 1;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
var tracker = serializedObject.FindProperty("tracker");
|
|
EditorGUILayout.PropertyField(tracker, new GUIContent("Tracker"), true);
|
|
|
|
var trackerHasSet = serializedObject.FindProperty("trackerHasSet");
|
|
if (!trackerHasSet.boolValue)
|
|
{
|
|
if (!tracker.objectReferenceValue)
|
|
{
|
|
tracker.objectReferenceValue = FindObjectOfType<ImageTrackerFrameFilter>();
|
|
}
|
|
if (tracker.objectReferenceValue)
|
|
{
|
|
trackerHasSet.boolValue = true;
|
|
}
|
|
}
|
|
serializedObject.ApplyModifiedProperties();
|
|
controller.Tracker = (ImageTrackerFrameFilter)tracker.objectReferenceValue;
|
|
|
|
if (Event.current.type == EventType.Used)
|
|
{
|
|
foreach (var obj in DragAndDrop.objectReferences)
|
|
{
|
|
var objg = obj as GameObject;
|
|
if (objg && objg.GetComponent<ImageTrackerFrameFilter>() && !AssetDatabase.GetAssetPath(obj).Equals(""))
|
|
DragAndDrop.visualMode = DragAndDropVisualMode.Rejected;
|
|
}
|
|
}
|
|
|
|
CheckScale();
|
|
}
|
|
|
|
void CheckScale()
|
|
{
|
|
if (Application.isPlaying)
|
|
{
|
|
return;
|
|
}
|
|
var controller = (ImageTargetController)target;
|
|
if (controller.SourceType == ImageTargetController.DataSource.ImageFile)
|
|
{
|
|
if (controller.GizmoData.Scale != controller.ImageFileSource.Scale)
|
|
{
|
|
UpdateScale(controller, controller.ImageFileSource.Scale);
|
|
}
|
|
else if (controller.GizmoData.ScaleX != controller.transform.localScale.x)
|
|
{
|
|
controller.ImageFileSource.Scale = Math.Abs(controller.transform.localScale.x);
|
|
UpdateScale(controller, controller.ImageFileSource.Scale);
|
|
}
|
|
else if (controller.GizmoData.Scale != controller.transform.localScale.y)
|
|
{
|
|
controller.ImageFileSource.Scale = Math.Abs(controller.transform.localScale.y);
|
|
UpdateScale(controller, controller.ImageFileSource.Scale);
|
|
}
|
|
else if (controller.GizmoData.Scale != controller.transform.localScale.z)
|
|
{
|
|
controller.ImageFileSource.Scale = Math.Abs(controller.transform.localScale.z);
|
|
UpdateScale(controller, controller.ImageFileSource.Scale);
|
|
}
|
|
else if (controller.GizmoData.HorizontalFlip != controller.HorizontalFlip)
|
|
{
|
|
UpdateScale(controller, controller.ImageFileSource.Scale);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (controller.GizmoData.HorizontalFlip != controller.HorizontalFlip || controller.GizmoData.ScaleX != controller.transform.localScale.x || controller.GizmoData.Scale != controller.transform.localScale.y || controller.GizmoData.Scale != controller.transform.localScale.z)
|
|
{
|
|
UpdateScale(controller, controller.GizmoData.Scale);
|
|
}
|
|
}
|
|
}
|
|
|
|
static private void UpdateScale(ImageTargetController controller, float s)
|
|
{
|
|
if (Application.isPlaying)
|
|
{
|
|
return;
|
|
}
|
|
var vec3Unit = Vector3.one;
|
|
if (controller.HorizontalFlip)
|
|
{
|
|
vec3Unit.x = -vec3Unit.x;
|
|
}
|
|
controller.transform.localScale = vec3Unit * s;
|
|
|
|
controller.GizmoData.Scale = s;
|
|
controller.GizmoData.ScaleX = controller.transform.localScale.x;
|
|
controller.GizmoData.HorizontalFlip = controller.HorizontalFlip;
|
|
}
|
|
|
|
[DrawGizmo(GizmoType.Active | GizmoType.Pickable | GizmoType.NotInSelectionHierarchy | GizmoType.InSelectionHierarchy)]
|
|
static void DrawGizmo(ImageTargetController scr, GizmoType gizmoType)
|
|
{
|
|
var signature = scr.SourceType.ToString();
|
|
switch (scr.SourceType)
|
|
{
|
|
case ImageTargetController.DataSource.ImageFile:
|
|
if (!EasyARController.Settings.GizmoConfig.ImageTarget.EnableImageFile) { return; }
|
|
signature += scr.ImageFileSource.PathType.ToString() + scr.ImageFileSource.Path;
|
|
break;
|
|
case ImageTargetController.DataSource.TargetDataFile:
|
|
if (!EasyARController.Settings.GizmoConfig.ImageTarget.EnableTargetDataFile) { return; }
|
|
signature += scr.TargetDataFileSource.PathType.ToString() + scr.TargetDataFileSource.Path;
|
|
break;
|
|
case ImageTargetController.DataSource.Target:
|
|
if (!EasyARController.Settings.GizmoConfig.ImageTarget.EnableTarget) { return; }
|
|
if (scr.Target != null)
|
|
{
|
|
signature += scr.Target.runtimeID().ToString();
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (scr.GizmoData.Material == null)
|
|
{
|
|
scr.GizmoData.Material = new Material(Shader.Find("EasyAR/ImageTargetGizmo"));
|
|
}
|
|
if (scr.GizmoData.Signature != signature)
|
|
{
|
|
if (scr.GizmoData.Texture != null)
|
|
{
|
|
UnityEngine.Object.DestroyImmediate(scr.GizmoData.Texture);
|
|
scr.GizmoData.Texture = null;
|
|
}
|
|
|
|
string path;
|
|
switch (scr.SourceType)
|
|
{
|
|
case ImageTargetController.DataSource.ImageFile:
|
|
path = scr.ImageFileSource.Path;
|
|
if (scr.ImageFileSource.PathType == PathType.StreamingAssets)
|
|
{
|
|
path = Application.streamingAssetsPath + "/" + scr.ImageFileSource.Path;
|
|
}
|
|
if (System.IO.File.Exists(path))
|
|
{
|
|
var sourceData = System.IO.File.ReadAllBytes(path);
|
|
scr.GizmoData.Texture = new Texture2D(2, 2);
|
|
scr.GizmoData.Texture.LoadImage(sourceData);
|
|
scr.GizmoData.Texture.Apply();
|
|
UpdateScale(scr, scr.ImageFileSource.Scale);
|
|
if (SceneView.lastActiveSceneView)
|
|
{
|
|
SceneView.lastActiveSceneView.Repaint();
|
|
}
|
|
}
|
|
break;
|
|
case ImageTargetController.DataSource.TargetDataFile:
|
|
path = scr.TargetDataFileSource.Path;
|
|
if (scr.TargetDataFileSource.PathType == PathType.StreamingAssets)
|
|
{
|
|
path = Application.streamingAssetsPath + "/" + scr.TargetDataFileSource.Path;
|
|
}
|
|
if (System.IO.File.Exists(path))
|
|
{
|
|
if (!EasyARController.Initialized)
|
|
{
|
|
EasyARController.GlobalInitialization();
|
|
if (!EasyARController.Initialized)
|
|
{
|
|
Debug.LogWarning("EasyAR Sense target data gizmo enabled but license key validation failed, target data gizmo will not show");
|
|
}
|
|
}
|
|
var sourceData = System.IO.File.ReadAllBytes(path);
|
|
|
|
using (Buffer buffer = Buffer.wrapByteArray(sourceData))
|
|
{
|
|
var targetOptional = ImageTarget.createFromTargetData(buffer);
|
|
if (targetOptional.OnSome)
|
|
{
|
|
using (ImageTarget target = targetOptional.Value)
|
|
{
|
|
var imageList = target.images();
|
|
if (imageList.Count > 0)
|
|
{
|
|
var image = imageList[0];
|
|
scr.GizmoData.Texture = new Texture2D(image.width(), image.height(), TextureFormat.R8, false);
|
|
scr.GizmoData.Texture.LoadRawTextureData(image.buffer().data(), image.buffer().size());
|
|
scr.GizmoData.Texture.Apply();
|
|
}
|
|
foreach (var image in imageList)
|
|
{
|
|
image.Dispose();
|
|
}
|
|
UpdateScale(scr, target.scale());
|
|
if (SceneView.lastActiveSceneView)
|
|
{
|
|
SceneView.lastActiveSceneView.Repaint();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case ImageTargetController.DataSource.Target:
|
|
if (scr.Target != null)
|
|
{
|
|
var imageList = (scr.Target as ImageTarget).images();
|
|
if (imageList.Count > 0)
|
|
{
|
|
var image = imageList[0];
|
|
scr.GizmoData.Texture = new Texture2D(image.width(), image.height(), TextureFormat.R8, false);
|
|
scr.GizmoData.Texture.LoadRawTextureData(image.buffer().data(), image.buffer().size());
|
|
scr.GizmoData.Texture.Apply();
|
|
}
|
|
foreach (var image in imageList)
|
|
{
|
|
image.Dispose();
|
|
}
|
|
UpdateScale(scr, (scr.Target as ImageTarget).scale());
|
|
if (SceneView.lastActiveSceneView)
|
|
{
|
|
SceneView.lastActiveSceneView.Repaint();
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (scr.GizmoData.Texture == null)
|
|
{
|
|
scr.GizmoData.Texture = new Texture2D(2, 2);
|
|
scr.GizmoData.Texture.LoadImage(new byte[0]);
|
|
scr.GizmoData.Texture.Apply();
|
|
}
|
|
scr.GizmoData.Signature = signature;
|
|
}
|
|
|
|
if (scr.GizmoData.Material && scr.GizmoData.Texture)
|
|
{
|
|
scr.GizmoData.Material.SetMatrix("_Transform", scr.transform.localToWorldMatrix);
|
|
if (scr.GizmoData.Texture.format == TextureFormat.R8)
|
|
{
|
|
scr.GizmoData.Material.SetInt("_isRenderGrayTexture", 1);
|
|
}
|
|
else
|
|
{
|
|
scr.GizmoData.Material.SetInt("_isRenderGrayTexture", 0);
|
|
}
|
|
scr.GizmoData.Material.SetFloat("_Ratio", (float)scr.GizmoData.Texture.height / scr.GizmoData.Texture.width);
|
|
Gizmos.DrawGUITexture(new Rect(0, 0, 1, 1), scr.GizmoData.Texture, scr.GizmoData.Material);
|
|
}
|
|
}
|
|
}
|
|
}
|