<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkQMSH89eCp7ImA9WhBaEEQ.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877</id><updated>2013-05-20T15:53:09.160-07:00</updated><category term="ModelLoader" /><category term="TransformElement" /><category term="Decorator" /><category term="ANE" /><category term="loadLanguageXML.Locale" /><category term="Sign" /><category term="Proscenium" /><category term="uploadFromByteArray" /><category term="Error 1004" /><category term="Windows" /><category term="MovieClips" /><category term=".a" /><category term="Starling framework" /><category term="IPhone" /><category term="Flash" /><category term="ADL" /><category term="Games" /><category term="Packing" /><category term="IOS" /><category term="gesture works" /><category term="SWC" /><category term="AnimationTrack" /><category term="Flex" /><category term="TUIO" /><category term="Events" /><category term="MeshElementDataPolylist" /><category term="Molehil" /><category term="OpenGL" /><category term="Zip" /><category term="Static Library" /><category term="Memebership function" /><category term="Context3DTextureFormat.BGRA" /><category term="AIR" /><category term="Game Server" /><category term="Design" /><category term="format" /><category term="Rules" /><category term="XSimulator" /><category term="BlaseDS" /><category term="addSources" /><category term="Fire effect" /><category term="Pattern" /><category term="Interfaces" /><category term="AIR 3.2" /><category term="Manifold" /><category term="Certificate" /><category term="Multidimensional" /><category term="mx_internal" /><category term="BVH" /><category term="Level of confidence" /><category term="Optimization" /><category term="ScenMeshData" /><category term="Serialization" /><category term="DAE" /><category term="AIR 3.0" /><category term="Perlin" /><category term="UNION" /><category term="Template" /><category term="JAVA" /><category term="Agal" /><category term="uploadFromBitmapData" /><category term="Flash Develop IDE" /><category term="fragment shader" /><category term="ByteArray" /><category term="Bitmap" /><category term="Threads" /><category term="Motion" /><category term="Texture Packager" /><category term="MovieClip" /><category term="Objective C" /><category term="Multiplayer server" /><category term="decorating" /><category term="Degree of Membership" /><category term="Artificial Intelligence" /><category term="Fuzzy Logic" /><category term="MD2" /><category term="SkinController" /><category term="Workers" /><category term="extends" /><category term="2D" /><category term="Biovision" /><category term="Deffuzification" /><category term="Multi" /><category term="Bone" /><category term="BitmapData" /><category term="Viewer" /><category term="Components" /><category term="Action Script" /><category term="touch simulator" /><category term="JSON" /><category term="Native extension" /><category term="Android" /><category term="Animation" /><category term="gotoAndPlay" /><category term="Inheritance" /><category term="Flash 11" /><category term="Diamond" /><category term="MeshDataElement" /><category term="Array of Arrays" /><category term="Feathers UI" /><category term="Morph" /><category term="Custom MovieClip" /><category term="SimController" /><category term="Flash Builder" /><category term="override" /><category term="AS3" /><category term="Localization" /><category term="Flames" /><category term="Collada" /><category term="BGRA to ARGB" /><category term="Flash Professional CS6" /><category term="Numeric Slider" /><category term="Matrix" /><category term="filters" /><category term="Package" /><category term="Texture" /><category term="3D" /><category term="Stage3D" /><category term="Stage 3D" /><category term="Multilanguage" /><category term="Character Animation" /><category term="String.Format" /><category term="Vector" /><category term="AMF" /><category term="AnimationController" /><category term="problem" /><title>Action Script Top Notch</title><subtitle type="html">Flash, Flex, Action Script, Games, Tutorials, libraries,frameworks, mobile, social network systems, virtual worlds, AI, Fuzzy logic</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://winxalex.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/AyfFy" /><feedburner:info uri="blogspot/ayffy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;Ak4GQns9fSp7ImA9WhBaEEU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-1177621821120457115</id><published>2013-05-15T08:41:00.002-07:00</published><updated>2013-05-20T15:28:43.565-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-20T15:28:43.565-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="3D" /><category scheme="http://www.blogger.com/atom/ns#" term="addSources" /><category scheme="http://www.blogger.com/atom/ns#" term="Action Script" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash Professional CS6" /><category scheme="http://www.blogger.com/atom/ns#" term="Starling framework" /><category scheme="http://www.blogger.com/atom/ns#" term="MovieClip" /><category scheme="http://www.blogger.com/atom/ns#" term="gotoAndPlay" /><category scheme="http://www.blogger.com/atom/ns#" term="2D" /><title>Starling MovieClip Hiccup! (Games)</title><content type="html">&lt;i&gt;&amp;nbsp; &amp;nbsp;Even Daniel admits that should be enhanced and fixed when issue gets priority&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; What is important in any animation?

