Exemplo n.º 1
0
    public override void OnInspectorGUI()
    {
        Object[] targetObjects = serializedObject.targetObjects;

        EditorGUILayout.PropertyField(targetProjectFolder, new GUIContent("Project Folder"));
        EditorGUILayout.PropertyField(targetClipNames, new GUIContent("Clip Names"), true);

        EditorGUILayout.PropertyField(targetSheetResolution, new GUIContent("Sheet Resolution"));
        EditorGUILayout.PropertyField(targetColor, new GUIContent("Color"));
        EditorGUILayout.PropertyField(targetDepth, new GUIContent("Depth"));

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Discretization Step");
        targetDiscretizationStep.intValue = (int)EditorGUILayout.Slider(targetDiscretizationStep.intValue, 1, 30);
        EditorGUILayout.EndHorizontal();

        foldRenderTarget = EditorGUILayout.Foldout(foldRenderTarget, "Render Target");
        if (foldRenderTarget)
        {
            ++EditorGUI.indentLevel;

            int  valueIndex1  = targetRenderTarget.enumValueIndex;
            bool isSameValue1 = !targetRenderTarget.hasMultipleDifferentValues;

            EditorGUILayout.PropertyField(targetRenderTarget, new GUIContent("Target"));

            int  valueIndex2  = targetRenderTarget.enumValueIndex;
            bool isSameValue2 = !targetRenderTarget.hasMultipleDifferentValues;

            if ((valueIndex1 != valueIndex2) ||
                !isSameValue1 && isSameValue2)
            {
                if (valueIndex2 == (int)HarmonyRenderer.RenderTarget.eScreen)
                {
                    foreach (HarmonyRenderer harmonyRenderer in targetObjects)
                    {
                        GameObject rendererObject = harmonyRenderer.gameObject;
                        GenerateHarmonyMesh.ClearTextureObjectMesh(rendererObject);
                    }

                    //  Components were removed from ui.  Bail out now.
                    serializedObject.ApplyModifiedProperties();
                    EditorGUIUtility.ExitGUI();
                }
                else if (valueIndex2 == (int)HarmonyRenderer.RenderTarget.eRenderTexture)
                {
                    foreach (HarmonyRenderer harmonyRenderer in targetObjects)
                    {
                        GameObject rendererObject = harmonyRenderer.gameObject;
                        GenerateHarmonyMesh.CreateOrUpdateTextureObjectMesh(rendererObject, true);
                    }

                    //  Components were removed from ui.  Bail out now.
                    serializedObject.ApplyModifiedProperties();
                    EditorGUIUtility.ExitGUI();
                }
            }

            GUI.enabled = (targetRenderTarget.enumValueIndex == (int)HarmonyRenderer.RenderTarget.eRenderTexture);
            {
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.PrefixLabel("Texture Resolution");

                bool disabled = true;
                if (targetObjects.Length == 1)
                {
                    HarmonyRenderer harmonyRenderer = targetObjects[0] as HarmonyRenderer;
                    GameObject      rendererObject  = harmonyRenderer.gameObject;

                    MeshFilter meshFilter = harmonyRenderer.gameObject.GetComponent <MeshFilter>();
                    if ((meshFilter != null) && (meshFilter.sharedMesh != null))
                    {
                        Bounds bounds         = meshFilter.sharedMesh.bounds;
                        float  meshResolution = Mathf.Max(bounds.size.x, bounds.size.y);
                        if (meshResolution > 0.0f)
                        {
                            float currentTextureScale = targetRenderTextureScale.floatValue;
                            float currentResolution   = meshResolution * currentTextureScale;
                            float newResolution       = EditorGUILayout.Slider(currentResolution, 32, 8192);

                            if (newResolution != currentResolution)
                            {
                                float newTextureScale = newResolution / meshResolution;
                                harmonyRenderer.renderTextureScale = newTextureScale;

                                GenerateHarmonyMesh.CreateOrUpdateTextureObjectMesh(rendererObject);

                                serializedObject.Update();
                            }

                            disabled = false;
                        }
                    }
                }

                if (disabled)
                {
                    bool wasEnabled = GUI.enabled;
                    GUI.enabled = false;
                    EditorGUILayout.Slider(32, 32, 8192);
                    GUI.enabled = wasEnabled;
                }

                EditorGUILayout.EndHorizontal();

                //EditorGUILayout.PropertyField(targetRenderTextureViewport, new GUIContent("Texture Viewport"));
                //EditorGUILayout.PropertyField(targetRenderTextureScale, new GUIContent("Texture Scale"));

                if (!Application.isPlaying)
                {
                    //  Regenerate Mesh
                    EditorGUILayout.BeginHorizontal();
                    GUILayout.Space(EditorGUI.indentLevel * TAB_SIZE);

                    if (GUILayout.Button("Generate Mesh", GUILayout.Width(120)))
                    {
                        foreach (HarmonyRenderer harmonyRenderer in targetObjects)
                        {
                            GameObject rendererObject = harmonyRenderer.gameObject;
                            GenerateHarmonyMesh.CreateOrUpdateTextureObjectMesh(rendererObject, true);
                        }
                    }

                    if (GUILayout.Button("Clear Mesh", GUILayout.Width(120)))
                    {
                        foreach (HarmonyRenderer harmonyRenderer in targetObjects)
                        {
                            GameObject rendererObject = harmonyRenderer.gameObject;
                            GenerateHarmonyMesh.ClearTextureObjectMesh(rendererObject);
                        }

                        //  Components were removed from ui.  Bail out now.
                        EditorGUIUtility.ExitGUI();
                    }

                    EditorGUILayout.EndHorizontal();
                }
            }
            GUI.enabled = true;

            --EditorGUI.indentLevel;
        }

        foldColliders = EditorGUILayout.Foldout(foldColliders, "Colliders");
        if (foldColliders)
        {
            ++EditorGUI.indentLevel;

            EditorGUILayout.PropertyField(targetSyncCollider, new GUIContent("Sync Collider"));
            EditorGUILayout.PropertyField(targetColliderShape, new GUIContent("Collider Shape"));
            EditorGUILayout.PropertyField(targetColliderTrigger, new GUIContent("Collider Trigger"));

            if (!Application.isPlaying)
            {
                //  Update colliders
                EditorGUILayout.BeginHorizontal();
                GUILayout.Space(EditorGUI.indentLevel * TAB_SIZE);

                if (GUILayout.Button("Generate Colliders", GUILayout.Width(120)))
                {
                    foreach (HarmonyRenderer harmonyRenderer in targetObjects)
                    {
                        harmonyRenderer.PreCalculateColliders();
                    }

                    //  Components were removed from ui.  Bail out now.
                    EditorGUIUtility.ExitGUI();
                }

                if (GUILayout.Button("Clear Colliders", GUILayout.Width(120)))
                {
                    foreach (HarmonyRenderer harmonyRenderer in targetObjects)
                    {
                        harmonyRenderer.ClearColliders();
                    }

                    //  Components were removed from ui.  Bail out now.
                    EditorGUIUtility.ExitGUI();
                }

                EditorGUILayout.EndHorizontal();
            }

            --EditorGUI.indentLevel;
        }

        foldMetadata = EditorGUILayout.Foldout(foldMetadata, "Metadata");
        if (foldMetadata)
        {
            ++EditorGUI.indentLevel;

            //  Override label width to 1 pixel...
            EditorGUIUtility.labelWidth = 1f;

            for (int i = 0; i < System.Math.Min(targetMetadataKeys.arraySize, targetMetadataLists.arraySize); ++i)
            {
                SerializedProperty targetMetadataKey       = targetMetadataKeys.GetArrayElementAtIndex(i);
                SerializedProperty targetMetadataContainer = targetMetadataLists.GetArrayElementAtIndex(i);

                SerializedProperty targetMetadataList = targetMetadataContainer.FindPropertyRelative("metas");

                EditorGUILayout.LabelField(targetMetadataKey.stringValue);

                EditorGUILayout.BeginHorizontal();
                GUILayout.Space(EditorGUI.indentLevel * TAB_SIZE);
                EditorGUILayout.BeginVertical();
                EditorGUILayout.BeginHorizontal("box");

                GUILayout.Label("name ");
                GUILayout.Label("node");
                GUILayout.Label("value");

                if (GUILayout.Button("+", GUILayout.Width(16), GUILayout.Height(16)))
                {
                    ++targetMetadataList.arraySize;
                }

                EditorGUILayout.EndHorizontal();
                EditorGUILayout.EndVertical();
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                GUILayout.Space(EditorGUI.indentLevel * TAB_SIZE);
                EditorGUILayout.BeginVertical();
                for (int j = 0; j < targetMetadataList.arraySize; ++j)
                {
                    SerializedProperty targetMetadata = targetMetadataList.GetArrayElementAtIndex(j);

                    EditorGUILayout.BeginHorizontal("box");

                    SerializedProperty targetMetadataName     = targetMetadata.FindPropertyRelative("metaName");
                    SerializedProperty targetMetadataNodeName = targetMetadata.FindPropertyRelative("nodeName");
                    SerializedProperty targetMetadataValue    = targetMetadata.FindPropertyRelative("metaValue");

                    EditorGUILayout.PropertyField(targetMetadataName, new GUIContent(" "));
                    EditorGUILayout.PropertyField(targetMetadataNodeName, new GUIContent(" "));
                    EditorGUILayout.PropertyField(targetMetadataValue, new GUIContent(" "));

                    if (GUILayout.Button("-", GUILayout.Width(16), GUILayout.Height(16)))
                    {
                        targetMetadataList.DeleteArrayElementAtIndex(j);
                    }

                    EditorGUILayout.EndHorizontal();
                }
                EditorGUILayout.EndVertical();
                EditorGUILayout.EndHorizontal();
            }

            if (!Application.isPlaying)
            {
                //  Update props and anchors
                EditorGUILayout.BeginHorizontal();
                GUILayout.Space(EditorGUI.indentLevel * TAB_SIZE);

                if (GUILayout.Button("Update All Metadata", GUILayout.Width(120)))
                {
                    foreach (HarmonyRenderer harmonyRenderer in targetObjects)
                    {
                        GameObject rendererObject = harmonyRenderer.gameObject;

                        //  Create Metadata.
                        GenerateHarmonyMeta.CreateOrUpdatePropsFromMetadata(rendererObject);
                        GenerateHarmonyMeta.CreateOrUpdateAnchorsFromMetadata(rendererObject);
                        GenerateHarmonyMeta.CreateOrUpdateGenericMetadata(rendererObject);
                    }

                    serializedObject.Update();
                }

                EditorGUILayout.EndHorizontal();
            }

            --EditorGUI.indentLevel;

            //  Restore label width...
            EditorGUIUtility.labelWidth = 0f;
        }

        serializedObject.ApplyModifiedProperties();

        if (GUI.changed)
        {
            foreach (Object target in targetObjects)
            {
                EditorUtility.SetDirty(target);
            }
        }
    }
