forked from: flash on 2013-1-26
forked from flash on 2013-1-26 (diff: 24)
just added some pseudo tricky shadow thing (using projecting a point to a plane)
ActionScript3 source code
/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/wlt2
*/
// forked from mutantleg's flash on 2013-1-26
package {
import flash.events.Event;
import flash.geom.Vector3D;
import flash.geom.Matrix3D;
import flash.geom.Point;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public var vecVert:Vector.<wVert>;
public var vecFace:Vector.<int>;
public function FlashTest() {
vecVert = new Vector.<wVert>(0,false);
vecFace = new Vector.<int>(0,false);
var i:int;
var num:int;
var ang:Number;
var u:Number;
var p:wVert;
var off:int;
var wid:Number;
wid = -32;
num = 8;
u = 6.28 / num;
ang = 0;
graphics.clear();
graphics.lineStyle(1,0);
p = new wVert(0,0,wid);
vecVert.push(p);
//graphics.drawCircle(p.x, p.y, 4);
off = vecVert.length;
var k:int;
var st:int;
var sw:Number;
sw = 64;
st = 4;
for (k = 0; k < st; k +=1)
{
ang = 0;
for (i = 0; i < num; i++)
{
p = new wVert();
p.x = Math.cos(ang) * sw;
p.y = Math.sin(ang) * sw;
p.z = wid;
// graphics.drawCircle(p.x, p.y, 4);
ang += u;
vecVert.push(p);
}//nexti
sw += 16;
wid += 16;
}//nextst
/*
ang = 0;
for (i = 0; i < num; i++)
{
p = new Point();
p.x = 200+Math.cos(ang) * 96;
p.y = 200+Math.sin(ang) * 96;
graphics.drawCircle(p.x, p.y, 4);
ang += u;
vecVert.push(p);
}//nexti
*/
for (i = 0; i < (num-1) ; i++)
{
vecFace.push(0);
vecFace.push(1+i);
vecFace.push(2+i);
}//nexti
vecFace.push(0);
vecFace.push(1);
vecFace.push(num);
var vv:int;
var off2:int;
off2 = vecVert.length;
p =new wVert(0,0, wid);
vecVert.push(p);
//graphics.drawCircle(p.x, p.y, 4);
for (i= 0; i < (num-1);i++)
{
vecFace.push(off2);
vecFace.push(off2-1-i);
vecFace.push(off2-2-i);
} //nexti
vecFace.push(off2);
vecFace.push(off2-1);
vecFace.push(off2-num);
k = 1;
var sk:int;
for (k = 0; k < (st-1); k++)
{
sk = k* num;
for (i = 0; i < (num-1); i++)
{
vecFace.push(0+i+off+sk);
vecFace.push(1+i+off+sk);
vecFace.push(num+i+off+sk);
vecFace.push(1+i+off+sk);
vecFace.push(num+1+i+off+sk);
vecFace.push(num+i+off+sk);
}//nexti
vecFace.push(num-1+off+sk);
vecFace.push(num+num-1+off+sk);
vecFace.push(num+off+sk);
vecFace.push(num-1+off+sk);
vecFace.push(0+off+sk);
vecFace.push(num+off+sk);
}//nextk
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public var tang:Number = 0;
public var tmat:Matrix3D = new Matrix3D();
public function onEnter(e:Event):void
{
var nx:Number; var ny:Number; var nz:Number;
var px:Number; var py:Number; var pz:Number;
var dot:Number;
nx = 0; ny = -1; nz = -0.2;
px = 0; py = 128; pz = 0;
graphics.clear();
graphics.lineStyle(1,0);
tmat.identity();
var i:int;
var num:int;
var mat:Matrix3D;
var raw:Vector.<Number>;
var w:wVert;
mat = new Matrix3D();
mat.identity();
mat.appendRotation(tang, Vector3D.Y_AXIS);
tang += 5;
raw = mat.rawData;
num = vecVert.length;
for (i = 0; i < num; i++)
{
w = vecVert[i];
w.sx = w.x * raw[0] + w.y * raw[4] + w.z * raw[8] + raw[12] + 200;
w.sy = w.x * raw[1] + w.y * raw[5] + w.z * raw[9] + raw[13] + 200;
dot = (w.sx * nx) + (w.sy * ny) + (w.z * nz);
w.gx = w.sx - (dot * nx);
w.gy = w.sy - (dot * ny) + 400;
}//nexti
var p1:wVert;
var p2:wVert;
var p3:wVert;
num = vecFace.length;
for (i = 0; i < num;i+=3)
{
p1 = vecVert[ vecFace[i] ];
p2 = vecVert[ vecFace[i+1] ];
p3 = vecVert[ vecFace[i+2] ];
// graphics.beginFill(Math.random()*0xffFFff,0.75);
graphics.moveTo(p1.sx, p1.sy);
graphics.lineTo(p2.sx, p2.sy);
graphics.lineTo(p3.sx, p3.sy);
graphics.lineTo(p1.sx, p1.sy);
// graphics.endFill();
graphics.beginFill(0, 0.5);
graphics.moveTo(p1.gx, p1.gy);
graphics.lineTo(p2.gx, p2.gy);
graphics.lineTo(p3.gx, p3.gy);
graphics.lineTo(p1.gx, p1.gy);
graphics.endFill();
}//nexti
}//onenter
}//classend
}
internal class wVert
{
public var x:Number = 0;
public var y:Number = 0;
public var z:Number = 0;
public var sx:Number = 0;
public var sy:Number = 0;
public var gx:Number = 0;
public var gy:Number = 0;
public function wVert(x_:Number=0,y_:Number=0,z_:Number=0):void
{
x = x_;
y = y_;
z = z_;
}//wvert
}//wvert