// Curved World <http://u3d.as/1W8h>
// Copyright (c) Amazing Assets <https://amazingassets.world>
 
using UnityEngine;


//This script is designed specially for "car racing" example scenes, to exclude object from Curved World space and paste it in the same position, but now in the World space
//Car will be excluded from the Curved World space if it goes out of the road


namespace AmazingAssets.CurvedWorld.Examples
{
    public class DisableCurvedWorld : MonoBehaviour
    {
        public CurvedWorld.CurvedWorldController curvedWorldController;

        [Space(10)]
        public float xMin = 0;
        public float xMax = 0;

        [Space(10)]
        public float yMin = 0;
        public float yMax = 0;

        [Space(10)]
        public float zMin = 0;
        public float zMax = 0;
        

        private void FixedUpdate()
        {
            if (xMin != xMax)
            {
                if (transform.position.x < xMin || transform.position.x > xMax)
                    ToWorldSpace();
            }
            else if (yMin != yMax)
            {
                if (transform.position.y < yMin || transform.position.y > yMax)
                    ToWorldSpace();
            }
            else if (zMin != zMax)
            {
                if (transform.position.z < zMin || transform.position.z > zMax)
                    ToWorldSpace();
            }
        }
        void ToWorldSpace()
        {
            //Disable Curved World vertex transformation by enabling "CURVEDWORLD_DISABLED_ON" keyword.
            //Note, if shader is constructed using shader graph tools, "CURVEDWORLD_DISABLED_ON" keyword has to be implemented there manually, or material shader can be replaced with 'non Curved World' shader.

            Renderer[] renderers = GetComponentsInChildren<Renderer>();
            for (int r = 0; r < renderers.Length; r++)
            {
                if (renderers[r] == null || renderers[r].sharedMaterials == null)
                    continue;

                for (int m = 0; m < renderers[r].sharedMaterials.Length; m++)
                {
                    if (renderers[r].materials[m] != null)
                        renderers[r].materials[m].EnableKeyword("CURVEDWORLD_DISABLED_ON");
                }
            }


            //Get Curved World equivalent position, but in World Space
            Vector3 realPosition = curvedWorldController.TransformPosition(transform.position);

            //And rotation too.
            Quaternion realRotation = curvedWorldController.TransformRotation(transform.position, transform.forward, transform.right);


            //Update object transformation
            transform.position = realPosition;
            transform.rotation = realRotation;


            //Dissable collider to avoid confusion with 'Curved World' physics
            Collider collider = GetComponent<Collider>();
            if (collider != null)
                collider.enabled = false;


            //This script can be disabled
            this.enabled = false;
        }
    }
}
