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];} > } > }
