Exemplo n.º 1
0
    IEnumerator Start()
    {
        HarmonyAnimation[] animations = FindObjectsOfType <HarmonyAnimation>();

        //  Wait for audio to be complete before playing animation.
        foreach (HarmonyAnimation animation in animations)
        {
            GameObject gameObject = animation.gameObject;

            HarmonyRenderer renderer = gameObject.GetComponent <HarmonyRenderer>();
            if (renderer != null)
            {
                //  Preemptively load clip.
                renderer.LoadClipIndex(0 /* first clip */);
            }

            //  Wait for audio if necessary.
            HarmonyAudio audio = gameObject.GetComponent <HarmonyAudio>();
            if (audio != null)
            {
                yield return(StartCoroutine(audio.WaitForDownloads()));
            }
        }

        foreach (HarmonyAnimation animation in animations)
        {
            animation.LoopAnimation(24.0f, 0 /* first clip */);

            //  Loop only part of the animation.
            //animation.LoopFrames( 24.0f, 1.0f, 30.0f );
        }
    }
Exemplo n.º 2
0
    public IEnumerator RefreshRendererObject()
    {
        if (rendererObject == null)
        {
            yield break;
        }

        SceneSettings settings = FindObjectOfType(typeof(SceneSettings)) as SceneSettings;

        if (settings == null)
        {
            yield break;
        }

        HarmonyRenderer  renderer  = rendererObject.GetComponent <HarmonyRenderer>();
        HarmonyAnimation animation = rendererObject.GetComponent <HarmonyAnimation>();
        HarmonyAudio     audio     = rendererObject.GetComponent <HarmonyAudio>();

        if ((renderer == null) || (animation == null) || (audio == null))
        {
            yield break;
        }

        renderer.LoadClipIndex(settings.clipIdx);

        //  Make sure sound is all downloaded before playing animation.
        yield return(StartCoroutine(audio.WaitForDownloads()));

        //  Loop animation indefinitely.
        animation.ResetAnimation();
        animation.LoopAnimation(frameRate, settings.clipIdx);
        animation.ResumeAnimation(); // resume if paused.
    }
Exemplo n.º 3
0
    private void OnTransformParentChanged()
    {
        //  Update HarmonyRenderer component if prop has been reparented
        //  in a new hierarchy.
        Transform parentTransform = gameObject.transform.parent;

        if (parentTransform != cachedParentTransform)
        {
            cachedParentTransform = parentTransform;

            HarmonyRenderer harmonyRenderer = GetComponentInParent <HarmonyRenderer>();
            if (harmonyRenderer != cachedHarmonyRenderer)
            {
                if (cachedHarmonyRenderer != null)
                {
                    cachedHarmonyRenderer.InvalidateProps();
                }

                cachedHarmonyRenderer = harmonyRenderer;

                if (cachedHarmonyRenderer != null)
                {
                    cachedHarmonyRenderer.InvalidateProps();
                }
            }
        }
    }
Exemplo n.º 4
0
    IEnumerator Start()
    {
        //  Preemptively load clips.
        HarmonyRenderer renderer = GetComponent <HarmonyRenderer>();

        if ((renderer == null) || (renderer.clipNames == null))
        {
            yield break;
        }

        //yield return StartCoroutine(renderer.WaitForDownloads());

        foreach (string clipName in renderer.clipNames)
        {
            renderer.LoadClipName(clipName);
        }

        //  Wait for audio if necessary.
        HarmonyAudio audio = GetComponent <HarmonyAudio>();

        if (audio != null)
        {
            yield return(StartCoroutine(audio.WaitForDownloads()));
        }
    }
