/*           INFINITY CODE           */
/*     https://infinity-code.com     */

using InfinityCode.uPano.Renderers;
using UnityEngine;

namespace HutongGames.PlayMaker.Actions.uPano
{
    [ActionCategory(uPanoCategories.CREATE)]
    [Tooltip("Create Cube Faces Panorama")]
    public class CreateCubeFacesPano : FsmStateAction
    {
        [RequiredField]
        [Tooltip("GameObject name")]
        public FsmString name = "Panorama";

        [RequiredField]
        public FsmTexture upTexture;

        [RequiredField]
        public FsmTexture frontTexture;

        [RequiredField]
        public FsmTexture leftTexture;

        [RequiredField]
        public FsmTexture backTexture;

        [RequiredField]
        public FsmTexture rightTexture;

        [RequiredField]
        public FsmTexture bottomTexture;

        [RequiredField]
        public FsmVector3 size = new Vector3(20, 20, 20);

        [RequiredField]
        public FsmObject shader = Shader.Find("Unlit/Texture");

        [RequiredField]
        public FsmBool enabled = true;

        [Tooltip("Panorama renderer instance")]
        [UIHint(UIHint.Variable)]
        public FsmObject storeInstance;

        [UIHint(UIHint.Variable)]
        public FsmGameObject storeGameObject;

        public override void Reset()
        {
            name = "Panorama";
            upTexture = null;
            frontTexture = null;
            leftTexture = null;
            backTexture = null;
            rightTexture = null;
            bottomTexture = null;
            size = new Vector3(20, 20, 20);
            shader = Shader.Find("Unlit/Texture");
            enabled = true;
            storeInstance = null;
            storeGameObject = null;
        }

        public override void OnEnter()
        {
            DoEnter();
            Finish();
        }

        private void DoEnter()
        {
            Texture2D[] textures =
            {
                upTexture.Value as Texture2D, 
                frontTexture.Value as Texture2D, 
                leftTexture.Value as Texture2D,
                backTexture.Value as Texture2D, 
                rightTexture.Value as Texture2D, 
                bottomTexture.Value as Texture2D
            };
            CubeFacesPanoRenderer renderer = CubeFacesPanoRenderer.Create(textures, size.Value);
            if (!shader.IsNone && shader.Value is Shader) renderer.shader = shader.Value as Shader;

            renderer.gameObject.name = name.Value;
            renderer.gameObject.SetActive(enabled.Value);
            if (!storeInstance.IsNone) storeInstance.Value = renderer;
            if (!storeGameObject.IsNone) storeGameObject.Value = renderer.gameObject;
        }}
}