※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : psyark's BumpMap [diff(156)]

FORKED

forked from: BumpMap Shadow casting test [diff(58)]

  1. package
  2. {
  3.     import flash.display.*;
  4.     import flash.events.*;
  5.     import flash.filters.*;
  6.     import flash.geom.*;
  7.     import sandy.core.*;
  8.     import sandy.core.data.*;
  9.     import sandy.core.scenegraph.*;
  10.     import sandy.primitive.*;
  11.     import sandy.materials.*;
  12.     import sandy.materials.attributes.*;
  13.     import sandy.view.*;
  14.     // shadow mapping test (warning: CPU killer)
  15.     [SWF (width=465, height=465, backgroundColor=0, frameRate=10)]
  16.     public class Test extends BasicView
  17.     {
  18.         private const S:int = 150;
  19.         private const Q:int = 10;
  20.         private const Y:Number = 30;
  21.         private var angle:Number = 0;
  22.         private var texture:BitmapData;
  23.         private var hmap:BitmapData, lmap:BitmapData, tmap:BitmapData;
  24.         private var blur:BlurFilter = new BlurFilter (222);
  25.         private var stmp:Shape = new Shape;
  26.         public function Test()
  27.         {
  28.             super (); init (465465); render ();
  29.             // planes suck - use hexagonal grid instead
  30.             var p:Plane3D = addHorizontalPlane (S, S, Q,
  31.                 new Point3D (0, -0.6 * S, 0));
  32.             texture = new BitmapData (S, S, false0);
  33.             p.appearance = makeBitmapAppearance (texture);
  34.             // engine light
  35.             p.appearance.frontMaterial.attributes =
  36.                 new MaterialAttributes (new LightAttributes (false0.6));
  37.             p.appearance.lightingEnable = true;
  38.             // build random terrain
  39.             // this is not really smooth terrain, but whatever
  40.             var r:Number = 0;
  41.             for each (var v:Vertex in p.geometry.aVertex) {
  42.                 //r = 0.5 * (r + Math.random ()); v.y = Y * r;
  43.                 if (Math.random () < 0.1) v.y = Y / 2;
  44.             }
  45.             // update face normals
  46.             for each (var face:Polygon in p.aPolygons) face.updateNormal ();
  47.             // render terrain heightmap
  48.             renderHeightMap (p, graphics, S);
  49.             hmap = new BitmapData (S, S, false0); hmap.draw (this);
  50.             // noisy texture
  51.             tmap = new BitmapData (S, S, false0);
  52.             tmap.noise (1232002557true);
  53.             tmap.draw (tmap, nullnew ColorTransform (1, 0xEF / 255.0, 0x7F / 255.0));
  54.             // make light map
  55.             lmap = new BitmapData (S, S, false0);
  56.             var b:Bitmap = new Bitmap (lmap); b.x = S; addChild (b);
  57.             // "sun"
  58.             graphics.beginFill (0xFFEF7F); graphics.drawCircle (465 * 0.5465 * 0.510);
  59.         }
  60.         override public function simpleRender(e:Event = null):void {
  61.             // spin light (map coords)
  62.             angle = mouseX / 100;
  63.             var light:Point3D = new Point3D (Math.sin (angle), Math.cos (angle), 0.25); light.normalize ();
  64.             // face light (real coords)
  65.             camera.x = +2 * S * light.x;
  66.             camera.y = +2 * S * light.z;
  67.             camera.z = -2 * S * light.y;
  68.             camera.lookAt (000);
  69.             scene.light.setDirection (camera.x, -camera.y, camera.z);
  70.             // re-build shadow map
  71.             lmap.lock ();
  72.             lmap.fillRect (lmap.rect, 0);
  73.             var m:Number = 0; m1.identity (); 
  74.             while (m < 255) { 
  75.                 m1.tx += light.x; m1.ty += light.y; m += 2// TODO: m = f (light) 
  76.                 stmp.graphics.clear (); 
  77.                 stmp.graphics.beginBitmapFill (hmap, m1, truetrue); 
  78.                 stmp.graphics.drawRect (00, S, S); 
  79.                 stmp.graphics.endFill (); 
  80.                 lmap.draw (stmp, nullnew ColorTransform (1111, -m, -m, -m), 
  81.                     BlendMode.LIGHTEN, nulltrue); 
  82.             } 
  83.             lmap.draw (hmap, nullnull, BlendMode.DIFFERENCE); 
  84.             // transform into light map 
  85.             lmap.draw (lmap, nullnew ColorTransform ( -10, -10, -101255255255)); 
  86.             lmap.threshold (lmap, lmap.rect, lmap.rect.topLeft, "<", 0x808080, 0xFF404030, 0xFFFFFF); 
  87.             lmap.threshold (lmap, lmap.rect, lmap.rect.topLeft, ">", 0x808080, 0xFFFFFFFF, 0xFFFFFF); 
  88.             lmap.unlock ();
  89.             lmap.applyFilter (lmap, lmap.rect, lmap.rect.topLeft, blur);
  90.             texture.draw (tmap); texture.draw (lmap, nullnull, BlendMode.MULTIPLY);
  91.             super.simpleRender (e);
  92.         }
  93.         private function renderHeightMap (p:Plane3D, g:Graphics, s:int):void {
  94.             for each (var t:Polygon in p.aPolygons)
  95.                 renderHeightMapElement (t, g, s);
  96.         }
  97.         private var m1:Matrix = new Matrix;
  98.         private var m2:Matrix = new Matrix;
  99.         private function renderHeightMapElement (t:Polygon, g:Graphics, s:int):void {
  100.             var h0:Number = t.a.y / Y;
  101.             var h1:Number = t.b.y / Y;
  102.             var h2:Number = t.c.y / Y;
  103.             var v0:Number = -100, v1:Number = 0, v2:Number = 100;
  104.             var u0:Number = (h0 - 0.5) * (32768 * 0.05);
  105.             var u1:Number = (h1 - 0.5) * (32768 * 0.05);
  106.             var u2:Number = (h2 - 0.5) * (32768 * 0.05);
  107.             var uv:UVCoord = UVCoord (t.aUVCoord [0]); m2.tx = uv.u * s; m2.ty = uv.v * s;
  108.             if ( (int (u0 * 0.1) == int (u1 * 0.1)) && (int (u1 * 0.1) == int (u2 * 0.1)) ) {
  109.                 // solid color case
  110.                 g.beginFill ( 0x10101 * Math.round (0xFF * h0) );
  111.             } else {
  112.                 // gradient case
  113.                 if ((u2 - u1) * (u1 - u0) > 0) {
  114.                     var tmp:Number = v1; v1 = v2; v2 = tmp;
  115.                 }
  116.                 m1.a = u1 - u0; m1.b = v1 - v0;
  117.                 m1.c = u2 - u0; m1.d = v2 - v0;
  118.                 m1.tx = u0; m1.ty = v0;
  119.                 m1.invert ();
  120.                 uv = UVCoord (t.aUVCoord [1]);
  121.                 m2.a = uv.u * s - m2.tx; m2.b = uv.v * s - m2.ty;
  122.                 uv = UVCoord (t.aUVCoord [2]);
  123.                 m2.c = uv.u * s - m2.tx; m2.d = uv.v * s - m2.ty;
  124.                 m1.concat (m2);
  125.                 g.beginGradientFill ("linear", [0, 0xFFFFFF], [11], [0255], m1);
  126.             }
  127.             g.moveTo (m2.tx, m2.ty); for each (uv in t.aUVCoord) g.lineTo (uv.u * s, uv.v * s);
  128.             g.endFill ();
  129.         }
  130.     }
  131. }
noswf
Get Adobe Flash Player