Exemplo n.º 5
0
    public static void CreateOrUpdateGenericMetadata(GameObject rootObject)
    {
        HarmonyRenderer renderer = rootObject.GetComponent <HarmonyRenderer>();

        if (renderer == null)
        {
            return;
        }

        string projectFolder = renderer.projectFolder;

        if (!new DirectoryInfo(projectFolder).Exists)
        {
            projectFolder = Application.streamingAssetsPath + "/" + projectFolder;
        }

        //  Load custom metadata from XML
        XML_Types.XML_GenericMeta[] xmlMetas = XML_StageLoader.loadGenericMeta(projectFolder).ToArray();
        if (xmlMetas.Length > 0)
        {
            foreach (XML_Types.XML_GenericMeta xmlMeta in xmlMetas)
            {
                HarmonyMeta.MetaEntry entry = new HarmonyMeta.MetaEntry();
                entry.metaName  = xmlMeta._name;
                entry.nodeName  = xmlMeta._nodeName;
                entry.metaValue = xmlMeta._value;

                if (Array.Exists(renderer.clipNames, clipName => clipName == xmlMeta._clipName))
                {
                    if (!renderer.metadata.ContainsKey(xmlMeta._clipName))
                    {
                        renderer.metadata[xmlMeta._clipName] = new HarmonyMeta();
                    }

                    if (renderer.metadata[xmlMeta._clipName].GetMeta(entry.metaName, entry.nodeName) == null)
                    {
                        renderer.metadata[xmlMeta._clipName].AddMeta(entry);
                    }
                }
                else
                {
                    HarmonyProp[] propComponents = rootObject.GetComponentsInChildren <HarmonyProp>();
                    foreach (HarmonyProp propComponent in propComponents)
                    {
                        if (propComponent.playName == xmlMeta._playName)
                        {
                            if (propComponent.metadata.GetMeta(entry.metaName, entry.nodeName) == null)
                            {
                                propComponent.metadata.AddMeta(entry);
                            }
                            break;
                        }
                    }
                }
            }
        }
    }
Exemplo n.º 6
0
    private void PlayStaticFramePriv(float staticFrame, int clipIdx, float duration, CallbackEvents callbacks)
    {
        HarmonyRenderer renderer = GetComponent <HarmonyRenderer>();

        if (renderer != null && renderer.clipNames != null)
        {
            if (clipIdx < renderer.clipNames.Length)
            {
                string clipName = renderer.clipNames[clipIdx];
                PlayStaticFramePriv(staticFrame, clipName, duration, callbacks);
            }
        }
    }
Exemplo n.º 7
0
    private void PlayAnimationPriv(float frameRate, int clipIdx, float startFrame, float duration, int nTimes, bool reverse, CallbackEvents callbacks)
    {
        HarmonyRenderer renderer = GetComponent <HarmonyRenderer>();

        if (renderer != null && renderer.clipNames != null)
        {
            if (clipIdx < renderer.clipNames.Length)
            {
                string clipName = renderer.clipNames[clipIdx];
                PlayAnimationPriv(frameRate, clipName, startFrame, duration, nTimes, reverse, callbacks);
            }
        }
    }
Exemplo n.º 8
0
    private void PlayStaticFramePriv(float staticFrame, string clipName, float duration, CallbackEvents callbacks)
    {
        HarmonyRenderer renderer = GetComponent <HarmonyRenderer>();

        if (renderer != null)
        {
            //  Load clip at index if not already loaded.
            renderer.LoadClipName(clipName);
        }

        if (duration < 0.0f)
        {
            AnimationClip clip = new AnimationClip(gameObject, 0.0f, clipName, staticFrame, 1.0f /*don't care*/, -1, false /*forward*/, callbacks);
            PlayPriv(clip);
        }
        else
        {
            AnimationClip clip = new AnimationClip(gameObject, 0.0f, clipName, staticFrame, duration, 1, false /*forward*/, callbacks);
            PlayPriv(clip);
        }
    }