Exemplo n.º 2
0
    static void Run()
    {
        projectFolder = EditorUtility.OpenFolderPanel("Import Harmony Game Engine Project", projectFolder, "");
        if (!string.IsNullOrEmpty(projectFolder) &&
            new DirectoryInfo(projectFolder).Exists)
        {
            string[] clipNames = XML_StageLoader.loadStageClipNames(projectFolder).ToArray();

            if (clipNames.Length > 0)
            {
                string name = Path.GetFileName(projectFolder);

                GameObject rendererObject = new GameObject(name);

                HarmonyRenderer renderer = rendererObject.AddComponent <HarmonyRenderer>();
                /*HarmonyAnimation animation = */ rendererObject.AddComponent <HarmonyAnimation>();

                //  Do not create audio components if there is no audio sequences in specified project folder...
                bool needAudio = false;
                foreach (string clipName in clipNames)
                {
                    List <XML_Types.XML_SoundSequence> soundSequences = XML_StageLoader.loadSoundSequences(projectFolder, clipName);
                    if (soundSequences.Count > 0)
                    {
                        needAudio = true;
                        break;
                    }
                }

                if (needAudio)
                {
                    /*HarmonyAudio audio = */ rendererObject.AddComponent <HarmonyAudio>();
                    /*AudioSource audioSource = */ rendererObject.AddComponent <AudioSource>();
                }

                //  Remove streaming assets path part of the specified project folder if
                //  applicable.  An absolute path will work on the user's machine but will
                //  likely not be found elsewhere.
                string streamingAssetsPath   = Application.streamingAssetsPath;
                string rendererProjectFolder = projectFolder;
                if (rendererProjectFolder.Contains(streamingAssetsPath))
                {
                    rendererProjectFolder = rendererProjectFolder.Substring(streamingAssetsPath.Length + 1);
                }

                renderer.projectFolder = rendererProjectFolder;
                renderer.clipNames     = clipNames;
                renderer.renderTarget  = HarmonyRenderer.RenderTarget.eRenderTexture;

                //  Create Mesh.
                GenerateHarmonyMesh.CreateOrUpdateTextureObjectMesh(rendererObject);

                //  Adjust texture scale factor if resolution is too small...
                MeshFilter meshFilter = rendererObject.GetComponent <MeshFilter>();
                if (meshFilter != null)
                {
                    if (meshFilter.sharedMesh != null)
                    {
                        Bounds bounds         = meshFilter.sharedMesh.bounds;
                        float  meshResolution = Mathf.Max(bounds.size.x, bounds.size.y);

                        if (meshResolution < 1024.0f)
                        {
                            //  Adjust texture scale.
                            float newTextureScale = 1024.0f / meshResolution;
                            renderer.renderTextureScale = newTextureScale;

                            //  Update mesh with new texture scale values.
                            GenerateHarmonyMesh.CreateOrUpdateTextureObjectMesh(rendererObject);
                        }
                    }
                }

                //  Create Metadata.
                GenerateHarmonyMeta.CreateOrUpdatePropsFromMetadata(rendererObject);
                GenerateHarmonyMeta.CreateOrUpdateAnchorsFromMetadata(rendererObject);
                GenerateHarmonyMeta.CreateOrUpdateGenericMetadata(rendererObject);

                //  If no Harmony cameras available, ask user if he wants to create one.
                HarmonyCamera[] harmonyCameras = FindObjectsOfType <HarmonyCamera>();
                if (harmonyCameras.Length == 0)
                {
                    string title = "Create HarmonyCamera components?";
                    string body  = "Only a camera with the HarmonyCamera component will render Harmony Game Objects.";

                    if (EditorUtility.DisplayDialog(title, body, "Create", "Do Not Create"))
                    {
                        //  Make sure there is at least one camera in the scene.
                        Camera[] cameras = FindObjectsOfType <Camera>();
                        if (cameras.Length == 0)
                        {
                            GameObject cameraObject = new GameObject("Main Camera");
                            /*Camera camera = */ cameraObject.AddComponent <Camera>();
                        }

                        CreateHarmonyCamera.ShowWindow();
                    }
                }
            }
        }
    }