flash on 2012-11-15

by mutantleg
import alternativ7.types.*;
♥0 | Line 280 | Modified 2012-11-15 23:50:30 | MIT License
play

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/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