﻿using UnityEngine;
using System.Collections;

public class VertexTransform : MonoBehaviour {

    public Vector4 homogeneousCoordinate;

    public delegate Vector4 TransformDelegate(Vector4 vertex, out bool clipped);

    public TransformDelegate transformDel;

    public Transform sourceVertex;

    protected float recordedTime;
    private const float clipDuration = 0.25f;
    bool clipRenderEnabledState = true;

    void Awake()
    {
        recordedTime = Time.time;
    }

    /// <summary>
    /// Performed late to take camera transforms into account.
    /// Also assumes that the TransformManager will have enabled/disabled
    /// the renderer during the last update call.
    /// </summary>
	void LateUpdate()
    {
        if (transformDel != null)
        {
            bool clipped;
            // record homogeneousPosition for display in property inspector
            homogeneousCoordinate = transformDel(new Vector4(sourceVertex.position.x, sourceVertex.position.y, sourceVertex.position.z, 1), out clipped);
            Vector3 newPosition = new Vector3(homogeneousCoordinate.x / homogeneousCoordinate.w, homogeneousCoordinate.y / homogeneousCoordinate.w, homogeneousCoordinate.z / homogeneousCoordinate.w);
            this.transform.position = newPosition;

            if (clipped && renderer.enabled == true)
            {
                if (Time.time - recordedTime > clipDuration)
                {
                    recordedTime = Time.time;
                    clipRenderEnabledState = !clipRenderEnabledState;
                }
                renderer.enabled = clipRenderEnabledState;
            }
        }
	}
}
