flash on 2016-4-25
/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/G8Ki
*/
package {
import flash.events.Event;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public function FlashTest() {
myDraw = new xVertDraw();
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public var myDraw:xVertDraw;
public var camx:Number = 0;
public var camy:Number = 0;
public var camz:Number = 1024;
public var cori:xQuat = new xQuat();
public var ang:Number = 0;
public function onEnter(e:Event):void
{
graphics.clear();
graphics.lineStyle(2, 0);
xVertDraw.setProjMat(projMat, 90, 1, 1, 6000);
xVertDraw.setViewMat(viewMat, camx, camy, camz, cori.x, cori.y, cori.z, cori.w);
xVertDraw.multMatrix(projMat, viewMat, myDraw.projMat);
myDraw.drawBox(graphics, -256, -256, -256, 256, 256, 256);
myDraw.drawBox3(graphics, 0,0,0, 32,32,32);
graphics.drawRect(0,0,465,465);
var ms:Number; ms=512;
ang += 0.01;
camx = Math.cos(ang)*ms;
camz = Math.sin(ang)*ms;
cori.lookAtXYZ(camx,camy,camz,0,0,0);
ms=128;
var ax:Number; var ay:Number; var az:Number; var ta:Number;
for (ta = 0; ta < 6.28; ta+=(0.31415))
{
ax = Math.cos(ta+ang)*ms;
ay = Math.sin(ta+ang)*ms;
az= Math.sin(ta)*64; // 0;
myDraw.drawBox3(graphics,ax,ay,az, 8,8,8);
myDraw.drawRect3(graphics,ax,-256,az, 8,1,8);
}//nextta
}//onenter
public var ident:Vector.<Number> = Vector.<Number>([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
public var temp:Vector.<Number> = Vector.<Number>([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
public var projMat:Vector.<Number> = Vector.<Number>([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
public var viewMat:Vector.<Number> = Vector.<Number>([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
}//classend
}
import flash.display.Graphics;
internal class xQuat
{
public var x:Number = 0; public var y:Number = 0;
public var z:Number = 0; public var w:Number = 1;
public function reset():void { x = 0; y = 0; z = 0; w = 1; }
public function normalise():void
{ var mag:Number; mag = (x * x) + (y * y) + (z * z) + (w * w);
if (mag == 1.0) return; //already normal
if (mag == 0) { x = 0; y = 0; z = 0; w = 1; return; }
mag = 1.0 / Math.sqrt(mag); x *= mag; y *= mag; z *= mag; w *= mag;
}//norm
public function rotAxis(ang:Number, xyz:int=0):void //0 x 1 y 2 z
{ var ax:Number; var ay:Number; var az:Number; var aw:Number;
var tx:Number; var ty:Number; var tz:Number; var tw:Number;
ang *= 0.5;
ax = xyz == 0? Math.sin(ang):0; ay = xyz == 1? Math.sin(ang):0;
az = xyz == 2? Math.sin(ang):0; aw = Math.cos(ang);
tx = (w * ax + x * aw + y * az - z * ay); ty = (w * ay + y * aw + z * ax - x * az);
tz = (w * az + z * aw + x * ay - y * ax); tw = (w * aw - x * ax - y * ay - z * az);
x = tx; y = ty; z = tz; w = tw;
normalise();
}//rotaxis
public function setVec(vec:Vector.<Number>):void
{ var xx:Number= x * x; var xy:Number= x * y; var xz:Number = x * z; var xw:Number = x * w;
var yy:Number= y * y; var yz:Number= y * z; var yw:Number = y * w;
var zz:Number= z * z; var zw:Number= z * w;
vec[3] = vec[7] = vec[11] = vec[12] = vec[13] = vec[14] = 0.0; vec[15] = 1.0;
vec[0] = 1.0 - 2.0 * ( yy + zz ); vec[4] = 2.0 * ( xy - zw ); vec[8] = 2.0 * ( xz + yw );
vec[1] = 2.0 * ( xy + zw ) ; vec[5] = 1.0 - 2.0 * ( xx + zz ); vec[9] = 2.0 * ( yz - xw ) ;
vec[2] = 2.0 * ( xz - yw ); vec[6] = 2.0 * ( yz + xw ); vec[10] = 1.0 - 2.0 * ( xx + yy );
}//setvec
public function lookAtXYZ(ax:Number, ay:Number, az:Number, bx:Number, by:Number, bz:Number):void
{
var yaw:Number; var pitch:Number; var dx:Number; var dz:Number; var am:Number;
x = 0; y = 0; z = 0; w = 1;
dx = bx - ax; dz = bz - az;
yaw = Math.atan2(dz, dx);
am = Math.cos(yaw) * dx + Math.sin(yaw) * dz;
pitch = Math.atan2(by - ay, am);
rotAxis( -yaw - 1.57, 1);
rotAxis(pitch, 0);
}//lookat
public function getSideVx():Number { return 1.0 - 2.0 * ( y * y + z * z ); }
public function getSideVy():Number { return 2.0 * ( x * y + z * w ); }
public function getSideVz():Number { return 2.0 * ( x * z - y * w ); }
public function getUpVx():Number { return 2.0 * ( x*y - z*w ); }
public function getUpVy():Number { return 1.0 - 2.0 * ( x*x + z*z ); }
public function getUpVz():Number { return 2.0 * ( y*z + x*w ); }
public function getFrontVx():Number { return 2.0 * ( x*z + y*w ); }
public function getFrontVy():Number { return 2.0 * ( y*z - x*w ); }
public function getFrontVz():Number { return 1.0 - 2.0 * ( x*x + y*y ); }
}//xquat
internal class xVertDraw
{
public var projMat:Vector.<Number> = Vector.<Number>([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
public var scrw:Number = 465;
public var scrh:Number = 465;
public var rendw:Number = 465 * 0.5;
public var rendh:Number = 465 * 0.5;
public function xVertDraw()
{ setProjMat(projMat, 90, 1, 1, 1000); }//ctor
public function drawBox3(g:Graphics, ax:Number, ay:Number, az:Number,
rx:Number, ry:Number, rz:Number):void
{ drawBox(g, ax-rx, ay-ry, az-rz, ax + rx, ay + ry, az + rz); }
public function drawBox2(g:Graphics, ax:Number, ay:Number, az:Number,
aw:Number, ah:Number, ad:Number):void
{ drawBox(g, ax, ay, az, ax + aw, ay + ah, az + ad); }
public function drawBox(g:Graphics, minx:Number, miny:Number, minz:Number,
maxx:Number, maxy:Number, maxz:Number):void
{
//bottom
drawLine2(g, minx, miny, minz, maxx, miny, minz);
drawLine2(g, minx, miny, maxz, maxx, miny, maxz);
drawLine2(g, minx, miny, minz, minx, miny, maxz);
drawLine2(g, maxx, miny, minz, maxx, miny, maxz);
//top
drawLine2(g,minx, maxy, minz, maxx, maxy, minz);
drawLine2(g,minx, maxy, maxz, maxx, maxy, maxz);
drawLine2(g,minx, maxy, minz, minx, maxy, maxz);
drawLine2(g, maxx, maxy, minz, maxx, maxy, maxz);
drawLine(g,minx, miny, minz, minx, maxy, minz);
drawLine(g,maxx, miny, minz, maxx, maxy, minz);
drawLine(g,minx, miny, maxz, minx, maxy, maxz);
drawLine(g,maxx, miny, maxz, maxx, maxy, maxz);
}//drawbox
public function drawRect3(g:Graphics, ax:Number, ay:Number, az:Number,
rx:Number, ry:Number, rz:Number):void
{ drawRect(g, ay, ax-rx, az-rz, ax + rx, az + rz); }
public function drawRect(g:Graphics, ay:Number, minx:Number, minz:Number, maxx:Number, maxz:Number):void
{
drawLine2(g,minx, ay, minz, maxx, ay, minz);
drawLine2(g,minx, ay, maxz, maxx, ay, maxz);
drawLine2(g,minx, ay, minz, minx, ay, maxz);
drawLine2(g, maxx, ay, minz, maxx, ay, maxz);
}//drawrect
public function drawLine2(g:Graphics, ax:Number, ay:Number, az:Number,
bx:Number, by:Number, bz:Number):void
{
var mat:Vector.<Number>; var w0:Number, w1:Number;
mat = projMat;
w0 = ax * mat[3] + ay * mat[7] + az * mat[11] + mat[15];
w1 = bx * mat[3] + by * mat[7] + bz * mat[11] + mat[15];
if (w0 <= 0 && w1 <= 0) { return; }
if (w0 > 0 && w1 > 0) { drawLine(g, ax, ay, az, bx, by, bz); return; }
var u:Number; var t:Number;
var kx:Number; var ky:Number; var kz:Number;
kx = (bx - ax); ky = (by - ay); kz = (bz - az);
t = 0.2;
for (u = 0; u < 1; u += t)
{ drawLine(g, ax + kx * u, ay + ky * u, az + kz * u,
ax + kx * (u + t), ay + ky * (u + t), az + kz * (u + t)); }
}//dline2
public function drawLine(g:Graphics, ax:Number, ay:Number, az:Number,
bx:Number, by:Number, bz:Number):void
{
var mat:Vector.<Number>;
var sx0:Number, sy0:Number, sz0:Number, w0:Number;
var sx1:Number, sy1:Number, sz1:Number, w1:Number;
mat = projMat;
w0 = ax * mat[3] + ay * mat[7] + az * mat[11] + mat[15];
w1 = bx * mat[3] + by * mat[7] + bz * mat[11] + mat[15];
if (w0 <= 0 && w1 <= 0) { return; }
sx0 = ax * mat[0] + ay * mat[4] + az * mat[8] + mat[12];
sy0 = ax * mat[1] + ay * mat[5] + az * mat[9] + mat[13];
//sz0 = ax * mat[2] + ay * mat[6] + az * mat[10] + mat[14];
sx1 = bx * mat[0] + by * mat[4] + bz * mat[8] + mat[12];
sy1 = bx * mat[1] + by * mat[5] + bz * mat[9] + mat[13];
//sz1 = bx * mat[2] + by * mat[6] + bz * mat[10] + mat[14];
sx0 /= w0; sy0 /= w0;
//projection fix
if (w0 < 0.0)
{ if (sx0 > 0) { sx0 = -1.0 - sx0; } else { sx0 = 1.0 - sx0; }
if (sy0 > 0) { sy0 = -1.0 - sy0; } else { sy0 = 1.0 - sy0; }
}//endif
sx0 *= rendw; sy0 *= -rendh; sx0 += rendw; sy0 += rendh;
sx1 /= w1; sy1 /= w1;
//projection fix
if (w1 < 0.0)
{ if (sx1 > 0) { sx1 = -1.0 - sx1; } else { sx1 = 1.0 - sx1; }
if (sy1 > 0) { sy1 = -1.0 - sy1; } else { sy1 = 1.0 - sy1; }
}//endif
sx1 *= rendw; sy1 *= -rendh; sx1 += rendw; sy1 += rendh;
//my pathetic attempt at optimisation
if (sx0 < 0 && sx1 < 0) { return; } if (sy0 < 0 && sy1 < 0) { return; }
if (sx0 > scrw && sx1 > scrw) { return; } if (sy0 > scrh && sy1 > scrh) { return; }
g.moveTo(sx0, sy0); g.lineTo(sx1, sy1);
}//drawline
public static function setProjMat(vec:Vector.<Number>,
fovdeg:Number = 60.0, aspect:Number=1.0, nearp:Number = 1.0, farp:Number=1000.0):void
{ var f:Number; var i:int;
for (i = 0; i < 16; i++) { vec[i] = 0.0; }
f = 1.0 / Math.tan( (fovdeg * (3.1415 / 180.0)) * 0.5 );
if (nearp == 0) { nearp = 0.0001; }
if (farp == 0) { farp = 0.0001; }
vec[0] = f / aspect; vec[5] = f;
vec[10] = (farp + nearp) / (nearp - farp);
vec[14] = (2.0 * farp * nearp) / (nearp - farp);
vec[11] = -1.0; vec[15] = 0.0;
}//projmatrix
public static function setViewMat(vec:Vector.<Number>,
cx:Number, cy:Number, cz:Number, qx:Number, qy:Number, qz:Number, qw:Number):void
{ var forwx:Number; var forwy:Number; var forwz:Number;
var sidex:Number; var sidey:Number; var sidez:Number;
var upx:Number; var upy:Number; var upz:Number;
var i:int; for(i=0;i<16;i++){vec[i]=0.0;}vec[0]=vec[5]=vec[10]=vec[15]=1.0;
forwx=2.0*(qx*qz+qy*qw);forwy=2.0*(qy*qz-qx*qw);forwz=1.0-2.0*(qx*qx+qy*qy);
upx=2.0*(qx*qy-qz*qw);upy=1.0-2.0*(qx*qx+qz*qz);upz=2.0*(qy*qz+qx*qw);
sidex=1.0-2.0*(qy*qy+qz*qz);sidey=2.0*(qx*qy+qz*qw);sidez=2.0*(qx*qz-qy*qw);
vec[0]=sidex;vec[4]=sidey;vec[8]=sidez;
vec[1]=upx;vec[5]=upy;vec[9]=upz;
vec[2]=forwx;vec[6]=forwy;vec[10]=forwz;
vec[12]=(sidex*-cx)+(sidey*-cy)+(sidez*-cz);
vec[13]=(upx*-cx)+(upy*-cy)+(upz*-cz);
vec[14]=(forwx*-cx)+(forwy*-cy)+(forwz*-cz);
}//setlookat
//only works with 4x4 matrices
public static function multMatrix(a:Vector.<Number>, b:Vector.<Number>, r:Vector.<Number>):void
{ var i:int; for (i = 0; i < 16; i += 4)
{
r[i] = a[0] * b[i] + a[4] * b[i + 1] + a[8] * b[i + 2] + a[12] * b[i + 3];
r[i + 1] = a[1] * b[i] + a[5] * b[i + 1] + a[9] * b[i + 2] + a[13] * b[i + 3];
r[i + 2] = a[2] * b[i] + a[6] * b[i + 1] + a[10] * b[i + 2] + a[14] * b[i + 3];
r[i + 3] = a[3] * b[i] + a[7] * b[i + 1] + a[11] * b[i + 2] + a[15] * b[i + 3];
}//nexti
}//multmat
}//vertdraw