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

using InfinityCode.uPano.Renderers;
using UnityEngine;

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

        [RequiredField]
        public FsmTexture texture;

        [RequiredField]
        public FsmFloat radius = 10;

        [RequiredField]
        public FsmFloat height = 10;

        [RequiredField]
        public FsmInt sides = 32;

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

        public FsmMaterial material;

        [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";
            texture = null;
            radius = 10;
            height = 10;
            sides = 32;
            shader = Shader.Find("Unlit/Texture");
            material = null;
            enabled = true;
            storeInstance = null;
            storeGameObject = null;
        }

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

        private void DoEnter()
        {
            CylindricalPanoRenderer renderer = CylindricalPanoRenderer.Create(texture.Value as Texture2D, radius.Value, height.Value, sides.Value);
            if (!shader.IsNone && shader.Value is Shader) renderer.shader = shader.Value as Shader;
            if (!material.IsNone) renderer.material = material.Value;
            renderer.gameObject.name = name.Value;
            renderer.gameObject.SetActive(enabled.Value);
            if (!storeInstance.IsNone) storeInstance.Value = renderer;
            if (!storeGameObject.IsNone) storeGameObject.Value = renderer.gameObject;
        }
    }
}