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

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

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


FORKED
  1. // forked from mrdoob's Desert Generator
  2. /*
  3.  * Terrain raycaster (optimised)
  4.  * by Mr.doob (http://mrdoob.com)
  5.  *
  6.  * Click for a new terrain
  7.  */
  8. package  
  9. {
  10.     import flash.display.Bitmap;
  11.     import flash.display.BitmapData;
  12.     import flash.display.BlendMode;
  13.     import flash.display.Sprite;
  14.     import flash.display.StageScaleMode;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.geom.Rectangle;    
  18.     [SWF(backgroundColor="#000000", frameRate="60")] 
  19.     public class Main extends Sprite 
  20.     {
  21.         private var precision : int = 1;
  22.         
  23.         private var canvas : BitmapData;
  24.         private var canvas_width : int = 465;
  25.         private var canvas_height : int = 465;
  26.         private var canvas_width_half : int = canvas_width / 2;
  27.         private var canvas_height_half : int = canvas_height / 2;    
  28.         
  29.         private var terrain_size : int = 1024;    
  30.         
  31.         private var light : Point3D;
  32.         
  33.         private var diffuseColor : Color;
  34.         private var ambientColor : Color;
  35.         private var fogColor : Color;
  36.         private var skyColor : Color;
  37.         
  38.         private var pixelRect : Rectangle;
  39.         private var lineRect : Rectangle;
  40.         
  41.         private var xx : int = 0;
  42.         
  43.         private var terrainH : BitmapData;
  44.         private var fractaliser : BitmapData;
  45.         
  46.         private var camera_height : Number;
  47.         private var prev_t : Number = 1;
  48.         
  49.         public function Main()
  50.         {
  51.             addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
  52.         }
  53.         
  54.         private function onAddedToStage( e : Event ) : void
  55.         {
  56.             stage.scaleMode = StageScaleMode.NO_SCALE;
  57.             
  58.             canvas = new BitmapData( canvas_width, canvas_height, false0 );
  59.             var sprite : Sprite = new Sprite();
  60.             sprite.buttonMode = true;
  61.             sprite.addChild( new Bitmap( canvas ) );
  62.             addChild( sprite );
  63.             pixelRect = new Rectangle();
  64.             lineRect = new Rectangle(001, canvas_height);
  65.             
  66.             terrainH = new BitmapData(terrain_size, terrain_size, false0);
  67.             fractaliser = new BitmapData(terrain_size, terrain_size, false0);
  68.             
  69.             diffuseColor = new Color( 0x6f2d17 );
  70.             ambientColor = new Color( 0x070300 );
  71.             fogColor = new Color( 0x51547d );
  72.             skyColor = new Color( 0xbbcde3 );
  73.             init();
  74.             
  75.             stage.addEventListener(MouseEvent.CLICK, init);
  76.             addEventListener(Event.ENTER_FRAME, render);
  77.         }
  78.         
  79.         private function init( e : Event = null ) : void
  80.         {
  81.             xx = 0;
  82.             precision = 16;
  83.             
  84.             generateTerrain();
  85.             light = new Point3D( (Math.random() - 0.5) * 2, Math.random(), (Math.random() - 0.5) * 2 );            
  86.             // Need to sort this out to avoid camera inside sand
  87.             //camera_height = f(canvas_width_half,canvas_width_half);
  88.         }
  89.         
  90.         private function generateTerrain() : void
  91.         {
  92.             terrainH.perlinNoise(5005001, Math.random() * 100truefalse7true);
  93.             
  94.             var i : int = 0;
  95.             
  96.             while(i++ < 1)
  97.             {
  98.                 fractaliser.perlinNoise(5005001, Math.random() * 100truefalse7true);
  99.                 terrainH.draw(fractaliser, nullnull, BlendMode.DIFFERENCE);
  100.             }
  101.         }
  102.         
  103.         private function render( e : Event ) : void
  104.         {
  105.             canvas.lock();
  106.             
  107.             for (var yy : int = canvas_height; yy >= 0; yy -= precision)
  108.             {
  109.                  var ray : Ray = new Ray();
  110.                 ray.origin = new Point3D( canvas_width_half, canvas_height_half, canvas_width_half);
  111.                 ray.direction = Point3D.sub( new Point3D(xx, canvas_height - yy, 0 ), ray.origin);
  112.                 ray.direction.normalise();
  113.                 pixelRect.x = xx;
  114.                 pixelRect.y = yy;
  115.                 pixelRect.width = precision;
  116.                 pixelRect.height = precision;
  117.                 
  118.                 if (castRay(ray))
  119.                 {
  120.                     canvas.fillRect(pixelRect, terrainColor(ray) );
  121.                 }
  122.                 else
  123.                 {
  124.                     pixelRect.y = 0;
  125.                     pixelRect.height = yy + precision;
  126.                     canvas.fillRect(pixelRect, skyColor.getHex());
  127.                     break;
  128.                 }
  129.                 
  130.                 prev_t = 0.1;        
  131.             }
  132.             
  133.             lineRect.x = xx + precision;
  134.             canvas.fillRect(lineRect, 0xffffff );                
  135.             if ((xx += precision) > canvas_width)
  136.             {
  137.                 if (precision > 1)
  138.                     precision /= 2;
  139.                 else
  140.                     init();                
  141.                 xx = 0;
  142.             }
  143.             
  144.             canvas.unlock();
  145.         }    
  146.         
  147.         private function f( x : Number, z : Number) : Number
  148.         {
  149.             x = Math.abs((x - 250) * 1000) % terrain_size;
  150.             z = Math.abs((z - 250) * 1000) % terrain_size;
  151.             
  152.             var f : Number = ((0x0000ff & terrainH.getPixel(x, z)) / 0xff) * .3;
  153.             return f - .1 + canvas_height_half;
  154.         }
  155.         
  156.         private function castRay( ray : Ray ) : Boolean
  157.         {
  158.             var delt : Number = 0.01;
  159.             var mint : Number = prev_t; //0.1;
  160.             var maxt : Number = 50.0;
  161.             
  162.             forvar t : Number = mint; t < maxt; t += delt )
  163.             {
  164.                 var p : Point3D = Point3D.add(ray.origin, Point3D.scalar(ray.direction, t));
  165.                 
  166.                 if( p.y < f( p.x, p.z ) )
  167.                 {
  168.                     prev_t = ray.t = t - 0.5 * delt;
  169.                     return true;
  170.                 }
  171.                 
  172.                 delt = 0.01 * t;   
  173.             }
  174.             return false;
  175.         }
  176.         
  177.         private function terrainColor( ray : Ray ) : Number
  178.         {    
  179.             var p : Point3D = Point3D.add(ray.origin, Point3D.scalar(ray.direction, ray.t));
  180.             var n : Point3D = getNormal(p);
  181.             var dot : Number = Point3D.dot(n, light);
  182.             
  183.             var c : Color = new Color(0x000000);
  184.                         
  185.             c.addRGB( diffuseColor );
  186.             c.addNumber( dot * 0xFF );
  187.             c.addRGB( ambientColor );
  188.             c.mixRGB( fogColor, ray.t * 0.2);
  189.                         
  190.             return c.getHex();
  191.         }
  192.         
  193.         private function getNormal( p : Point3D ) : Point3D
  194.         {
  195.             var eps : Number = 0.01;
  196.             var normal : Point3D = new Point3D( f(p.x-eps,p.z) - f(p.x+eps,p.z),
  197.                                                 2 * eps, 
  198.                                                 f(p.x,p.z-eps) - f(p.x,p.z+eps) );
  199.             normal.normalise();
  200.             return normal;
  201.         }        
  202.     }
  203. }
  204.     
  205. class Ray 
  206. {
  207.     public var origin : Point3D;
  208.     public var direction : Point3D;
  209.     public var t : Number;
  210. }
  211. class Point3D 
  212. {
  213.     public var x : Number;
  214.     public var y : Number;
  215.     public var z : Number;
  216.     
  217.     public function Point3D( x : Number = 0, y : Number = 0, z : Number = 0)
  218.     {
  219.         this.x = x;
  220.         this.y = y;
  221.         this.z = z; 
  222.     }
  223.     
  224.     public function normalise() : void
  225.     {
  226.         var dist : Number = Math.sqrt( (x * x)+(y * y)+(z * z) );
  227.         
  228.         x = x * ( 1.0 / dist );
  229.         y = y * ( 1.0 / dist );
  230.         z = z * ( 1.0 / dist );
  231.     }
  232.     
  233.     public static function add( p1 : Point3D, p2 : Point3D ) : Point3D
  234.     {
  235.         return new Point3D( p1.x + p2.x, p1.y + p2.y, p1.z + p2.z);
  236.     }
  237.     public static function sub( p1 : Point3D, p2 : Point3D ) : Point3D
  238.     {
  239.         return new Point3D( p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
  240.     }
  241.     public static function scalar( p1 : Point3D, val : Number ) : Point3D
  242.     {
  243.         return new Point3D( p1.x * val, p1.y * val, p1.z * val);
  244.     }
  245.         
  246.     public static function dot( p1 : Point3D, p2 : Point3D ) : Number
  247.     {
  248.         return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z;            
  249.     }
  250.         
  251.     public function clone() : Point3D
  252.     {
  253.         return new Point3D(x, y , z);
  254.     }
  255.         
  256.     public function toString() : String
  257.     {
  258.         return "x: " + x + ", y: " + y + ", z: " + z;
  259.     }
  260. }
  261. class Color 
  262. {
  263.     public var r : int, g : int, b : int;
  264.     
  265.     public function Color( hex : int )
  266.     {
  267.         r = ( ( 0xff0000 & hex ) >> 16 );  
  268.         g = ( ( 0xff00 & hex ) >> 8 );  
  269.         b = ( ( 0xff & hex ) );
  270.     }
  271.         
  272.     public function getHex() : int
  273.     {
  274.         r = ( r > 0xff ) ? 0xff : ( r < 0x00 ) ? 0 : r;
  275.         g = ( g > 0xff ) ? 0xff : ( g < 0x00 ) ? 0 : g;
  276.         b = ( b > 0xff ) ? 0xff : ( b < 0x00 ) ? 0 : b;    
  277.             
  278.         return r << 16 | g << 8 | b << 0;
  279.     }
  280.     public function addNumber( value : int ) : void
  281.     {
  282.         r += value;
  283.         g += value;
  284.         b += value;
  285.     }
  286.         
  287.     public function addRGB( colour : Color ) : void
  288.     {
  289.         r += colour.r;
  290.         g += colour.g;
  291.         b += colour.b;
  292.     }
  293.         
  294.     public function mixRGB( colour : Color, amount : Number ) : void
  295.     {
  296.         amount = (amount > 1) ? 1 : (amount < 0) ? 0 : amount; 
  297.             
  298.         r = (r * (1 - amount)) + (colour.r * amount);
  299.         g = (g * (1 - amount)) + (colour.g * amount);
  300.         b = (b * (1 - amount)) + (colour.b * amount);
  301.     }        
  302.         
  303.     public function multiplyNumber( value : Number ) : void
  304.     {
  305.         r *= value;
  306.         g *= value;
  307.         b *= value;
  308.     }
  309. }
noswf
  1. // forked from mrdoob's Desert Generator
  2. /*
  3.  * Terrain raycaster (optimised)
  4.  * by Mr.doob (http://mrdoob.com)
  5.  *
  6.  * Click for a new terrain
  7.  */
  8. package  
  9. {
  10.     import flash.display.Bitmap;
  11.     import flash.display.BitmapData;
  12.     import flash.display.BlendMode;
  13.     import flash.display.Sprite;
  14.     import flash.display.StageScaleMode;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.geom.Rectangle;    
  18.     [SWF(backgroundColor="#000000", frameRate="60")] 
  19.     public class Main extends Sprite 
  20.     {
  21.         private var precision : int = 1;
  22.         
  23.         private var canvas : BitmapData;
  24.         private var canvas_width : int = 465;
  25.         private var canvas_height : int = 465;
  26.         private var canvas_width_half : int = canvas_width / 2;
  27.         private var canvas_height_half : int = canvas_height / 2;    
  28.         
  29.         private var terrain_size : int = 1024;    
  30.         
  31.         private var light : Point3D;
  32.         
  33.         private var diffuseColor : Color;
  34.         private var ambientColor : Color;
  35.         private var fogColor : Color;
  36.         private var skyColor : Color;
  37.         
  38.         private var pixelRect : Rectangle;
  39.         private var lineRect : Rectangle;
  40.         
  41.         private var xx : int = 0;
  42.         
  43.         private var terrainH : BitmapData;
  44.         private var fractaliser : BitmapData;
  45.         
  46.         private var camera_height : Number;
  47.         private var prev_t : Number = 0.1;
  48.         
  49.         public function Main()
  50.         {
  51.             addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
  52.         }
  53.         
  54.         private function onAddedToStage( e : Event ) : void
  55.         {
  56.             stage.scaleMode = StageScaleMode.NO_SCALE;
  57.             
  58.             canvas = new BitmapData( canvas_width, canvas_height, false0 );
  59.             var sprite : Sprite = new Sprite();
  60.             sprite.buttonMode = true;
  61.             sprite.addChild( new Bitmap( canvas ) );
  62.             addChild( sprite );
  63.             pixelRect = new Rectangle();
  64.             lineRect = new Rectangle(001, canvas_height);
  65.             
  66.             terrainH = new BitmapData(terrain_size, terrain_size, false0);
  67.             fractaliser = new BitmapData(terrain_size, terrain_size, false0);
  68.             
  69.             diffuseColor = new Color( 0x6f2d17 );
  70.             ambientColor = new Color( 0x070300 );
  71.             fogColor = new Color( 0x51547d );
  72.             skyColor = new Color( 0xbbcde3 );
  73.             init();
  74.             
  75.             stage.addEventListener(MouseEvent.CLICK, init);
  76.             addEventListener(Event.ENTER_FRAME, render);
  77.         }
  78.         
  79.         private function init( e : Event = null ) : void
  80.         {
  81.             xx = 0;
  82.             precision = 16;
  83.             
  84.             generateTerrain();
  85.             light = new Point3D( (Math.random() - 0.5) * 2, Math.random(), (Math.random() - 0.5) * 2 );            
  86.             // Need to sort this out to avoid camera inside sand
  87.             //camera_height = f(canvas_width_half,canvas_width_half);
  88.         }
  89.         
  90.         private function generateTerrain() : void
  91.         {
  92.             terrainH.perlinNoise(5005001, Math.random() * 100truefalse7true);
  93.             
  94.             var i : int = 0;
  95.             
  96.             while(i++ < 3)
  97.             {
  98.                 fractaliser.perlinNoise(5005001, Math.random() * 100truefalse7true);
  99.                 terrainH.draw(fractaliser, nullnull, BlendMode.DIFFERENCE);
  100.             }
  101.         }
  102.         
  103.         private function render( e : Event ) : void
  104.         {
  105.             canvas.lock();
  106.             
  107.             for (var yy : int = canvas_height; yy >= 0; yy -= precision)
  108.             {
  109.                  var ray : Ray = new Ray();
  110.                 ray.origin = new Point3D( canvas_width_half, canvas_height_half, canvas_width_half);
  111.                 ray.direction = Point3D.sub( new Point3D(xx, canvas_height - yy, 0 ), ray.origin);
  112.                 ray.direction.normalise();
  113.                 pixelRect.x = xx;
  114.                 pixelRect.y = yy;
  115.                 pixelRect.width = precision;
  116.                 pixelRect.height = precision;
  117.                 
  118.                 if (castRay(ray))
  119.                 {
  120.                     canvas.fillRect(pixelRect, terrainColor(ray) );
  121.                 }
  122.                 else
  123.                 {
  124.                     pixelRect.y = 0;
  125.                     pixelRect.height = yy + precision;
  126.                     canvas.fillRect(pixelRect, skyColor.getHex());
  127.                     break;
  128.                 }
  129.                 
  130.                 prev_t = 0.1;        
  131.             }
  132.             
  133.             lineRect.x = xx + precision;
  134.             canvas.fillRect(lineRect, 0xffffff );                
  135.             if ((xx += precision) > canvas_width)
  136.             {
  137.                 if (precision > 1)
  138.                     precision /= 2;
  139.                 else
  140.                     init();                
  141.                 xx = 0;
  142.             }
  143.             
  144.             canvas.unlock();
  145.         }    
  146.         
  147.         private function f( x : Number, z : Number) : Number
  148.         {
  149.             x = Math.abs((x - 250) * 1000) % terrain_size;
  150.             z = Math.abs((z - 250) * 1000) % terrain_size;
  151.             
  152.             var f : Number = ((0x0000ff & terrainH.getPixel(x, z)) / 0xff) * .3;
  153.             return f - .1 + canvas_height_half;
  154.         }
  155.         
  156.         private function castRay( ray : Ray ) : Boolean
  157.         {
  158.             var delt : Number = 0.01;
  159.             var mint : Number = prev_t; //0.1;
  160.             var maxt : Number = 50.0;
  161.             
  162.             forvar t : Number = mint; t < maxt; t += delt )
  163.             {
  164.                 var p : Point3D = Point3D.add(ray.origin, Point3D.scalar(ray.direction, t));
  165.                 
  166.                 if( p.y < f( p.x, p.z ) )
  167.                 {
  168.                     prev_t = ray.t = t - 0.5 * delt;
  169.                     return true;
  170.                 }
  171.                 
  172.                 delt = 0.01 * t;   
  173.             }
  174.             return false;
  175.         }
  176.         
  177.         private function terrainColor( ray : Ray ) : Number
  178.         {    
  179.             var p : Point3D = Point3D.add(ray.origin, Point3D.scalar(ray.direction, ray.t));
  180.             var n : Point3D = getNormal(p);
  181.             var dot : Number = Point3D.dot(n, light);
  182.             
  183.             var c : Color = new Color(0x000000);
  184.                         
  185.             c.addRGB( diffuseColor );
  186.             c.addNumber( dot * 0xFF );
  187.             c.addRGB( ambientColor );
  188.             c.mixRGB( fogColor, ray.t * 0.2);
  189.                         
  190.             return c.getHex();
  191.         }
  192.         
  193.         private function getNormal( p : Point3D ) : Point3D
  194.         {
  195.             var eps : Number = 0.01;
  196.             var normal : Point3D = new Point3D( f(p.x-eps,p.z) - f(p.x+eps,p.z),
  197.                                                 2 * eps, 
  198.                                                 f(p.x,p.z-eps) - f(p.x,p.z+eps) );
  199.             normal.normalise();
  200.             return normal;
  201.         }        
  202.     }
  203. }
  204.     
  205. class Ray 
  206. {
  207.     public var origin : Point3D;
  208.     public var direction : Point3D;
  209.     public var t : Number;
  210. }
  211. class Point3D 
  212. {
  213.     public var x : Number;
  214.     public var y : Number;
  215.     public var z : Number;
  216.     
  217.     public function Point3D( x : Number = 0, y : Number = 0, z : Number = 0)
  218.     {
  219.         this.x = x;
  220.         this.y = y;
  221.         this.z = z; 
  222.     }
  223.     
  224.     public function normalise() : void
  225.     {
  226.         var dist : Number = Math.sqrt( (x * x)+(y * y)+(z * z) );
  227.         
  228.         x = x * ( 1.0 / dist );
  229.         y = y * ( 1.0 / dist );
  230.         z = z * ( 1.0 / dist );
  231.     }
  232.     
  233.     public static function add( p1 : Point3D, p2 : Point3D ) : Point3D
  234.     {
  235.         return new Point3D( p1.x + p2.x, p1.y + p2.y, p1.z + p2.z);
  236.     }
  237.     public static function sub( p1 : Point3D, p2 : Point3D ) : Point3D
  238.     {
  239.         return new Point3D( p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
  240.     }
  241.     public static function scalar( p1 : Point3D, val : Number ) : Point3D
  242.     {
  243.         return new Point3D( p1.x * val, p1.y * val, p1.z * val);
  244.     }
  245.         
  246.     public static function dot( p1 : Point3D, p2 : Point3D ) : Number
  247.     {
  248.         return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z;            
  249.     }
  250.         
  251.     public function clone() : Point3D
  252.     {
  253.         return new Point3D(x, y , z);
  254.     }
  255.         
  256.     public function toString() : String
  257.     {
  258.         return "x: " + x + ", y: " + y + ", z: " + z;
  259.     }
  260. }
  261. class Color 
  262. {
  263.     public var r : int, g : int, b : int;
  264.     
  265.     public function Color( hex : int )
  266.     {
  267.         r = ( ( 0xff0000 & hex ) >> 16 );  
  268.         g = ( ( 0xff00 & hex ) >> 8 );  
  269.         b = ( ( 0xff & hex ) );
  270.     }
  271.         
  272.     public function getHex() : int
  273.     {
  274.         r = ( r > 0xff ) ? 0xff : ( r < 0x00 ) ? 0 : r;
  275.         g = ( g > 0xff ) ? 0xff : ( g < 0x00 ) ? 0 : g;
  276.         b = ( b > 0xff ) ? 0xff : ( b < 0x00 ) ? 0 : b;    
  277.             
  278.         return r << 16 | g << 8 | b << 0;
  279.     }
  280.     public function addNumber( value : int ) : void
  281.     {
  282.         r += value;
  283.         g += value;
  284.         b += value;
  285.     }
  286.         
  287.     public function addRGB( colour : Color ) : void
  288.     {
  289.         r += colour.r;
  290.         g += colour.g;
  291.         b += colour.b;
  292.     }
  293.         
  294.     public function mixRGB( colour : Color, amount : Number ) : void
  295.     {
  296.         amount = (amount > 1) ? 1 : (amount < 0) ? 0 : amount; 
  297.             
  298.         r = (r * (1 - amount)) + (colour.r * amount);
  299.         g = (g * (1 - amount)) + (colour.g * amount);
  300.         b = (b * (1 - amount)) + (colour.b * amount);
  301.     }        
  302.         
  303.     public function multiplyNumber( value : Number ) : void
  304.     {
  305.         r *= value;
  306.         g *= value;
  307.         b *= value;
  308.     }
  309. }
noswf
  1. // forked from mrdoob's Desert Generator
  2. /*
  3.  * Terrain raycaster (optimised)
  4.  * by Mr.doob (http://mrdoob.com)
  5.  *
  6.  * Click for a new terrain
  7.  */
  8. package  
  9. {
  10.     import flash.display.Bitmap;
  11.     import flash.display.BitmapData;
  12.     import flash.display.BlendMode;
  13.     import flash.display.Sprite;
  14.     import flash.display.StageScaleMode;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.geom.Rectangle;    
  18.     [SWF(backgroundColor="#000000", frameRate="60")] 
  19.     public class Main extends Sprite 
  20.     {
  21.         private var precision : int = 1;
  22.         
  23.         private var canvas : BitmapData;
  24.         private var canvas_width : int = 465;
  25.         private var canvas_height : int = 465;
  26.         private var canvas_width_half : int = canvas_width / 2;
  27.         private var canvas_height_half : int = canvas_height / 2;    
  28.         
  29.         private var terrain_size : int = 1024;    
  30.         
  31.         private var light : Point3D;
  32.         
  33.         private var diffuseColor : Color;
  34.         private var ambientColor : Color;
  35.         private var fogColor : Color;
  36.         private var skyColor : Color;
  37.         
  38.         private var pixelRect : Rectangle;
  39.         private var lineRect : Rectangle;
  40.         
  41.         private var xx : int = 0;
  42.         
  43.         private var terrainH : BitmapData;
  44.         private var fractaliser : BitmapData;
  45.         
  46.         private var camera_height : Number;
  47.         private var prev_t : Number = 0.1;
  48.         
  49.         public function Main()
  50.         {
  51.             addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
  52.         }
  53.         
  54.         private function onAddedToStage( e : Event ) : void
  55.         {
  56.             stage.scaleMode = StageScaleMode.NO_SCALE;
  57.             
  58.             canvas = new BitmapData( canvas_width, canvas_height, false0 );
  59.             var sprite : Sprite = new Sprite();
  60.             sprite.buttonMode = true;
  61.             sprite.addChild( new Bitmap( canvas ) );
  62.             addChild( sprite );
  63.             pixelRect = new Rectangle();
  64.             lineRect = new Rectangle(001, canvas_height);
  65.             
  66.             terrainH = new BitmapData(terrain_size, terrain_size, false0);
  67.             fractaliser = new BitmapData(terrain_size, terrain_size, false0);
  68.             
  69.             diffuseColor = new Color( 0x6f2d17 );
  70.             ambientColor = new Color( 0x070300 );
  71.             fogColor = new Color( 0x51547d );
  72.             skyColor = new Color( 0xbbcde3 );
  73.             init();
  74.             
  75.             stage.addEventListener(MouseEvent.CLICK, init);
  76.             addEventListener(Event.ENTER_FRAME, render);
  77.         }
  78.         
  79.         private function init( e : Event = null ) : void
  80.         {
  81.             xx = 0;
  82.             precision = 16;
  83.             
  84.             generateTerrain();
  85.             light = new Point3D( (Math.random() - 0.5) * 2, Math.random(), (Math.random() - 0.5) * 2 );            
  86.             // Need to sort this out to avoid camera inside sand
  87.             //camera_height = f(canvas_width_half,canvas_width_half);
  88.         }
  89.         
  90.         private function generateTerrain() : void
  91.         {
  92.             terrainH.perlinNoise(5005001, Math.random() * 100truefalse7true);
  93.             
  94.             var i : int = 0;
  95.             
  96.             while(i++ < 3)
  97.             {
  98.                 fractaliser.perlinNoise(5005001, Math.random() * 100truefalse7true);
  99.                 terrainH.draw(fractaliser, nullnull, BlendMode.DIFFERENCE);
  100.             }
  101.         }
  102.         
  103.         private function render( e : Event ) : void
  104.         {
  105.             canvas.lock();
  106.             
  107.             for (var yy : int = canvas_height; yy >= 0; yy -= precision)
  108.             {
  109.                  var ray : Ray = new Ray();
  110.                 ray.origin = new Point3D( canvas_width_half, canvas_height_half, canvas_width_half);
  111.                 ray.direction = Point3D.sub( new Point3D(xx, canvas_height - yy, 0 ), ray.origin);
  112.                 ray.direction.normalise();
  113.                 pixelRect.x = xx;
  114.                 pixelRect.y = yy;
  115.                 pixelRect.width = precision;
  116.                 pixelRect.height = precision;
  117.                 
  118.                 if (castRay(ray))
  119.                 {
  120.                     canvas.fillRect(pixelRect, terrainColor(ray) );
  121.                 }
  122.                 else
  123.                 {
  124.                     pixelRect.y = 0;
  125.                     pixelRect.height = yy + precision;
  126.                     canvas.fillRect(pixelRect, skyColor.getHex());
  127.                     break;
  128.                 }
  129.                 
  130.                 prev_t = 0.1;        
  131.             }
  132.             
  133.             lineRect.x = xx + precision;
  134.             canvas.fillRect(lineRect, 0xffffff );                
  135.             if ((xx += precision) > canvas_width)
  136.             {
  137.                 if (precision > 1)
  138.                     precision /= 2;
  139.                 else
  140.                     init();                
  141.                 xx = 0;
  142.             }
  143.             
  144.             canvas.unlock();
  145.         }    
  146.         
  147.         private function f( x : Number, z : Number) : Number
  148.         {
  149.             x = Math.abs((x - 250) * 1000) % terrain_size;
  150.             z = Math.abs((z - 250) * 1000) % terrain_size;
  151.             
  152.             var f : Number = ((0x0000ff & terrainH.getPixel(x, z)) / 0xff) * .3;
  153.             return f - .1 + canvas_height_half;
  154.         }
  155.         
  156.         private function castRay( ray : Ray ) : Boolean
  157.         {
  158.             var delt : Number = 0.01;
  159.             var mint : Number = prev_t; //0.1;
  160.             var maxt : Number = 50.0;
  161.             
  162.             forvar t : Number = mint; t < maxt; t += delt )
  163.             {
  164.                 var p : Point3D = Point3D.add(ray.origin, Point3D.scalar(ray.direction, t));
  165.                 
  166.                 if( p.y < f( p.x, p.z ) )
  167.                 {
  168.                     prev_t = ray.t = t - 0.5 * delt;
  169.                     return true;
  170.                 }
  171.                 
  172.                 delt = 0.01 * t;   
  173.             }
  174.             return false;
  175.         }
  176.         
  177.         private function terrainColor( ray : Ray ) : Number
  178.         {    
  179.             var p : Point3D = Point3D.add(ray.origin, Point3D.scalar(ray.direction, ray.t));
  180.             var n : Point3D = getNormal(p);
  181.             var dot : Number = Point3D.dot(n, light);
  182.             
  183.             var c : Color = new Color(0x000000);
  184.                         
  185.             c.addRGB( diffuseColor );
  186.             c.addNumber( dot * 0xFF );
  187.             c.addRGB( ambientColor );
  188.             c.mixRGB( fogColor, ray.t * 0.2);
  189.                         
  190.             return c.getHex();
  191.         }
  192.         
  193.         private function getNormal( p : Point3D ) : Point3D
  194.         {
  195.             var eps : Number = 0.01;
  196.             var normal : Point3D = new Point3D( f(p.x-eps,p.z) - f(p.x+eps,p.z),
  197.                                                 2 * eps, 
  198.                                                 f(p.x,p.z-eps) - f(p.x,p.z+eps) );
  199.             normal.normalise();
  200.             return normal;
  201.         }        
  202.     }
  203. }
  204.     
  205. class Ray 
  206. {
  207.     public var origin : Point3D;
  208.     public var direction : Point3D;
  209.     public var t : Number;
  210. }
  211. class Point3D 
  212. {
  213.     public var x : Number;
  214.     public var y : Number;
  215.     public var z : Number;
  216.     
  217.     public function Point3D( x : Number = 0, y : Number = 0, z : Number = 0)
  218.     {
  219.         this.x = x;
  220.         this.y = y;
  221.         this.z = z; 
  222.     }
  223.     
  224.     public function normalise() : void
  225.     {
  226.         var dist : Number = Math.sqrt( (x * x)+(y * y)+(z * z) );
  227.         
  228.         x = x * ( 1.0 / dist );
  229.         y = y * ( 1.0 / dist );
  230.         z = z * ( 1.0 / dist );
  231.     }
  232.     
  233.     public static function add( p1 : Point3D, p2 : Point3D ) : Point3D
  234.     {
  235.         return new Point3D( p1.x + p2.x, p1.y + p2.y, p1.z + p2.z);
  236.     }
  237.     public static function sub( p1 : Point3D, p2 : Point3D ) : Point3D
  238.     {
  239.         return new Point3D( p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
  240.     }
  241.     public static function scalar( p1 : Point3D, val : Number ) : Point3D
  242.     {
  243.         return new Point3D( p1.x * val, p1.y * val, p1.z * val);
  244.     }
  245.         
  246.     public static function dot( p1 : Point3D, p2 : Point3D ) : Number
  247.     {
  248.         return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z;            
  249.     }
  250.         
  251.     public function clone() : Point3D
  252.     {
  253.         return new Point3D(x, y , z);
  254.     }
  255.         
  256.     public function toString() : String
  257.     {
  258.         return "x: " + x + ", y: " + y + ", z: " + z;
  259.     }
  260. }
  261. class Color 
  262. {
  263.     public var r : int, g : int, b : int;
  264.     
  265.     public function Color( hex : int )
  266.     {
  267.         r = ( ( 0xff0000 & hex ) >> 16 );  
  268.         g = ( ( 0xff00 & hex ) >> 8 );  
  269.         b = ( ( 0xff & hex ) );
  270.     }
  271.         
  272.     public function getHex() : int
  273.     {
  274.         r = ( r > 0xff ) ? 0xff : ( r < 0x00 ) ? 0 : r;
  275.         g = ( g > 0xff ) ? 0xff : ( g < 0x00 ) ? 0 : g;
  276.         b = ( b > 0xff ) ? 0xff : ( b < 0x00 ) ? 0 : b;    
  277.             
  278.         return r << 16 | g << 8 | b << 0;
  279.     }
  280.     public function addNumber( value : int ) : void
  281.     {
  282.         r += value;
  283.         g += value;
  284.         b += value;
  285.     }
  286.         
  287.     public function addRGB( colour : Color ) : void
  288.     {
  289.         r += colour.r;
  290.         g += colour.g;
  291.         b += colour.b;
  292.     }
  293.         
  294.     public function mixRGB( colour : Color, amount : Number ) : void
  295.     {
  296.         amount = (amount > 1) ? 1 : (amount < 0) ? 0 : amount; 
  297.             
  298.         r = (r * (1 - amount)) + (colour.r * amount);
  299.         g = (g * (1 - amount)) + (colour.g * amount);
  300.         b = (b * (1 - amount)) + (colour.b * amount);
  301.     }        
  302.         
  303.     public function multiplyNumber( value : Number ) : void
  304.     {
  305.         r *= value;
  306.         g *= value;
  307.         b *= value;
  308.     }
  309. }
noswf

Desert Generator Cube world [diff(21)]

  1. // forked from mrdoob's Desert Generator
  2. /*
  3.  * Terrain raycaster (optimised)
  4.  * by Mr.doob (http://mrdoob.com)
  5.  *
  6.  * Click for a new terrain
  7.  */
  8. package  
  9. {
  10.     import flash.display.Bitmap;
  11.     import flash.display.BitmapData;
  12.     import flash.display.BlendMode;
  13.     import flash.display.Sprite;
  14.     import flash.display.StageScaleMode;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.geom.Rectangle;    
  18.     [SWF(backgroundColor="#000000", frameRate="60")] 
  19.     public class Main extends Sprite 
  20.     {
  21.         private var precision : int = 1;
  22.         
  23.         private var canvas : BitmapData;
  24.         private var canvas_width : int = 465;
  25.         private var canvas_height : int = 465;
  26.         private var canvas_width_half : int = canvas_width / 2;
  27.         private var canvas_height_half : int = canvas_height / 2;    
  28.         
  29.         private var terrain_size : int = 128;    
  30.         
  31.         private var light : Point3D;
  32.         
  33.         private var diffuseColor : Color;
  34.         private var ambientColor : Color;
  35.         private var fogColor : Color;
  36.         private var skyColor : Color;
  37.         
  38.         private var pixelRect : Rectangle;
  39.         private var lineRect : Rectangle;
  40.         
  41.         private var xx : int = 0;
  42.         
  43.         private var terrainH : BitmapData;
  44.         private var fractaliser : BitmapData;
  45.             
  46.         private var prev_t : Number = 0.1;
  47.         
  48.         public function Main()
  49.         {
  50.             addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
  51.         }
  52.         
  53.         private function onAddedToStage( e : Event ) : void
  54.         {
  55.             stage.scaleMode = StageScaleMode.NO_SCALE;
  56.             
  57.             canvas = new BitmapData( canvas_width, canvas_height, false0 );
  58.             var sprite : Sprite = new Sprite();
  59.             sprite.buttonMode = true;
  60.             sprite.addChild( new Bitmap( canvas ) );
  61.             addChild( sprite );
  62.             pixelRect = new Rectangle();
  63.             lineRect = new Rectangle(001, canvas_height);
  64.             
  65.             terrainH = new BitmapData(terrain_size, terrain_size, false0);
  66.             fractaliser = new BitmapData(terrain_size, terrain_size, false0);
  67.             
  68.             diffuseColor = new Color( 0x6f2d17 );
  69.             ambientColor = new Color( 0x070300 );
  70.             fogColor = new Color( 0x51547d );
  71.             skyColor = new Color( 0xbbcde3 );
  72.             init();
  73.             
  74.             stage.addEventListener(MouseEvent.CLICK, init);
  75.             addEventListener(Event.ENTER_FRAME, render);
  76.         }
  77.         
  78.         private function init( e : Event = null ) : void
  79.         {
  80.             xx = 0;
  81.             precision = 16;
  82.             
  83.             generateTerrain();
  84.             light = new Point3D( (Math.random() - 0.5) * 2, (Math.random() - 0.5) * 2, (Math.random() - 0.5) * 2 );            
  85.         }
  86.         
  87.         private function generateTerrain() : void
  88.         {
  89.             terrainH.perlinNoise(5005001, Math.random() * 100truefalse7true);
  90.             
  91.             var i : int = 0;
  92.             
  93.             while(i++ < 3)
  94.             {
  95.                 fractaliser.perlinNoise(5005001, Math.random() * 100truefalse7true);
  96.                 terrainH.draw(fractaliser, nullnull, BlendMode.DIFFERENCE);
  97.             }
  98.         }
  99.         
  100.         private function render( e : Event ) : void
  101.         {
  102.             canvas.lock();
  103.             
  104.             for (var yy : int = canvas_height; yy >= 0; yy -= precision)
  105.             {
  106.                  var ray : Ray = new Ray();
  107.                 ray.origin = new Point3D( canvas_width_half, canvas_height_half, canvas_width_half);
  108.                 ray.direction = Point3D.sub( new Point3D(xx, canvas_height - yy, 0 ), ray.origin);
  109.                 ray.direction.normalise();
  110.                 pixelRect.x = xx;
  111.                 pixelRect.y = yy;
  112.                 pixelRect.width = precision;
  113.                 pixelRect.height = precision;
  114.                 
  115.                 if (castRay(ray))
  116.                 {
  117.                     canvas.fillRect(pixelRect, terrainColor(ray) );
  118.                 }
  119.                 else
  120.                 {
  121.                     pixelRect.y = 0;
  122.                     pixelRect.height = yy + precision;
  123.                     canvas.fillRect(pixelRect, skyColor.getHex());
  124.                     break;
  125.                 }
  126.                 
  127.                 prev_t = 0.1;        
  128.             }
  129.             
  130.             lineRect.x = xx + precision;
  131.             canvas.fillRect(lineRect, 0xffffff );                
  132.             if ((xx += precision) > canvas_width)
  133.             {
  134.                 if (precision > 1)
  135.                     precision /= 2;
  136.                 else
  137.                     init();                
  138.                 xx = 0;
  139.             }
  140.             
  141.             canvas.unlock();
  142.         }    
  143.         
  144.         private function f( x : Number, z : Number) : Number
  145.         {
  146.             x = Math.abs((x - 250) * 20) % terrain_size;
  147.             z = Math.abs((z - 250) * 20) % terrain_size;
  148.             
  149.             var f : Number = ((0x0000ff & terrainH.getPixel(x, z)) / 0xff) * 4;
  150.             return f - 0.3 + canvas_height_half;
  151.         }
  152.         
  153.         private function castRay( ray : Ray ) : Boolean
  154.         {
  155.             var delt : Number = 0.01;
  156.             var mint : Number = prev_t; //0.1;
  157.             var maxt : Number = 20.0;
  158.             
  159.             forvar t : Number = mint; t < maxt; t += delt )
  160.             {
  161.                 var p : Point3D = Point3D.add(ray.origin, Point3D.scalar(ray.direction, t));
  162.                 
  163.                 if( p.y < f( p.x, p.z ) )
  164.                 {
  165.                     prev_t = ray.t = t - 0.5 * delt;
  166.                     return true;
  167.                 }
  168.                 
  169.                 delt = 0.01 * t;   
  170.             }
  171.             return false;
  172.         }
  173.         
  174.         private function terrainColor( ray : Ray ) : Number
  175.         {    
  176.             var p : Point3D = Point3D.add(ray.origin, Point3D.scalar(ray.direction, ray.t));
  177.             var n : Point3D = getNormal(p);
  178.             var dot : Number = Point3D.dot(n, light);
  179.             
  180.             var c : Color = new Color(0x000000);
  181.                         
  182.             c.addRGB( diffuseColor );
  183.             c.addNumber( dot * 0xFF );
  184.             c.addRGB( ambientColor );
  185.             c.mixRGB( fogColor, ray.t * 0.2);
  186.                         
  187.             return c.getHex();
  188.         }
  189.         
  190.         private function getNormal( p : Point3D ) : Point3D
  191.         {
  192.             var eps : Number = 0.005;
  193.             var normal : Point3D = new Point3D( f(p.x-eps,p.z) - f(p.x+eps,p.z),
  194.                                                 2 * eps, 
  195.                                                 f(p.x,p.z-eps) - f(p.x,p.z+eps) );
  196.             normal.normalise();
  197.             return normal;
  198.         }        
  199.     }
  200. }
  201.     
  202. class Ray 
  203. {
  204.     public var origin : Point3D;
  205.     public var direction : Point3D;
  206.     public var t : Number;
  207. }
  208. class Point3D 
  209. {
  210.     public var x : Number;
  211.     public var y : Number;
  212.     public var z : Number;
  213.     
  214.     public function Point3D( x : Number = 0, y : Number = 0, z : Number = 0)
  215.     {
  216.         this.x = x;
  217.         this.y = y;
  218.         this.z = z; 
  219.     }
  220.     
  221.     public function normalise() : void
  222.     {
  223.         var dist : Number = Math.sqrt( (x * x)+(y * y)+(z * z) );
  224.         
  225.         x = x * ( 1.0 / dist );
  226.         y = y * ( 1.0 / dist );
  227.         z = z * ( 1.0 / dist );
  228.     }
  229.     
  230.     public static function add( p1 : Point3D, p2 : Point3D ) : Point3D
  231.     {
  232.         return new Point3D( p1.x + p2.x, p1.y + p2.y, p1.z + p2.z);
  233.     }
  234.     public static function sub( p1 : Point3D, p2 : Point3D ) : Point3D
  235.     {
  236.         return new Point3D( p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
  237.     }
  238.     public static function scalar( p1 : Point3D, val : Number ) : Point3D
  239.     {
  240.         return new Point3D( p1.x * val, p1.y * val, p1.z * val);
  241.     }
  242.         
  243.     public static function dot( p1 : Point3D, p2 : Point3D ) : Number
  244.     {
  245.         return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z;            
  246.     }
  247.         
  248.     public function clone() : Point3D
  249.     {
  250.         return new Point3D(x, y , z);
  251.     }
  252.         
  253.     public function toString() : String
  254.     {
  255.         return "x: " + x + ", y: " + y + ", z: " + z;
  256.     }
  257. }
  258. class Color 
  259. {
  260.     public var r : int, g : int, b : int;
  261.     
  262.     public function Color( hex : int )
  263.     {
  264.         r = ( (0xff0000 & hex) >> 16 );
  265.         g = ( (0x00ff00 & hex) >> 8 );
  266.         b = ( 0x0000ff & hex );
  267.     }
  268.         
  269.     public function getHex() : int
  270.     {
  271.         r = ( r > 0xff ) ? 0xff : ( r < 0x00 ) ? 0 : r;
  272.         g = ( g > 0xff ) ? 0xff : ( g < 0x00 ) ? 0 : g;
  273.         b = ( b > 0xff ) ? 0xff : ( b < 0x00 ) ? 0 : b;    
  274.             
  275.         return r << 16 | g << 8 | b << 0;
  276.     }
  277.     public function addNumber( value : int ) : void
  278.     {
  279.         r += value;
  280.         g += value;
  281.         b += value;
  282.     }
  283.         
  284.     public function addRGB( colour : Color ) : void
  285.     {
  286.         r += colour.r;
  287.         g += colour.g;
  288.         b += colour.b;
  289.     }
  290.         
  291.     public function mixRGB( colour : Color, amount : Number ) : void
  292.     {
  293.         amount = (amount > 1) ? 1 : (amount < 0) ? 0 : amount; 
  294.             
  295.         r = (r * (1 - amount)) + (colour.r * amount);
  296.         g = (g * (1 - amount)) + (colour.g * amount);
  297.         b = (b * (1 - amount)) + (colour.b * amount);
  298.     }        
  299.         
  300.     public function multiplyNumber( value : Number ) : void
  301.     {
  302.         r *= value;
  303.         g *= value;
  304.         b *= value;
  305.     }
  306. }
noswf
Get Adobe Flash Player