/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/ylKx
*/
package {
import flash.geom.Matrix;
import flash.ui.MouseCursor;
import flash.display.BitmapData;
import flash.events.Event;
import alternativ7.engine3d.containers.*;
import alternativ7.engine3d.core.*;
import alternativ7.engine3d.objects.*;
import alternativ7.engine3d.objects.Mesh;
import alternativ7.engine3d.primitives.*;
import alternativ7.engine3d.materials.*;
import alternativ7.*;
import alternativ7.engine3d.lights.*;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public var cam:Camera3D;
public var cont:ConflictContainer;
public var mat:TextureMaterial;
public var tria:Tri;
public var trib:Tri;
public var tex:BitmapData;
public var mm:Mesh;
public function FlashTest() {
// write as3 code here..
tex = new BitmapData(64,64,false,0);
var mat:Material;
mat = new TextureMaterial(tex);
cont = new ConflictContainer();
cam = new Camera3D();
cam.z = -100;
cam.view = new View(460,460);
addChild(cam.view);
cont.addChild(cam);
tria = new Tri();
tria.v1.cx = 0;
tria.v1.cy = 0;
tria.v1.cz = 0;
tria.v1.u = 0;
tria.v1.v = 0;
tria.v2.cx = -30;
tria.v2.cy = 0;
tria.v2.cz = 5;
tria.v2.u = 1;
tria.v2.v = 0.5;
tria.v3.cx = 0;
tria.v3.cy = 30;
tria.v3.cz = 20;
tria.v3.u = 0;
tria.v3.v = 1;
mm = new Mesh();
var a:Vertex;
var b:Vertex;
var c:Vertex;
a = mm.addVertex(tria.v1.cx, tria.v1.cy, tria.v1.cz, tria.v1.u, tria.v1.v);
b = mm.addVertex(tria.v2.cx, tria.v2.cy, tria.v2.cz, tria.v2.u, tria.v2.v);
c = mm.addVertex(tria.v3.cx, tria.v3.cy, tria.v3.cz, tria.v3.u, tria.v3.v);
mm.addTriFace(a,b,c, mat);
mm.calculateFacesNormals();
cont.addChild(mm);
calcMap(tria, tex);
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public function onEnter(e:Event):void
{
graphics.clear();
//graphics.lineStyle(1,0);
graphics.beginBitmapFill(tex);
graphics.drawRect(0,0,tex.width, tex.height);
graphics.endFill();
/*
graphics.lineStyle(1,0xFFffFF);
graphics.moveTo(tria.v1.u*tex.width, tria.v1.v*tex.height);
graphics.lineTo(tria.v2.u*tex.width, tria.v2.v*tex.height);
graphics.moveTo(tria.v2.u*tex.width, tria.v2.v*tex.height);
graphics.lineTo(tria.v3.u*tex.width, tria.v3.v*tex.height);
graphics.moveTo(tria.v1.u*tex.width, tria.v1.v*tex.height);
graphics.lineTo(tria.v3.u*tex.width, tria.v3.v*tex.height);
*/
//tex.noise(Math.random()*0xFFffFFff);
//mm.rotationY += 0.1;
cam.render();
}//onenter
public function getLight(
ax:Number, ay:Number, az:Number):Number
{
//omnilight position and range (hard coded for now)
var mx:Number;
var my:Number;
var mz:Number;
var mr:Number;
var vx:Number;
var vy:Number;
var vz:Number;
var dist:Number;
var dr:Number;
mx = 3;
my = 3;
mz = 3;
mr = 32;
dr = mr * mr;
vx = mx - ax;
vy = my - ay;
vz = mz - az;
dist = dr / (vx*vx+vy*vy+vz*vz);
if (dist > 1) { dist = 1;}
if (dist < 0) { dist = 0;}
//return 1;
return dist;
}//getlight
//based on
//http://www.petesqbsite.com/sections/tutorials/tuts/relsoft3d/Chapter3/Chapter3.htm
public function calcMap(tri:Tri, bm:BitmapData):void
{
var dx1:Number;
var dy1:Number;
var dx2:Number;
var dy2:Number;
var dx3:Number;
var dy3:Number;
var xstep1:Number;
var xstep2:Number;
var xstep3:Number;
var kx:Number;
var rx:Number;
var sx:Number;
var ex:Number;
var px:Number;
var py:Number;
var xt:Number;
var yt:Number;
var v0:Vert;
var v1:Vert;
var v2:Vert;
var tmp:Vert;
xt = 1.0 / bm.width;
yt = 1.0 / bm.height;
v0 = tri.v1;
v1 = tri.v2;
v2 = tri.v3;
if (v1.v < v0.v)
{ tmp = v1; v1 = v0; v0 = tmp; }
if (v2.v < v0.v)
{ tmp = v2; v2 = v0; v0 = tmp; }
if (v2.v < v1.v)
{ tmp = v2; v2 = v1; v1 = tmp; }
dx1 = v1.u - v0.u;
dy1 = v1.v - v0.v;
if (dy1 != 0) { xstep1 = dx1/dy1; }
else { xstep1 = 0; }
dx2 = v2.u - v1.u;
dy2 = v2.v - v1.v;
if (dy2 != 0) { xstep2 = dx2/dy2; }
else { xstep2 = 0; }
dx3 = v0.u - v2.u;
dy3 = v0.v - v2.v;
if (dy3 != 0) { xstep3 = dx3/dy3; }
else { xstep3 = 0; }
xstep1 /= bm.width;
xstep2 /= bm.width;
xstep3 /= bm.width;
kx = v0.u;
rx = v0.u;
var vec:Vec3;
var t:Number;
for (py = v0.v; py < v1.v; py += yt)
{
if (kx < rx) { sx = kx; ex = rx;}
else { sx = rx; ex = kx;}
for (px = sx; px <= ex; px += xt)
{
bm.setPixel(px*bm.width,py*bm.height, 0xFF0000);
vec = getBary(px,py+(yt*0.6),0,
tri.v1.u, tri.v1.v, 0,
tri.v2.u, tri.v2.v, 0,
tri.v3.u, tri.v3.v, 0);
vec = getFromBary(
vec.x, vec.y,
tri.v1.cx, tri.v1.cy, tri.v1.cz,
tri.v2.cx, tri.v2.cy, tri.v2.cz,
tri.v3.cx, tri.v3.cy, tri.v3.cz);
t = getLight(vec.x, vec.y, vec.z);
bm.setPixel(
Math.floor(px*bm.width),
Math.floor(py*bm.height),
255 * t);
}//nextx
kx += xstep1;
rx += xstep3;
}//nexty
kx = v1.u;
for (py = v1.v; py < v2.v; py += yt)
{
if (kx < rx) { sx = kx; ex = rx;}
else { sx = rx; ex = kx;}
for (px = sx; px <= ex; px += xt)
{
bm.setPixel(px*bm.width,py*bm.height, 0x00FF00);
vec = getBary(px,py+(yt*0.6),0,
tri.v1.u, tri.v1.v, 0,
tri.v2.u, tri.v2.v, 0,
tri.v3.u, tri.v3.v, 0);
vec = getFromBary(
vec.x, vec.y,
tri.v1.cx, tri.v1.cy, tri.v1.cz,
tri.v2.cx, tri.v2.cy, tri.v2.cz,
tri.v3.cx, tri.v3.cy, tri.v3.cz);
t = getLight(vec.x, vec.y, vec.z);
bm.setPixel(
Math.floor(px*bm.width),
Math.floor(py*bm.height),
255 * t);
}//nextx
kx += xstep2;
rx += xstep3;
}//nexty
}//calcmap
//based on
////http://www.blackpawn.com/texts/pointinpoly/default.html
public var ret:Vec3 = new Vec3();
public function getBary(
px:Number, py:Number, pz:Number,
x1:Number, y1:Number, z1:Number,
x2:Number, y2:Number, z2:Number,
x3:Number, y3:Number, z3:Number):Vec3
{
var u:Number;
var v:Number;
var vx1:Number;
var vy1:Number;
var vz1:Number;
var vx2:Number;
var vy2:Number;
var vz2:Number;
var vx0:Number;
var vy0:Number;
var vz0:Number;
var dot00:Number;
var dot01:Number;
var dot02:Number;
var dot11:Number;
var dot12:Number;
var invDenom:Number;
vx0 = px - x1;
vy0 = py - y1;
vz0 = pz - z1;
vx1 = x2 - x1;
vy1 = y2 - y1;
vz1 = z2 - z1;
vx2 = x3 - x1;
vy2 = y3 - y1;
vz2 = z3 - z1;
dot00 = vx0*vx0 + vy0*vy0 + vz0*vz0;
dot01 = vx0*vx1 + vy0*vy1 + vz0*vz1;
dot02 = vx0*vx2 + vy0*vy2 + vz0*vz2;
dot11 = vx1*vx1 + vy1*vy1 + vz1*vz1;
dot12 = vx1*vx2 + vy1*vy2 + vz1*vz2;
invDenom = 1.0 / (dot00*dot11 - dot01*dot01);
u = (dot11 * dot02 - dot01 * dot12) * invDenom;
v = (dot00 * dot12 - dot01 * dot02) * invDenom;
ret.x = u;
ret.y = v;
ret.z = 1 - ( u + v );
return ret;
}//getbary
public function getFromBary(
u:Number, v:Number,
x1:Number, y1:Number, z1:Number,
x2:Number, y2:Number, z2:Number,
x3:Number, y3:Number, z3:Number):Vec3
{
var w:Number;
w = 1 - (u+v);
ret.x = (u*x1 + v*x2 + w*x3);
ret.y = (u*y1 + v*y2 + w*y3);
ret.z = (u*z1 + v*z2 + w*z3);
return ret;
}//frombary
}//classend
}//package
internal class Vec3
{
public var x:Number = 0;
public var y:Number = 0;
public var z:Number = 0;
};//v3
internal class Vert
{
public var cx:Number = 0;
public var cy:Number = 0;
public var cz:Number = 0;
public var u:Number = 0;
public var v:Number = 0
};//vert
internal class Tri
{
public var v1:Vert = new Vert();
public var v2:Vert = new Vert();
public var v3:Vert = new Vert();
};//tri