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