#if POSEIDON
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Pinwheel.Poseidon;

namespace Pinwheel.Griffin
{
    [ExecuteInEditMode]
    public class GCameraBuoyancyController : MonoBehaviour
    {
        public PWater water;
        public float speed;
        public Transform lookAt;

        private void Update()
        {
            if (water == null)
                return;
            Vector3 p = GetPosition(transform.position);
            Vector3 p0 = GetPosition(transform.position + Vector3.left);
            Vector3 p1 = GetPosition(transform.position + Vector3.forward);
            Vector3 p2 = GetPosition(transform.position + Vector3.right);
            Vector3 p3 = GetPosition(transform.position + Vector3.back);

            Vector3 center = (p + p0 + p1 + p2 + p3) / 5f;
            Vector3 n0 = Vector3.Cross(p0 - p, p1 - p);
            Vector3 n1 = Vector3.Cross(p1 - p, p2 - p);
            Vector3 n2 = Vector3.Cross(p2 - p, p3 - p);
            Vector3 n3 = Vector3.Cross(p3 - p, p0 - p);
            Vector3 up = (n0 + n1 + n2 + n3) / 4f;

            transform.position = center;
            transform.up = Vector3.Lerp(transform.up, up, 0.01667f * speed);

            if (lookAt != null)
            {
                transform.LookAt(lookAt.position, transform.up);
            }
        }

        private Vector3 GetPosition(Vector3 worldPoint)
        {
            Vector3 localPoint = water.transform.InverseTransformPoint(worldPoint);
            localPoint.y = 0;
            localPoint = PWaterExtension.GetLocalVertexPosition(water, localPoint, true);
            worldPoint = water.transform.TransformPoint(localPoint);
            return worldPoint;
        }
    }
}
#endif