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