Exemplo n.º 9
0
    IEnumerator Start()
    {
        SceneSettings settings = FindObjectOfType(typeof(SceneSettings)) as SceneSettings;

        if (settings != null)
        {
            if (settings.clipNames.Length > 0)
            {
                rendererObject = new GameObject("RendererObject");
                rendererObject.transform.parent = settings.viewerGroup.transform;

                HarmonyRenderer  renderer            = rendererObject.AddComponent <HarmonyRenderer>();
                HarmonyAnimation animation           = rendererObject.AddComponent <HarmonyAnimation>();
                HarmonyAudio     audio               = rendererObject.AddComponent <HarmonyAudio>();
                AudioSource      templateAudioSource = rendererObject.AddComponent <AudioSource>();

                //  Linear rolloff.  Easier for sound to be heard.
                templateAudioSource.rolloffMode = AudioRolloffMode.Linear;

                //  Set up clip collection in renderer.
                renderer.projectFolder = settings.projectFolder;
                renderer.clipNames     = settings.clipNames;

                renderer.LoadClipIndex(settings.clipIdx);

                //  Adjust renderer object size to fit in camera.
                Bounds box = renderer.CalculateCurrentBoundingBox();

                float scaleFactor = 5.0f / Mathf.Max(box.size.x, box.size.y);
                rendererObject.transform.localScale = new Vector3(scaleFactor, scaleFactor, 1.0f);

                //  Make sure sound is all downloaded before playing animation.
                yield return(StartCoroutine(audio.WaitForDownloads()));

                //  Loop animation indefinitely.
                animation.ResetAnimation();
                animation.LoopAnimation(frameRate, settings.clipIdx);
            }
        }
    }
Exemplo n.º 10
0
  private void OnTransformParentChanged()
  {
    //  Update HarmonyRenderer component if prop has been reparented
    //  in a new hierarchy.
    Transform parentTransform = gameObject.transform.parent;
    if (parentTransform != cachedParentTransform)
    {
      cachedParentTransform = parentTransform;

      HarmonyRenderer harmonyRenderer = GetComponentInParent<HarmonyRenderer>();
      if (harmonyRenderer != cachedHarmonyRenderer)
      {
        if (cachedHarmonyRenderer != null)
          cachedHarmonyRenderer.InvalidateProps();

        cachedHarmonyRenderer = harmonyRenderer;

        if (cachedHarmonyRenderer != null)
          cachedHarmonyRenderer.InvalidateProps();
      }
    }
  }
Exemplo n.º 11
0
    void CreateCharacterAt(Vector3 pos)
    {
        //Message.Log( "Create Character at: " + pos );

    #if CLONE_ON_TOUCH
        GameObject rendererObject = GameObject.Instantiate(gameObjectToClone) as GameObject;
        rendererObject.transform.localPosition = new Vector3(pos.x, pos.y, pos.z);
        rendererObject.transform.parent        = gameObject.transform;

        HarmonyRenderer  renderer  = rendererObject.GetComponent <HarmonyRenderer>();
        HarmonyAnimation animation = rendererObject.GetComponent <HarmonyAnimation>();
    #else
        GameObject rendererObject = new GameObject("Space Duck");
        rendererObject.transform.localScale    = new Vector3(0.01f, 0.01f, 0.01f);
        rendererObject.transform.localPosition = new Vector3(pos.x, pos.y, pos.z);
        rendererObject.transform.parent        = gameObject.transform;


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

        Rigidbody2D       rigidBody = rendererObject.AddComponent <Rigidbody2D>();
        PolygonCollider2D collider  = rendererObject.AddComponent <PolygonCollider2D>();

        //  Set up clip collection in renderer.
        renderer.projectFolder = liveProjectFolder;
        renderer.clipNames     = XML_StageLoader.loadStageClipNames(renderer.projectFolder).ToArray();

        renderer.syncCollider  = HarmonyRenderer.SyncCollider.eAlways;
        renderer.colliderShape = colliderShape;
    #endif // CLONE_ON_TOUCH

        //  Randomly play a clip.
        if (renderer.clipNames.Length > 0)
        {
            animation.LoopAnimation(24.0f, rand.Next() % renderer.clipNames.Length);
        }
    }