&lt;br /&gt;
&lt;br /&gt;
By my opinion is to see all the frames even in dropped frame rate then expected.
I noticed big hiccups in how Starling implements MovieClip.advanceTime(and no matter what you do, you couldn't get precise duration of the frame&amp;nbsp;especially&amp;nbsp;with difference in time of frames of AVM depending of workload, so if you are expecting some currentFrame to be hit might never be.
I think I&amp;nbsp;remember&amp;nbsp;Adobe encourages making timings based on TimerEvent and not onEnterFrame.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;You could also make adjusting of difference of more precise time with getTimer() but you never should allowed you jump frame cos previous frame have took some or all of his time. This would tell you at least to drop frame rate or try to solve bottlenecks.

&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Why not to using the AVM "juggler", but creating new one? I personally don't like whole concept of juggler cos first it makes Starling different from Flash, second hanging one MovieClip hangs all animations depending &amp;nbsp;of juggler (could happen to AVM too, but that is on global) and your advanceTime function is called no matter your MovieClip is stopped or not (checking flag and go in or go out of).&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Next "stop()" function should be stop(). Not reset. ;)&lt;br /&gt;
&lt;br /&gt;
How many cases we want MovieClip to start playing on creation.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;If you see the animation carefully you would see that cos of different sizes of frames (width/height)

&lt;br /&gt;
&lt;pre class="brush: xml;"&gt;&amp;nbsp;SubTexture name="flight_03" x="916" y="1" width="382" height="286" frameX="-32" frameY="-73" frameWidth="440" frameHeight="440"/&amp;gt;
&amp;nbsp; &amp;nbsp; SubTexture name="flight_04" x="1314" y="285" width="402"

height="218"&lt;/pre&gt;
after switching the texture some parts could be cut and give also wrong hit area so you need to fix with
readjustSize() after switching of texture.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;The other big problem is that often you have&amp;nbsp;multiply&amp;nbsp;animations of the Character (walking,runing,jumping...) and some of them should be combined(ex. run first and then run second on the end of first....). Also you need to trigger some action on some frame and not just last.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;What Daniel proposed on forums for mulitiply animations and also saw on guy having done tutorial on AciveTuts by creating MovieClip for every animation and using switch in you loop by (key or/and mouse action) &amp;nbsp;and which includes

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;&amp;nbsp;removeChild(currentMc);
juggler.remove(currentMc);
addChild(newMc);
juggler.add(newMc)
&lt;/pre&gt;
&lt;br /&gt;
and count numbers of executing above, when checking loop is very fast and mouse/keys changes happen very often so the need of change of the Character.

At the top of the cake aren't the fundaments of Flash are actually gotoAndPlay and gotoAndStop() :))).



Other thing that boders me alot in Starling are big use of "private" modifier instead of "protected" and top of that when you create MovieClip you need to supply textures (not adequate in many situation see the feedback of the people in forums).





&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt; //Most used call
  //mc= new MovieClipEx(Assets.getTextureAtlas("StarlingTexture","StarlingXml").getTextures("flight_"));
  
   //Add textures later
   //mc= new MovieClipEx();
   //mc.textures = Assets.getTextureAtlas("StarlingTexture", "StarlingXml").getTextures("flight_");
   

   //Add Label, Sound and Call frame script

   mc= new MovieClipEx();
   mc.textures = Assets.getTextureAtlas("StarlingTexture", "StarlingXml").getTextures("flight_");
   mc.setFrameSound(5, Assets.getSound("WingFlapSound"));
   mc.setFrameLabel(new FrameLabel("Starling Stand", 14));
   mc.fps = 60;

  //try adding label again
   try {
    mc.setFrameLabel(new FrameLabel("Starling Stand",14));
   }catch (e:Error) {
    trace("Intentional error", e);
   }
   trace("Label at frame 14 is:" + mc.getFrameLabel(14));
   //mc.setFrameDuration(14, 5);//set frame duration to 5s
   mc.addFrameScript(14, callback14,mc);//add arguments to callback
   mc.addFrameScript(15, callback15);&lt;/pre&gt;
&lt;pre class="brush: as3;"&gt;//add Complete and enter frame events listeners
mc.addEventListener(Event.COMPLETE, onComplete);
mc.addEventListener(Event.ENTER_FRAME, onEnterFrame);&lt;/pre&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;    
   //GOTO and Stop by ID and label/FrameLabel
   // mc.gotoAndStop(14);
   //mc.gotoAndStop("Starling Stand");
   //mc.gotoAndStop(new FrameLabel("Starling Stand", 14));
  

//mc.nextFrame();
//mc.gotoAndStop("Starling Stand");
//mc.prevFrame();

//mc.gotoAndPlay(5);
&lt;/pre&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;  
   mc.play();
   
   this.addChild(mc);
   //Starling.juggler.add(mc) &amp;nbsp;NO MORE;
&lt;/pre&gt;
&lt;pre class="brush: as3;"&gt;//Use original Starling MovieClip (hiccup test)
var mcOrg:MovieClipTrace = new MovieClipTrace( Assets.getTextureAtlas("StarlingTexture", "StarlingXml").getTextures("flight_"),60);
   mcOrg.x = 400;
   this.addChild(mcOrg)
   Starling.juggler.add(mcOrg);


 private function onEnterFrame(e:Event):void 
  {
   trace("MovieClipEx currentFrame:", MovieClipEx(e.target).currentFrame);
  }
  
  private function onComplete(e:Event):void 
  {
   trace("MovieClipEx Completed");
  }
  
  public function callback15():void 
  {
   mc.fps = 12;
   //mc.stop();
  }
  
  
  public function callback14(mc:MovieClipEx):void {
   trace("callback from frame id "+mc.currentFrameLabel.frame+" with label:"+mc.currentFrameLabel.name);
   
  }
  
 &lt;/pre&gt;
MovieClipEx can be used also with&amp;nbsp;animations&amp;nbsp;imported from swf and swc.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Not tested but I think it would work, if you concat new Vector textures( Character have received new fighting moves) to the current textures or add new Vector of textures (morphing or adding new armor of the Character).&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;



&lt;a href="http://www.winx.ws/blog/movieclipexteststarling.zip"&gt;Download&lt;/a&gt;



&lt;script type="text/javascript"&gt;
 SyntaxHighlighter.highlight();
&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/-_Dvn2N9EMY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/1177621821120457115/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2013/05/starling-movieclip-hiccup-games.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/1177621821120457115?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/1177621821120457115?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/-_Dvn2N9EMY/starling-movieclip-hiccup-games.html" title="Starling MovieClip Hiccup! (Games)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2013/05/starling-movieclip-hiccup-games.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMHRH47fSp7ImA9WhBbGE0.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-7816207498273299017</id><published>2013-05-10T17:02:00.001-07:00</published><updated>2013-05-17T08:10:35.005-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-17T08:10:35.005-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Objective C" /><category scheme="http://www.blogger.com/atom/ns#" term="AIR" /><category scheme="http://www.blogger.com/atom/ns#" term="IOS" /><category scheme="http://www.blogger.com/atom/ns#" term="Static Library" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="IPhone" /><category scheme="http://www.blogger.com/atom/ns#" term="ANE" /><category scheme="http://www.blogger.com/atom/ns#" term=".a" /><category scheme="http://www.blogger.com/atom/ns#" term="Native extension" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash 11" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash Develop IDE" /><title>Total Objective C Native Extension development in Flash Develop on Windows</title><content type="html">In order Flash Develop to support some Objective C highlighting we need to do some upgrade.
Open MainMenu.xml from FlashDevelop installation/Settings folder and add:

&lt;br /&gt;
&lt;pre class="brush: xml;"&gt;&lt;button click="NewFromTemplate" label="ANE ObjectiveC(.m)Document" shortcut="Control|D0" tag="m;$(BaseDir)\Templates\M.fdt"&gt;&lt;/button&gt;
&lt;/pre&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-syZdxSxJ1J4/UYzobcybEYI/AAAAAAAAAN8/gotut6RpznA/s1600/Clipboard01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="201" src="http://1.bp.blogspot.com/-syZdxSxJ1J4/UYzobcybEYI/AAAAAAAAAN8/gotut6RpznA/s320/Clipboard01.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
This would add additional item in menu.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-ouzMLDXYRaw/UYzpjL2KMnI/AAAAAAAAAOE/j7iJhNiM8nQ/s1600/Clipboard02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://4.bp.blogspot.com/-ouzMLDXYRaw/UYzpjL2KMnI/AAAAAAAAAOE/j7iJhNiM8nQ/s320/Clipboard02.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;Now add M.fdt in FlashDevelop install\Templates, which is template for creation basic Adobe Native Extension .m file.

Add M.xml FlashDevelop install\Languages which  contain keywords/functions set and which would add   on ObjectiveC .m,.h,.mm syntax coloring styles.
M.xml contains also FlashExtension functions/keywords.(Note some work on adding keywords of most of used frameworks if not all should be done)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-MhDBDPMqnNU/UY0Xgk3m4DI/AAAAAAAAAOU/RSwqlViyQOs/s1600/Clipboard03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="http://1.bp.blogspot.com/-MhDBDPMqnNU/UY0Xgk3m4DI/AAAAAAAAAOU/RSwqlViyQOs/s320/Clipboard03.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;Now we have syntax highlighting we need IOS SDK on windows. Pierre-Marry Baty have done tremendous work to bring Apple IOS SDK on windows and keep updated with every release. I deeply we encourage you to donate to support his work. He also built template that you can run in Visual Studio.&lt;br /&gt;
&lt;a href="http://www.pmbaty.com/iosbuildenv/"&gt;Download &lt;/a&gt;and install IOS Build Environment.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-pVI4r22nSrU/UY2HzbpUgLI/AAAAAAAAAOk/jdZmuJQCEyM/s1600/Clipboard05.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="60" src="http://4.bp.blogspot.com/-pVI4r22nSrU/UY2HzbpUgLI/AAAAAAAAAOk/jdZmuJQCEyM/s640/Clipboard05.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;Create folder Adobe AIR.framework inside IOSBuildEnvrionment\SDK\System\Library\Frameworks
and copy content of your AIRSDK\runtimes\air\mac\Adobe AIR.framework\Versions\1.0 into.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Copy Flash Develop template into installFlashDevelop\Projects folder and open project&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-vT_CV8Q0_Yc/UY2IlXZYtqI/AAAAAAAAAOs/hQq1XmYvfGk/s1600/Clipboard04.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://3.bp.blogspot.com/-vT_CV8Q0_Yc/UY2IlXZYtqI/AAAAAAAAAOs/hQq1XmYvfGk/s320/Clipboard04.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Execute Run.bat.

 

Voilla !!! Library is created.&lt;br /&gt;
&amp;nbsp;Now you can use other Flash develop &lt;a href="http://winxalex.blogspot.com/2012/04/native-extension-template-flash-develop.html"&gt;template&lt;/a&gt; to create your Adobe Native Extension.&amp;nbsp;
&lt;br /&gt;
&lt;br /&gt;
And if you are lazy  just copy &lt;a href="http://www.winx.ws/blog/FlashDevelopObjectC.zip"&gt;this&lt;/a&gt; into your FlashDevelop and have fun.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
 SyntaxHighlighter.highlight();
&lt;/script&gt;
&lt;a class="twitter-timeline" data-widget-id="334804742494646272" href="https://twitter.com/Winx_Alex"&gt;Tweets by @Winx_Alex&lt;/a&gt;
&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");&lt;/script&gt;

&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/TsL2qALoXzQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/7816207498273299017/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2013/05/total-object-c-native-extension.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7816207498273299017?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7816207498273299017?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/TsL2qALoXzQ/total-object-c-native-extension.html" title="Total Objective C Native Extension development in Flash Develop on Windows" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-syZdxSxJ1J4/UYzobcybEYI/AAAAAAAAAN8/gotut6RpznA/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2013/05/total-object-c-native-extension.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8DQnk5eyp7ImA9WhBbGE0.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-2939525419232206197</id><published>2013-05-03T15:19:00.000-07:00</published><updated>2013-05-17T08:34:33.723-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-17T08:34:33.723-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AIR" /><category scheme="http://www.blogger.com/atom/ns#" term="3D" /><category scheme="http://www.blogger.com/atom/ns#" term="Numeric Slider" /><category scheme="http://www.blogger.com/atom/ns#" term="Games" /><category scheme="http://www.blogger.com/atom/ns#" term="Feathers UI" /><category scheme="http://www.blogger.com/atom/ns#" term="Starling framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Components" /><title>Numeric Slider (Feathers,Starling)</title><content type="html">Recently I've built Numeric Slider,thx to great infrastructure Josh have done in Feathers UI, which is useful&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/NumericSlider.zip"&gt;component&lt;/a&gt; for use in pair when defining ranges.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&amp;nbsp;

&lt;a href="http://3.bp.blogspot.com/-hFYqtqr416U/UYT_4reym0I/AAAAAAAAANk/1kOckXPLlRs/s1600/Clipboard02.jpg" imageanchor="1"&gt;&lt;img border="0" height="50" src="http://3.bp.blogspot.com/-hFYqtqr416U/UYT_4reym0I/AAAAAAAAANk/1kOckXPLlRs/s400/Clipboard02.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;

&lt;a href="http://4.bp.blogspot.com/-YjWErYL8_jA/UYUAJNJE72I/AAAAAAAAANs/QHltPqD2Ifk/s1600/Clipboard03.jpg" imageanchor="1"&gt;&lt;img border="0" height="45" src="http://4.bp.blogspot.com/-YjWErYL8_jA/UYUAJNJE72I/AAAAAAAAANs/QHltPqD2Ifk/s400/Clipboard03.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;
Usage:
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;var numSlider:NumericSlider = new NumericSlider();&amp;nbsp;

&amp;nbsp;numSlider.maximum = 100;&amp;nbsp;

&amp;nbsp;numSlider.minimum = 0;

&amp;nbsp;numSlider.value = 55;






&amp;nbsp;//numSlider.textEditorProperties.width = 100;
   //numSlider.textEditorProperties.height = 100;
   
//you can use template settings or custom
   //numSlider.minimumTrackProperties.defaultSkin=new Image(Texture...
   //numSlider.thumbProperties.defaultSkin=new Image(Texture...&amp;nbsp;

&amp;nbsp;numSlider.customTextInputName = "MyStyleTextInputNameInsideTheme";

&amp;nbsp;numSlider.customSliderName = "MyStyleSliderNameInsideTheme";
&lt;/pre&gt;
&lt;script type="text/javascript"&gt;
 SyntaxHighlighter.highlight();
&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/P-g9oyAPjVQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/2939525419232206197/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2013/05/numeric-slider-feathersstarling.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/2939525419232206197?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/2939525419232206197?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/P-g9oyAPjVQ/numeric-slider-feathersstarling.html" title="Numeric Slider (Feathers,Starling)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-hFYqtqr416U/UYT_4reym0I/AAAAAAAAANk/1kOckXPLlRs/s72-c/Clipboard02.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2013/05/numeric-slider-feathersstarling.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4NQ3c5fSp7ImA9WhBaEEU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-5800098519437954932</id><published>2013-03-19T16:18:00.000-07:00</published><updated>2013-05-20T15:13:12.925-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-20T15:13:12.925-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Action Script" /><category scheme="http://www.blogger.com/atom/ns#" term="Game Server" /><category scheme="http://www.blogger.com/atom/ns#" term="Games" /><title>Photon  server and Flash (Games)</title><content type="html">At start I was very exited about Photon being fast C++ written server with C# wrapper, with Flash SDK and even more when I saw example at &lt;a href="http://blog.sebaslab.com/first-actionscript-3-multiplayer-game-with-photon-cloud/"&gt;sebaslab&lt;/a&gt; .&amp;nbsp; Checking the code at first I was even more happy that Flash - Photon are using AMF. But that was it.&lt;br /&gt;
&lt;br /&gt;
I found that communication is done in kind of different way of&amp;nbsp; how Adobe have encourage using it and how its used in BlaseDS for Java and FluorineFX for .NET.&lt;br /&gt;
First I found that SDK is using Dictionary key/values pairs to transport data from Flash to Photon. For example you need to create Dictionary&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;var dictionary:Dictionary=new Dictionary();
dictionary[123]=new Actor2(3);
dictionary[122]={x:1111,y:"bbb"};


&lt;/pre&gt;
Key values can be bytes(0 -127) or Strings but String wouldn't help you engage auto reflection mechanism on Photon side( commented later). If you want to optimize bit code you need to call sendOperation(...) Function and send [key,value,key2,value2....]
 sendOperation(operationCode,[123,new Actor,122,{x:111,y:"bbb"}]..
cos all your dictionaries would be converted to dynamic objects.

&lt;br /&gt;
&lt;pre class="brush:as3;"&gt;    public class Actor2
    {
       
            private var mActorNo:int=3333;
           
            public var testNumber:Number=1111.33;
           
            //public var vec:Vector.=new Vector.([1,2,3]);
            public var testArray:Array=[{x:1,y:3},3];
            
            public var testString:String="test_String";
            
            public var data:Date=new Date();
            
            public function Actor2(num:int)
            {
                mActorNo=num;
            }// end function
            
            
            
            
            public function setActorNo(param1:int) : void
            {
                mActorNo = param1;
                return;
            }// end function
            
        
    }
&lt;/pre&gt;
&lt;pre class="brush:as3;"&gt;&lt;/pre&gt;
This would be prepared in something as:
["testNumber",1111.33,"testArray",["x",1,"y",3,3],"date",....
packed into the message(I woudn't not now comment about how the message is compose but will focus on message data) and send as AMF bytes. 



I personally doubt that such manual mechanism of mapping object attributes is better then Adobe serialization/deseralisation  by implementing of flash.utils.IExternalizable into your class object. 
Exit Games Flash SDK:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;1. Doesn't serialize private variables. Adobe shows clearly how you could decide what to serialize what not
by using implementing IExternizable&lt;br /&gt;
&lt;br /&gt;
2.Doesn't  serialize sub/sub objects...even using Dictionary[Dictionary[Dictionary...way of doing this
ex. public var testArray:Array=[{x:1,y:3},new Actor2(3)];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;3.Doesn't serialize Vector (connection closed cos of  InvalidDataType exception)
public var vec:Vector.=new Vector.([1,2,3]);

 On the server side you can forget of reconstructing of Actor2 object as we expect using AMF communication and Photon would return.
 Every AS3 Object would be converted into C# HashTable
and every AS3 Array would be converted into C# object[]
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-lwFID4s7nvs/UUjyoSpYf3I/AAAAAAAAANQ/TQ4YuzlKpKI/s1600/Clipboard03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="229" src="http://4.bp.blogspot.com/-lwFID4s7nvs/UUjyoSpYf3I/AAAAAAAAANQ/TQ4YuzlKpKI/s320/Clipboard03.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Try to use normal way of serializing object for AMF communication returned (connection closed cos of  InvalidDataType exception)
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;package photon_trace
{
    import flash.utils.IDataInput;
    import flash.utils.IDataOutput;
    import flash.utils.IExternalizable;

    [RemoteClass(alias="photon_trace.Actor")]
    public class Actor implements IExternalizable
    {
       
            private var mActorNo:int=3333;
           
            public var testNumber:Number=1111.33;
           
            //public var vec:Vector.=new Vector.([1,2,3]);
            public var testArray:Array=[1,2,3];
           
            public var testString:String="test_String";
           
            public var data:Date=new Date();
           
            public function Actor()
            {
               
            }// end function
           
           
            public function writeExternal(output:IDataOutput):void
            { 
                output.writeInt(mActorNo); 
            } 
            public function readExternal(input:IDataInput):void { mActorNo = input.readInt();  } 
           
            public function getActorNo() : int
            {
                return mActorNo;
            }// end function
           
            public function setActorNo(param1:int) : void
            {
                mActorNo = param1;
                return;
            }// end function
           
       
    }
}
&lt;/pre&gt;
&lt;pre class="brush: as3;"&gt;
&lt;/pre&gt;
In order to achieve somekind of auto deserialisation/reflection on Photon side,  you need to use byte as keys as ["testNumber",1111.33.... wouldn't be mapped.
but [bytekey,value... ex.  [111,1111.33... would be as key 111 maps to DataMemeber Code 111 in Operation, so some kind of mapping keys table with same values, kept at Flash and Photon side. O My I would like to back to old slow String parsing JSON.

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp;"&gt;namespace HelloPhoton
{
    class MyOperation:Operation
    {

        public MyOperation(IRpcProtocol protocol, OperationRequest request)
        : base(protocol, request)
         {
         }

        

        [DataMember(Code = (byte)111, IsOptional = false)]
        public float testNumber { get; set; }
        
    }
}
&lt;/pre&gt;
I also tried to add custom types handling serialization by using
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp;"&gt; var typeRegistred = Photon.SocketServer.Protocol.TryRegisterCustomType(typeof(Actor), (byte)101, SerializeAMF, DeserializeAMF);
&lt;/pre&gt;
&lt;pre class="brush: csharp;"&gt;
&lt;/pre&gt;
found in so scarce documentation/forums and not succeed.






Let say we send now response from Photon server to Flash client.
&lt;br /&gt;
&lt;pre class="brush: csharp;"&gt;namespace HelloPhoton
{
    public class MyResponse
    {
        
        [DataMember(Code = (byte)33, IsOptional = false)]
        public string testText { get; set; }

        //[DataMember(Code = (byte)34, IsOptional = false)]
        //public IList testList { get; set; }//ArrayList isn't supported


        [DataMember(Code = (byte)34, IsOptional = false)]
        public Hashtable testHash { get; set; }
    }
} 
&lt;/pre&gt;
On Flash side you would get Dictionary with [33]=somestring, [34]=Array[1,2,3..,so no info about the class object. Also I couldn't put sub object(myItem done similar as MyResponse) in HashTable without Photon throwing error.
And top of  the cake is reply of Tobias Lead Client Engineer at Exit Games:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&amp;nbsp;"Re: Hashtable in another Hashtable"
by Tobias » Thu Sep 20, 2012 5:35 pm
We always have trouble with supporting Flash fully, due to it's limitations with types, so nested Hashtables are most likely affected by this.
Can you work around this?
Sadly, I can't promise we can do something about it really soon."&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Due to Limitations with types? What types are missing?  Guys in Fluorine had not problems with any C# (.NET) types and Flash types .Am I missing something? 
 I don't even want to think about RemoteObjects and that could I invoke C# Command. Hello! anybody home :).
My opinion is if you support platform you support it seriously as serious company other then that is wasting investors time and losing the clients.

&lt;script type="text/javascript"&gt;
 SyntaxHighlighter.highlight();
&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/bLArE2Mhse4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/5800098519437954932/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2013/03/photon-server-and-flash.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5800098519437954932?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5800098519437954932?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/bLArE2Mhse4/photon-server-and-flash.html" title="Photon  server and Flash (Games)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-lwFID4s7nvs/UUjyoSpYf3I/AAAAAAAAANQ/TQ4YuzlKpKI/s72-c/Clipboard03.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2013/03/photon-server-and-flash.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cNQn4-cSp7ImA9WhBbGE0.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-6711004823572525464</id><published>2012-11-18T11:39:00.001-08:00</published><updated>2013-05-17T08:38:13.059-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-17T08:38:13.059-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Agal" /><category scheme="http://www.blogger.com/atom/ns#" term="filters" /><category scheme="http://www.blogger.com/atom/ns#" term="Stage 3D" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Starling framework" /><category scheme="http://www.blogger.com/atom/ns#" term="fragment shader" /><title>Gradient Shadow Filter Starling</title><content type="html">Instead of doing lot of bla,bla... check the code&amp;nbsp; &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-1yjKvlIoYCk/UKk5FYghBII/AAAAAAAAAMs/nrMjkMz1oRI/s1600/Clipboard01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="272" src="http://4.bp.blogspot.com/-1yjKvlIoYCk/UKk5FYghBII/AAAAAAAAAMs/nrMjkMz1oRI/s320/Clipboard01.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
*Updated 20.11.12 (added radial shadow option)&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;
package filters &lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;import starling.core.RenderSupport;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;import starling.display.DisplayObject;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;import starling.filters.FragmentFilter;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; import flash.display3D.Context3D;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; import flash.display3D.Context3DProgramType;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; import flash.display3D.Program3D;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; import starling.textures.Texture;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; * ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; * @author winxalex&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;public class GradientShadowFilter extends FragmentFilter&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var mShaderProgram:Program3D;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private static var recStageWidth:Number=NaN;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private static var recStageHeight:Number = NaN;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; * Fragment constants vectors&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var fc1:Vector.&amp;lt;Number&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var fc2:Vector.&amp;lt;Number&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var _axisX:Boolean;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var _lightToDark:Boolean;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var _spreadOffsetX:Number=0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var _spreadOffsetY:Number = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var _xCenter:Number = 0.5;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var _yCenter:Number = 0.5;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;private var _radial:Boolean;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; * &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param&amp;nbsp;&amp;nbsp; &amp;nbsp;axisX&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param&amp;nbsp;&amp;nbsp; &amp;nbsp;dir&lt;br /&gt;
&lt;number&gt;&lt;number&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param radial (radial or rectangle shadow) &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function GradientShadowFilter(axisX:Boolean=true,lightToDark:Boolean=true,radial:Boolean=false):void&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc1 =new Vector.&amp;lt;Number&amp;gt;(4,true);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc2 = new Vector.&amp;lt;Number&amp;gt;(4, true);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc2[0] = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc2[1] = 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc2[2] = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc2[3] = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_axisX = axisX;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_lightToDark = lightToDark;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_radial = radial;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public override function dispose():void&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (mShaderProgram) mShaderProgram.dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override function createPrograms():void&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var vertexProgramCode:String =&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"m44 vt0, va0, vc0 \n" + // 4x4 matrix transform to output space&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mov v1, vt0 \n" + // move position to v1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mov op, vt0 \n" +//move position to output&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mov v0, va1 "; //move color to output&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var fragmentProgramCode:String = &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"tex ft0, v0, fs0 &amp;lt;2d data-blogger-escaped-clamp="clamp" data-blogger-escaped-linear="linear" data-blogger-escaped-mipnone="mipnone"&amp;gt;&amp;nbsp; \n" + // read texture color&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mov ft1, v1 \n" + &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(_radial ? &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; "sub ft1.x, ft1.x, fc1.x \n" +// subtruct current x from _clipX &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; "div ft1.x, ft1.x, fc1.z \n" + // transfer x in clip region from 0-1 (x-_clipX)/_clipWidth&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; "sub ft1.y, ft1.y, fc1.y \n" +// subtruct current y from _clipY &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; "div ft1.y, ft1.y, fc1.w \n" + // transfer x in clip region from 0-1 (y-_clipY)/_clipHeight&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; (!_lightToDark&amp;nbsp; ?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; "sub ft1.x, fc2.x, ft1.x \n"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;: "sub ft1.y, fc2.x, ft1.y \n" // change direction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;) +&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; (!_axisX ? &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; "sub ft1.y, ft1.y, fc2.w \n" +//&amp;nbsp; Ycenter position (default:0) &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; "mul ft1.y, ft1.y, fc2.y \n" // y*2&amp;nbsp; =&amp;gt; half height&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; "sub ft1.x, ft1.x, fc2.z \n" +//&amp;nbsp; Xcenter position (default:0) &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; "mul ft1.x, ft1.x, fc2.y \n" // x*2&amp;nbsp; =&amp;gt; half width&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;)+&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mul ft1.y, ft1.y, ft1.y \n" +// y^2&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mul ft1.x, ft1.x, ft1.x \n" +// x^2&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"add ft1.z, ft1.x, ft1.y \n" +// x^2 + y^2&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"sub ft1.z, fc2.x, ft1.z \n" +// flip shadow direction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mul ft0.xyz, ft0.xyz, ft1.zzz\n" &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;: //RECTANGLE&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// X - GRADIENT&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(_axisX ?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "sub ft1.x, ft1.x, fc1.x \n" +// subtruct current x from _clipX &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"div ft1.x, ft1.x, fc1.z \n" + // transfer x in clip region from 0-1 (x-_clipX)/_clipWidth&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(_lightToDark ?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"sub ft1.x, fc2.x, ft1.x \n" // change direction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;: "") +&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mul ft0.xyz,ft0.xyz, ft1.xxx\n" //make x gradient&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; // Y - GRADIENT&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; :&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "sub ft1.y, ft1.y, fc1.y \n" +// subtruct current y from _clipY &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"div ft1.y, ft1.y, fc1.w \n" + // transfer x in clip region from 0-1 (y-_clipY)/_clipHeight&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(_lightToDark ?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"sub ft1.y, fc2.x, ft1.y \n" // change direction (1-y)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;: ""&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;) +&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mul ft0.xyz,ft0.xyz, ft1.yyy\n" //make y gradient&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;)+&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//uniform color&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//"mul ft0.xyz, ft0.xyz, ft2.www\n" +&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;"mov oc, ft0";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mShaderProgram = assembleAgal(fragmentProgramCode,vertexProgramCode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;override public function render(object:DisplayObject, support:RenderSupport, parentAlpha:Number):void &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (isNaN(recStageHeight)) recStageHeight = 1 / object.stage.stageHeight;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (isNaN(recStageWidth)) recStageWidth = 1 / object.stage.stageWidth;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc1[2] = ((_spreadOffsetX +object.width) * 2 * object.scaleX)* recStageWidth ;//_clipWidth&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc1[3] =&amp;nbsp; ((_spreadOffsetY+object.height) * 2 * object.scaleY) * recStageHeight ;//_clipHeight&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc1[0] = (2*object.x * recStageWidth)-1;//_clipX&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc1[1] = (2*(object.stage.stageHeight-object.height-object.y) * recStageHeight)-1 ;//_clipY with switch of y direction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc2[2] = 0.5;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fc2[3] = 0.5;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;super.render(object, support, parentAlpha);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override function activate(pass:int, context:Context3D, texture:Texture):void&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // already set by super class:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // vertex constants 0-3: mvpMatrix (3D)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // vertex attribute 0:&amp;nbsp;&amp;nbsp; vertex position (FLOAT_2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // vertex attribute 1:&amp;nbsp;&amp;nbsp; texture coordinates (FLOAT_2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // texture 0:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; input texture&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 1, fc1, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 2, fc2, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.setProgram(mShaderProgram);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; * typical values between -width and +width&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function set spreadOffsetX(value:Number):void &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_spreadOffsetX = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; * typical values -height to height&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function set spreadOffsetY(value:Number):void &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_spreadOffsetY = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; * values: 0 : 1 (0 mean center default:0.5)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function set xCenter(value:Number):void &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_xCenter = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; * values: 0 : 1 (0 mean center default:0.5)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public function set yCenter(value:Number):void &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_yCenter = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;!--2d--&gt;&lt;!--2d--&gt;&lt;!--2d--&gt;&lt;!--2d--&gt;&lt;!--2d--&gt;&lt;/number&gt;&lt;/number&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-TWEa8E4jX04/UKv5I7o0giI/AAAAAAAAAM8/stDXITKYxLA/s1600/Clipboard01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://4.bp.blogspot.com/-TWEa8E4jX04/UKv5I7o0giI/AAAAAAAAAM8/stDXITKYxLA/s320/Clipboard01.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;number&gt;&lt;number&gt;&lt;number&gt;&lt;number&gt;Usage:&lt;/number&gt;&lt;/number&gt;&lt;/number&gt;&lt;/number&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;
&lt;number&gt;&lt;number&gt;&lt;number&gt;&lt;number&gt;dO = addChild(new Image(Texture.fromBitmap( new StarlingBMP(), false )))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dO.x = 130;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dO.y = 140;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dO.filter = new GradientShadowFilter(true,false);&lt;/number&gt;&lt;/number&gt;&lt;/number&gt;&lt;/number&gt;&lt;br /&gt;
&lt;number&gt;&lt;number&gt;&lt;number&gt;&lt;number&gt;GradientShadowFilter(dO.filter).spreadOffsetX = -50; //use width-50 px for spreading of shadow&lt;!--2d--&gt;&lt;/number&gt;&lt;/number&gt;&lt;/number&gt;&lt;/number&gt;&lt;!--2d--&gt;&lt;/pre&gt;
&lt;script type="text/javascript"&gt;
 SyntaxHighlighter.highlight();
&lt;/script&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/d-lTNt6krN8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/6711004823572525464/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/11/gradient-shadow-filter-starling.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6711004823572525464?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6711004823572525464?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/d-lTNt6krN8/gradient-shadow-filter-starling.html" title="Gradient Shadow Filter Starling" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-1yjKvlIoYCk/UKk5FYghBII/AAAAAAAAAMs/nrMjkMz1oRI/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/11/gradient-shadow-filter-starling.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcNQXwzeip7ImA9WhNRGUw.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-1592203330340418792</id><published>2012-11-10T12:30:00.002-08:00</published><updated>2012-11-14T08:21:30.282-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-14T08:21:30.282-08:00</app:edited><title>GLSL to AGAL Convertor tool</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
Great thx to Tom Krcha annoucing glsl2agal library with which I was able to reward my laziness to convert GLSL code to AGAL and play with it.&amp;nbsp;
&lt;a href="http://www.winx.ws/blog/GLSL2AGAL.html"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-GSS8mTs6vTw/UJ62q_h0PQI/AAAAAAAAAMc/isxdE6Ourj8/s1600/Clipboard01.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
In most GLSL programs you would find on net would contain just main function so you should declare variables &lt;br /&gt;
uniform vec2 resolution;&lt;br /&gt;
uniform float time;&lt;br /&gt;
uniform sampler2D tex0;&lt;br /&gt;
&lt;br /&gt;
This &lt;a href="http://mew.cx/glsl_quickref.pdf"&gt;link&lt;/a&gt; would help you with variables types.&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/7cHdh_leRn8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/1592203330340418792/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/11/glsl-to-agal-convertor-tool.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/1592203330340418792?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/1592203330340418792?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/7cHdh_leRn8/glsl-to-agal-convertor-tool.html" title="GLSL to AGAL Convertor tool" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-GSS8mTs6vTw/UJ62q_h0PQI/AAAAAAAAAMc/isxdE6Ourj8/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/11/glsl-to-agal-convertor-tool.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEFSHwzeSp7ImA9WhBbFEU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-6216461600425756397</id><published>2012-09-16T07:15:00.002-07:00</published><updated>2013-05-13T15:20:19.281-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-13T15:20:19.281-07:00</app:edited><title>Јava Script your company future strategic goal??????????????</title><content type="html">&lt;tt&gt;&amp;nbsp;I swear that I would speak the truth nothing but the truth so help me God. Of course that always would be different point of views but I'll try to use as much facts as possible.&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;At start I want to underline that I've been programming JS in notepad in times when FrontPage or Dreamweaver or some other web design tools wasn't existing in order to make move thoose static HTML tags and make them "dynamic html". And I agree that technology was advance &lt;b&gt;&lt;u&gt;in that time&lt;/u&gt;&lt;/b&gt;. Today????? Future isn't bright with the such advicers that take compromise to go back for lack of their knowledge and vision. Strategy could be based only on the checked information and news should be tracked. For example Apple first restricted submission to Apple Store only to application developed thru its tools&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;but then, after seeing Droid taking the market, abandon the restriction. Now many tools offer creation of Apple content not just Adobe Air but Unity3D based on C#, Titanium based on JS, Corona based on Lua,....&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;Now I could see enormous effort in conversion and injecting steroids in JS.&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;Yes Action Script is ECMA based as JS but Action Script has the power OO language for long time while 90% of JS developers write spaghetti code like this&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;function(param1,function(param3,param4,function(param5),param6......&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;{&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;or not follow any patterns or good practice of programing, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;Comparing to Action Script, Flash for years had &lt;tt&gt;Tweeners,Animated Charts&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;Patterns, Classes, Biniding (backbone.js), Localization, ModelViewControl (3 generation), UI components ExtJS, unit testers and profilers... and why all of this should be recreated in JS???&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;br /&gt;&lt;/tt&gt;
&lt;tt&gt;&lt;br /&gt;&lt;/tt&gt;
&lt;tt&gt;&lt;br /&gt;&lt;/tt&gt;
&lt;tt&gt;I could also blame Steve Jobs sending the first poison arrow.&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;But most to blame is on Adobe and their amateur decision makers.&amp;nbsp;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;The power of Flash was that you can draw something and give functionality right away. Next expected was drawing 3D and giving functionality. We all expect future of live codding (changing the code and see changes in the player), going forward and backward in time, to see live onion skin (display object position/shape in time)....&amp;nbsp;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="allowfullscreen" frameborder="0" height="360" src="http://www.youtube.com/embed/PUv66718DII?feature=player_detailpage" width="640"&gt;&lt;/iframe&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;For years I couldn't see any major difference in releases Flash 
CS3,CS4,CS5 and CS6 with JS toolkit gave me feel that I'm using AS1(onPress :)) for 
making banners and exporting in JS. Did we pass that Flash, when Flash was good for banners, years ago?. Seem Adobe losing ground to JQuery with such 
innovation.&amp;nbsp;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;Drastic decision was also they announced canceling development of Flash Builder IDE and Flex SDK&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;&amp;nbsp;Well before that they were frameworks and well after 
that there are even better frameworks. Flex SDK isn't thrown away but 
serious guys are &lt;a href="http://incubator.apache.org/flex/download.html"&gt;working on it&lt;/a&gt; under Apache license and they got from starting Flex SDK 4.5 to 4.8. Even Adobe after announcing abandoning,
 released 4.6 version and Flash Builder 4.7 IDE beta. Will they continue
 producing Flash Builder IDE(Integrated Developement Environment) doesn't mater when outthere, there are even better IDE like FDT, Flash
 Develop, &lt;i&gt;InteliJ&lt;/i&gt; based Flex ...and new star &lt;i&gt;&lt;a href="http://realaxy.com/"&gt;Realaxy&lt;/a&gt;&lt;/i&gt;. Worst is if they stop supporting Flash Player? &lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;You think Flash is dead and now all should JS.&amp;nbsp;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;br /&gt;&lt;/tt&gt;
&lt;tt&gt;Let see what you get with this new but old technology. &lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;&lt;u&gt;&lt;b&gt;EXECUTION SPEED &amp;amp; FILE SIZE:&lt;/b&gt;&lt;/u&gt; In JS Google team or other code optimizers, packagers (zippers) or browser producers could improve their browser parsers in order to gain faster download and execution speed of several thousand lines of code in serious apps.&amp;nbsp;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;Someone would say doesn't matter when now we all have optic-fiber connection and super computers, but even then as engineer isn't logical to use resources to push wooden cart on highway instead of using them for some future invented vehicles. &lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;What about readability and updatability of that optimized, packed code? What about of time of zipping and unzipping? Why we are compile code and create binaries when size and parsing of text files (.js) is better solution!?&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;&lt;u&gt;&lt;b&gt;COMPATIBILITY:&lt;/b&gt;&lt;/u&gt; Here come the CEO's technological adviser's statement that JS is compatible with everything even with mobiles.&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;Partly true. Lot false.&amp;nbsp;&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;There are several things why this is not true.&amp;nbsp;&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;First NO BROWSER never was and wouldn't ever follow be 100% compatible with W3C standards let say HTML5 currently. There may reasons why which I won't to elaborate now. Even in browser version of same producer, difference are so big so you need to write code to handle not just browser type but also same browser&amp;nbsp; versions.&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;Here comes redundancy of code when you have same code that handling browser with every framework you engage into your project.&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;And top of that your code wouldn't be compatible with the next version of browsers.&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;Then comes good news your web site would be viewable on mobile devices. &lt;/tt&gt;&lt;/tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;Partly true&lt;/tt&gt;&lt;/tt&gt;. Even we assume that web browsers and mobile browsers are 100% clones, what is the benefit of that your web site is visible but simple not usable in same way in browser.For example websites were designed for using with mouse and not with finger touch and all those fancy moves.&lt;/tt&gt;&lt;/tt&gt;&lt;tt&gt;&lt;tt&gt; So not compatible, when you need to have to use jQuery and jQueryMobile for addressing different device.&lt;/tt&gt;&lt;/tt&gt;
&lt;tt&gt;&lt;tt&gt;And why big companies like Yahoo and Facebook offer right away native application(&lt;b&gt;APPLICATIONS NOT WEB SITES&lt;/b&gt;) for your device and why they not let you to use your mobile browser???&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;Flash player had backward compatibility and user would have 90%(maybe this is 95% or more but I'm satisfied with 90% compared to experiences of writing HTML/JS/CSS for every major browser) same experience in all major browser.&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;Yes, Flash player is discontinued from mobile devices( anyway Flash could show full power on low hardware mobiles then and was hard to exploit specific device options) but you can develop application using Adobe AIR technology. You can use full power of Flex RAD(Rapid Application Development) practices into you main content and target with the same effort target Android,IOS,BlackBerry,Windows,MacOs...Plus you can extend toward specific device functionality&amp;nbsp; using Adobe Native Extension and write native code.&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;&lt;u&gt;&lt;b&gt;DEPENDENCY:&lt;/b&gt;&lt;/u&gt; First dependency is of your OS. (text)&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;... Second dependency is of your browser. Third dependency is installed programs and plugins.&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strike&gt;&lt;tt&gt;&lt;tt&gt;target WEB: No JS gives same user experience as Flash sites.&lt;/tt&gt;&lt;/tt&gt;&lt;/strike&gt;&lt;br /&gt;
&lt;strike&gt;&lt;tt&gt;&lt;tt&gt;target Desktop(Mac,Win...): I've never seen JS standalone applications. In Flash your browser based app would work as standalone without problem reducing the cost of development.&amp;nbsp; &lt;/tt&gt;&lt;/tt&gt;&lt;/strike&gt;&lt;br /&gt;
&lt;strike&gt;&lt;tt&gt;&lt;tt&gt;target IOS:&lt;/tt&gt;&lt;/tt&gt;&lt;/strike&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;&lt;strike&gt;target Android:&lt;/strike&gt;&amp;nbsp; &lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;At the end if you think that you become dependent in some way 
installing Flash Player pluggin did you get dependent also when you 
install Garmin(for you training device), Java applet or other pluggins 
in your web broswer.&lt;tt&gt; Why you then feel dependent of?&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="allowfullscreen" frameborder="0" height="360" src="http://www.youtube.com/embed/caux7Uh2BK0?feature=player_embedded" width="640"&gt;&lt;/iframe&gt;
&lt;tt&gt;&lt;tt&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/tt&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;&lt;br /&gt;&lt;/tt&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/tt&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;u&gt;&lt;b&gt;GAMES&lt;/b&gt;&lt;/u&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;u&gt;&lt;b&gt;:&lt;/b&gt;&lt;/u&gt; To find JS games are so rare as needle in the haystack. Even with the introducing to canvas lack of quality visual IDE, game engines and frameworks, constant browsers crashing, performance and being not visual attractive make JS far from favorite game development environment.&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;u&gt;&lt;b&gt;3D:&lt;/b&gt;&lt;/u&gt;&lt;/tt&gt;&lt;/tt&gt; Use of third dimension thru JS is possible for ex. with &lt;a href="https://github.com/mrdoob/three.js/"&gt;Three.js&lt;/a&gt;(by Mr.Doob former &lt;i&gt;Papervision 3D&lt;/i&gt; guru) and it's based on &lt;i&gt;WebGL&lt;/i&gt;. But even it works on Chrome and could be enabled in FireFox, the owners of technology Microsoft, have sealed its future stating th&lt;tt&gt;ey &lt;tt&gt;&lt;tt&gt;&lt;tt&gt;would not continue developing or support in its browsers e.g IE.&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;In Flash Player many graphics cards are supported offering 3D across browsers and mobiles. Frameworks like Starling gives great performance by utilizing use of GPU to UI and Games.&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;tt&gt;&lt;tt&gt; &lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;u&gt;&lt;b&gt;SEO:&lt;/b&gt;&lt;/u&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;u&gt;&lt;b&gt;REALTIME APPLICABILITY:&lt;/b&gt;&lt;/u&gt;&lt;/tt&gt;&lt;/tt&gt; I didn't encounter so far pure JS based streaming solution or real time data transfer.There were some tries to make HTML/JS Video players but saw Youtube back to Flash Player and Apple made custom video application that jump out when you browse and want to see video. I'ven't seen something made in JS in comparation to Adobe Live Data Cycle.&lt;/tt&gt;&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;&lt;tt&gt;JSON:&amp;nbsp;&lt;/tt&gt;&lt;/u&gt;&lt;/b&gt;&lt;tt&gt;Main data transfer JS format is way outdated when many formats today offered ,like AMF, faster and class object transfer. Libraries like AMFPHP and ZendAMF, FlourineFX(.NET) or Java AMF allows seamless/realtime OO communiction with backend.&lt;/tt&gt;&lt;br /&gt;
&lt;tt&gt;&lt;br /&gt;Someone would say "SignalR" and I couldn't find here Eureka just another&amp;nbsp;muscle&amp;nbsp;injection.&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;u&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;CONSTANT BEHAVIOR&lt;/span&gt;:&lt;/b&gt;&lt;/u&gt; Freedom of dynamic scripts (a.k.a prototyping) as JS means freedom in syntax creation, but that not mean artistic freedom. With that freedom library's creators can use $,#,_ to make some functionality which looks &lt;span style="font-size: small;"&gt;cu&lt;span style="font-size: small;"&gt;te&lt;/span&gt;&lt;/span&gt; as art and in saving file size and speed up codding, but as developer with every new library you need to learn new syntax and new way of use. Sometimes I feel like I'm into new script/language not in JS cos of so called freedom to design library. Pain!.&lt;br /&gt;
One JS GURU told me take backbone.js it fits 80% to original JS syntax and AngularJS about 15%, Fits?&amp;nbsp; So today top libraries jQuery,AngularJS ... parse HTML + there enhancing syntax (part fitting - part new language) into JS, minimized in 1000 ways , which then would be parsed AGAIN! by browser. Hell not logical.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;UNIFICATION&lt;/span&gt;:&lt;/b&gt;&lt;/u&gt;&amp;nbsp; This is great thing. JS thruout the programming world. Great! But in the ideal world and with some universal purpose strong language, and definitely&lt;tt&gt; not&lt;/tt&gt; with 15 year old script concept. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;RIDING ON THE NEW WAVE WITH YOUR OLD IRONING BOARD&lt;/span&gt;:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
I also couldn't describe all of&amp;nbsp; Action Script Gurus who waste 10 years of their life, now are writing JS tutorials &lt;i&gt;Lee Brimelow&lt;/i&gt;, try to convert their components&amp;nbsp; to JS like &lt;i&gt;&lt;span class="st"&gt;Keith Peters&lt;/span&gt;&lt;/i&gt;, try to convert their multiplayer server &lt;i&gt;Collin Mock&lt;/i&gt; (50,000lines of code!!!!)...., create JS frameworks alike&amp;nbsp; Action Script so developers can easy transfer to JS like &lt;span class="st"&gt;&lt;i&gt;Grant Skinner&lt;/i&gt;&lt;/span&gt; other then turncoats, call me stubborn to new turn into bright web future, if you like, but I could see all of this as step backward and reinventing the 15 years&amp;nbsp; old wooden wheel as some kind of&amp;nbsp; advance,which we all need to follow and to be your company future&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
strategic goal.&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
I would like to add to the list&amp;nbsp;&lt;i&gt;Thibault&lt;/i&gt;&amp;nbsp;Imbert&amp;nbsp;here ,after he been assigned to HTML dev team, he said he Flash is his heart but TypeScript and new ECMA is almost good as AS.&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;&lt;iframe allowfullscreen="" frameborder="0" height="300" mozallowfullscreen="" src="http://player.vimeo.com/video/26224634?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="400"&gt;&lt;/iframe&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/200UK6yikdU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/6216461600425756397/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/09/ava-script-your-company-strategic-goal.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6216461600425756397?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6216461600425756397?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/200UK6yikdU/ava-script-your-company-strategic-goal.html" title="Јava Script your company future strategic goal??????????????" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/PUv66718DII/default.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/09/ava-script-your-company-strategic-goal.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MARXs-eSp7ImA9WhJUF0w.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-7892380683673472799</id><published>2012-09-14T16:39:00.000-07:00</published><updated>2012-09-15T07:30:44.551-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-15T07:30:44.551-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="3D" /><category scheme="http://www.blogger.com/atom/ns#" term="ByteArray" /><category scheme="http://www.blogger.com/atom/ns#" term="uploadFromByteArray" /><category scheme="http://www.blogger.com/atom/ns#" term="BGRA to ARGB" /><category scheme="http://www.blogger.com/atom/ns#" term="Starling framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Action Script" /><category scheme="http://www.blogger.com/atom/ns#" term="format" /><category scheme="http://www.blogger.com/atom/ns#" term="BitmapData" /><category scheme="http://www.blogger.com/atom/ns#" term="Texture" /><category scheme="http://www.blogger.com/atom/ns#" term="Context3DTextureFormat.BGRA" /><category scheme="http://www.blogger.com/atom/ns#" term="Threads" /><category scheme="http://www.blogger.com/atom/ns#" term="Stage3D" /><category scheme="http://www.blogger.com/atom/ns#" term="Workers" /><category scheme="http://www.blogger.com/atom/ns#" term="AMF" /><category scheme="http://www.blogger.com/atom/ns#" term="uploadFromBitmapData" /><title>Workers At Starling</title><content type="html">&amp;nbsp;I need to move from original idea to put some heavy &lt;i&gt;BitmapData&lt;/i&gt; manipulation and upload to GPU in BackWorker and draw in MainWorker, cos didn't found way to share context or native texture thru AMF channel, so I let just original regeneration of displayBitmapData on the BackWorker. Now problem was how to pass &lt;i&gt;BitmapData &lt;/i&gt;to AMF. AMF require classes to have constructors with default values and to implement &lt;i&gt;IExternalizable &lt;/i&gt;interface in order to handle complex data types. &lt;i&gt;BitmapData &lt;/i&gt;Class doesn't comply to both and solution is to transfer from back to main by use of&amp;nbsp; &lt;i&gt;ByteArray&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
If you plan to use with Texture.&lt;i&gt;uploadFromBitmapData &lt;/i&gt;you need to encode (JPG,PNG...) in order that Loader.loadBytes to be able to load bytes from &lt;i&gt;ByteArray &lt;/i&gt;and recreate &lt;i&gt;BitmapData&lt;/i&gt;. Also good cos less bytes would go over the channel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I was stubborn and wanted to use &lt;i&gt;uploadFromByteArray. &lt;/i&gt;&lt;br /&gt;
I saw some guy was talking on Starling forums about Texture.&lt;i&gt;uploadFromByteArray &lt;/i&gt;but found out that even in Starling 1.2 isn't supported. So I added this function to Texture.as to fill that gap.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #999999;"&gt; /** Creates a texture from Byte array. &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*&amp;nbsp; */&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public static function fromByteArray(data:ByteArray,width:int,height:int, byteArrayOffset:uint,miplevel:uint=0,&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; optimizeForRenderTexture:Boolean=false,&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; scale:Number=1):starling.textures.Texture&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var origWidth:int = width;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var origHeight:int = height;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var legalWidth:int&amp;nbsp; = getNextPowerOfTwo(width);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var legalHeight:int = getNextPowerOfTwo(height);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var context:Context3D = Starling.context;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (context == null) throw new MissingContextError();&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var nativeTexture:flash.display3D.textures.Texture = context.createTexture(&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; legalWidth, legalHeight, Context3DTextureFormat.BGRA, optimizeForRenderTexture);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nativeTexture.uploadFromByteArray(data,byteArrayOffset,miplevel);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var concreteTexture:ConcreteTexture = new ConcreteTexture(&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nativeTexture, legalWidth, legalHeight, false, true, &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; optimizeForRenderTexture, scale);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (Starling.handleLostContext)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; concreteTexture.restoreOnLostContext(data);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (origWidth == legalWidth &amp;amp;&amp;amp; origHeight == legalHeight)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return concreteTexture;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return new SubTexture(concreteTexture, &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; new Rectangle(0, 0, origWidth/scale, origHeight/scale), &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; true);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #999999;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While creating native texture in the code, you can see that format Context3DTextureFormat.BGRA and BitmapData is ARGB, so it need conversion before placing into ByteArray&lt;br /&gt;
&lt;span style="color: #666666;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #666666;"&gt;for ( var j : int = 0 ; j &amp;lt; displayBitmapData.height; j ++ ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for ( var i : int = 0 ; i &amp;lt; displayBitmapData.width; i ++ ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //memory is ByteArray&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; memory.writeUnsignedInt((displayBitmapData.getPixel32(i,j) &amp;amp; 0x000000ff) &amp;lt;&amp;lt; 16 | (displayBitmapData.getPixel32(i,j) &amp;amp; 0x0000FF00) | (displayBitmapData.getPixel32(i,j) &amp;amp; 0x00FF0000) &amp;gt;&amp;gt; 16);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You need also to watch that your &lt;i&gt;BitmapData &lt;/i&gt;is size of&amp;nbsp; power of&amp;nbsp; 2.&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.winx.ws/blog/bin/BitmapUploadWorkers.html"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-FDZNlT5AdKM/UFO-gwMoHEI/AAAAAAAAAMA/16hGimjgW0c/s1600/Clipboard03.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Download: &lt;a href="http://www.winx.ws/blog/StarlingWorkers.zip"&gt;source&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/X_nXf9hFzQA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/7892380683673472799/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/09/workers-at-starling.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7892380683673472799?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7892380683673472799?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/X_nXf9hFzQA/workers-at-starling.html" title="Workers At Starling" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-FDZNlT5AdKM/UFO-gwMoHEI/AAAAAAAAAMA/16hGimjgW0c/s72-c/Clipboard03.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/09/workers-at-starling.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUERHc6eyp7ImA9WhJXE0g.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-6594988673118799639</id><published>2012-08-04T07:42:00.001-07:00</published><updated>2012-08-07T09:16:45.913-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-07T09:16:45.913-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Fire effect" /><category scheme="http://www.blogger.com/atom/ns#" term="Action Script" /><category scheme="http://www.blogger.com/atom/ns#" term="Perlin" /><category scheme="http://www.blogger.com/atom/ns#" term="Games" /><category scheme="http://www.blogger.com/atom/ns#" term="BitmapData" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Starling framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Flames" /><title>Using Bitmap Data filters in Starling</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.winx.ws/blog/StarlingFireScene.html"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-vhLqKFNIsHg/UB0vfZh94oI/AAAAAAAAAK4/MXxKCSfW3MQ/s1600/Clipboard01.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
Fire test application based on Starling in Firefox 14&amp;nbsp; shows 30fps&lt;/div&gt;
In the past Adobe attract designers to flash offering them Bitmap effects using filters Blur, Displacement, Perlin and so on... without need to understand what is going behind (e.g copymem, rdmem, pointers...). And ofcourse people have found way to access it &lt;a href="http://www.buraks.com/azoth/index.html"&gt;Azoth &lt;/a&gt;and &lt;a href="http://code.google.com/p/apparat/"&gt;Apparat&lt;/a&gt;. When Flash moved from CPU to GPU and AGAL now we kind of back to assembler. Its great. Ups what about the other guys(designers) then shader gurus. Should we now all write Perlin, Displacement ... shader program in order to got benifit of GPU speed and have 60fps??? Should not Adobe do same abstraction as what was done at introduction of BitmapData???&lt;br /&gt;
&lt;br /&gt;
I was so foolish and want to use BitmapData effect from CPU and draw them on GPU. Yeah I know that uploading BitmapData to GPU every frame is costly operation and not how we suppose to do, but I don't want to spent month writing shader to achive same effect(I didn't want to make texture atlas cos I want generic fire not looping fire). It would be good if&amp;nbsp; I could make let say 60 textures and while looping thoose&amp;nbsp; I could async download changes into texture slots(Update 07.08.12: Workers might help) that are already shown and not sync in onEnterFrame. But never the less increase in performance is obvious.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.winx.ws/blog/StarlingFireScene.html"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-fUuPdkK8JMw/UB0xGcxmJ5I/AAAAAAAAALI/O5BIe_Qegt4/s1600/Clipboard02.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Xq-Yj-2VWTQ/UB0wSEsgB2I/AAAAAAAAALA/Ux8Af3mVXpg/s1600/Clipboard02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Fire test application based on Starling in Flash Player&amp;nbsp; shows 45-58fps&lt;br /&gt;
&lt;br /&gt;
Source: &lt;a href="http://www.winx.ws/blog/StarlingFireScene.zip"&gt;Download&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/nR4h2i1MHTI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/6594988673118799639/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/08/using-bitmap-data-filters-in-starling.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6594988673118799639?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6594988673118799639?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/nR4h2i1MHTI/using-bitmap-data-filters-in-starling.html" title="Using Bitmap Data filters in Starling" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-vhLqKFNIsHg/UB0vfZh94oI/AAAAAAAAAK4/MXxKCSfW3MQ/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/08/using-bitmap-data-filters-in-starling.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcFR3syeip7ImA9WhJXEU0.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-467047857764803787</id><published>2012-07-21T09:59:00.000-07:00</published><updated>2012-08-04T10:56:56.592-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-04T10:56:56.592-07:00</app:edited><title>Decorator Pattern in Action Script partII (Games)</title><content type="html">Please check Decorator pattern &lt;a href="http://winxalex.blogspot.com/2012/07/decorator-pattern-in-action-script.html"&gt;part I&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
In order we not overwhelm all decorators in extended classes (create less foot print) with the functions that aren't used in them(for example we have some decorator that doesn't allow magical ehancement, so what for would be function getFireResitance() subclassed from some class in hierarchy), we extend base from &lt;i&gt;Proxy &lt;/i&gt;class.(Can be done with some other pattern inside this one also)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&lt;span style="background-color: black; color: white;"&gt; public class ArmorDecorator extends Proxy implements IArmor {&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var _armorToBeDecorated : * ;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var _type : int ;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var _container:Sprite;&lt;/span&gt;&lt;span style="background-color: white;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function ArmorDecorator( decoratedArmor : * ){&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _armorToBeDecorated = decoratedArmor;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; _container = new Sprite();&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; //add decoratedArmor to display list&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; _armorToBeDecorated.getParent().addChild(this._container);&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; //if Decorator doesn't have functionality&amp;nbsp; required would ask wrapped decorator or component for it.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; override flash_proxy function getProperty(name:*):* &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return _armorToBeDecorated[name];&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: black; color: white;"&gt; //if Decorator doesn't have functionality&amp;nbsp; required would call from wrapped decorator or component .&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; override flash_proxy function callProperty(name:*, ...rest):* &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; // trace("callProp", name,this[name]);&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; return _armorToBeDecorated[name].apply(null,rest);&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: black; color: white;"&gt;Source: &lt;a href="http://www.winx.ws/blog/DecoratorProxy.zip"&gt;Download (&lt;span style="color: white;"&gt;without visual component)&lt;/span&gt;&lt;/a&gt; &lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/4IhZfh5TtXk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/467047857764803787/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/07/decorator-pattern-in-action-script_21.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/467047857764803787?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/467047857764803787?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/4IhZfh5TtXk/decorator-pattern-in-action-script_21.html" title="Decorator Pattern in Action Script partII (Games)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/07/decorator-pattern-in-action-script_21.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4NSHg4eyp7ImA9WhBaEEU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-829155338989491207</id><published>2012-07-10T15:42:00.001-07:00</published><updated>2013-05-20T15:29:59.633-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-20T15:29:59.633-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Decorator" /><category scheme="http://www.blogger.com/atom/ns#" term="Action Script" /><category scheme="http://www.blogger.com/atom/ns#" term="decorating" /><category scheme="http://www.blogger.com/atom/ns#" term="Games" /><category scheme="http://www.blogger.com/atom/ns#" term="Pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Design" /><title>Decorator Pattern in Action Script (Games)</title><content type="html">&lt;br /&gt;
&amp;nbsp;Sometimes ago I have interview with &lt;a href="http://www.wooga.com/jobs/offers/jobvite/?job=ozDPVfwG"&gt;Wooga&lt;/a&gt; and although that I expected that they have 1.000.000 Euros annual income as the guy who interview me advertizes, I didn't expect so low level attitude, everything in order to underestimate me as human and developer. Even he is Genius or whatever, he isn't allowed to enforce such attitude of&amp;nbsp; little people as you and me.....&lt;br /&gt;
One of the interview questions were about familiarity with Decorator pattern(auf Deutsch Dekuaaatoooohhrhhrhr). Let not get me wrong I myself have basic knowledge of German languages but I've also learned in my home and school education about decency, which doctor House The Interviewer has missed to acquire as foundation of all his ingenuity.&lt;br /&gt;
But...let's continue...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Theory(source: WIKI) &lt;br /&gt;
"The decorator pattern can be used to &lt;i&gt;extend (decorate)&lt;/i&gt; the functionality of a certain object&lt;b&gt; at &lt;a href="http://en.wikipedia.org/wiki/Run_time_%28program_lifecycle_phase%29" title="Run time (program lifecycle phase)"&gt;&lt;/a&gt;runtime&lt;/b&gt;, independently of other instances of the same class, provided some groundwork is done at design time. This is achieved by designing a new &lt;i&gt;decorator&lt;/i&gt; class that &lt;b&gt;wraps &lt;/b&gt;the original class. This wrapping could be achieved by the following sequence of steps:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Subclass the original "Decorator" class into a "Component" class (see UML diagram);&lt;/li&gt;
&lt;li&gt;In the &lt;i&gt;Decorator &lt;/i&gt;class, add a &lt;i&gt;Component &lt;/i&gt;pointer as a field;&lt;/li&gt;
&lt;li&gt;Pass a &lt;i&gt;Component &lt;/i&gt;to the &lt;i&gt;Decorator &lt;/i&gt;constructor to initialize the &lt;i&gt;Component &lt;/i&gt;pointer;&lt;/li&gt;
&lt;li&gt;In the &lt;i&gt;Decorator &lt;/i&gt;class, redirect all "Component" methods to the "Component" pointer; and&lt;/li&gt;
&lt;li&gt;In the &lt;i&gt;ConcreteDecorator &lt;/i&gt;class, override any &lt;i&gt;Component &lt;/i&gt;method(s) whose behavior needs to be modified.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-kpAf-DvmH1k/T_wvjD9Y4UI/AAAAAAAAAKA/kBEvwdJszSA/s1600/decorator.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="330" src="http://4.bp.blogspot.com/-kpAf-DvmH1k/T_wvjD9Y4UI/AAAAAAAAAKA/kBEvwdJszSA/s400/decorator.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This pattern is designed so that multiple decorators can be stacked 
on top of each other, each time&lt;b&gt; adding a&lt;/b&gt; &lt;b&gt;new functionality to the 
overridden method&lt;/b&gt;(s).&lt;br /&gt;
The decorator pattern is an alternative to subclassing. Subclassing adds behavior at compile time, and the change affects all instances of the original class; decorating can provide new behavior at run-time for individual objects.&lt;br /&gt;
."&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;This especially useful with OO languages that cannot create classes at runtime a.k.a Reflection, in which group Action Script belongs.&lt;br /&gt;
&lt;br /&gt;
There are lot of theory out there, people have written tons of theory examples of coffe and icecream,&amp;nbsp; but let use pattern in real life scenario and compiling to flash display list logic.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.winx.ws/blog/Decorator.html" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="322" src="http://3.bp.blogspot.com/-zni3ClsCQqQ/T_359Wa2xfI/AAAAAAAAAKY/lM7bmL2Vnzc/s400/Clipboard02.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;i&gt;"decorating can provide new behavior at run-time for individual objects." &lt;/i&gt;&lt;br /&gt;
For example you have hero in your game that starts with basic armor( HideHelmet,SteelShield,HideBody)&lt;br /&gt;
&amp;nbsp;so hero's armor is decorated like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;&amp;nbsp;hero.armor= new HideHelmet(new SteelShield(new HideBody(new Cloath));
&lt;/pre&gt;
&amp;nbsp;But what if hero found &lt;i&gt;SteelBody&lt;/i&gt; which is better then &lt;i&gt;HideBody&lt;/i&gt; (you decorated you armor with better defense) or you have magically enhanced &lt;i&gt;HideHelmet &lt;/i&gt;(decorated your helmet with enhancement new behavior to give to hero magical resistance for example) ,&amp;nbsp; Decorator patter comes as good solution&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:as3;"&gt;hero.armor.removeArmorPart(Armor.ARMOR_HELMET);
hero.armor.removeArmorPart(Armor.ARMOR_BODY);

  hero.armor= new ArmorMagicEnhancment(new HideHelmet(hero.armor),new Resistance(10,15));
      hero.armor = new SteelBody(hero.armor);
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-f4q6nZmGLWc/UAK4GigD9yI/AAAAAAAAAKk/8EISvE_J0gs/s1600/Model.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-f4q6nZmGLWc/UAK4GigD9yI/AAAAAAAAAKk/8EISvE_J0gs/s1600/Model.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;"The decorator pattern can be used to &lt;/i&gt;&lt;i&gt;extend (decorate) the functionality of a certain object&lt;b&gt; at runtime&lt;/b&gt;,..."&lt;/i&gt;&lt;br /&gt;
Which component we are planning to decorate at runtime decorating here? The Armor ! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:as3;"&gt;package com.example{
 
  import flash.display.DisplayObject;
  import flash.display.DisplayObjectContainer;
  import flash.display.Sprite;
 
  public class Armor extends Sprite implements IArmor {
     
      public static const ARMOR_SHIELD:int=1;
      public static const ARMOR_BODY:int=2;
      public static const ARMOR_HELMET:int=4;
     
      private var _hasShield:Boolean=false;
      private var _hasHelmet:Boolean=false;
      private var _hasBody:Boolean=false;
     
      public function get hasBody():Boolean
      {
          return _hasBody;
      }

...
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We are creating Armor Decorator class in order to decorate armor. Component got wrapped around decorator class adding new functionality. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;package com.example{
 

  import flash.display.DisplayObjectContainer;
  ///!!! Don't extend ArmorDecorator from Armor (you would use decoupling of decorator from component decorating) Abstract class not available in AS3
  public class ArmorDecorator extends Sprite implements IArmor {
    private var _armorToBeDecorated : IArmor ;
    private var _type : int ;
    public function ArmorDecorator( decoratedArmor : IArmor ){
&lt;/pre&gt;
&lt;br /&gt;
//&lt;i&gt;"In the Decorator class, add a &lt;/i&gt;&lt;i&gt;Component pointer as a field;"&lt;/i&gt; - we have pointer to armor(_armorToBeDecorated)

&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;  


    _armorToBeDecorated = decoratedArmor;
     
      //add decoratedArmor to display list
      _armorToBeDecorated.getParent().addChild(this);
       }
   


&lt;/pre&gt;
"In the Decorator class, redirect all "Component" methods to the "Component" pointer "
   
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;   
    override public function getDefence (  ) : Number {
      return _armorToBeDecorated.getDefence() ;
    }

 public class ArmorMagicEnhancment extends ArmorDecorator {
     
    private var _resistance:Resistance;
    private var _type:int;
    private var _armorToBeDecorated:IArmor;
    public function ArmorMagicEnhancment( decoratedShild : IArmor,resistance:Resistance ){
      super (decoratedShild) ;
     
      _armorToBeDecorated=decoratedShild;
     
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
//Adding "state" = if armor is magical enhanced =&amp;gt; add glow&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;      


Sprite(_armorToBeDecorated).filters=[new GlowFilter(0xFF00FF)];
     
      _resistance=resistance;
    }
   
    override public function removeArmor(type:int=0):IArmor
    {
        //if type!=0
        if(type)
        {
            //if this type should be removed
            if(getType()==type)
            {
                this.parent.removeChild(this);
                return _armorToBeDecorated.removeArmor(type);
            }
           
            _armorToBeDecorated=_armorToBeDecorated.removeArmor(type);
            return  this;
        }
        else
        {
            this.parent.removeChild(this);
            return _armorToBeDecorated.removeArmor();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
In another decorator on top of basic decorator we can add additional decorations(extend and add new operations, behavior and states)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;package com.example{
  
  import flash.display.DisplayObjectContainer;
  
  import flashx.textLayout.elements.OverflowPolicy;
  
  public class HideHelmet extends Helmet {
    
    
    public function HideHelmet( decoratedArmor : IArmor ){
      name = "HideHelmet";
      super (decoratedArmor) ;
      
        
    }
    
    //we are adding some different behavior 
    override public function getDefence (  ) : Number {
      return super.getDefence() + Settings.HIDE_HELMET_DEFENCE ;
    }
   
  }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Hero is entity whose armor we are decorating during run-time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt; package com.example{
 
  import flash.display.Sprite;
 
  public class Hero extends Sprite {
    private var _armor : IArmor ;
  
    public function Hero(  ){
    
    }
    
    public function get hasBody():Boolean
    {
        if(!_armor) return false;
        return Armor(_armor.getParent()).hasBody;
    }
&lt;/pre&gt;
...to be Continue(&lt;a href="http://www.blogger.com/decorator-pattern-in-action-script_21.html=" http:="" winxalex.blogspot.com=""&gt;part 2&lt;/a&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download &lt;a href="http://www.winx.ws/blog/Decorator.zip"&gt;source&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
 SyntaxHighlighter.highlight();
&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/KA0FcBBk1fI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/829155338989491207/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/07/decorator-pattern-in-action-script.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/829155338989491207?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/829155338989491207?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/KA0FcBBk1fI/decorator-pattern-in-action-script.html" title="Decorator Pattern in Action Script (Games)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-kpAf-DvmH1k/T_wvjD9Y4UI/AAAAAAAAAKA/kBEvwdJszSA/s72-c/decorator.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/07/decorator-pattern-in-action-script.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQMR3c_cCp7ImA9WhJTFEg.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-6038621098877180383</id><published>2012-06-23T05:08:00.000-07:00</published><updated>2012-06-23T05:09:46.948-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-23T05:09:46.948-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Action Script" /><category scheme="http://www.blogger.com/atom/ns#" term="mx_internal" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash Builder" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="override" /><category scheme="http://www.blogger.com/atom/ns#" term="Flex" /><category scheme="http://www.blogger.com/atom/ns#" term="Error 1004" /><title>Override mx_internal function Error 1004</title><content type="html">If you need to override mx_internal function you will encounter Error 1004.&lt;br /&gt;
&lt;br /&gt;
If you include in header would work for call of mx_internal namespace function or variable&lt;br /&gt;
&lt;strike&gt;import mx.core.mx_internal&lt;/strike&gt;&lt;br /&gt;
&lt;strike&gt;use namespace mx_internal;&lt;/strike&gt;&lt;br /&gt;
but in override, wouldn't work.&lt;strike&gt; &lt;/strike&gt;&lt;br /&gt;
&lt;br /&gt;
You will find online Adobe employee Jedi for Adobe Highcouncil have registered &lt;a href="https://bugs.adobe.com/jira/browse/ASC-3728"&gt;bug&lt;/a&gt;(2010&amp;nbsp; and in current year is 2012 Flex SDK 4.6) and advice, that in 99% wouldn't work , "to remove &lt;i&gt;override &lt;/i&gt;key word". &lt;br /&gt;
Above would fool compiler but would throw run-time error of incompatible override signature.&lt;br /&gt;
Now pull you hair.&lt;br /&gt;
&lt;br /&gt;
After not having any hair I found out solution:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;public namespace mx_internal = "http://www.adobe.com/2006/flex/mx/internal";&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; override mx_internal function updateOrientationState():void&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //super.mx_internal::updateOrientationState();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/z0LVV0jay_s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/6038621098877180383/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/06/override-mxinternal-function-error-1004.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6038621098877180383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6038621098877180383?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/z0LVV0jay_s/override-mxinternal-function-error-1004.html" title="Override mx_internal function Error 1004" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/06/override-mxinternal-function-error-1004.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4FQ389eyp7ImA9WhJbFUU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-6919417295381716453</id><published>2012-06-21T17:27:00.001-07:00</published><updated>2012-09-25T06:48:32.163-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-25T06:48:32.163-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XSimulator" /><category scheme="http://www.blogger.com/atom/ns#" term="SimController" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash Professional CS6" /><category scheme="http://www.blogger.com/atom/ns#" term="TUIO" /><category scheme="http://www.blogger.com/atom/ns#" term="touch simulator" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Flex" /><category scheme="http://www.blogger.com/atom/ns#" term="gesture works" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash Develop IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="AIR 3.2" /><category scheme="http://www.blogger.com/atom/ns#" term="ADL" /><title>Gesture, Accelerator and Geolocation simulator (Flex mobile)</title><content type="html">Have you notice new so &lt;a class="spell" href="https://www.google.com/search?hl=en&amp;amp;client=firefox-a&amp;amp;hs=iiX&amp;amp;rls=org.mozilla:en-US:official&amp;amp;sa=X&amp;amp;ei=6LPjT-7mNZHntQaa2cGPCQ&amp;amp;ved=0CAgQvwUoAQ&amp;amp;q=necessary&amp;amp;spell=1"&gt;&lt;b&gt;&lt;i&gt;necessary&lt;/i&gt;&lt;/b&gt;&lt;/a&gt; simulator&amp;nbsp; for mobile development in Flash Professional CS6.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.youtube.com/watch?v=a389mkjVY_4&amp;amp;feature=related"&gt;&lt;img border="0" height="264" src="http://1.bp.blogspot.com/-nbRWnrto37o/T-OzewkF3mI/AAAAAAAAAJQ/YaFAVaS7tQ0/s320/up2.jpg" width="320" /&gt; l&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;Most of us were waiting lengthy packaging and deploy to device in order check some of the gesture or acceleration, and after finding stupid bug redoing the whole thing again. Or use some rudimentary free simulator thru socket servers or local connection, or pay for libs like &lt;i&gt;gestureworks&lt;/i&gt;. Finally polished simulator by Adobe as air app(using away3D and not Proscenium???) which also creates socket server and option to ADL(Air Debugger launcher) -Xsimulation &lt;port&gt; ,known only to&amp;nbsp;&lt;b&gt;&lt;i&gt;Lee&lt;/i&gt;&lt;/b&gt; &lt;b&gt;&lt;i&gt;Brimelow&lt;/i&gt;&lt;/b&gt; and &lt;i&gt;&lt;b&gt;Thibault Imbert&lt;/b&gt;&lt;/i&gt;, :) to force ADL to connect to Simulator.&lt;/port&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Why couldn't use it with Flash Develop or Flash Builder. Damn. :)))&lt;br /&gt;
&lt;br /&gt;
Download and install Flash Professional trail. You can find simulator app in your installation folder&lt;br /&gt;
ex "E:\Program Files\Adobe\Adobe Flash CS6\Common\Configuration\Simulator\simcontroller.exe"&lt;br /&gt;
&lt;br /&gt;
Run the Simulator &lt;br /&gt;
"E:\Program Files\Adobe\Adobe Flash CS6\Common\Configuration\Simulator\simcontroller.exe" -once&amp;nbsp; -lang en_US -port 7842 &lt;br /&gt;
&lt;br /&gt;
Run ADL from command prompt:&lt;br /&gt;
ex adl.exe application.xml -Xsimulation 7842&lt;br /&gt;
&lt;br /&gt;
Whoolla you can use simulator in your application.&lt;br /&gt;
&lt;br /&gt;
You are too lazy. Me too. Lets edit Run.bat in Flash Develop IDE mobile application template&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-j495txbY7h8/T-OzigfBdBI/AAAAAAAAAJY/11cv25OvR-w/s1600/up1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-j495txbY7h8/T-OzigfBdBI/AAAAAAAAAJY/11cv25OvR-w/s1600/up1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Create and add SimController.bat into bat folder. Change reference, pointing to your SimController instalation folder.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-J-naj9yM1Cs/T-O4dJtRnbI/AAAAAAAAAJk/Y7_8RdzfJgU/s1600/up3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-J-naj9yM1Cs/T-O4dJtRnbI/AAAAAAAAAJk/Y7_8RdzfJgU/s1600/up3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-DQaBhJtWcTc/T-O7Cqa8f0I/AAAAAAAAAJs/rv9Zfos4hqA/s1600/up4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-DQaBhJtWcTc/T-O7Cqa8f0I/AAAAAAAAAJs/rv9Zfos4hqA/s1600/up4.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;Next find out how we can pass Xsimulation as application.xml tag in Flash Builder somewhere somenamed somehow HO HO HO&lt;br /&gt;
&lt;i&gt;Update: 25.09.12&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Flash Builder 4.7 allows ADL custom compiler&amp;nbsp; params. &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
If you like this please click +1;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/qWD4LKsbjUE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/6919417295381716453/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/06/gesture-accelerator-and-geolocation.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6919417295381716453?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6919417295381716453?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/qWD4LKsbjUE/gesture-accelerator-and-geolocation.html" title="Gesture, Accelerator and Geolocation simulator (Flex mobile)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-nbRWnrto37o/T-OzewkF3mI/AAAAAAAAAJQ/YaFAVaS7tQ0/s72-c/up2.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/06/gesture-accelerator-and-geolocation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cFQH4_fyp7ImA9WhBbFkg.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-9063361382253894832</id><published>2012-04-28T10:39:00.000-07:00</published><updated>2013-05-15T16:03:31.047-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-15T16:03:31.047-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AIR" /><category scheme="http://www.blogger.com/atom/ns#" term="Template" /><category scheme="http://www.blogger.com/atom/ns#" term="SWC" /><category scheme="http://www.blogger.com/atom/ns#" term="Sign" /><category scheme="http://www.blogger.com/atom/ns#" term="ANE" /><category scheme="http://www.blogger.com/atom/ns#" term="Certificate" /><category scheme="http://www.blogger.com/atom/ns#" term="Native extension" /><category scheme="http://www.blogger.com/atom/ns#" term="Package" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash Develop IDE" /><title>Native extension template Flash Develop IDE</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Yhlu_02K-ww/T5wyau22BaI/AAAAAAAAAIA/mm3bFFAMe4M/s1600/Clipboard011.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://1.bp.blogspot.com/-Yhlu_02K-ww/T5wyau22BaI/AAAAAAAAAIA/mm3bFFAMe4M/s400/Clipboard011.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Open your extension.xml and setup your native library name and path to your class in native code that extends &lt;i&gt;FreExtension&lt;/i&gt; as initializer and &lt;i&gt;id&lt;/i&gt; which would be used to create and identify context. &lt;i&gt;Extension.createExtensionContext&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;img border="0" src="http://2.bp.blogspot.com/-1Ytv4s0h9_Y/T5wzn0J94iI/AAAAAAAAAII/8NkGTevRqEo/s1600/Clipboard012.jpg" /&gt;&lt;/div&gt;
&lt;br /&gt;
Open bat/Setup.bat to set path to your FlexSDK with AIR.(AIR 3.0 or above)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-KPS3ipqOZ0Q/T5w011Tk83I/AAAAAAAAAIc/P5SxPF8jOzw/s1600/Clipboard013.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-KPS3ipqOZ0Q/T5w011Tk83I/AAAAAAAAAIc/P5SxPF8jOzw/s1600/Clipboard013.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
You could use bat/Certificate.bat to create key to sign your native extension.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Open main entry ActionScript class and code it. (Template would auto generate it for you)&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" src="http://1.bp.blogspot.com/-ewW0jsj6Quk/T5wxrUsJm6I/AAAAAAAAAH4/qWpR8zhOWZ8/s1600/Clipboard06.jpg" /&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
Run PackageSWC.bat. It would create swc of your interface towards native code (.jar or .a,...file) and unpack library.swf in the platform folders.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-0qDX7643Oyc/T5w3DM5tezI/AAAAAAAAAIo/6wsTthnXtl0/s1600/Clipboard015.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-0qDX7643Oyc/T5w3DM5tezI/AAAAAAAAAIo/6wsTthnXtl0/s1600/Clipboard015.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Copy your native code inside platform folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-gpCqPjlLBhI/T5w4Ou-BeeI/AAAAAAAAAIw/FPMNAUlxChY/s1600/Clipboard016.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-gpCqPjlLBhI/T5w4Ou-BeeI/AAAAAAAAAIw/FPMNAUlxChY/s1600/Clipboard016.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
Update 28.08.12&lt;br /&gt;
If&amp;nbsp; you have resources(drawable,layout,strings...) in you Android Java project, copy them in extlib-&amp;gt;Android-ARM-&amp;gt;res folder so they be packed into the ane.&lt;br /&gt;
Run PackageAne.bat. It would create your native extension swc and unpack in "ane" folder.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-395ZMLfnauU/T5w0abQac1I/AAAAAAAAAIQ/cOZQRkbSQA0/s1600/Clipboard014.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-395ZMLfnauU/T5w0abQac1I/AAAAAAAAAIQ/cOZQRkbSQA0/s1600/Clipboard014.jpg" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
If you want to add more classes beside Main.as to your swc you should edit conf/swcConfig.xml&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-GRdctq5sbOc/UDfx4yx4MGI/AAAAAAAAALg/EjbaTj8tGYA/s1600/Clipboard05.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-GRdctq5sbOc/UDfx4yx4MGI/AAAAAAAAALg/EjbaTj8tGYA/s1600/Clipboard05.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-qtwngW1eCGE/T5w6Oq86qqI/AAAAAAAAAI4/g1R4ZcbjOmQ/s1600/Clipboard017.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;and add to path-element new tag with your class name (MyNewClass.as).(* def this need improvement maybe some batch to read content of "src" and change xml)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-mbQau0PIzeM/T5w6_Sji3VI/AAAAAAAAAJA/s0d-zQWrPnE/s1600/Clipboard018.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-mbQau0PIzeM/T5w6_Sji3VI/AAAAAAAAAJA/s0d-zQWrPnE/s1600/Clipboard018.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
*Update 29.05.12&lt;br /&gt;
Extract the template downloaded from below link into Projects folder of your FlashDevelop installation.&lt;br /&gt;
&amp;nbsp;ex. E:\Program Files\FlashDevelop\Projects&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;*Update 22.08.12&lt;br /&gt;
In other project where you will use created native extension from above:&lt;br /&gt;
1. Create folder "extdir"&lt;br /&gt;
2. Copy &lt;i&gt;Multitouch.ane&lt;/i&gt; folder and &lt;i&gt;Multitouch.swc&lt;/i&gt; inside&lt;br /&gt;
2a. Right Click on the&amp;nbsp; &lt;i&gt;Multitouch.swc -&amp;gt;&lt;/i&gt; Add to Library&lt;i&gt; &lt;/i&gt;&lt;br /&gt;
2b. Right Click on the&amp;nbsp; &lt;i&gt;Multitouch.swc -&amp;gt;&lt;/i&gt; Options-&amp;gt;External Library&lt;i&gt; &lt;/i&gt;&lt;br /&gt;
3. In Run.bat add -extdir "extdir"&lt;br /&gt;
adl -screensize %SCREEN_SIZE% -XscreenDPI %SCREEN_DPI% "%APP_XML%" "%APP_DIR%" -extdir "extdir"&lt;br /&gt;
The above is for Debug and Release. If&amp;nbsp; you want to package:&lt;br /&gt;
1.Create folder "ane"&lt;br /&gt;
&lt;strike&gt;2. Copy &lt;i&gt;Multitouch.swc (rename it to .ane)&lt;/i&gt;&lt;/strike&gt;&lt;br /&gt;
2. Copy &lt;i&gt;Multitouch..ane&lt;/i&gt;&lt;br /&gt;
3.In Package.bat add -extdir "ane"&lt;br /&gt;
call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR% -extdir "ane" &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-iLiioMZvlkE/UDf177FEyPI/AAAAAAAAALw/zhKpJRridCU/s1600/Clipboard02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-iLiioMZvlkE/UDf177FEyPI/AAAAAAAAALw/zhKpJRridCU/s1600/Clipboard02.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
*Update 28.09.12&amp;nbsp; Template Packager.bat updated, "res" and "ane" folder added for packed .ane file. &lt;br /&gt;
&lt;br /&gt;
*Update 09.05.13 &amp;nbsp;.&lt;br /&gt;
1. added -platformoptions flag in command line and platformoptions.xml in iPhone-ARM folder, so additional frameworks and libs can be defined in linkeroptions&lt;br /&gt;
2. changed IPhone-ARM folder name to iPhone-ARM.&lt;br /&gt;
3. changed IPhone-ARM extension.xml to iPhone-ARM fixing problems with packaging under IOS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/FlashDevelop4AS3Native%20ExtensionTemplate.zip"&gt;download&lt;/a&gt;

&lt;a class="twitter-timeline" href="https://twitter.com/Winx_Alex" data-widget-id="334804742494646272"&gt;Tweets by @Winx_Alex&lt;/a&gt;
&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");&lt;/script&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/mERftO3dMj8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/9063361382253894832/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/04/native-extension-template-flash-develop.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/9063361382253894832?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/9063361382253894832?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/mERftO3dMj8/native-extension-template-flash-develop.html" title="Native extension template Flash Develop IDE" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Yhlu_02K-ww/T5wyau22BaI/AAAAAAAAAIA/mm3bFFAMe4M/s72-c/Clipboard011.jpg" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/04/native-extension-template-flash-develop.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUNQXoyeip7ImA9WhBaEEU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-7717917345668783441</id><published>2012-04-16T10:06:00.000-07:00</published><updated>2013-05-20T15:01:30.492-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-20T15:01:30.492-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Texture Packager" /><category scheme="http://www.blogger.com/atom/ns#" term="3D" /><category scheme="http://www.blogger.com/atom/ns#" term="MovieClips" /><category scheme="http://www.blogger.com/atom/ns#" term="Games" /><category scheme="http://www.blogger.com/atom/ns#" term="Animation" /><category scheme="http://www.blogger.com/atom/ns#" term="IPhone" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="Starling framework" /><category scheme="http://www.blogger.com/atom/ns#" term="OpenGL" /><category scheme="http://www.blogger.com/atom/ns#" term="AIR 3.2" /><category scheme="http://www.blogger.com/atom/ns#" term="2D" /><title>Starling Framework Extension (Games)</title><content type="html">"&lt;i&gt;Starling&lt;/i&gt; is a port of an iPhone Development Framework named &lt;i&gt;Sparrow&lt;/i&gt; 
written by Gamua that lets developers take advantage of the hardware 
capabilities of coding for OpenGL, but are abstracted to Classes and 
APIs that are familiar to ActionScript developers."&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-IS5isUZig4o/T41eZF3ZCQI/AAAAAAAAAHs/By73K4UC03Q/s1600/Clipboard06.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-IS5isUZig4o/T41eZF3ZCQI/AAAAAAAAAHs/By73K4UC03Q/s320/Clipboard06.jpg" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
But why should I use iPhone Development workflow? Why should we use 
Texture packager and tools alike to export all our swf animations to 
huge bitmap called TextureAtlas?&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-wiXqJTKvYAs/T4xT6ga-2dI/AAAAAAAAAHc/xcntHrE94ic/s1600/Creature.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-wiXqJTKvYAs/T4xT6ga-2dI/AAAAAAAAAHc/xcntHrE94ic/s320/Creature.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;Is this Flash way?&lt;br /&gt;
Why should I load 2.28MB picture in memory for 20 frames instead 30KB something swf or swc? What about if I want to scale it. Should I create and load Atlas for every size I've.&lt;br /&gt;
&lt;br /&gt;
What about if I embed swc or swf with animation vector data and use it to create texture's bitmap data when ever I need and with size I need. I've develop this logic for &lt;a href="http://winxalex.blogspot.com/2010/04/blog-post.html"&gt;AnimatedClip&lt;/a&gt; and can be 99%(*) applied with Starling.MovieClip too, so would be good to check my previous post.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.winx.ws/blog/StarlingMyExp.html"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/--oWqB1OS8Wk/T4xVmRceVXI/AAAAAAAAAHk/AiOKUOIKEsY/s1600/Clipboard06.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
(see embedded CreatureRageMode.swf and included CreatureNormalMode.swc)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: as3;"&gt;
public static function getMovieClipTextures(name:String,preserveColor:Boolean=false,processFilters:Boolean=true):Vector.
        {
            
                        
             if (sTextures[name] == undefined)
            {
                
                var data:*= new Assets[name]();
                
                _stage.addChild(data);
               sTextures[name] = generateTextureFrames(data);
                _stage.removeChild(data);
            }
            
            return sTextures[name];
        }
&lt;/pre&gt;
&lt;br /&gt;
Standard 2D &lt;i&gt;MovieClips&lt;/i&gt; are added to stage, frames converted to Textures and removed. Textures are used for creation of Starling.MovieClip.&lt;br /&gt;
&lt;br /&gt;
*as you can see Starling.MovieClip should be tweaked for pivots and using different size bitmaps in different frame.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Source: &lt;a href="http://www.winx.ws/blog/StarlingMyExp.zip"&gt;download&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;script type="text/javascript"&gt;
 SyntaxHighlighter.highlight();
&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/cb80gcAFvP4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/7717917345668783441/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/04/starling-framework-extension-games.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7717917345668783441?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/7717917345668783441?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/cb80gcAFvP4/starling-framework-extension-games.html" title="Starling Framework Extension (Games)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-IS5isUZig4o/T41eZF3ZCQI/AAAAAAAAAHs/By73K4UC03Q/s72-c/Clipboard06.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/04/starling-framework-extension-games.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAGQ38-fSp7ImA9WhVTEkU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-4823280663731117038</id><published>2012-02-26T11:32:00.000-08:00</published><updated>2012-02-26T11:32:02.155-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T11:32:02.155-08:00</app:edited><title /><content type="html">I've been busy lately, in spare time was reviewing one good book.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://www.packtpub.com/adobe-flash11-stage3d-molehill-game-programming-beginners-guide/book"&gt;&lt;img alt="" src="data:image/jpeg;base64,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tjUV2rSHqYh9iB8qOUwyx7ciJ/4pax0GDnGc49NbdT3ep02obg1hqDMTMuuO1BgKUE4jxgQFpX19UJSMDIyNal074Ue44M2WhFdjVOqwm4MmO2Y6YrKOIQ6UKCfMWFJBwhRAGT17aMtC90CtwmC0Fo2TbsBI10uRPZ2obb2oetx6g1i/6rTINGqK4chxpMomUuM6cqKWwkq91P0jjAz0JPTX7UdqZU4P1+iz6RTqVOVJk0eLUagGpMmI2ogKSFDGSB/mUDrI3SvOPfl5Sq/AjvRoJaZjxGHccmmm2wkJ6EgdQo9D66M6fu7aVMsaRbTVNrcsP01URNLnLZfgsSVd5Da1DzUYJKggYGT+3UAUiS3YFd7sc2myqLvOo2Ad+vb2HRBG29l/d5dDVGemexwmmnJk6TjJZjNjK1AfHsB9ZGimdR9s6zbdVmUSzrrpCYbC3qdVXecpiYUHBS6Eo4t5weoOAc5PTBGdtL2ZsS4nKjNp5nU+dDep06OlfBa47oAVxPoegP7MdO+iyqbp2rS7DqNiWSm6pEephtsmszUFuI0lzmpDLTfQcskE9O+dFPIGXib+itihiXYgBgMc2IMDXnE79ljaNLoZVtRdLc8U1wwkPChfdC7l44Zicc++cdF/8v1jrrVa2rqFVo1tRabTWI1QqUGTV5c6TPwwiElQCXFpKQGkgHvlRP1aILs3isqqt3VUKLR6y1VrkpkamoXIU0GYrSAkONpCTniQnOeuSewHf4u7wWnPqEymT6XVm7ek21Gt9v2ctiUyGSFBYBPEgqzkZ6jH6NTlogxPv2PFYcdwg9ocWQR5X23ubDbl+S+EnZGYza1HjQ/ZKjcFdqTyosmLNC4fyc0yFLd5dAAFK6k4IxjGdA92WPVLRagS5M2nVCFU0uKizafI85hwoVxWkKwDySSMjHqO+mNC3vtuiVCgwqFRqo1Q6ZRJVHeDi2zJCpCwpbyD9AqyhB6gA9RgDGgrca9ot1Kp0ClP1R2BTW18FT/KStbqyCtQQ0AlAwEjAz2znUVBRyy3X/XqtcG/H8aBVHNMkz8zHy/xt8/oGampqaWXZX9CVf8A474DxLz9vTvMWeS8VdvHI9/XU/B10v8AN6f/ABdv7dTU1blR6De71XIPBZ6+p93op+Drpf5vT/4u39up+Drpf5vT/wCLt/bqamp5Weg3u9VHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39up+Drpf5vT/4u39upqaOVnoN7vVHws9fU+4eSn4Oul/m9P8A4u39upqamjlZ6De71R8LPX1PuHkv/9k=" /&gt;https://www.packtpub.com/adobe-flash11-stage3d-molehill-game-programming-beginners-guide/book&lt;/a&gt;&lt;br /&gt;
Despite I've quite experience with Papervison3D redoing and enhancing original library support of Open GL from Flash 11 player changed things alot.&amp;nbsp; You probably wouldn't&amp;nbsp; code low level very often (probably when creating custom shaders and particals&amp;nbsp; thru AGAL) but you would use high level libraries like Alternativa, Away 3D...&lt;br /&gt;
You can fill the gaps of your 3D knowledge&amp;nbsp; with this book as I did and also learn how above libs work under the hood.&amp;nbsp; Book give some optimization tips for best performance and information of advance topics . Good thing is that learning of Stage3D goes thru building of example game.&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/esYysWUHVQI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/4823280663731117038/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/02/ive-been-busy-lately-in-spare-time-was.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/4823280663731117038?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/4823280663731117038?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/esYysWUHVQI/ive-been-busy-lately-in-spare-time-was.html" title="" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/02/ive-been-busy-lately-in-spare-time-was.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08NR3w9eyp7ImA9WhBbGE0.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-1347799412223429245</id><published>2012-02-15T14:14:00.000-08:00</published><updated>2013-05-17T08:51:36.263-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-17T08:51:36.263-07:00</app:edited><title>Fuzzy Library 1.0.2</title><content type="html">&lt;pre class="brush: as3;"&gt;rule = new FuzzyRule(
function():Number
                        { 

//IF MEDIUM AND LOW 
return    fuz.AND.call(null,
                                              fuz.inputFuzzymanifolds.Distance_to_Target.memberfunctions.Far.degreeOfMembership,
                                           
                                            fuz.inputFuzzymanifolds.Ammo_Status.memberfunctions.Low.degreeOfMembership
                                   )
                                 
                        },
                    //THEN UNDESIRABLE
                        fuz.outputFuzzyManifolds.Desirability.memberfunctions.Undesirable
                      );
                     
         fuz.addRule(rule,false);
&lt;/pre&gt;
&lt;pre class="brush: as3;"&gt;
&lt;/pre&gt;
&lt;pre class="brush: as3;"&gt;
&lt;/pre&gt;
&lt;pre class="brush: as3;"&gt;&lt;a href="http://winxalex.blogspot.com/2010/08/fuzzy-logic-games-library-01-in.html"&gt;More...&lt;/a&gt;&lt;/pre&gt;
&lt;pre class="brush: as3;"&gt;
&lt;/pre&gt;
&lt;pre class="brush: as3;"&gt;&lt;a href="https://code.google.com/p/fuzzylogic-actionscipt3/"&gt;SVN&lt;/a&gt;&lt;/pre&gt;
&lt;script type="text/javascript"&gt;
 SyntaxHighlighter.highlight();
&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/yJPLBMCHy2E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/1347799412223429245/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2012/02/fuzzy-library-102.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/1347799412223429245?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/1347799412223429245?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/yJPLBMCHy2E/fuzzy-library-102.html" title="Fuzzy Library 1.0.2" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2012/02/fuzzy-library-102.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8ESXg9cSp7ImA9WhRQE0s.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-8915387644719893685</id><published>2011-11-24T12:36:00.001-08:00</published><updated>2011-12-08T10:10:08.669-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-08T10:10:08.669-08:00</app:edited><title>Facebook Application Development with Graph API Cookbook</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-q6yQ9MBXEWk/Ts6r9XhAsJI/AAAAAAAAAGU/6olq4V-pVtg/s1600/0928EXP_Facebook+Application+Development+with+Graph+API+Cookbook.jpg.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/news/moodle-festive-month" target="_blank"&gt;Find good discounts on this and other books.&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black; font-family: Calibri;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://www.packtpub.com/facebook-application-development-with-graph-api-cookbook/book" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/Y8LXXW93iS8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/8915387644719893685/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/11/facebook-application-development-with.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8915387644719893685?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8915387644719893685?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/Y8LXXW93iS8/facebook-application-development-with.html" title="Facebook Application Development with Graph API Cookbook" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-q6yQ9MBXEWk/Ts6r9XhAsJI/AAAAAAAAAGU/6olq4V-pVtg/s72-c/0928EXP_Facebook+Application+Development+with+Graph+API+Cookbook.jpg.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/11/facebook-application-development-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8DR3o_cCp7ImA9WhBaEEU.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-230091843619219080</id><published>2011-11-05T10:12:00.000-07:00</published><updated>2013-05-20T15:27:56.448-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-20T15:27:56.448-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="3D" /><category scheme="http://www.blogger.com/atom/ns#" term="Morph" /><category scheme="http://www.blogger.com/atom/ns#" term="Action Script" /><category scheme="http://www.blogger.com/atom/ns#" term="Proscenium" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><title>How to Morph (manipulate vertices) Proscenium Stage3D Molehil</title><content type="html">&amp;nbsp;In Procenium you can't do something like this&lt;br /&gt;
&lt;div style="color: #274e13; text-align: center;"&gt;
(i-th v-vertex of some mesh)&lt;/div&gt;
&lt;div style="color: #274e13; text-align: center;"&gt;
v[i].x=0.5&lt;/div&gt;
&lt;div style="color: #274e13; text-align: center;"&gt;
v[i].y=0.5&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="color: #274e13;"&gt;v[i].z=0.3&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
as you would do in some others frameworks.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
The above code in basic tough would mean creation of buffer for one vertex and upload modification into GPU. What about you need to modify many vertices (or all) of the mesh as you will do in the morphing???&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.winx.ws/blog/bin/TestVertices.html" target="_blank"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-jtM-E0JfOxY/TrVswDU9h4I/AAAAAAAAAF8/irYjY_4gG3o/s400/Clipboard01.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
After creation of the &lt;i&gt;MeshElement&lt;/i&gt; from &lt;i&gt;MeshData&lt;/i&gt; local buffer with 3 sets of data is created and uploaded &lt;i&gt;VertexBuffer3DHandle.uploadFromVector&lt;/i&gt;(I couln't understand why is internal when &lt;i&gt;uploadFromByteArray &lt;/i&gt;is public)&lt;i&gt; and&amp;nbsp;&lt;/i&gt;&lt;i&gt; &lt;/i&gt;to GPU. &lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;i&gt;Indices Set&lt;/i&gt; - contains indices of the vertex info in vertices setset&amp;nbsp; &lt;span style="color: #274e13;"&gt;ex. index[0,1,2...]=30,10,12 ...&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
inx ex. 30 means 30-th group of vertices set actually vertexSet[30 * stride]&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;i&gt;Vertices Set&lt;/i&gt; -contains vertex info for every primitive in successive order as defined&lt;br /&gt;
in &lt;a href="http://winxalex.blogspot.com/2011/10/md2-model-loader-proscenium-3d.html" target="_blank"&gt;primitive's index vector&lt;/a&gt;&lt;br /&gt;
&lt;span style="color: #274e13;"&gt;.... v30posX,v30posY, v30posZ u30,v30,v30normXv30normY,v30normZ,...(stride=8)&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;i&gt;Joints Set -...&lt;/i&gt;(think which vertices are connected&lt;i&gt; &lt;/i&gt;to which joint)&lt;br /&gt;
&lt;br /&gt;
Idea was changing the content of the verticesSet and upload to the bufffer. &lt;br /&gt;
&amp;nbsp;You could obtain copy &lt;i&gt;Indices Set &lt;/i&gt;and &lt;i&gt;Vertices Set &lt;/i&gt;thru MeshUtils.getCopy but I didn't find way to change their content. Other problem was there is no information about vector indices inside &lt;i&gt;Vertices Set &lt;/i&gt;used&amp;nbsp; so you know which value inside vertices set belong to which vertex. Luckily I found local structure created during proccesing of MeshData of type &lt;i&gt;IndexHashMap(simple but powerful packing)&lt;/i&gt; which actually contain just that information and expose it to subclasses.&lt;br /&gt;
&lt;span style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v[3]=[0,12,29..] //&lt;/span&gt;&amp;nbsp;&lt;span style="color: #274e13;"&gt; 3-th vertex is involved into face 0,12 and 29...&lt;/span&gt;&lt;br /&gt;
As much Adobe tried go more on speed and make easy for designers (of course no one want to reinvent the wheel), seems framework is very close by my opinion ,especially when you need for example create your custom &lt;i&gt;MeshElement&lt;/i&gt; and &lt;i&gt;MeshElementData&lt;/i&gt; or its super classes like &lt;i&gt;MeshPolylistElementData&lt;/i&gt;, from one side from the other side back to writing assembler to make particles (of course for custom shader but let's write binary for other cases it will be more easy :)) when we have high level languages) &amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
Update 05.01.12.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I found reference of this post on one Japanese blog about better solution by creation and removing MeshElements with every vertex change as cleaner solution. I agree (similar thing is done in my MD2 importer) but influence to performance is very big and sometimes thing must be ugly :)) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestVertices.zip"&gt;Source&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/N95zXJz2iAQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/230091843619219080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/11/how-to-morph-manipulate-vertices.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/230091843619219080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/230091843619219080?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/N95zXJz2iAQ/how-to-morph-manipulate-vertices.html" title="How to Morph (manipulate vertices) Proscenium Stage3D Molehil" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-jtM-E0JfOxY/TrVswDU9h4I/AAAAAAAAAF8/irYjY_4gG3o/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/11/how-to-morph-manipulate-vertices.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQNQnc-eyp7ImA9WhRSFUk.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-6916962570997346822</id><published>2011-11-04T02:00:00.000-07:00</published><updated>2011-11-17T08:29:53.953-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-17T08:29:53.953-08:00</app:edited><title>How to cook Flash Facebook games and social application (Tips and tricks)</title><content type="html">As Facebook lack of good documentation and also support of Adobe is somekind of open project I find useful to write few tips that will save you time and headeches.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tip1:&lt;/b&gt; Avoid using obsolete technologies&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;FBJS&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;RestAPI&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;FBML&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="text-align: justify;"&gt;
and tones of google trashy old tutorials. This is very hard as Facebook changes are very often (lately I found that have changed &lt;i&gt;auth.statusChange&lt;/i&gt; event status from &lt;b&gt;not_connected&lt;/b&gt; to &lt;b&gt;not_authorized&lt;/b&gt;) but investing in legacy technologies in only if you desperate . This tips might be obsolete too so be careful and read what is newest.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Tip2:&amp;nbsp; &lt;/b&gt;HTML container page&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
Its not enough to download and included &lt;a href="http://code.google.com/p/facebook-actionscript-api/" target="_blank"&gt;FlashFacebook&lt;b&gt; &lt;/b&gt;swc API's&lt;/a&gt;&lt;b&gt; . FlashFacebook API's are using ExternalInterface for communication to JS. &lt;/b&gt;If you check Facebook documentation 99% of examples&amp;nbsp; not telling to include JSDK js to your html page:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;lt; script src="http://connect.facebook.net/en_US/all.js" type="text/javascript" &amp;gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
don't forget to put this layer inside body tag.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; div id="fb-root" &amp;gt;&lt;br /&gt;
&lt;br /&gt;
in you swfobject.js code you should have(one is used by IE and one for FF):&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;var attributes = {};&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; attributes.id = "qol";&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; attributes.name = "qol";&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tip3: &lt;/b&gt;What and where work&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
Most of things work in AIR but not in web application.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;Facebook.init("&lt;b&gt;YOUR_APP_ID&lt;/b&gt;", onFacebookInit);&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;onFacebookInit&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;would not fire local or localhost&amp;nbsp; so you need to upload online host on which your Facebook app settings point to then change DEBUG configuration to debug from online&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected function onFacebookInit(success:Object, fail:Object):void {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (success) {&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else{&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Facebook.login(onFacebookLogin);&amp;nbsp;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="color: white;"&gt;
&lt;b&gt;Facebook.login&lt;/b&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&amp;nbsp; if you are logged and authorized app would do nothing&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;nbsp; if you aren't logged would open login dialog (then if you not authorized application would open permission dialog)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;nbsp; if you are logged and not_authorized app would open permission dialog&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;every of above situation if successful&amp;nbsp; would trigger &lt;/b&gt;&lt;i&gt;onFacebookInit&lt;/i&gt; &lt;b&gt;too&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Tip4:&lt;/b&gt; Invite friends&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;span style="color: red;"&gt;&amp;nbsp; Facebook.ui("apprequests",{message:"Join Quest of Legends Game",picture:"http://www.google.com/intl/en_com/images/srpr/logo3w.png",description:"Quest of legends is very addictive...",caption: "Quest of Legends"},onFriendsHandler);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: white;"&gt;
&lt;b&gt;-message&amp;nbsp; (required)&lt;/b&gt;&lt;/div&gt;
&lt;div style="color: white;"&gt;
&lt;b&gt;- to: '499802820,499802852'....users id's&amp;nbsp; (omitting it mean everyone)&lt;/b&gt;&lt;/div&gt;
&lt;b style="color: white;"&gt;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;b style="color: white;"&gt;Tip5:&lt;/b&gt;&lt;b&gt;&lt;/b&gt;Buy credits&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt; works only if you access your html page containing swf thru http://apps.facebook.com/YOUR_APP_ID/ as canvas page&lt;br /&gt; &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="color: red;"&gt;Facebook.ui('pay', {credits_purchase: true }, onFacebookCreditsPurchase );&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tip5:&lt;/b&gt;Track user status&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
If you not track if user is still logged or not or something happen your game or app might blow so its good you listen for this event:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;Facebook.addJSEventListener("auth.statusChange", statusChangeHandler);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;protected function statusChangeHandler(result:Object):void {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (result &amp;amp;&amp;amp; result.status) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; switch (result.status) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case "connected":&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; isLoggedOn = true;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; trace ( "User is logged in and authorised our application.");&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case "not_authorized":&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; isLoggedOn = false;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; trace "User is logged in but has not authorised our application.");&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; default:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; Facebook.login(onFacebookLogin);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; isLoggedOn = false;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; trace( "Status Unknown.");&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tip6:&lt;/b&gt;Publish status/feed&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;woudn't work if you aren't logged&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="color: red;"&gt;Facebook.api("/me/feed",submitPostHandler,{message:text},"POST");&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt; &lt;br /&gt;
&lt;a href="http://www.amazon.co.uk/s/ref=nb_sb_ss_i_0_15/277-4499114-3348816?url=search-alias%3Daps&amp;amp;field-keywords=flash+facebook+cookbook&amp;amp;x=0&amp;amp;y=0&amp;amp;sprefix=Flash+Facebook+" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51Mg8lX0t3L._SL160_PIsitb-sticker-arrow-dp,TopRight,12,-18_SH30_OU02_AA115_.jpg" /&gt;&lt;/a&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Recently I encounter one great book on very hot topic and it was honоr that reviewing is being granted to me . &lt;b&gt;Cooking games and social application of Facebook!!!&lt;/b&gt;.&lt;strike&gt; I'm still reviewing it but&lt;/strike&gt; found very useful for someone want to learn to use of Facebook API's fast and in deep, and what is most important is that realtime situations are covered with example source code.&lt;/div&gt;
&lt;br /&gt;
So I warmly recommend it.&lt;a href="http://www.packtpub.com/flash-facebook-cookbook-for-graph-api-applications/book"&gt;FaceCookbook&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/X1FI2MfDRWk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/6916962570997346822/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/11/flash-face-cookbook.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6916962570997346822?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/6916962570997346822?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/X1FI2MfDRWk/flash-face-cookbook.html" title="How to cook Flash Facebook games and social application (Tips and tricks)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/11/flash-face-cookbook.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIBRHgzfSp7ImA9WhRbFEw.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-8347284548905735662</id><published>2011-10-30T13:26:00.000-07:00</published><updated>2012-02-04T20:52:35.685-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-04T20:52:35.685-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Viewer" /><category scheme="http://www.blogger.com/atom/ns#" term="Packing" /><category scheme="http://www.blogger.com/atom/ns#" term="Action Script" /><category scheme="http://www.blogger.com/atom/ns#" term="Proscenium" /><category scheme="http://www.blogger.com/atom/ns#" term="Stage 3D" /><category scheme="http://www.blogger.com/atom/ns#" term="Zip" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash 11" /><category scheme="http://www.blogger.com/atom/ns#" term="DAE" /><category scheme="http://www.blogger.com/atom/ns#" term="AIR 3.0" /><category scheme="http://www.blogger.com/atom/ns#" term="Collada" /><title>Collada DAE to  Proscenium ActionScript Export Stage3D Flash11</title><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XML that X stating for exchange is well known format of exchanging files between different systems, programs and worlds. Thru Collada specification and its xml file format .dae&amp;nbsp; users could exchange 3D files created in diffrent 3D environments like Maya, 3D Max, Blender, Daz and so on... and this exchanging file format got supported in Procsenium as well. &lt;br /&gt;
&amp;nbsp;Having simple running animation of woman model having 51777 vertices in my DAZ exported .dae file, file reach 6.5MB (excluding all unnecessary and unsupported things like morphs) + 1.15MB jpg textures. By zipping DAE file I decrease it to 1.19MB (maybe some packing methods like built in Proscenium LZH would return even better results) but also increase the size of main.swf file, now containing the compression libraries and additional time to for unzipping. Also parsing of text file isn't avoided. All in all parsing of such big .dae (text files) takes a lot to time so I couldn't find logic in using DAE files by many developers in production phase. So lets underline again word &lt;u&gt;&lt;b&gt;EXCHANGE&lt;/b&gt;&lt;/u&gt;. By my opinion as clearly stated we should use .dae files for exchange and inside the Flash platform swf,swc as we would use .max files in 3DMAX or .obj files in WAVEFRONT...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Being stubborn myself and want to prove the concept to other developers I built little AIR application that can preview &lt;b&gt;.dae&lt;/b&gt; files and export then as &lt;b&gt;.as&lt;/b&gt; .&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-24u9sdQUEW8/Tq2th4Dg7RI/AAAAAAAAAF0/YcCfEXPUmJ0/s1600/Clipboard01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="388" src="http://2.bp.blogspot.com/-24u9sdQUEW8/Tq2th4Dg7RI/AAAAAAAAAF0/YcCfEXPUmJ0/s640/Clipboard01.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp; with options, texture files to be embed or loaded for external source. By using embed option (model+bones+animation+texture files) I succeed in getting export of 3.44MB &lt;a href="http://www.winx.ws/blog/TestExports.html"&gt;swf&lt;/a&gt; size loading in less then 5s.&lt;br /&gt;
Exporter can create ActionScript files:&lt;br /&gt;
&lt;br /&gt;
-Model.as that is planned for raw inclusion in your project. &lt;br /&gt;
-Model.as that is planned as external swf/swc and then loaded in main.swf. (6.5MB .dae was 4.5MB swf)&lt;br /&gt;
swf doesn't contain Proscenium.swc so duplication of&amp;nbsp; Proscenium.swc requred inclusion in main.swf&amp;nbsp; is avoided with bit loss of creation speed using &lt;i&gt;getDefinitionByName&lt;/i&gt; function.&lt;br /&gt;
Model.as in both cases could have source for loading textures or to embed them&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;There lot of space of improvements and upgrades like using ByteArrays or BinarySerialization to pack model data inside .as.&lt;br /&gt;
Next: &lt;br /&gt;
Option of generation of relative texture urls is in plan and prevention of duplication of embedlinks. (Currently manual fixed)&lt;br /&gt;
Reduce decimals like this 0.35814398527145386 to 6 digits think its enough?&lt;br /&gt;
&amp;nbsp;I wish to hear your toughs or at least support so I can provide more to the community and my 3 weeks day night effort isn't futile.&lt;br /&gt;
Someone said saying "Great model!". (I wonder if this is a showcase) :))))).&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/Exporter.zip"&gt;Source(+ air installation)&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestExporter.zip"&gt;Test project file&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/uY14278R5So" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/8347284548905735662/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/10/collada-dae-to-proscenium-actionscript.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8347284548905735662?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/8347284548905735662?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/uY14278R5So/collada-dae-to-proscenium-actionscript.html" title="Collada DAE to  Proscenium ActionScript Export Stage3D Flash11" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-24u9sdQUEW8/Tq2th4Dg7RI/AAAAAAAAAF0/YcCfEXPUmJ0/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/10/collada-dae-to-proscenium-actionscript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEMRXg7cCp7ImA9WhRaE0k.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-3414201822905706850</id><published>2011-10-24T12:58:00.000-07:00</published><updated>2012-02-15T14:08:04.608-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-15T14:08:04.608-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Bone" /><category scheme="http://www.blogger.com/atom/ns#" term="Molehil" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="AnimationTrack" /><category scheme="http://www.blogger.com/atom/ns#" term="BVH" /><category scheme="http://www.blogger.com/atom/ns#" term="Proscenium" /><category scheme="http://www.blogger.com/atom/ns#" term="TransformElement" /><category scheme="http://www.blogger.com/atom/ns#" term="Motion" /><category scheme="http://www.blogger.com/atom/ns#" term="Stage3D" /><category scheme="http://www.blogger.com/atom/ns#" term="AnimationController" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash 11" /><category scheme="http://www.blogger.com/atom/ns#" term="Biovision" /><category scheme="http://www.blogger.com/atom/ns#" term="SkinController" /><title>Import BVH BioVision motion Proscenium Stage 3D Flash11</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
In order to do some custom animation or use external motion(animation) files you need to understand how animation works in Proscenium. &lt;/div&gt;
&lt;div class="separator" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;
&lt;a href="http://www.winx.ws/blog/bin/TestBVH.html"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-3QPfReFdLCI/TqXCwWzm-8I/AAAAAAAAAFk/muDRcfcnsq8/s1600/Clipboard01.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
!!! Click twice on the buttons &amp;lt;-temp solution (No loader wait for load)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;AnimationController - controls animation timeline and contain animation tracks.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; animationController = new AnimationController(name + "AnimationController");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if you do&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt; animationController.time=0.5;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
it will jump to 0.5s in time. &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Sampler&lt;/i&gt;&amp;nbsp; - gives interpolated output value based on sampler function, time(keyframes) and input values. All samplers have times vector with incremental time values in which transformation happen - actually KEYFRAMES.&lt;br /&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;_times=Vector[0,0.5,0.78,..]&lt;/div&gt;
&lt;br /&gt;
and input values in different format depends of type of sampler you use and transform element you plan to target.&lt;br /&gt;
&lt;i&gt;SamplerNumber, &lt;/i&gt;&lt;i&gt;SamplerBezierCurve&lt;/i&gt;&lt;i&gt; &lt;/i&gt;gave single output number value so can be used with trasformations like &lt;i&gt;TransformElementTranslate,TransformElementRotate,TransformElementScale&lt;/i&gt;&lt;br /&gt;
and &lt;i&gt;SamplerNumberMatrix3D &lt;/i&gt;giving matrix as output so should be used with &lt;i&gt;TransformElementMatrix&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #38761d;"&gt;//create Sampler&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt; sampler = new SamplerNumber(_times, inputValuesVector);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warning only &lt;i&gt;SamplerNumber&lt;/i&gt;, &lt;i&gt;SamplerMatrix3D&lt;/i&gt;, &lt;i&gt;SamplerBezierCurve&lt;/i&gt; are functional the others aren't implemented yet. &lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;AnimationTrack&lt;/i&gt; - binds sampler output to target source's transformation elements not to scene node transform directly.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;span style="color: #38761d;"&gt;&amp;nbsp; //create Track&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt; track = new AnimationTrack(animationController, sampler, targetSource);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
SceneNode contains transform steak which contains transform elements.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt; node.transformStack = new TransformStack();&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #38761d;"&gt; //bone.transformStack.push(new TransformElementMatrix("&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID&lt;/span&gt;&lt;span style="color: #38761d;"&gt;", matrix));&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bone.transformStack.push(new TransformElementRotate("rotateX"));&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bone.transformStack.push(new TransformElementRotate("rotateY"));&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bone.transformStack.push(new TransformElementRotate("rotateZ"));&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #38761d;"&gt;&amp;nbsp; //targetSource is&amp;nbsp; string in format&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; //&lt;/span&gt;&lt;span style="color: #38761d;"&gt; if transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementMatrix&lt;/i&gt;&lt;span style="color: #38761d;"&gt; "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID"&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if &lt;/span&gt;&lt;span style="color: #38761d;"&gt; transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementRotate&lt;/i&gt;&lt;span style="color: #38761d;"&gt; "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID.ANGLE"&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // if &lt;/span&gt;&lt;span style="color: #38761d;"&gt; transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementTranslate&lt;/i&gt;&lt;span style="color: #38761d;"&gt; planned to translate X "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID.X"&lt;/span&gt;&lt;span style="color: #38761d;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if &lt;/span&gt;&lt;span style="color: #38761d;"&gt; transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementTranslate &lt;/i&gt;&lt;span style="color: #38761d;"&gt;planned to translate Y&lt;/span&gt;&lt;span style="color: #38761d;"&gt; "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID.Y"&lt;/span&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if &lt;/span&gt;&lt;span style="color: #38761d;"&gt; transformElement is &lt;/span&gt;&lt;i style="color: #38761d;"&gt;TransformElementTranslate &lt;/i&gt;&lt;span style="color: #38761d;"&gt;planned to translate Z&lt;/span&gt;&lt;span style="color: #38761d;"&gt; "node.name/&lt;/span&gt;&lt;span style="color: #38761d;"&gt;transformElementID.Z"&lt;/span&gt;&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;//Connect transform steak with node transform&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 
&lt;span style="color: red;"&gt;&amp;nbsp;Attribute.connect(bone.transformStack.attribute(Transformer.ATTRIBUTE_TRANSFORM),
 bone.attribute(SceneNode.ATTRIBUTE_TRANSFORM));&lt;/span&gt;&lt;span style="color: #38761d;"&gt;&lt;span style="color: red;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #38761d;"&gt; //add track to controller &lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: red;"&gt;&amp;nbsp; animationController.addTrack(track); &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In &lt;i&gt;onAnimate&lt;/i&gt; loop (enterframe) playback of time happen (of course calculating interpolated transformation samples, applying of transformations to the targets and re-render)&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; override protected function onAnimate(t:Number, dt:Number):void&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (!_initialized)&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for each (var animationController:AnimationController in animations)&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; animationController.time = (t % animation.length) + animation.start;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/div&gt;
&lt;br /&gt;
You can also animate node by appending translation,rotation:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
override protected function onAnimate(t:Number, dt:Number):void{&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp; myNode.appendRotation(angle,arroundWhichAxes);//Vector3D.Y_Axis &amp;lt;--- arround y axis&lt;/div&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp; &amp;nbsp; myNode.appendTranslation(translationx,translationy,transaltionz);&lt;/div&gt;
&lt;div style="color: red;"&gt;
} &lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestBVH.zip"&gt;Source&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/mkcS3leGom4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/3414201822905706850/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/10/import-bvh-biovision-motion-proscenium.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3414201822905706850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3414201822905706850?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/mkcS3leGom4/import-bvh-biovision-motion-proscenium.html" title="Import BVH BioVision motion Proscenium Stage 3D Flash11" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-3QPfReFdLCI/TqXCwWzm-8I/AAAAAAAAAFk/muDRcfcnsq8/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/10/import-bvh-biovision-motion-proscenium.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04BSX89eCp7ImA9WhRTFE0.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-5275454085635009205</id><published>2011-10-13T16:29:00.001-07:00</published><updated>2011-11-04T03:19:18.160-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-04T03:19:18.160-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MD2" /><category scheme="http://www.blogger.com/atom/ns#" term="addSources" /><category scheme="http://www.blogger.com/atom/ns#" term="MeshDataElement" /><category scheme="http://www.blogger.com/atom/ns#" term="Stage 3D" /><category scheme="http://www.blogger.com/atom/ns#" term="ScenMeshData" /><category scheme="http://www.blogger.com/atom/ns#" term="ModelLoader" /><category scheme="http://www.blogger.com/atom/ns#" term="MeshElementDataPolylist" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash 11" /><title>MD2 Model loader Proscenium framework Stage3D API  (Flash11)</title><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Proscenium is experimental framework as Adobe says. Used to very user friendly PV3D,Away3D and Alternativa frameworks +plus they are opensource, found Proscenium at least different approach. I expected that black box would be on top of ability of vertex manipulation. Not far far above restricting developer freedom to Adobe's ideas how things should go. Main problem with all big companies and the King is that, they rare walk between people. As a project manager I would listen people's chat/ideas/forums then draw development direction instead thinking that we are the smartest and we are only untouchable politics creators. I could now enter into discussion of clumsy Adobe's tweeners to libraries as Tweener and TweenLite and signals compared to dispatch event system... As is obvious that I don't want restriction (restricted to load DAE,OBJ..) files. I wanted to load Quake2 MD2 as very useful in games, when you don't need complex models with bones and skinning, but cheaper,easy to create, with animation several moves and low number of polygons("low" in past wasn't too low :))&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestMD2Loader.html"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5663123462503848562" src="http://2.bp.blogspot.com/-Yft8j28HQAQ/Tpd0yN242nI/AAAAAAAAAFc/8TDdeEkXoho/s400/Clipboard01.jpg" style="cursohttp: //www.blogger.com/img/blank.gifr:hand; cursor: pointer; display: block; height: 294px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
In short to build loader you need to extend &lt;span style="font-style: italic;"&gt;ModelLoader&lt;/span&gt; class with already binary and text loader helper and event handling mechanism ....&lt;br /&gt;
When item is loaded you use loader.model.addTo(sceneNode) function from &lt;span style="font-style: italic;"&gt;ModelData&lt;/span&gt; and returns &lt;span style="font-style: italic;"&gt;ModelManifest. &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;ModelManifest &lt;/span&gt;is document containing info of loaded bones,meshes,animations,materials...&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Magnificent &lt;i&gt;addTo &lt;/i&gt;function do everything so find out this approach less customizable for example if you want to init &lt;span style="font-style: italic;"&gt;SceneMesh&lt;/span&gt;.userData during creation of the mesh not after adding on scene.&lt;br /&gt;
It create materials,meshes,bones,nodes??? from MaterialData,MeshElementData,BonesData,SceneNodeData create model manifest and add all nodes and subnodes to scene.&lt;br /&gt;
&amp;nbsp;After parsing of data this strucutre should be created&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ModelData&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;SceneNodeData&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;MeshData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First we define types of vertex inputs or properties. Position,Texcoord,Normal&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&amp;nbsp;&lt;span style="font-size: small;"&gt;meshData.addVertexInput(new Input(Input.SEMANTIC_POSITION, "positions", 0));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&amp;nbsp;meshData.addVertexInput(new Input(Input.SEMANTIC_TEXCOORD, "texcoords", 1));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&amp;nbsp;meshData.addVertexInput(new Input(Input.SEMANTIC_NORMAL, "normals", 2));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;//indices 0,1,2 specify&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;how array of primitives would be filled with vertex values( &lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;x1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;y1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;z1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;u1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;v1,w1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt; nx1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,ny1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;nz1&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
add sources to of the Inputs&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;meshData.addSource(new Source("texcoords", new ArrayElementFloat(texcoords), 2));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;// index 2 mean that&amp;nbsp; data in texcoords would be read by pairs texcoords=[u1,v1,u2,v2,u3,v3....num_texcoords pairs&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;meshData.addSource(new Source("positions", &lt;/span&gt;&lt;span style="font-size: small;"&gt;new ArrayElementFloat(&lt;/span&gt;&lt;span style="font-size: small;"&gt;positions), 3));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;// index 3 mean that&amp;nbsp; data in position would be read by tripples texcoords=[x1,y1,z1, next tripple x2,y2,z2...&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;num_vertices&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;meshData.addSource(new Source("normals", &lt;/span&gt;&lt;span style="font-size: small;"&gt;new ArrayElementFloat(normals)&lt;/span&gt;&lt;span style="font-size: small;"&gt;, 3));&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: white;"&gt;
&lt;span style="font-size: small;"&gt;Create MeshElementData&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;var polylist:MeshElementDataPolylist = new MeshElementDataPolylist(meshData, meshData.vertexInputs,num_primitives, primitives, null, vcount, "MeshElementDataPolylistDoll", "materialName");&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//primitives array containing vertex position, texcoord, normal, index triples&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//ex primitives=[0,1,2, 0,2,3...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//ex. 0,1,2 =&amp;gt; 0 is index inside vertex position array, 1=&amp;gt; is index inside texture cords array, 2=&amp;gt; index inside vertex normals postion&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//vcount is array showing how many vertices in primitives array make primitive(face/polygon).(index&amp;gt;3)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="color: #274e13;"&gt;//ex. vcount=[3,4,3,4,3,5...]&amp;nbsp; so first primitive is formed of 3 groups of &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;( x1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;y1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;z1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;u1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;v1,w1,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt; nx1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,ny1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;,&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;nz1&lt;/span&gt;&lt;span style="color: #274e13; font-size: small;"&gt;)&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="color: #274e13;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
And workhorse is MeshElementDataSource that extends MeshElement process and puck all data and source of vertices, normals and texcoords to structures and buffers ready for AGAL Compiler.&lt;br /&gt;
How we can access vertices(and structures containing data) so we can apply some transformation???&lt;br /&gt;
To expose them we need to extend &lt;span style="font-style: italic;"&gt;MeshElementDataSource&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;MeshElementDataPolylist &lt;/span&gt;so I can access &lt;i&gt;vertexSources&lt;/i&gt; and &lt;i&gt;vertexIndices&lt;/i&gt;&lt;span style="font-style: italic;"&gt;??? &lt;/span&gt;Ofcourse vetex positions and normals should be calculated before putting inside this structures.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-size: 85%;"&gt;&lt;br /&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;override protected function initModels():void&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;        {&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            //super.initModels();&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            var md2Model:String =&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            //"../res/models/"+&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"doll.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"box.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"spos_body.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"spos_weapon.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                //"spos_body.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;                "tris.md2";&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            _md2Loader = new MD2Loader(md2Model );&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red; font-size: 85%;"&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;            _md2Loader.addEventListener( Event.COMPLETE, completeEventHandler, false, 0, true );&lt;/span&gt;&lt;span style="color: red; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: red; font-family: courier new; font-size: small;"&gt;        }&lt;/span&gt;                  &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;protected function completeEventHandler(event:Event):void&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;var loader:MD2Loader = event.target as MD2Loader;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;var manifest:ModelManifest = loader.model.addTo(scene);&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: red;"&gt;
&lt;span style="font-size: small;"&gt;_mesh = manifest.meshes[0];&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;... &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As half of Proscenium lean towards handling Collada files it is important to check Collada specification.&lt;br /&gt;
&lt;br /&gt;
Many thanks to my friend Tim Knip for quick 3D tips and creator of extraordinary Collada library &amp;nbsp; .&lt;br /&gt;
&lt;br /&gt;
You will also need Proscenium framework from &lt;a href="http://labs.adobe.com/technologies/proscenium/"&gt;Adobe site&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.winx.ws/blog/TestMD2Loader.zip"&gt;Source&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/ZtvUmLnWxQw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/5275454085635009205/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/10/md2-model-loader-proscenium-3d.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5275454085635009205?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/5275454085635009205?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/ZtvUmLnWxQw/md2-model-loader-proscenium-3d.html" title="MD2 Model loader Proscenium framework Stage3D API  (Flash11)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Yft8j28HQAQ/Tpd0yN242nI/AAAAAAAAAFc/8TDdeEkXoho/s72-c/Clipboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/10/md2-model-loader-proscenium-3d.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4GQXo6fCp7ImA9WhZQFUQ.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-3394220897763110258</id><published>2011-04-23T13:16:00.000-07:00</published><updated>2011-04-23T13:35:20.414-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-23T13:35:20.414-07:00</app:edited><title>Flex4 Custom Validator (Compare and Multifields)</title><content type="html">I've been not satisfied by Adobe example of making custom validators making model object when you need to compare 2 or more fields. For example you want to compare password fields or you want to compare several string fields not duplicating same StringValidators.  I found on net lot of hacking solution but not one clean.&lt;br /&gt;So after spending several hrs exploring how Validators are functioning and found that grail was "listener" parameter. Seal source param by overloading it. Create sources field to accept sources involved in validation.&lt;br /&gt;By switching the listener switch source of error listening.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;span style="font-family:verdana;"&gt;package components&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import flash.events.IEventDispatcher;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.core.mx_internal;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.events.FlexEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.events.ValidationResultEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.validators.IValidatorListener;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.validators.StringValidator;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.validators.ValidationResult;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import mx.validators.Validator;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  import spark.components.TextInput;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  public class CompareValidator extends StringValidator&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _sources:Array;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _actualTriggers:Array;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _emptyErrorMessage:String="No value to compare with ";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _compareErrorMessage:String="Comparation equality failed";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private var _minmaxErrorMessage:String="Length of value should be between min and max";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function CompareValidator()&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          super();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function get actualTriggers():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return _actualTriggers;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      [Bindable]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function set actualTriggers(value:Array):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          _actualTriggers = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      [Bindable]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function get compareErrorMessage():String&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return _compareErrorMessage;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function set compareErrorMessage(value:String):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          _compareErrorMessage = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      [Bindable]&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function set sources(value:Array):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          removeTriggerHandler()&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          _sources = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          _actualTriggers=_sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          listener=_sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          addTriggerHandler();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      public function get sources():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return _sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      override public function get source():Object&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      override public function set source(value:Object):void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      /**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;         &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;       *  @private&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;       */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private function addTriggerHandler():void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          if (_actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              for each(var trigger:IEventDispatcher in actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              trigger.addEventListener(FlexEvent.VALUE_COMMIT, triggerHandler);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private function triggerHandler(e:FlexEvent):void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          validate();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      /**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;       *  @private&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;       */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private function removeTriggerHandler():void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          if (actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              for each(var trigger:IEventDispatcher in actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              trigger.removeEventListener(FlexEvent.VALUE_COMMIT, triggerHandler);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      override public function validate(value:Object=null, suppressEvents:Boolean=false):ValidationResultEvent&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;         &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          if (required)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                  &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              var errorResults:Array = doValidation(null);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              // Validate if the target is required or our value is non-null.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              return handleResults(errorResults);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              // We assume if value is null and required is false that&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              // validation was successful.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              var resultEvent:ValidationResultEvent =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  new ValidationResultEvent(ValidationResultEvent.VALID);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              if (!suppressEvents &amp;amp;&amp;amp; enabled)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                             &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  dispatchEvent(resultEvent);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              return resultEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      override protected function doValidation(value:Object):Array {&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          // Clear results Array.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          var results:Array = [];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          var comparationValue:String;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          var stringResults:Array;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          if(_sources)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              for(var i:int=0;i&amp;lt;_sources.length;i++){&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  comparationValue=String(_sources[i][property]);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  results=super.doValidation(comparationValue);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  listener=_sources[i];&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  if(results.length){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                      this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.INVALID,false,false,_sources[i].id,results));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  }else if (!compareWithRest(comparationValue)){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                                     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                      results[results.length]=new ValidationResult(true,"","",_compareErrorMessage);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                      this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.INVALID,false,false,_sources[i].id,results));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  }else{&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                      this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.VALID,false,false,_sources[i].id));&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                  }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              }     &lt;/span&gt;&lt;/span&gt;                                  &lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return results;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;              &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      private function compareWithRest(comparationValue:String):Boolean&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          var result:Boolean=true;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          for(var i:int=0;i&amp;lt;_sources.length;i++){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;              if(_sources[i][property]!=comparationValue) return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;          return result;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                                  &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;package components&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.controls.TextInput;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.events.FlexEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.events.ValidationResultEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.messaging.FlexClient;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.olap.aggregators.MinAggregator;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.validators.CreditCardValidator;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.validators.StringValidator;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.validators.ValidationResult;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    import mx.validators.Validator;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    public class MultiStringValidator extends StringValidator&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private var _sources:Array;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private var _actualTriggers:Array;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function MultiStringValidator()&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            super();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function get actualTriggers():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;          &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return _actualTriggers;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        [Bindable]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function set actualTriggers(value:Array):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            _actualTriggers = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        [Bindable]&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function set sources(value:Array):void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            removeTriggerHandler()&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            _sources = value;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            _actualTriggers=_sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            //listener=_sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            addTriggerHandler();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            //this.subFields=["firstNameTextInput","lastNameTextInput"];&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        public function get sources():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return _sources;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        override public function get source():Object&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        override public function set source(value:Object):void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        /**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;         *  @private&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;         */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private function addTriggerHandler():void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if (_actualTriggers) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                for each(var trigger:IEventDispatcher in actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                trigger.addEventListener(FlexEvent.VALUE_COMMIT, triggerHandler);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private function triggerHandler(e:FlexEvent):void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            validate();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        /**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;              &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;         *  @private&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;         */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private function removeTriggerHandler():void&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if (actualTriggers) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                for each(var trigger:IEventDispatcher in actualTriggers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                trigger.removeEventListener(FlexEvent.VALUE_COMMIT, triggerHandler);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        override public function validate(value:Object=null, suppressEvents:Boolean=false):ValidationResultEvent&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if (required)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                var errorResults:Array = doValidation(null);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                // Validate if the target is required or our value is non-null.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                return handleResults(errorResults);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                // We assume if value is null and required is false that&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                // validation was successful.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                var resultEvent:ValidationResultEvent =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    new ValidationResultEvent(ValidationResultEvent.VALID);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                if (!suppressEvents &amp;amp;&amp;amp; enabled)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                             &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    dispatchEvent(resultEvent);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                return resultEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    /*    override protected function get actualListeners():Array&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if(listener &amp;amp;&amp;amp; listener is Array) return listener as Array;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if(_sources)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                return _sources;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return [];&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        override protected function doValidation(value:Object):Array {&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            // Clear results Array.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            var results:Array = [];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            var comparationValue:String;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            var stringResults:Array;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            if(_sources)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                for(var i:int=0;i&amp;lt;_sources.length;i++){&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    comparationValue=String(_sources[i][property]);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    stringResults=super.doValidation(comparationValue);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    listener=_sources[i];&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    if(stringResults.length){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                            this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.INVALID,false,false,_sources[i].id,stringResults));&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                                &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                              &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    else{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                            this.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.VALID,false,false,_sources[i].id));&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                               &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                    results=results.concat(stringResults);&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                                              &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                }       &lt;/span&gt;&lt;/span&gt;                                                                                               &lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return results;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        private function compareWithRest(comparationValue:String):Boolean&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            var result:Boolean=true;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            for(var i:int=0;i&amp;lt;_sources.length;i++){&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;                if(_sources[i][property]!=comparationValue) return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;            return result;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;                  &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/OOcBKadty2I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/3394220897763110258/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/04/flex4-custom-validator-compare-and.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3394220897763110258?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3394220897763110258?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/OOcBKadty2I/flex4-custom-validator-compare-and.html" title="Flex4 Custom Validator (Compare and Multifields)" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>1</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/04/flex4-custom-validator-compare-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQMSH88cSp7ImA9WhBaEEQ.&quot;"><id>tag:blogger.com,1999:blog-5117115183110986877.post-3199544684767692347</id><published>2011-03-23T10:02:00.000-07:00</published><updated>2013-05-20T15:53:09.179-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-20T15:53:09.179-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Array of Arrays" /><category scheme="http://www.blogger.com/atom/ns#" term="Multidimensional" /><category scheme="http://www.blogger.com/atom/ns#" term="Matrix" /><category scheme="http://www.blogger.com/atom/ns#" term="AS3" /><category scheme="http://www.blogger.com/atom/ns#" term="Vector" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash" /><title>Multidimesnional Vectors  Arrays</title><content type="html">Creation of multidimensional vectors(arrays) is painful and slow process.&lt;br /&gt;
1D I - vector (length)&lt;br /&gt;
2D IxJ -matrix (width x height)&lt;br /&gt;
3D IxJxK - quader (width x height x length)&lt;br /&gt;
4D IxJxKxM - quader of quaders (width x height x length x time)&lt;br /&gt;
...&lt;br /&gt;
Especially when you don't have some function like var vector:Vector.&lt;int&gt;=new Vector.&lt;int&gt;(5,3,4) which will create 3D vector 5x3x4; (Matlab has... and some other languages)&lt;br /&gt;In Action script3 you can create for example 3D vector(5x3x4)  width x height x length:&lt;br /&gt; like below:
&lt;pre class="brush:as3;"&gt;
var m:Array=new Array(new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array())),
//
new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array())),
//
new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array()))
//
new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array()))
//
new Array(new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array(),new Array(new Array(),new Array(),new Array()))
);
&lt;/pre&gt;
//even with way using brackets like
&lt;pre class="brush:as3;"&gt;
 m=[[[],[],[]...]
m[0][0][1]=1;
trace(m[0][0][1]);

&lt;/pre&gt;
its long way too.

Using auto resizing vectors as Array is, isn't memory efficient. For example Array reserve 10 memory locations. If you are using 2 you have 8 empty but reserved location. If you start using 11 locations, it will be allocated another 10 memory locations.

Restricting Array to fixed size we would manage memory better. But creation of 3D vector of 5x3x4 size would need initialization loops and make creation lengthy. New loop for every dimension on top of the rest. Also creation of lot of objects with "new" consume even more time and memory.
&lt;br /&gt;
&lt;pre class="brush:as3;"&gt;
var i,j,k;

var mainArray:Array=new Array(5);

for(i=0; i&amp;lt;5 data-blogger-escaped-array="" data-blogger-escaped-fill="" data-blogger-escaped-for="" data-blogger-escaped-i="" data-blogger-escaped-j="" data-blogger-escaped-k="0;k&amp;lt;4;k++)" data-blogger-escaped-mainarray="" data-blogger-escaped-new="" data-blogger-escaped-pre=""&amp;gt;

Using not typed vectors(a.k.a Array) would slow down processing even further, cos AVM need to check type of element with every access. We could use typed Vector instead of Array with defined length and fixed flag set to true but still we need to initialize with loop for every dimension.
&lt;pre class="brush:as3;"&gt;
var d1:Vector.&lt;vector .="" int=""&gt;&amp;gt; = new Vector.&lt;vector .="" int=""&gt;&amp;gt;(5*3*4,true);

//follows loop initialization
...

&lt;/pre&gt;

Access to element of d1[i][j][k] is very clean but it is slow. AVM access d1[i] then search of property of "j" of unnamed vector then k of unnamed vector and so on. 
Some processing speed could be achived accessing dimensions like:
&lt;pre class="brush:as3;"&gt;var d2=d1[i];
var d3=d2[j];
var value=d3[k];
&lt;/pre&gt;

VectorEx class solves all this problems. To create 3D(5x3x4) vector with integers:
&lt;pre class="brush:as3;"&gt;var vector:VectorEx=new VectorEx(int,5,3,4);
&lt;/pre&gt;
 VectorEx use assembler trick of making multidimensional vectors with one-dimensional vector and quick shifting index math to access other dimensions in it.
&lt;pre class="brush:as3;"&gt;trace(vector[0][1][2]);//you can use this clean way but
//using getElementAt is much faster 
trace(vector.getElementAt(0,1,2));
vector.setElementAt(55,0,1,2);//s
trace(vector.getElementAt(0,1,2));
&lt;/pre&gt;
Source: &lt;a href="http://www.winx.ws/blog/VectorEx.zip"&gt;Download&lt;/a&gt;

&lt;script type="text/javascript"&gt;
 SyntaxHighlighter.highlight();
&lt;/script&gt;&lt;!--5--&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/AyfFy/~4/GghdY4kWBvo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://winxalex.blogspot.com/feeds/3199544684767692347/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://winxalex.blogspot.com/2011/03/unimatrix-multidimesnional.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3199544684767692347?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5117115183110986877/posts/default/3199544684767692347?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/AyfFy/~3/GghdY4kWBvo/unimatrix-multidimesnional.html" title="Multidimesnional Vectors  Arrays" /><author><name>winxalex</name><uri>http://www.blogger.com/profile/07640553115817602057</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_Hoya55ledVM/S4_m5T9_gcI/AAAAAAAAABk/13_bZvZSQhs/S220/DSC00931.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://winxalex.blogspot.com/2011/03/unimatrix-multidimesnional.html</feedburner:origLink></entry></feed>
