I'm sure you'll make some AwayLite fans happy with this one :)
thx for sharing Anton!

Fabrice

On Sep 3, 2010, at 12:31 AM, [email protected] wrote:

> dear list,
> 
> At the moment there is only one skybox class in away3lite and it works
> only with one image. Sometimes it is rather unconvenient, for instance
> most of the panoramic stitchers does not save to appropriate for
> skybox6 format and you have to compose it manualy..
> That's why I decided to write my own skybox class capable of working
> with 6 images. Here it is:
> 
> /*
> Skybox class for away3dlite
> The idea is very simple: bitmapdata's from images are stitched
> together and then used as an ordinary skybox6 texture
> 
> Anton Kulaga, september 2010
> */
> package skyboxes
> {
>       import away3dlite.materials.BitmapMaterial;
>       import away3dlite.materials.ColorMaterial;
>       import away3dlite.materials.Material;
>       import away3dlite.primitives.Skybox6;
> 
>       import flash.display.Bitmap;
>       import flash.display.BitmapData;
>       import flash.display.Loader;
>       import flash.events.Event;
>       import flash.geom.Point;
>       import flash.geom.Rectangle;
>       import flash.net.URLRequest;
> 
>       public class Skybox extends Skybox6
>       {
>               protected var bigBitmap:BitmapData;
>               protected var _path:String;
>               protected var _format:String="jpg"
> 
> 
>               public var loaders:Vector.<Loader>;
>               public var bmds:Vector.<BitmapData>;
> 
>               public var imgWidth:Number;
>               public var imgHeight:Number;
>               public var rect:Rectangle;
>               public var mat:BitmapMaterial;
>               public var numLoad:int=0;
>               public var picNames:Vector.<String>;
> 
>               public function
> Skybox(picNames:Vector.<String>,path:String="",format:String="jpg")
>               {
>                       super(null,80000,5,1);
>                       this._format = format;
>                       this._path = path;
>                       this.picNames = picNames;
>                       this.bmds = new Vector.<BitmapData>;
>                       this.loaders = new Vector.<Loader>;
>                       if(this.picNames.length>=6)     this.startLoaders(); 
> //checks if there
> are enough pictures for skybox
>               }
> 
>               protected function startLoaders():void
>               {
>                       for(var i:int=0;i<6;i++)
>                       {
>                               if(this.loaders.length<=i)      
> this.loaders.push(new Loader());
>       
> this.loaders[i].contentLoaderInfo.addEventListener(Event.COMPLETE,this.loaderHandler);
>                               this.loaders[i].load(new 
> URLRequest(_path+"/"+picNames[i]
> +"."+this._format));
>                       }
>               }
> 
>               protected function loaderHandler(event:Event):void
>               {
>                       this.numLoad++;
>                       if(this.numLoad < 6) return void;
>                       this.fromLoadersToBmps();
>                       this.makeBigBitmap();
>               }
> 
> 
>               //extracts bitmaps from loaders to bitmapdata Vector
>               protected function fromLoadersToBmps():void
>               {
>                       var bmp:BitmapData;
>                       for(var i:int=0;i<this.loaders.length;i++)
>                       {
>                               bmp =
> Bitmap(this.loaders[i].contentLoaderInfo.content).bitmapData;
>                               if(this.bmds.length<=i) this.bmds[i] = bmp; else
> this.bmds.push(bmp);
>                       }
>                       this.numLoad=0;
>               }
> 
>               protected function initBigBitmap():void
>               {
>                       this.imgHeight = this.bmds[0].height;
>                       this.imgWidth = this.bmds[0].width;
>                       this.rect = new 
> Rectangle(0,0,this.imgWidth,this.imgHeight);
>                       this.bigBitmap = new 
> BitmapData(this.imgWidth*3,this.imgHeight*2);
>                       this.material = new BitmapMaterial(this.bigBitmap);
>                       BitmapMaterial(this.material).smooth = true;
>               }
> 
>               //makes one bitmap from all loaded bitmaps
>               protected function makeBigBitmap():void
>               {
>                       if(!this.bigBitmap) this.initBigBitmap();
>                       this.bigBitmap.copyPixels(this.front,this.rect,new 
> Point(0,0));
>                       this.bigBitmap.copyPixels(this.right,this.rect,new
> Point(this.imgWidth,0));
>                       this.bigBitmap.copyPixels(this.back,this.rect,new
> Point(this.imgWidth*2,0));
> 
>                       this.bigBitmap.copyPixels(this.left,this.rect,new
> Point(0,this.imgHeight));
>                       this.bigBitmap.copyPixels(this.top,this.rect,new
> Point(this.imgWidth,this.imgHeight));
>                       this.bigBitmap.copyPixels(this.bottom,this.rect,new
> Point(this.imgWidth*2,this.imgHeight));
>               }
> 
>               //getters for bitmapdatas
>               public function get front():BitmapData {return this.bmds[0];}
>               public function get right():BitmapData {return this.bmds[1];}
>               public function get back():BitmapData {return this.bmds[2];}
>               public function get left():BitmapData {return this.bmds[3];}
>               public function get top():BitmapData {return this.bmds[4];}
>               public function get bottom():BitmapData {return this.bmds[5];}
>       }
> }

Reply via email to