Exemplo n.º 12
0
    private void PlayAnimationPriv(float frameRate, string clipName, float startFrame, float duration, int nTimes, bool reverse, CallbackEvents callbacks)
    {
        HarmonyRenderer renderer = GetComponent <HarmonyRenderer>();

        if (renderer != null)
        {
            //  Load clip at index if not already loaded.
            renderer.LoadClipName(clipName);

            //  Negative duration, replace with clip full duration.
            if (duration < 0.0f)
            {
                float nFrames = renderer.GetClipFrameCount(clipName);
                duration = (frameRate > 0.0f) ? ((nFrames + 1.0f - startFrame) / frameRate) : 0.0f;
            }
        }

        if (duration > 0.0f)
        {
            AnimationClip clip = new AnimationClip(gameObject, frameRate, clipName, startFrame, duration, nTimes, reverse, callbacks);
            PlayPriv(clip);
        }
    }
Exemplo n.º 13
0
    void postStart()
    {
        HarmonyRenderer renderer = GetComponent <HarmonyRenderer>();

        //  Preemptively load clip.
        renderer.LoadClipIndex(0 /* first clip */);

        HarmonyAnimation animation = gameObject.GetComponent <HarmonyAnimation>();

        if (animation != null)
        {
            HarmonyAnimation.CallbackEvents callbacks = new HarmonyAnimation.CallbackEvents();

            //  Trigger a callback at frame 10 of animation.
            callbacks.AddCallbackAtFrame(10.0f, CallbackMethod1);

            //  Trigget a callback at end of animation.
            callbacks.AddCallbackAtEnd(CallbackMethod2);

            //  Loop animation indefinitely.
            animation.LoopAnimation(frameRate, 0 /* first clip */, 1.0f /*first frame*/, false /*forward*/, callbacks);
        }
        renderer.readyToRender = true;
    }
Exemplo n.º 14
0
    IEnumerator Start()
    {
        //  Preemptively load clips.
        HarmonyRenderer renderer = GetComponent <HarmonyRenderer>();

        if ((renderer == null) || (renderer.clipNames == null))
        {
            yield break;
        }

#if UNITY_WEBGL && !UNITY_EDITOR
        if (WebGL_FileSystem.GetPreparationStateOfResource(renderer.projectFolder) != 3)
        {
            renderer.readyToRender = false;
            PrepareProjectFolder(renderer.projectFolder);
        }
        else
        {
            postStart();
        }
#else
        postStart();
#endif
    }
Exemplo n.º 15
0
    void Update()
    {
        HarmonyAudio audio = GetComponent <HarmonyAudio>();

        if ((audio != null) && !audio.isReady)
        {
            return;
        }

        HarmonyAnimation animation = GetComponent <HarmonyAnimation>();

        if (animation == null)
        {
            return;
        }

        HarmonyRenderer renderer = GetComponent <HarmonyRenderer>();

        if ((renderer == null) || (renderer.clipNames == null))
        {
            return;
        }

        //if ( !renderer.isReady )
        //  return;

        //  Almost at end of our scheduled list, reschedule a new sequence.
        if (renderer.clipNames.Length > animation.scheduledCount)
        {
            //  Play all clips
            foreach (string clipName in renderer.clipNames)
            {
                animation.PlayAnimation(frameRate, clipName);
            }
        }
    }
