using UnityEngine;
using System.Collections;

[RequireComponent (typeof (MeshFilter))]
public class Twist : MonoBehaviour {

	public float twistAngle = 0.0f;	
	public Vector3 twistVector = Vector3.forward;
	public Vector3 twistCentre = Vector3.zero;
	
	private Vector3[] original;
	private Mesh mesh;
	private Vector3 dv;
	private Vector3 noScale = new Vector3(1,1,1);

	void Start() {		
		MeshFilter mfilter = GetComponent(typeof(MeshFilter)) as MeshFilter;
		mesh = mfilter.mesh;
		original = mesh.vertices;
		dv = new Vector3(mesh.bounds.size.x / 2, mesh.bounds.size.y / 2, mesh.bounds.size.z / 2);
	}
	

	void Update() {
		twistVector.Normalize();
		
		Vector3[] vs = mesh.vertices;
		int vc = vs.Length;
		
		
		float d = -Vector3.Dot(twistVector, twistCentre);

		for (int i = 0; i < vc; i++) {
			Vector3 v = copy(original[i]);
			float dd = Vector3.Dot(v, twistVector) + d;
			float a = (dd / dv.magnitude) * twistAngle;
			Matrix4x4 m = Matrix4x4.TRS(Vector3.zero, Quaternion.AngleAxis(a, twistVector), noScale);
			vs[i] = m.MultiplyVector(v);
		}
		
		mesh.vertices = vs;
		mesh.RecalculateNormals();
	}

	
	private Vector3 copy(Vector3 orig) {
		return new Vector3(orig.x, orig.y, orig.z);
	}
}















