package com.as3dmod.modifiers {
import com.as3dmod.IModifier;
import com.as3dmod.core.Matrix4;
import com.as3dmod.core.Modifier;
import com.as3dmod.core.Vector3;
import com.as3dmod.core.VertexProxy;
/**
* Twist modifier.
*
* Adapted from the Twist modifier for PV3D.
* More info here: http://blog.zupko.info/?p=140.
*/
public class Twist extends Modifier implements IModifier {
private var _vector:Vector3 = new Vector3(0, 1, 0);
private var _angle:Number;
public var center:Vector3 = Vector3.ZERO;
public function Twist(a:Number = 0) {
_angle = a;
}
public function get angle():Number {
return _angle;
}
public function set angle(value:Number):void {
_angle = value;
}
public function get vector():Vector3 {
return _vector;
}
public function set vector(value:Vector3):void {
_vector = value;
}
public function apply():void {
_vector.normalize();
var dv:Vector3 = new Vector3(mod.maxX / 2, mod.maxY / 2, mod.maxZ / 2);
var d:Number = -Vector3.dot(_vector, center);
for(var i:int = 0;i < mod.getVertices().length; i++) {
var vertex:VertexProxy = mod.getVertices()[i];
var dd:Number = Vector3.dot(new Vector3(vertex.x, vertex.y, vertex.z), _vector) + d;
twistPoint(vertex, (dd / dv.magnitude) * _angle);
}
}
private function twistPoint(v:VertexProxy, a:Number):void {
var mat:Matrix4 = Matrix4.translationMatrix(v.x, v.y, v.z);
mat = Matrix4.multiply(Matrix4.rotationMatrix(_vector.x, _vector.y, _vector.z, a), mat);
v.x = mat.n14;
v.y = mat.n24;
v.z = mat.n34;
}
}
}