Exemplo n.º 16
0
    public static void CreateOrUpdateAnchorsFromMetadata(GameObject rootObject)
    {
        HarmonyRenderer renderer = rootObject.GetComponent <HarmonyRenderer>();

        if (renderer == null)
        {
            return;
        }

        string projectFolder = renderer.projectFolder;

        if (!new DirectoryInfo(projectFolder).Exists)
        {
            projectFolder = Application.streamingAssetsPath + "/" + projectFolder;
        }

        //  Load anchors metadata from XML
        XML_Types.XML_AnchorMeta[] xmlAnchors = XML_StageLoader.loadAnchorMeta(projectFolder).ToArray();
        if (xmlAnchors.Length > 0)
        {
            string     anchorObjectName      = "Anchors";
            GameObject anchorContainerObject = null;

            Transform[] childTransforms = rootObject.GetComponentsInChildren <Transform>(true /*includeInactive*/);
            foreach (Transform childTransform in childTransforms)
            {
                GameObject childObject = childTransform.gameObject;

                //  Direct child to root object
                if (childObject.transform.parent == rootObject.transform)
                {
                    //  Object matching preset Anchors game object name.
                    if (childObject.name == anchorObjectName)
                    {
                        anchorContainerObject = childObject;
                        break;
                    }
                }
            }

            HarmonyAnchor[] anchorComponents = rootObject.GetComponentsInChildren <HarmonyAnchor>(true /*includeInactive*/);

            foreach (XML_Types.XML_AnchorMeta xmlAnchor in xmlAnchors)
            {
                if (!Array.Exists(anchorComponents, anchor => (anchor.playName == xmlAnchor._playName) && (anchor.nodeName == xmlAnchor._nodeName)))
                {
                    if (anchorContainerObject == null)
                    {
                        //  Create container game object from anchors child to renderer object.
                        anchorContainerObject = new GameObject(anchorObjectName);
                        anchorContainerObject.transform.parent = rootObject.transform;
                    }

                    GameObject anchorObject = new GameObject(xmlAnchor._nodeName);
                    anchorObject.transform.parent = anchorContainerObject.transform;

                    HarmonyAnchor anchorComponent = anchorObject.AddComponent <HarmonyAnchor>();

                    anchorComponent.playName = xmlAnchor._playName;
                    anchorComponent.nodeName = xmlAnchor._nodeName;
                }
            }
        }
    }
Exemplo n.º 17
0
    public static void CreateOrUpdatePropsFromMetadata(GameObject rootObject)
    {
        HarmonyRenderer renderer = rootObject.GetComponent <HarmonyRenderer>();

        if (renderer == null)
        {
            return;
        }

        string projectFolder = renderer.projectFolder;

        if (!new DirectoryInfo(projectFolder).Exists)
        {
            projectFolder = Application.streamingAssetsPath + "/" + projectFolder;
        }

        //  Load props metadata from XML
        XML_Types.XML_PropMeta[] xmlProps = XML_StageLoader.loadPropMeta(projectFolder).ToArray();
        if (xmlProps.Length > 0)
        {
            string     propObjectName      = "Props";
            GameObject propContainerObject = null;

            Transform[] childTransforms = rootObject.GetComponentsInChildren <Transform>(true /*includeInactive*/);
            foreach (Transform childTransform in childTransforms)
            {
                GameObject childObject = childTransform.gameObject;

                //  Direct child to root object
                if (childObject.transform.parent == rootObject.transform)
                {
                    //  Object matching preset Props game object name.
                    if (childObject.name == propObjectName)
                    {
                        propContainerObject = childObject;
                        break;
                    }
                }
            }

            HarmonyProp[] propComponents = rootObject.GetComponentsInChildren <HarmonyProp>(true /*includeInactive*/);

            foreach (XML_Types.XML_PropMeta xmlProp in xmlProps)
            {
                if (!Array.Exists(propComponents, prop => (prop.clipName == xmlProp._clipName) && (prop.playName == xmlProp._playName)))
                {
                    if (propContainerObject == null)
                    {
                        //  Create container game object from props child to renderer object.
                        propContainerObject = new GameObject(propObjectName);
                        propContainerObject.transform.parent = rootObject.transform;
                    }

                    GameObject propObject = new GameObject(xmlProp._playName);
                    propObject.transform.parent = propContainerObject.transform;

                    HarmonyProp propComponent = propObject.AddComponent <HarmonyProp>();

                    propComponent.clipName = xmlProp._clipName;
                    propComponent.playName = xmlProp._playName;
                }
            }
        }
    }
Exemplo n.º 18
0
 private void Awake()
 {
     cachedParentTransform = gameObject.transform.parent;
     cachedHarmonyRenderer = GetComponentInParent <HarmonyRenderer>();
 }
