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

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

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


forked from : keim_at_Si's ABC flyer [diff(296)]

FAVORITE BY
:
best one yet needs the cloud mod though
:
3d
:
OUTRAGEOUS!
:
3D
:
Very Nice Sound and 3D
:
its a burner !
FORKED
  1. // forked from keim_at_Si's wonderflで音楽♪Final TakeOff from:ABC flyer
  2. // forked from keim_at_Si's ABC flyer
  3. // forked from keim_at_Si's ABC ground
  4. // The gradation colors are refered from psyrak's BumpyPlanet and nemu90kWw's 水平線.
  5. // arrows or [wasd] to move, [shift/x/m] to accel.
  6. //--------------------------------------------------------------------------------
  7. package {
  8.     import flash.display.*;
  9.     import flash.events.*;
  10.     import flash.media.*;
  11.     [SWF(width='465', height='465', backgroundColor='#103860', frameRate='30')]
  12.     public class main extends Sprite {
  13.         function main() {
  14.             // keyboard mapper
  15.             _key = new KeyMapper(stage);
  16.             _key.map(0,37,65).map(1,38,87).map(2,39,68).map(3,40,83).map(4,17,90,78).map(5,16,88,77);
  17.             
  18.             // rendering engine
  19.             _shape3d.visible = false;
  20.             addChild(_shape3d);
  21.             
  22.             // background
  23.             _base.x = 232.5;
  24.             _base.y = 232.5;
  25.             _landscape.rotationX = -85;
  26.             _landscape.scaleX = 10;
  27.             _landscape.scaleY = 8;
  28.             _landscape.x = -1024-_base.x;
  29.             _landscape.y = 280-_base.y;
  30.             _landscape.z = 1800;
  31.             _sky.scaleX = 5;
  32.             _sky.scaleY = 5;
  33.             _sky.x = -1520-_base.x;
  34.             _sky.y = -1400-_base.y;
  35.             _sky.z = 1800;
  36.             _base.addChild(_landscape);
  37.             _base.addChild(_sky);
  38.             addChild(_base);
  39.             
  40.             // rendering layer
  41.             addChild(new Bitmap(_screen));
  42.             
  43.             // initialize
  44.             _flyer = new Flyer(00100);
  45.             _pitch = 0;
  46.             _roll = 0;
  47.             
  48.             // event listener
  49.             addEventListener("enterFrame", _onEnterFrame);
  50.             
  51.             _startMusic();
  52.         }
  53.         private function _onEnterFrame(e:Event) : void {
  54.             // move
  55.             var inkey:int = _key.flag;
  56.             _roll  += ((inkey & 1)      - ((inkey & 4)>>2))*5 - _roll*0.1;
  57.             _pitch += (((inkey & 2)>>1) - ((inkey & 8)>>3))*2 - _pitch*0.1;
  58.             _globalVel.z += 0.5 - _globalVel.z * ((inkey & 32) ? 0.03 : 0.06);
  59.             _globalVel.x = (_roll) * 0.1 - 0.5;
  60.             _base.rotationX = _pitch;
  61.             _base.rotationZ = _roll;
  62.             
  63.             // update
  64.             _landscape.update();
  65.             _flyer.update();
  66.             
  67.             // rendering
  68.             _screen.fillRect(_screen.rect, 0);
  69.             _flyer.render();
  70.         }
  71.         
  72.         // sound
  73.         private var _sound:Sound = new Sound();
  74.         private var _sequencer:Sequencer = new Sequencer();
  75.         private var _module:TinySiOPM = new TinySiOPM(20481024, _sequencer.onSoundFrame);
  76.         
  77.         private function _startMusic() : void {
  78.             var mml:String = "";
  79.             mml += "#BS=l2<ef+abaf+>[2a8[2a4<a>araa12<gara>a4<a>araa6arr<ef+>a4a4<a>araa6<arrgara>a4<a>ara";
  80.             mml += "<ef+abaf+>a8a4<a>araa12<gara>a4<a>ara<<c+de4dc+>a4>a4a4<a>araa6<arrgara>a4f+4<f+r>g4<gr>g+4a8]|";
  81.             mml += "[2[2a4<a>araa6<arrga>g4g4<g>grgg16b4b4<b>brbb6<brrd8<dr6>e8<errrde>>|a4]";
  82.             mml += "l4g12g<g>gr<d8<dr>d<ef+r>>a8[11a]<gagd>g12g<g>gr<d8<dr>d<ef+r>>a8[23a]a16g8f+8";
  83.             mml += "[4l2[6a4<ar>]g4<gr>f+4<f+r>]|l4[2f8f2r2g8<g2r2d>gg8<g2r2>a8<age>f8f2r2g8<g2r2>ga8<e6g2a<c>bg8>]f8f2r2g48";
  84.             mml += "a8a<a2>a6a6a6a8aa2<a2>aa6a6g2a6[2aa8a6a6a8]l2]";
  85.             mml += "[2l4[4f8f2r2g8<g2r2d>gg8<g2r2>a8<age>f8f2r2g8<g2r2>ga8<e6g2a<c>bg8>]f8f2r2|g52]g48l2];";
  86.             mml += "@0@o1o4v6s16BS; @0@i3@o1o2s8BS; v7@0@i3o4s8BS;";
  87.             mml += "#BD=r16[2v10p4[3l4[3rcr2cc2crrc]|rcr2cc2l2v8<p1ggp5cc>l4p4gv10c]l3v8<p1ggg2p3eee2p5ccc2>l4v10p4rc[3rcr2cc2|crrc]c6c10v10crcr|v8<c6c10>v10";
  88.             mml += "[2l4[2[2ccr2cc2c[2r10c2c]r12]][2crrcrrcrrcrcr12crcrrcrrrcrrrcrcr]rcccl3v8<ggg2ccc2>l4v10cr12crcr";
  89.             mml += "[4cr12cr8crcr8c8c8]|[4cr8crcrccr8crcr8]cr8cr8[2cr12]cc[3rcr6c2crrc]r4l2v8<ggggeeeecccc>ggv10]";
  90.             mml += "[2[8cr8crcrccr8crcr8]cr8cr8[2cr12]cc]]rcrcr;";
  91.             mml += "#SN=r16[2v15p3[3l8[6rc]|rcl2p1ccp5ccp4c8]l3p1ccc2p3ccc2p5ccc2p3ccc2l8[4rc]rcc6c10|c4c4rc6c10";
  92.             mml += "[2[16rc][2l8rrcr4cr12crrcrcl4rccc|c2cc2c8]ccccccccl3ccc2ccc2l8c16cc";
  93.             mml += "[4rcrcrc4c2c2cc]|l8[7rc]l4cccrl8[6rc]rl2cc6ccccc4cc10l8c[3rc][6rc]r4l2[14c]l8]";
  94.             mml += "[2[2l8[7rc]l4cccrl8[6rc]rl2cc6ccccc4c|c2]c10l8c[3rc]]]c8l2[4c]c4c8c32;";
  95.             mml += "#CY=r12[2l2[2s4v15p3d16s99v4p5[56c+]][2[3s4v15p3d16s99v4p5[8c+]]|[16c+]]|[16c+]";
  96.             mml += "[2l4[2s4v15p3d16s32v5p5[28c+]]s4v15[2r4p3d28p6c+20p3d12|p6c+64]p6c+100p3d16s5[5p1c+8p6|d56]d8";
  97.             mml += "|[2s4v15p3c+16l2v6p5[14s99c+c+s8c+4]]s4v15p6c+12p2d16v6p4s8l8[3c+|r]";
  98.             mml += "l2[2s99[14v6c+v4c+]|s4v6d8]][2[4s4v15p3c+16l2v6p5[14s99c+c+s8c+4]]s4v15p6c+12p2d16v6p4s8l8[2c+r]|r4]]";
  99.             mml += "s6v15p3r24c+8p6d32;";
  100.             mml += "#CB=r16[2l8r256[32g]|[2r832|[32g][24g]][64g][8g][64g][8g]];";
  101.             mml += "#RD=r16l8r512[2r256[2r4l8[7e]r4r64]r64[4r4[6e]r12]|r4[31e]r4r192][2r4[31e]r4]r64[2r4[31e]r4]r64;";
  102.             mml += "@0s32w32o4BD; @3o0k6s12SN; @3o0CY; @2v8s99o6k120@o1CB;@0v8s64o6@i3p6CB; @2v10s4o6k123@o1RD;@0v5s20o5@i5p2RD;";
  103.             mml += "#GT=r12[2l32s1o4fga56<c8>fga20<c6c2r8>a8<c6c2r4d8> fga20<g+1a5g+1a5g+1a3a28>fga20g+1a5g+1a5g+1a3|w1a28";
  104.             mml += "w0[2[2a32g36b28<d16e16>][2g32<d32>d4r4|s8a4s1a52] s8a4s1a12s8a4s1a40g32a16g8f+8l4[4s4rarra8rs2a8a12g8f+8]";
  105.             mml += "|[2f8rg20g8ra8s4ages2f8rg12ra36]f8rg52s4aar8<s2c16>s4aar<drs2c12>s4aar8<s2c8rd32>]";
  106.             mml += "[4f8rg20g8ra8s4ages2f8rg12ra36]f8rg52 [4f8rg20g8ra8s4ages2|r8f8rgra36]f8rg12ra36f8rg48]a20l4grs7w2a32;";
  107.             mml += "@2@o1o6v6k1  GT; @0@i3@o1o4v12k112GT; p7@1@i4o3v6    GT;";
  108.             mml += "@2@o1o6v6k113GT; @0@i3@o1o4v12k224GT; p1@1@i4o3v6k112GT;";
  109.             mml += "@2@o1o7v5k1  GT; @0@i3@o1o5v10k112GT; p4@1@i4o4v6    GT;";
  110.             mml += "#S1=r16[2v8s5o6[2[2l2rrccrcrcc16rrddrdrdd16rreereree12|c+dc+6>a6e8c+6r6<]|l4arar24]rrarar|r20";
  111.             mml += "l4v6[2c+32d36d28d16e16c+24e8d36d28d16e16r20[2g12f+32f+ree56|r16]l2[5s64[6>a>a<a<a]s5g8f+8]";
  112.             mml += "|>l4[2a8rg16rg8ra16ra8rg16a36]a8rg52l2s64[16a>a<|a<a>]l4s5<] >l4[4a8rg16rg8ra16ra8rg16a36]a8rg52 l4[2a8rg16rg8ra16rr8a8rgra36]";
  113.             mml += "l2>gab<c>ab<cd>b<cdecdefdefgefgafgabgab<c>ab<cd>b<cdecdefdefgefgafgabgab<c>ab<cdl4d+1e11d12cdd+1e3dc>a8reab8rb16a20egar<c12>b52]";
  114.             mml += "r12gr6ar6v3ar6v2ar6v1ar6ar6;";
  115.             mml += "#S2=r16[2v8s5o5[2[2l2rraararaa16rrbbrbrbb16<rrc+c+rc+rc+c+12|r4>a6e6c+8>a6<r6]|l4ere>r24]rrerer|r20>";
  116.             mml += "l4v6[2[2a32b36b28a16b16]<d32[2d32drc+c+56|d28][5r48d8d8] |l4[2c8r>b16rb8r<c16rc8r>b16<c36]c8r>b52r124]";
  117.             mml += "l4[4c8r>b16rb8r<c16rc8r>b16<c36]c8r>b52 l4[4c8r>b16rb8r<c16r|r8c8r>br<c36]c8r>b16<c36>a8rg52]";
  118.             mml += "r12dr6er6v3er6v2er6v1er6er6;";
  119.             mml += "#S3=r16[2v8s5o5[2[2l2rrffrfrff16rrggrgrgg16rraararaa12|r4e6c+6>a8e6<r6]<|l4c+rc+>r24]rrc+rc+r|r20>";
  120.             mml += "l4v6[2[2e32g36f+28f+16g+16]b32[2a32araa56|b28][5r48b8a8] |l4[2f8rd16rd8re16rf8rd16e36]f8rd52r124]";
  121.             mml += "l4[4f8rd16rd8re16rf8rd16e36]f8rd52 l4[4f8rd16rd8re16r|r8f8rdre36]f8rd12re36f8rd52]";
  122.             mml += "r12>br6<c+r6v3c+r6v2c+r6v1c+r6c+r6;";
  123.             mml += "@1k1S1; @1k-1S2; @1S3; @1k-1S1;";
  124.             mml += "#MA=r16s4r508[2l4[2c1c+23dec+24de|d+1e15d12>a<c+1d11c+>arbr<]d+1e11dg+1a11g+arg+rf+rg+r";
  125.             mml += "g+1a51a+1b7<c+>brag+1a43c1c+3ea24c1c+3ea20a+1b7<c+>brag+1a91";
  126.             mml += "[2[3f+1g3]f+1g5f+5r1|e40]a40[3f+1g3]f+1g5f+5r1e40c+1d7c+d6er2c1c+3r>a44";
  127.             mml += "|ab<c2>b2a<d+1e11d16>gg<c>ba16g2f2e12d8ega20ab<c>a<c+1d7>a<d+1e7>a8<d+1e3gega8b<c>a8<cd+1e7dr2cr2>a36<d+1e11d128r48>]";
  128.             mml += "ab<c2>b2a<d+1e11d16>gg<c>ba16g2f2e12d8ega20ab<c>a<c+1d7>a<d+1e7>a8<d+1e3gega8b<c>a8<cd+1e7dr2cr2>a36";
  129.             mml += "<d+1e11d16>gg<c>ba16g2f2e12d8ega20ab<c>a<c+1d7>a<d+1e7>a8<d+1e3gega8b<c>a8<cd+1e3rdr2cr2>a36<d+1e11d52>>";
  130.             mml += ">b1<c3>b1<c3>a2g2a12l3geg2aga2bab2<c>b<c2dcd2l4r8d+1e13c6dc>ba<c20>l1ab<cdefgg+a8l4gfefge8d2c2d>a20cccc>b<cgc8>b1<c19";
  131.             mml += "l2>b<cdecdefdefgefgafgabgab<c>ab<cd>b<cdecdefdefgefgafgabgab<c>ab<cd>b<cdecdefl4f+1g11f12eff+1g3fec8r>a<cd8rd16c20>ab<cre12d52>;";
  132.             mml += "@1v12o6k-1MA; @6v12o5k1MA; @8v4p1o6r4MA;";
  133.             
  134.             _sequencer.mml = _expandMML(mml);
  135.             _sound.addEventListener("sampleData"function(e:SampleDataEvent) : void {
  136.                 var i:int, out:Vector.<Number> = _module.render();
  137.                 for (i=0; i<4096; i++) e.data.writeFloat(out[i]);
  138.             });
  139.             _sound.play();
  140.         }
  141.         
  142.         private function _expandMML(mml:String) : Array {
  143.             var split:Array = mml.replace(/\s+/g, "").split(/;/);
  144.             var list:Array = [], macro:* = {}, charA:int = "A".charCodeAt();
  145.             var defMacro:RegExp = /^#([_A-Z][_A-Z0-9]*)=?(.*)/m;
  146.             for each (var seq:String in split) {
  147.                 var res:* = defMacro.exec(seq);
  148.                 if (res) macro[res[1]] = res[2];
  149.                 else list.push(seq.replace(/[_A-Z][_A-Z0-9]*/g, function() : String {
  150.                     if (!arguments[0in macro) return "";
  151.                     return macro[arguments[0]];
  152.                 }));
  153.             }
  154.             return list;
  155.         }
  156.     }
  157. }
  158. import flash.display.*;
  159. import flash.geom.*;
  160. import flash.events.*;
  161. import flash.filters.*;
  162. import mx.utils.Base64Decoder;
  163. // internal variables
  164. //----------------------------------------------------------------------------------------------------
  165. var _key:KeyMapper;
  166. var _models:ModelManager = new ModelManager();
  167. var _flyer:Flyer;
  168. var _landscape:Landscape = new Landscape(256256);
  169. var _sky:Sky = new Sky();
  170. var _base:Sprite = new Sprite();
  171. var _light:Light = new Light(-1,-1,-1);
  172. var _shape3d:Shape3D = new Shape3D();
  173. var _screen:BitmapData = new BitmapData(465465true0);
  174. var _mat2d:Matrix = new Matrix(1,0,0,1,232,232);
  175. var _pitch:Number, _roll:Number, _globalVel:Vector3D = new Vector3D();
  176. var _homingAbility:Number = 0.1;
  177. // Key mapper
  178. //----------------------------------------------------------------------------------------------------
  179. class KeyMapper {
  180.     public  var flag:int = 0;
  181.     private var _mask:Vector.<int> = new Vector.<int>(256true);
  182.     
  183.     function KeyMapper(stage:Stage) : void { 
  184.         stage.addEventListener("keyDown"function(e:KeyboardEvent):void { flag |= _mask[e.keyCode]; });
  185.         stage.addEventListener("keyUp",   function(e:KeyboardEvent):void { flag &= ~(_mask[e.keyCode]); });
  186.     }
  187.     
  188.     public function map(bit:int, ...args) : KeyMapper {
  189.         for (var i:int=0; i<args.length; i++) { _mask[args[i]] = 1<<bit; }
  190.         return this;
  191.     }
  192. }
  193. // Resource
  194. //----------------------------------------------------------------------------------------------------
  195. class ModelManager {
  196.     public var mdlFlyer:Model;
  197.     public var mdlFire:Model;
  198.     public var texFire:Vector.<BitmapData> = new Vector.<BitmapData>(8true);
  199.     private var _dec:Base64Decoder = new Base64Decoder();
  200.     private const SCALE:Number = 0.1;
  201.     function ModelManager() {
  202.         var i:int, vdata:String="", idata:String="", shp:Shape=new Shape(), mtx:Matrix=new Matrix();
  203.         // Flyer model
  204.         vdata += "iN94Art14Ar5234tF43zutz4Au503zwR4HwxNz4Awt030zN34Ar524ItF44Mu504MwR4IQwt04LiN94Aft73Yft93AtF43znt53Q";
  205.         vdata += "mt93AwR4HwvR6nmtN6nQvSB3mmuD4AmuF3gmuB3AiOD4AfuF3gfuB3AzN34A0SEIA0uAHm1N73w1N54A4eDYA4uAHz4t+324t94A";
  206.         vdata += "7OB4AhN734at73Aat53Iat53Yat534at74AVt73AVt53IVt53YVt73gWR73rVt/3AVuB3IVuB3YVt/3gWR/3rat/3AauB3IauB3Y";
  207.         vdata += "at/3gat/4AfuD3oiN94AUt6nQUt7XZUt7XGUt93cUt93DUuAHGUuAHZUuA3QWt93QWt93QiN94Aft74oft95AtF44Mnt54wmt95A";
  208.         vdata += "wR4IQvR6oZtN6owvSB4ZmuD4AmuF4gmuB5AiOD4AfuF4gfuB5AzN34A0SEIA0uAIZ1N74Q1N54A4eDYA4uAIM4t+4J4t94A7OB4A";
  209.         vdata += "hN74Iat75Aat544at54oat54Iat74AVt75AVt544Vt54oVt74gWR74UVt/5AVuB44VuB4oVt/4gWR/4Uat/5AauB44auB4oat/4g";
  210.         vdata += "fuD4YiN94AUt6owUt7YmUt7Y5Ut94jUt948UuAI5UuAImUuA4wWt94wWt94wbN/3AbN/2QZt/0gdV93AdV92AgB93AgB92AcN/0I";
  211.         vdata += "mt93AgB/3AgB/2AdV/3AdV/2Amt93AbN/5AbN/5wZt/7gdV95AdV96AgB95AgB96AcN/74mt95AgB/5AgB/6AdV/5AdV/6Amt95A";
  212.         vdata += "UN/1wat93AWV92YX193ASt/2AUt92gVN93ATt/24VN93AWB/3AX193Aat93AUN/6Qat95AWV95oX195ASt/6AUt95gVN95ATt/5I";
  213.         vdata += "VN95AWB/5AX195Aat95AWtj3IUtj3IVt53IVt53Qat53Iat53QWtj44Utj44Vt544Vt54wat544at54w"
  214.         idata += "AAQIAAAgMABCQgHBCQYIBCAYFAAAoBAAAsKBBw4JBDg0JBDA0OAFRYTAEhUTADxITAEA8TAGBcWAFxsUAGRoYAJiglAJygmAJSgk";
  215.         idata += "AHyMiAFh8iAFhUfAFiIhAGBYhAHjo5AKywQALDEyALSwyAPh0cAPxApAOh4dAOzodAGBobAFxgbAIBkYAISAYAQEExAMEAxAQUMy";
  216.         idata += "AMUEyAQ0Y3AMkM3ARkc2AN0Y2AR0U1ANkc1ARUQ0ANUU0AREIvANEQvAQkAwAL0IwCSEZDCQUhDCRUdICSERFCSEJECSEBCCQUBI";
  217.         idata += "ATlFQATlBNATk1KATkpLAUVJTAT1ZSAU1VUAYGNhAYWNiAX2NgAXV5aAXVpRAWlBRAXF1RAXFFTAdHVZAS2dmAbWxnAbWdoAV1h4";
  218.         idata += "AZEt5AWFl1AWHV2AVlVTAVlNSAU1RbAU1tcAbHt6AbHprAbX17AbXtsAcoB9Acn1tAcYGAAcYByAcH+BAcIFxAb35/Ab39wAanx+";
  219.         idata += "Aan5vAa3p8Aa3xqCfYCCCfYJ7CgoF/Cf36CCfnyCCfHqCCgnp7AbmkzAPXM4AFhMXAFBMXAT05SAUU5SAiIaFAhYaQAi4qRAiomR";
  220.         idata += "Ai5GOAjI2OAk5SWAnpSTAn5iZAn5eYAnJ+ZAnJuaAp6WkAo6qhAqKmmAo6GiAqKepApKmnAqaSgAoKKrAq6mgAsLGzArbavAsrW0";
  221.         idata += "Arq2vAtbO0As7WwArLC1At66sArLW3Auru5AuL28Av8HAAwsO+BBAUCBAQQCBBQYDBAgUDBCAUEBBwgEBCgwEBAQoEBCw0MBCgsM";
  222.         idata += "BBAwOBBwQOAFBEQAExQQAFxQTAFhcTAHB0aAGRwaAHR4bAGh0bAFBseAERQeAIiYlAISIlAJyYiAIyciAJCAhAJSQhAKxARAKisR";
  223.         idata += "ALSkQALC0QALg8pALS4pALzArAKi8rAMDEsAKzAsAMy4tAMjMtANzgzAMjczAOTo1ANDk1AOjs2ANTo2AOzw3ANjs3APD04ANzw4";
  224.         idata += "AHT48AOx08APhw9APD49AOSoRAHjkRANC8qAOTQqCR0ZICSUdIAS0xPATktPATk9SAUU5SAVFVYAV1RYAVVZZAWFVZATFlWAT0xW";
  225.         idata += "AYGFdAXGBdAXWFiAXl1iAXFtfAYFxfATEtmAZUxmAS2RoAZ0toAZEppAaGRpAZWZrAamVrAZmdsAa2ZsAaGluAbWhuAbW5zAcm1z";
  226.         idata += "Ab3B1AdG91AcHF2AdXB2AcXJ3AdnF3AcnM9Ad3I9Adnd4AWHZ4APVd4Adz14AWUxlAdFllAdGVqAb3RqCg4KACgYOAAOHNuAMzhu";
  227.         idata += "Ah4iFAhIeFAiYqIAh4mIAi4aIAiouIAj5COAjY+OAkIaLAjpCLAhIWQAj4SQAkpOWAlZKWAlZaYAl5WYAlpSZAmJaZAm5yeAnZue";
  228.         idata += "AnJmUAnpyUAnZ6TAkp2TApaKgApKWgApaajAoqWjAp6imApaemArK6xAsKyxArq+yAsa6yAsbK0As7G0Aubu9AuLm9Aurm4AvLq4";
  229.         idata += "AvsPBAv77BAwr6/AwMK/"
  230.         mdlFlyer = _unpackModel(vdata, idata, [new Material(0xc0c0c0), new Material(0x203040), new Material(0xffc040)]);
  231.         // Fire billboard
  232.         mtx.createGradientBox(32,32,0,0);
  233.         for (i=0; i<8; i++) {
  234.             texFire[i] = new BitmapData(3232true0);
  235.             shp.graphics.clear();
  236.             shp.graphics.beginGradientFill(GradientType.RADIAL, [0x80c0f0, 0x80c0f0], [0,0.5-i*0.05], [0,255], mtx);
  237.             shp.graphics.drawCircle(16,16,16);
  238.             shp.graphics.endFill();
  239.             texFire[i].draw(shp);
  240.         }
  241.         mdlFire = new Model(Vector.<Number>([-1,-1,0,-1,1,0,1,-1,0,1,1,0]), Vector.<Number>([0,0,0,0,1,0,1,0,0,1,1,0]));
  242.         mdlFire.face(0,1,2).face(3,2,1);
  243.     }
  244.     
  245.     private function _unpackModel(vdata:String, idata:String, materials:Array) : Model {
  246.         var i:int, ui:uint, model:Model = new Model(nullnull, Vector.<Material>(materials));
  247.         for (i=0; i<vdata.length; i+=5) {
  248.             _dec.decode(vdata.substr(i, 5) + "A==");
  249.             ui = (_dec.toByteArray().readUnsignedInt())>>2;
  250.             model.vertices.push(((ui&1023)-512)*SCALE, (((ui>>10)&1023)-512)*SCALE, (((ui>>20)&1023)-512)*SCALE);
  251.         }
  252.         for (i=0; i<idata.length; i+=5) {
  253.             _dec.decode(idata.substr(i, 5) + "A==");
  254.             ui = (_dec.toByteArray().readUnsignedInt())>>2;
  255.             model.face(ui&255, (ui>>8)&255, (ui>>16)&255, (ui>>24)&63);
  256.         }
  257.         return model;
  258.     }
  259. }
  260. // Background
  261. //----------------------------------------------------------------------------------------------------
  262. class Sky extends Shape {
  263.     // This color gradation is refered from nemu90kWw's 水平線
  264.     // http://wonderfl.kayac.com/code/2b527a2efe155b7f69330822a3c7f7733ab6ea7e
  265.     public var gradation:* = {
  266.         color:[0x103860, 0x4070B8, 0x60B0E0, 0xD0F0F0, 0x0033c0, 0x0033c0], 
  267.         alpha:[1001001001001000], ratio:[0128192216224255]
  268.     };
  269.     function Sky() {
  270.         var mat:Matrix = new Matrix();
  271.         mat.createGradientBox(700380, Math.PI/2);
  272.         graphics.beginGradientFill("linear", gradation.color, gradation.alpha, gradation.ratio, mat);
  273.         graphics.drawRect(00700380);
  274.         graphics.endFill();
  275.     }
  276. }
  277. class Landscape extends Bitmap {
  278.     // This color gradation is refered from psyrak's BumpyPlanet
  279.     // http://wonderfl.kayac.com/code/d79cd85845773958620f42cb3e6cb363c2020c73
  280.     public var gradation:* = {
  281.         color:[0x000080, 0x0066ff, 0xcc9933, 0x00cc00, 0x996600, 0xffffff], 
  282.         alpha:[100100100100100100], ratio:[09696128168192]
  283.     };
  284.     public var pixels:BitmapData, texture:BitmapData, rect:Rectangle;
  285.     function Landscape(w:int, h:int) {
  286.         texture = new BitmapData(w*2, h*2false0);
  287.         pixels = new BitmapData(w, h, false0);
  288.         rect = new Rectangle(00, w, h);
  289.         super(pixels);
  290.         
  291.         // height map
  292.         var hmap:BitmapData = new BitmapData(w, h, false0);
  293.         hmap.perlinNoise(w*0.5, h*0.510, Math.random()*0xffffffff, truefalse0true);
  294.         hmap.colorTransform(hmap.rect, new ColorTransform(1.51.51.51, -64, -64, -640));
  295.         
  296.         // texture
  297.         var mapR:Array=new Array(256), mapG:Array=new Array(256), mapB:Array=new Array(256);
  298.         var gmap:BitmapData = new BitmapData(256,1,false,0), render:Shape = new Shape(), mat:Matrix = new Matrix();
  299.         mat.createGradientBox(256,1,0,0,0);
  300.         render.graphics.clear();
  301.         render.graphics.beginGradientFill("linear", gradation.color, gradation.alpha, gradation.ratio, mat);
  302.         render.graphics.drawRect(0,0,256,1);
  303.         render.graphics.endFill();
  304.         gmap.draw(render);
  305.         for (var i:int=0; i<256; i++) {
  306.             var col:uint = gmap.getPixel(i, 0);
  307.             mapR[i] = col & 0xff0000;
  308.             mapG[i] = col & 0x00ff00;
  309.             mapB[i] = col & 0x0000ff;
  310.         }
  311.         gmap.dispose();
  312.         mat.identity();
  313.         texture.paletteMap(hmap, hmap.rect, hmap.rect.topLeft, mapR, mapG, mapB);
  314.         // shading
  315.         var smap:BitmapData = new BitmapData(w, h, false0);
  316.         smap.applyFilter(hmap, hmap.rect, hmap.rect.topLeft, new ConvolutionFilter(3,3,[-1,-1,0,-1,0,1,0,1,1],1,0,true,true));
  317.         texture.draw(smap, nullnew ColorTransform(44411601601600), "multiply");
  318.         
  319.         // copy 2x2
  320.         pt.x = w; pt.y = h; texture.copyPixels(texture, hmap.rect, pt);
  321.         pt.x = 0; pt.y = h; texture.copyPixels(texture, hmap.rect, pt);
  322.         pt.x = w; pt.y = 0; texture.copyPixels(texture, hmap.rect, pt);
  323.         pt.x = 0; pt.y = 0;
  324.     }
  325.     
  326.     private var pt:Point = new Point();
  327.     public function update() : void {
  328.         rect.x = (int(rect.x-_globalVel.x)) & (pixels.width-1);
  329.         rect.y = (int(rect.y-_globalVel.z)) & (pixels.height-1);
  330.         pixels.copyPixels(texture, rect, pt);
  331.     }
  332. }
  333. // Flyer
  334. //----------------------------------------------------------------------------------------------------
  335. class Flyer {
  336.     public var p:Vector3D, v:Vector3D, a:Vector3D, mdlFlyer:Model, mdlFire:Model;
  337.     private var _afterBurner:Boolean = false;
  338.     
  339.     function Flyer(x:Number, y:Number, z:Number) : void {
  340.         p = new Vector3D(x, y, z);
  341.         v = new Vector3D();
  342.         a = new Vector3D();
  343.         mdlFlyer = _models.mdlFlyer;
  344.         mdlFire  = _models.mdlFire;
  345.     }
  346.     
  347.     public function update() : void {
  348.         var inkey:int = _key.flag;
  349.         a.x = ((inkey & 1) - ((inkey & 4)>>2))*1.2;
  350.         a.y = (((inkey & 2)>>1) - ((inkey & 8)>>3))*0.8;
  351.         v.x = v.x * 0.8 - p.x*0.05;
  352.         v.y = v.y * 0.8 - p.y*0.05;
  353.         _afterBurner = Boolean(inkey & 32);
  354.         p.x += v.x + a.x * 0.5;
  355.         p.y += v.y + a.y * 0.5;
  356.         v.x += a.x;
  357.         v.y += a.y;
  358.     }
  359.     
  360.     public function render() : void {
  361.         _shape3d.pushMatrix()
  362.             .translate(p.x, p.y+10, p.z).rotateZ(v.x*6-_roll*0.5).rotateY(v.x*3).rotateX(v.y*-4)
  363.             .project(mdlFlyer).renderSolid(_light);
  364.         _screen.draw(_shape3d, _mat2d);
  365.         var scale:Number = (_afterBurner) ? 1.7 : 1.5,
  366.             length:Number = (_afterBurner) ? 1.5 : 1.0,
  367.             rand:Number;
  368.         for (var i:int=0; i<8; i++) {
  369.             rand = scale*(0.9+Math.random()*0.1);
  370.             _shape3d.pushMatrix()
  371.                 .translate(-4.8, -0.9, -18.1-i*length).scale(rand, rand, 1)
  372.                 .project(mdlFire).renderTexture(_models.texFire[i]);
  373.             _screen.draw(_shape3d, _mat2d, null"add");
  374.             _shape3d.popMatrix().pushMatrix()
  375.                 .translate(4.8, -0.9, -18.1-i*length).scale(rand, rand, 1)
  376.                 .project(mdlFire).renderTexture(_models.texFire[i]);
  377.             _screen.draw(_shape3d, _mat2d, null"add");
  378.             _shape3d.popMatrix();
  379.         }
  380.         _shape3d.popMatrix();
  381.     }
  382. }
  383. // MML Sequencer
  384. //   http://wonderfl.kayac.com/user/keim_at_Si
  385. //----------------------------------------------------------------------------------------------------
  386. class Sequencer {
  387.     private var _tracks:Array, _count:int=Track.speed+1;
  388.     function Sequencer(speed:int=2, mml:Array=null) {
  389.         this.speed = speed;
  390.         this.mml = mml;
  391.     }
  392.     public function onSoundFrame() : Boolean {
  393.         if (++_count == Track.speed) {
  394.             for each (var tr:Track in _tracks) tr.execute();
  395.             _count = 0;
  396.             return true;
  397.         }
  398.         return false;
  399.     }
  400.     public function set speed(spd:int) : void {
  401.         Track.speed = spd;
  402.         if (_count >= spd) _count=0;
  403.     }
  404.     public function set drSpeed(spd:int) : void {
  405.         if (spd<0 || spd>2return;
  406.         Track.drs = spd;
  407.     }
  408.     public function set pos(p:int) : void {
  409.         for (var i:int=0; i<p; i++) {
  410.             for each (var tr:Track in _tracks) tr.execute();
  411.         }
  412.     }
  413.     public function set mml(list:Array) : void {
  414.         _tracks = [];
  415.         if (list) {
  416.             for each (var seq:String in list) _tracks.push(new Track(seq));
  417.         }
  418.         _count = 0;
  419.     }
  420. }
  421. class Track {
  422.     static public var codeA:int="a".charCodeAt(), nt:Array=[9,11,0,2,4,5,7], speed:int=3, drs:int=2;
  423.     public var oct:int, len:int, tl:int, dt:int, cnt:int, seq:String, sgn:int, stac:Array, osc:Osc;
  424.     private var _rex:RegExp=/(@i|@o|[a-gkloprsvw<>[|\]$@])([#+])?(-?\d+)?/g;
  425.     function Track(seq:String) {
  426.         osc = Osc.alloc().reset().activate(false);
  427.         reset(seq);
  428.     }
  429.     public function reset(seq_:String) : void {
  430.         seq=seq_; oct=5; len=4; tl=256; dt=0; cnt=0; sgn=0; _rex.lastIndex=0; stac=[];
  431.     }
  432.     public function execute() : void {
  433.         if (--cnt <= 0) {
  434.             for (var i:int=0; i<100; i++) {
  435.                 var res:* = _rex.exec(seq);
  436.                 if (!res) {
  437.                     if (sgn) { _rex.lastIndex = sgn; continue; }
  438.                     else     { cnt = int.MAX_VALUE; break; }
  439.                 }
  440.                 var cmd:int = res[1].charCodeAt();
  441.                 if (cmd>=codeA && cmd<=codeA+6) {
  442.                     cnt = (res[3]) ? int(res[3]) : len;
  443.                     osc.len = cnt * speed;
  444.                     osc.pt = ((nt[cmd-codeA]+oct*12+((res[2])?1:0))<<4) + dt;
  445.                     osc.tl = tl;
  446.                     break;
  447.                 } else if (res[1] == 'r') {
  448.                     cnt = (res[3]) ? int(res[3]) : len;
  449.                     break;
  450.                 } else {
  451.                     switch(res[1]){
  452.                     case 'k': dt  = int(res[3]); break;
  453.                     case 'l': len = int(res[3]); break;
  454.                     case 'o': oct = int(res[3]); break;
  455.                     case 'v': tl  = TinySiOPM.log(int(res[3])*0.0625); break;
  456.                     case '<': oct++; break;
  457.                     case '>': oct--; break;
  458.                     case '@':  osc.ws = int(res[3]);    break;
  459.                     case 's':  osc.dr = (int(res[3])<<drs)&~1break;
  460.                     case 'w':  osc.sw = -(int(res[3])>>(2-drs));   break;
  461.                     case 'p':  osc.pan = (int(res[3])<<4)-64break;
  462.                     case '@i': osc.mod = int(res[3]);   break;
  463.                     case '@o': osc.out = int(res[3]);   break;
  464.                     case '$': sgn = _rex.lastIndex; break;
  465.                     case '[': stac.unshift({p:_rex.lastIndex,c:((res[3])?int(res[3]):2),j:0}); break;
  466.                     case '|'if (stac[0].c == 1) { _rex.lastIndex = stac[0].j; stac.shift(); } break;
  467.                     case ']'
  468.                         stac[0].j = _rex.lastIndex;
  469.                         if (--stac[0].c == 0) stac.shift();
  470.                         else _rex.lastIndex = stac[0].p;
  471.                         break;
  472.                     }
  473.                 }
  474.             }
  475.         }
  476.     }
  477. }
  478. class TinySiOPM {
  479.     private var _output:Vector.<Number>, _zero:Vector.<int>, _pipe:Vector.<int>;
  480.     private var _pitchTable:Vector.<int> = new Vector.<int>(2048true);
  481.     private var _logTable:Vector.<int> = new Vector.<int>(6144true);
  482.     private var _panTable:Vector.<Number> = new Vector.<Number>(129true);
  483.     private var _bufferSize:int, _callbackFrams:int, _onSoundFrame:Function;
  484.     
  485.     // Pass the buffer size and the function calls in each frame.
  486.     function TinySiOPM(bufferSize:int=2048, callbackFrams:int=1024, onSoundFrame:Function=null) {
  487.         var i:int, j:int, p:Number, v:Number, t:Vector.<int>, ft:Array=[0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0];
  488.         for (i=0, p=0; i<192; i++, p+=0.00520833333)                            // create pitchTable[128*16]
  489.             for(v=Math.pow(2, p)*12441.464342886, j=i; j<2048; v*=2, j+=192) _pitchTable[j] = int(v);
  490.         for (i=0; i<32; i++) _pitchTable[i] = (i+1)<<6;                         // [0:31] for white noize
  491.         for (i=0, p=0.0078125; i<256; i+=2, p+=0.0078125)                       // create logTable[12*256*2]
  492.             for(v=Math.pow(213-p), j=i; j<3328; v*=0.5, j+=256) _logTable[j+1] = -(_logTable[j]=int(v));
  493.         for (i=3328; i<6144; i++) _logTable[i] = 0;                             // [3328:6144] is 0-fill area
  494.         for (i=0, p=0; i<129; i++, p+=0.01217671571) _panTable[i]=Math.sin(p)*0.5;  // pan table;
  495.         for (t=Osc.createTable(10), i=0, p=0; i<1024; i++, p+=0.00613592315) t[i] = log(Math.sin(p)); // sin=0
  496.         for (t=Osc.createTable(10), i=0, p=0.75; i<1024; i++, p-=0.00146484375) t[i] = log(p);        // saw=1
  497.         for (t=Osc.createTable(5),  i=0; i<16; i++) t[i+16] = (t[i] = log(ft[i]*0.0625)) + 1;         // famtri=2
  498.         for (t=Osc.createTable(15), i=0; i<32768; i++) t[i] = log(Math.random()-0.5);                 // wnoize=3
  499.         for (i=0; i<8; i++) for (t=Osc.createTable(4), j=0; j<16; j++) t[j] = (j<=i) ? 192 : 193;     // pulse=4-11
  500.         _zero = new Vector.<int>(bufferSize, true);                             // allocate zero buffer
  501.         _pipe = new Vector.<int>(bufferSize, true);                             // allocate fm pipe buffer
  502.         _output = new Vector.<Number>(bufferSize*2true);                      // allocate stereo out
  503.         _bufferSize = bufferSize;
  504.         _callbackFrams = callbackFrams; 
  505.         _onSoundFrame = onSoundFrame;                                           // set parameters
  506.         for (i=0; i<bufferSize; i++) { _pipe[i]=_zero[i]=0; }                   // clear buffers
  507.     }
  508.     
  509.     // calculate index of logTable
  510.     static public function log(n:Number) : int {
  511.         return (n<0) ? ((n<-0.00390625) ? (((int(Math.log(-n) * -184.66496523 + 0.5) + 1) << 1) + 1) : 2047)
  512.                      : ((n> 0.00390625) ? (( int(Math.log( n) * -184.66496523 + 0.5) + 1) << 1)      : 2046);
  513.     }
  514.     // reset all oscillators
  515.     public function reset() : void {
  516.         for (var o:Osc=Osc._tm.n; o!=Osc._tm; o=o.inactivate().n) { o.fl = Osc._fl; }
  517.     }
  518.     // Returns stereo output as Vector.<Number>(bufferSize*2).
  519.     public function render() : Vector.<Number> {
  520.         var i:int, j:int, ph:int, dph:int, mod:int, sh:int, tl:int, lout:int, v:int, imax:int
  521.             osc:Osc, tm:Osc, l:Number, r:Number, wv:Vector.<int>, fm:Vector.<int>, base:Vector.<int>, 
  522.             out:Vector.<int>=_pipe, lt:Vector.<int>=_logTable, stereoOut:Vector.<Number> = _output;
  523.         imax = _bufferSize<<1;
  524.         for (i=0; i<imax; i++) stereoOut[i] = 0;
  525.         for (imax=_callbackFrams; imax<=_bufferSize; imax+=_callbackFrams) {
  526.             if (_onSoundFrame!=null) _onSoundFrame();
  527.             tm = Osc._tm;
  528.             for (osc=tm.n; osc!=tm; osc=osc.update()) {
  529.                 dph=_pitchTable[osc.pt]; ph=osc.ph; mod=osc.mod+10; sh=osc.sh; tl=osc.tl; wv=osc.wv;
  530.                 fm=(osc.mod==0)?_zero:_pipe; base=(osc.out!=2)?_zero:_pipe;
  531.                 for (i = imax-_callbackFrams; i < imax; i++) {
  532.                     v = ((ph + (fm[i] << mod))& 0x3ffffff) >> sh;
  533.                     lout = wv[v] + tl;
  534.                     out[i] = lt[lout] + base[i];
  535.                     ph = (ph + dph) & 0x3ffffff;
  536.                 }
  537.                 osc.ph = ph;
  538.                 if (osc.out==0) {
  539.                     l = _panTable[64-osc.pan] * 0.0001220703125;
  540.                     r = _panTable[64+osc.pan] * 0.0001220703125;
  541.                     for (i=imax-_callbackFrams, j=i*2; i<imax; i++) {
  542.                         stereoOut[j] += out[i]*l; j++;
  543.                         stereoOut[j] += out[i]*r; j++;
  544.                     }
  545.                 }
  546.             }
  547.         }
  548.         return stereoOut;
  549.     }
  550.     
  551.     // note on
  552.     public function noteOn(pitch:int, length:int=0, vol:Number=0.5, wave:int=0, decay:int=6, sweep:int=0, pan:int=0) : Osc {
  553.         var osc:Osc = Osc.alloc().reset();
  554.         osc.pt = pitch;
  555.         osc.len = length;
  556.         osc.tl = log(vol);
  557.         osc.ws = wave;
  558.         osc.dr = decay<<2;
  559.         osc.sw = sweep; 
  560.         osc.pan = pan;
  561.         return osc.activate(true);
  562.     }
  563. }
  564. class Osc {
  565.     // create new wave table and you can refer the table by '@' command.
  566.     static public function createTable(b:int) : Vector.<int> {
  567.         _w.push(new Vector.<int>(1<<b,true)); _s.push(26-b);
  568.         return _w[_w.length-1];
  569.     }
  570.     static public var _w:Array=[], _s:Array=[], _fl:Osc=new Osc(), _tm:Osc=new Osc();
  571.     static public function alloc():Osc{ if(_fl.p==_fl)return new Osc();var r:Osc=_fl.p;_fl.p=r.p;r.p.n=_fl;return r; }
  572.     public function into(x:Osc):Osc{ p=x.p;n=x;p.n=this;n.p=this;return this; }
  573.     public var p:Osc, n:Osc, fl:Osc, pt:int, len:int, ph:int;
  574.     public var tl:int, sw:int, dr:int, wv:Vector.<int>, sh:int, mod:int, out:int, pan:int;
  575.     public function set ws(t:int) : void { wv=_w[t]; sh=_s[t]; }
  576.     public function Osc() { p = n = this; }
  577.     public function update() : Osc { tl+=dr; pt+=sw; pt&=2047return (--len==0||tl>3328) ? (inactivate().n) : n; }
  578.     public function reset() : Osc { ph=0; pt=0; len=0; tl=3328; sw=0; dr=24; pan=0; ws=0; mod=0; out=0return this; }
  579.     public function activate(autoFree:Boolean=false) : Osc { into(_tm); fl=(autoFree)?_fl:nullreturn this; }
  580.     public function inactivate() : Osc { tl=3328if(!fl)return thisvar r:Osc=p; p.n=n; n.p=p; into(fl); return r; }
  581.     public function isActive() : Boolean { return (tl<3328); }
  582. }
  583. // 3D Engine
  584. //   http://wonderfl.kayac.com/user/keim_at_Si
  585. //----------------------------------------------------------------------------------------------------
  586. /** 3D Shape */
  587. class Shape3D extends Shape {
  588.     /** model view matrix */
  589.     public var matrix:Matrix3D;
  590.     private var _modelProjected:Model = null;
  591.     private var _facesProjected:Vector.<Face> = new Vector.<Face>();
  592.     private var _vertexOnWorld:Vector.<Number> = new Vector.<Number>();
  593.     private var _vout:Vector.<Number> = new Vector.<Number>();
  594.     private var _projectionMatrix:Matrix3D;
  595.     private var _matrixStac:Vector.<Matrix3D> = new Vector.<Matrix3D>();
  596.     private var _cmdTriangle:Vector.<int> = Vector.<int>([1,2,2]);
  597.     private var _cmdQuadrangle:Vector.<int> = Vector.<int>([1,2,2,2]);
  598.     private var _data:Vector.<Number> = new Vector.<Number>(8true);
  599.     
  600.     /** constructor */
  601.     function Shape3D(focus:Number=300) {
  602.         var projector:PerspectiveProjection = new PerspectiveProjection()
  603.         projector.focalLength = focus;
  604.         _projectionMatrix = projector.toMatrix3D();
  605.         matrix = new Matrix3D();
  606.         _matrixStac.length = 1;
  607.         _matrixStac[0] = matrix;
  608.     }
  609.     
  610.     /** push matrix */
  611.     public function pushMatrix() : Shape3D { _matrixStac.push(matrix.clone()); return this; }
  612.     
  613.     /** pop matrix */
  614.     public function popMatrix() : Shape3D { matrix = (_matrixStac.length == 1) ? matrix : _matrixStac.pop(); return this; }
  615.     
  616.     /** translate */
  617.     public function translate(x:Number, y:Number, z:Number) : Shape3D { matrix.prependTranslation(x, y, z); return this; }
  618.     
  619.     /** scale */
  620.     public function scale(x:Number, y:Number, z:Number) : Shape3D { matrix.prependScale(x, y, z); return this; }
  621.     
  622.     /** rotate */
  623.     public function rotate(angle:Number, axis:Vector3D) : Shape3D { matrix.prependRotation(angle, axis); return this; }
  624.     public function rotateX(angle:Number) : Shape3D { matrix.prependRotation(angle, Vector3D.X_AXIS); return this; }
  625.     public function rotateY(angle:Number) : Shape3D { matrix.prependRotation(angle, Vector3D.Y_AXIS); return this; }
  626.     public function rotateZ(angle:Number) : Shape3D { matrix.prependRotation(angle, Vector3D.Z_AXIS); return this; }
  627.     
  628.     /** project */
  629.     public function project(model:Model) : Shape3D {
  630.         var i0x3:int, i1x3:int, i2x3:int, x01:Number, x02:Number, y01:Number, y02:Number, z01:Number, z02:Number,
  631.             viewx:Number, viewy:Number, viewz:Number;
  632.         matrix.transformVectors(model.vertices, _vertexOnWorld);
  633.         _facesProjected.length = 0;
  634.         var vertices:Vector.<Number> = _vertexOnWorld;
  635.         for each (var face:Face in model.faces) {
  636.             i0x3 = (face.i0<<1) + face.i0;
  637.             i1x3 = (face.i1<<1) + face.i1;
  638.             i2x3 = (face.i2<<1) + face.i2;
  639.             face.x = (vertices[i0x3] + vertices[i1x3] + vertices[i2x3]) * 0.333333333333;
  640.             x01 = vertices[i1x3] - vertices[i0x3];
  641.             x02 = vertices[i2x3] - vertices[i0x3];
  642.             i0x3++; i1x3++; i2x3++;
  643.             face.y = (vertices[i0x3] + vertices[i1x3] + vertices[i2x3]) * 0.333333333333;
  644.             y01 = vertices[i1x3] - vertices[i0x3];
  645.             y02 = vertices[i2x3] - vertices[i0x3];
  646.             i0x3++; i1x3++; i2x3++;
  647.             face.z = (vertices[i0x3] + vertices[i1x3] + vertices[i2x3]) * 0.333333333333;
  648.             z01 = vertices[i1x3] - vertices[i0x3];
  649.             z02 = vertices[i2x3] - vertices[i0x3];
  650.             face.normal.z = x02*y01 - x01*y02;
  651.             face.normal.x = y02*z01 - y01*z02;
  652.             face.normal.y = z02*x01 - z01*x02;
  653.             if (face.x * face.normal.x + face.y * face.normal.y + face.z * face.normal.z <= 0) {
  654.                 face.normal.normalize();
  655.                 _facesProjected.push(face);
  656.             }
  657.         }
  658.         _facesProjected.sort(function(f1:Face, f2:Face) : Number { return f2.z - f1.z; });
  659.         _modelProjected = model;
  660.         return this;
  661.     }
  662.     /** render solid */
  663.     public function renderSolid(light:Light) : Shape3D {
  664.         var idx:int, mat:Material, materials:Vector.<Material> = _modelProjected.materials;
  665.         Utils3D.projectVectors(_projectionMatrix, _vertexOnWorld, _vout, _modelProjected.texCoord);
  666.         graphics.clear();
  667.         for each (var face:Face in _facesProjected) {
  668.             mat = materials[face.mat];
  669.             graphics.beginFill(mat.getColor(light, face.normal), mat.alpha);
  670.             idx = face.i0<<1;
  671.             _data[0] = _vout[idx]; idx++;
  672.             _data[1] = _vout[idx]; 
  673.             idx = face.i1<<1;
  674.             _data[2] = _vout[idx]; idx++;
  675.             _data[3] = _vout[idx]; 
  676.             idx = face.i2<<1;
  677.             _data[4] = _vout[idx]; idx++;
  678.             _data[5] = _vout[idx]; 
  679.             graphics.drawPath(_cmdTriangle, _data);
  680.             graphics.endFill();
  681.         }
  682.         return this;
  683.     }
  684.     
  685.     /** render with texture */
  686.     public function renderTexture(texture:BitmapData) : Shape3D {
  687.         var idx:int, mat:Material;
  688.         Utils3D.projectVectors(_projectionMatrix, _vertexOnWorld, _vout, _modelProjected.texCoord);
  689.         graphics.clear();
  690.         graphics.beginBitmapFill(texture, nullfalsetrue);
  691.         graphics.drawTriangles(_vout, _modelProjected.indices, _modelProjected.texCoord);
  692.         graphics.endFill();
  693.         return this;
  694.     }
  695. }
  696. /** Face */
  697. class Face {
  698.     public var i0:int, i1:int, i2:int, i3:int, mat:int, x:Number, y:Number, z:Number, normal:Vector3D = new Vector3D();
  699.     static private var _freeList:Vector.<Face> = new Vector.<Face>();
  700.     static public function alloc() : Face { return _freeList.pop() || new Face(); }
  701.     static public function free(face:Face) : void { _freeList.push(face); }
  702. }
  703. /** Model */
  704. class Model {
  705.     public var materials:Vector.<Material>;                 // material list
  706.     public var vertices:Vector.<Number>;                    // vertex
  707.     public var texCoord:Vector.<Number>;                    // texture coordinate
  708.     public var faces:Vector.<Face> = new Vector.<Face>();   // face list
  709.     private var _indices:Vector.<int> = new Vector.<int>(); // temporary index list
  710.     
  711.     /** indices as Vector.<int> */
  712.     public function get indices() : Vector.<int> {
  713.         _indices.length = 0;
  714.         for each (var face:Face in faces) { _indices.push(face.i0, face.i1, face.i2); }
  715.         return _indices;
  716.     }
  717.     /** constructor */
  718.     function Model(vertices:Vector.<Number>=null, texCoord:Vector.<Number>=null, materials:Vector.<Material>=null) {
  719.         this.vertices = vertices || new Vector.<Number>();
  720.         this.texCoord = texCoord || new Vector.<Number>();
  721.         this.materials = materials || Vector.<Material>([new Material()]);
  722.     }
  723.     
  724.     /** clear */
  725.     public function clear() : Model {
  726.         for each (var face:Face in faces) Face.free(face);
  727.         faces.length = 0;
  728.         return this;
  729.     }
  730.     
  731.     /** register face */
  732.     public function face(i0:int, i1:int, i2:int, mat:int=0) : Model {
  733.         var face:Face = Face.alloc();
  734.         face.i0 = i0;
  735.         face.i1 = i1;
  736.         face.i2 = i2;
  737.         face.mat = mat;
  738.         faces.push(face);
  739.         return this;
  740.     }
  741. }
  742. /** Light */
  743. class Light {
  744.     private var _direction:Vector3D = new Vector3D();
  745.     private var _halfVector:Vector3D = new Vector3D();
  746.     public function get direction()  : Vector3D { return _direction; }
  747.     public function get halfVector() : Vector3D { return _halfVector; }
  748.     
  749.     /** constructor (set position) */
  750.     function Light(x:Number=1, y:Number=1, z:Number=1) { setPosition(x, y, z); }
  751.     
  752.     /** set position */
  753.     public function setPosition(x:Number, y:Number, z:Number) : void {
  754.         _direction.x = x;
  755.         _direction.y = y;
  756.         _direction.z = z; 
  757.         _direction.normalize();
  758.         _halfVector.x = _direction.x;
  759.         _halfVector.y = _direction.y;
  760.         _halfVector.z = _direction.z + 1
  761.         _halfVector.normalize();
  762.     }
  763. }
  764. /** Material */
  765. class Material {
  766.     public var colorTable:BitmapData = new BitmapData(256,256,false);
  767.     public var alpha:Number = 1;
  768.     private var _nega_filter:int = 0;
  769.     
  770.     /** constructor */
  771.     function Material(color:uint=0xc0c0c0, alpha:Number=1.0) { setColor(color, alpha); }
  772.     
  773.     /** set color. */
  774.     public function setColor(color:uint, alpha:Number1.0
  775.                              amb:int=64, dif:int=192, spc:int=0,  pow:Number=8
  776.                              emi:int=0,  doubleSided:Boolean=false) : Material 
  777.     {
  778.         var i:int, r:int, c:int, rc:Rectangle;
  779.         var lightTable:BitmapData = new BitmapData(256256false);
  780.         
  781.         // color/alpha
  782.         colorTable.fillRect(colorTable.rect, color);
  783.         this.alpha = alpha;
  784.         // ambient/diffusion/emittance
  785.         var ea:Number = (256-emi)*0.00390625, eb:Number = emi*0.5;
  786.         r = dif - amb;
  787.         rc = new Rectangle(001256);
  788.         for (i=0; i<256; ++i) {
  789.             rc.x = i;
  790.             lightTable.fillRect(rc, (((i*r)>>8)+amb)*0x10101);
  791.         }
  792.         colorTable.draw(lightTable, nullnew ColorTransform(ea,ea,ea,1,eb,eb,eb,0), BlendMode.HARDLIGHT);
  793.         
  794.         // specular/power
  795.         if (spc > 0) {
  796.             rc = new Rectangle(002561);
  797.             for (i=0; i<256; ++i) {
  798.                 rc.y = i;
  799.                 c = int(Math.pow(i*0.0039215686, pow)*spc);
  800.                 lightTable.fillRect(rc, ((c<255)?c:255)*0x10101);
  801.             }
  802.             colorTable.draw(lightTable, nullnull, BlendMode.ADD);
  803.         }
  804.         // double side
  805.         _nega_filter = (doubleSided) ? -1 : 0;
  806.         
  807.         lightTable.dispose();
  808.         return this;
  809.     }
  810.     
  811.     /** calculate color by light and normal vector. */
  812.     public function getColor(light:Light, normal:Vector3D) : uint {
  813.         var dir:Vector3D = light.direction, hv:Vector3D = light.halfVector;
  814.         var ln:int = int((dir.x * normal.x + dir.y * normal.y + dir.z * normal.z)*255),
  815.             hn:int = int((hv.x  * normal.x + hv.y  * normal.y + hv.z  * normal.z)*255);
  816.         if (ln<0) ln = (-ln) & _nega_filter;
  817.         if (hn<0) hn = (-hn) & _nega_filter;
  818.         return colorTable.getPixel(ln, hn);
  819.     }
  820. }
noswf
Get Adobe Flash Player