Exemplo n.º 19
0
    static void RenderAnchorControls(Transform objectTransform, GizmoType gizmoType, bool selected)
    {
        GameObject    gameObject    = objectTransform.gameObject;
        HarmonyAnchor harmonyAnchor = gameObject.GetComponent <HarmonyAnchor>();

        if (harmonyAnchor == null)
        {
            return;
        }

        HarmonyRenderer harmonyRenderer = harmonyAnchor.GetComponentInParent <HarmonyRenderer>();

        if (harmonyRenderer == null)
        {
            return;
        }

        string clipName = harmonyRenderer.currentClipName;

        if (string.IsNullOrEmpty(clipName))
        {
            return;
        }

        string projectFolder = harmonyRenderer.currentProjectFolder;

        if (string.IsNullOrEmpty(projectFolder))
        {
            return;
        }

        float[] position = new float[3];
        float[] rotation = new float[3];
        float[] scale    = new float[3];

        if (Internal.CalculateLocatorTransform(projectFolder, clipName, harmonyRenderer.currentFrame, harmonyAnchor.nodeName, position, rotation, scale))
        {
            Vector3    localPosition   = new Vector3(position[0], position[1], position[2]);
            Quaternion localQuaternion = Quaternion.Euler(rotation[0], rotation[1], rotation[2]);
            Vector3    localScale      = new Vector3(scale[0], scale[1], scale[2]);

            Matrix4x4 localMatrix = Matrix4x4.TRS(localPosition, localQuaternion, localScale);

            Vector3 globalPosition       = localMatrix.MultiplyPoint(Vector3.zero);
            Vector3 globalRightDirection = localMatrix.MultiplyVector(Vector3.right);
            Vector3 globalUpDirection    = localMatrix.MultiplyVector(Vector3.up);

            if (gameObject.transform.parent != null)
            {
                globalPosition       = gameObject.transform.parent.localToWorldMatrix.MultiplyPoint(globalPosition);
                globalRightDirection = gameObject.transform.parent.localToWorldMatrix.MultiplyVector(globalRightDirection);
                globalUpDirection    = gameObject.transform.parent.localToWorldMatrix.MultiplyVector(globalUpDirection);
            }

            globalRightDirection.Normalize();
            globalUpDirection.Normalize();

            Quaternion axisQuaternion        = Quaternion.FromToRotation(Vector3.forward, Vector3.right);
            Quaternion globalRightQuaternion = Quaternion.FromToRotation(new Vector3(1, 0, 0), globalRightDirection);

            float arrowLength  = HandleUtility.GetHandleSize(globalPosition) * 0.5f;
            float axisLength   = arrowLength * 0.6f;
            float circleRadius = arrowLength * 0.5f;

            Handles.color = selected ? Color.cyan : Color.red;

            Handles.DrawWireDisc(globalPosition,
                                 Vector3.forward,
                                 circleRadius);

            Handles.DrawLine(globalPosition - globalRightDirection * axisLength,
                             globalPosition);

            Handles.DrawLine(globalPosition - globalUpDirection * axisLength,
                             globalPosition + globalUpDirection * axisLength);

            Handles.ArrowCap(0,
                             globalPosition,
                             globalRightQuaternion * axisQuaternion,
                             arrowLength);
        }
    }
Exemplo n.º 20
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.º 21
0
 private void Awake()
 {
     harmonyRenderer = GetComponentInParent <HarmonyRenderer>();
 }
Exemplo n.º 22
0
    public static void CreateOrUpdateTextureObjectMesh(GameObject rootObject, bool regenerateMesh = false)
    {
        HarmonyRenderer renderer = rootObject.GetComponent <HarmonyRenderer>();

        if (renderer == null)
        {
            return;
        }

        //if (renderer.renderTarget != HarmonyRenderer.RenderTarget.eRenderTexture)
        //  return;

        MeshFilter meshFilter = rootObject.GetComponent <MeshFilter>();

        if (meshFilter == null)
        {
            meshFilter = rootObject.AddComponent <MeshFilter>();
        }

        MeshRenderer meshRenderer = rootObject.GetComponent <MeshRenderer>();

        if (meshRenderer == null)
        {
            meshRenderer = rootObject.AddComponent <MeshRenderer>();
        }

        Bounds box = new Bounds(Vector3.zero, Vector3.zero);

        if ((meshFilter.sharedMesh == null) || regenerateMesh)
        {
            box = renderer.CalculateCumulativeBoundingBox();
        }
        else
        {
            box = meshFilter.sharedMesh.bounds;
        }

        if (box.size.sqrMagnitude > 0.0f)
        {
            float textureScale = renderer.renderTextureScale;

            float textureWidth  = Mathf.NextPowerOfTwo((int)(box.size.x * textureScale));
            float textureHeight = Mathf.NextPowerOfTwo((int)(box.size.y * textureScale));
            float textureX      = box.min.x * textureScale;
            float textureY      = box.min.y * textureScale;

            float x      = box.min.x;
            float y      = box.min.y;
            float width  = box.size.x;
            float height = box.size.y;

            float scaledWidth  = width * textureScale;
            float scaledHeight = height * textureScale;

            float u0 = 0.0f;
            float u1 = scaledWidth / textureWidth;
            float v0 = 1.0f - (scaledHeight / textureHeight);
            float v1 = 1.0f;

            //Message.Log( "uvs: (" + u0 + "," + v0 + ") (" + u1 + "," + v1 + ")" );

            renderer.renderTextureViewport = new Rect(textureX, textureY, textureWidth, textureHeight);

            //  Create basic quad to map texture unto.
            if ((meshFilter.sharedMesh == null) || regenerateMesh)
            {
                Mesh mesh = new Mesh();
                mesh.name = rootObject.name + "_mesh";

                Vector3[] vertices = new Vector3[4]
                {
                    new Vector3(x, y, 0),
                    new Vector3(x + width, y, 0),
                    new Vector3(x + width, y + height, 0),
                    new Vector3(x, y + height, 0)
                };

                Vector3[] normals = new Vector3[4]
                {
                    new Vector3(0, 0, -1.0f),
                    new Vector3(0, 0, -1.0f),
                    new Vector3(0, 0, -1.0f),
                    new Vector3(0, 0, -1.0f)
                };

                Vector2[] uvs = new Vector2[4]
                {
                    new Vector2(u0, v1),
                    new Vector2(u1, v1),
                    new Vector2(u1, v0),
                    new Vector2(u0, v0)
                };

                int[] faces = new int[6]
                {
                    2, 1, 0,
                    3, 2, 0
                };

                mesh.vertices  = vertices;
                mesh.normals   = normals;
                mesh.uv        = uvs;
                mesh.triangles = faces;

                UnityEngine.Object.DestroyImmediate(meshFilter.sharedMesh);
                meshFilter.mesh = mesh;
            }
            else
            {
                Mesh meshCopy = Mesh.Instantiate(meshFilter.sharedMesh) as Mesh;
                meshCopy.name = rootObject.name + "_mesh";

                Vector2[] uvs = new Vector2[4]
                {
                    new Vector2(u0, v1),
                    new Vector2(u1, v1),
                    new Vector2(u1, v0),
                    new Vector2(u0, v0)
                };

                meshCopy.uv = uvs;

                UnityEngine.Object.DestroyImmediate(meshFilter.sharedMesh);
                meshFilter.mesh = meshCopy;
            }

            //  Create material for new mesh.
            if (meshRenderer.sharedMaterial == null)
            {
                Shader shader = Shader.Find("Harmony/UnlitTransparentPremult");
                if (shader != null)
                {
                    Material mat = new Material(shader);
                    mat.name = rootObject.name + "_mat";

                    UnityEngine.Object.DestroyImmediate(meshRenderer.sharedMaterial);
                    meshRenderer.material = mat;
                }
            }
        }
    }
Exemplo n.º 23
0
 private void Awake()
 {
   cachedParentTransform = gameObject.transform.parent;
   cachedHarmonyRenderer = GetComponentInParent<HarmonyRenderer>();
 }
Exemplo n.º 24
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();
                    }
                }
            }
        }
    }