code:
package core.rendering
{
import core.Vector;
import flash.filters.DropShadowFilter;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.filters.BlurFilter;
import flash.filters.ConvolutionFilter;
public class Renderer extends Sprite
{
private var objects:Array;
private var dispBtmpD:BitmapData;
private var dispBtmp:Bitmap;
private var blurBtmpD:BitmapData;
private var blurBtmp:Bitmap;
private var counter:int;
private var dim:Vector;
private var blurDecay:Number;
private var blurInterval:int;
public static var instance:Renderer;
private var temp:BitmapData;
private var tempPoint:Point;
private var rect:Rectangle = new Rectangle(0,0,0,0);
private var rot:Number;
private var obDim:Vector = new Vector(9,8);
private var rotInterval:Number = 5;
private var tempVec:Vector;
private var row:Number;
private var spacing:Number = 1.2;
public function Renderer(_dim:Vector, _objects:Array)
{
super();
instance = this;
counter = 1;
dim = _dim;
objects = _objects;
setupObjects();
setupBitmaps();
blurDecay = 0.87;
blurInterval = 2;
tempPoint = new Point(0,0);
}
private function setupObjects():void{
var holder:Array = [];
for(var i:String in objects){
try{
//create a 9 by 8 grid for 5 degree rotations
var obd:BitmapData = new BitmapData(objects[i].width*spacing*obDim.x, objects[i].height*spacing*obDim.y, true, 0x00000000);
var m:Matrix;
for(var j:int = 0; j<obDim.x; j++){
for(var k:int = 0; k<obDim.y; k++){
m = new Matrix();
//offset by one so first box is 0 degrees the 8 is (9-1)
m.translate(-objects[i].width/2, -objects[i].height/2);
m.rotate(Vector.D_TO_R*(rotInterval*(j+(k*obDim.x) )));
m.translate(j*objects[i].width*spacing+objects[i].width/2, k*objects[i].height*spacing+objects[i].height/2);
obd.draw(objects[i], m);
}
}
holder[i] = obd;
}catch (e:Error){
}
//objects = holder;
}
objects = holder;
}
private function setupBitmaps():void{
dispBtmpD = new BitmapData(dim.x, dim.y, true, 0x00000000);
dispBtmp = new Bitmap(dispBtmpD);
blurBtmpD = new BitmapData(dim.x, dim.y, true, 0x00000000);
blurBtmp = new Bitmap(blurBtmpD);
addChild(blurBtmp);
addChild(dispBtmp);
}
public function addToObjects(item:String, object:*):void{
objects[item] = object;
}
public function setBlurDecay(n:Number):void{
blurDecay = n;
}
public function getBlurDecay():Number{
return blurDecay;
}
public function setBlurInterval(i:int):void{
blurInterval = i;
}
public function getBlurInterval():int{
return blurInterval;
}
public function getDimensions():Vector{
return dim;
}
public function setDimensions(v:Vector):void{
dim = v;
}
public function getDisplayBtmp():Bitmap{
return dispBtmp;
}
public function getBlurBtmp():Bitmap{
return blurBtmp;
}
public function flash():void{
var flashBtmpD:BitmapData = new BitmapData(dim.x, dim.y,true, 0x10FFFFFF);
blurBtmpD.copyPixels(flashBtmpD,flashBtmpD.rect, new Point(0,0),null,null,true);
//blurBtmpD.colorTransform(blurBtmpD.rect, new ColorTransform(1,1,1,1,10,10,10));
}
private function getObDimensions(ob:*):Vector{
return new Vector(ob.width/obDim.x, ob.height/obDim.y);
}
public function spark(xy:Vector, name:String):void{
try{
counter = blurInterval;
temp = objects[name];
//from render()
tempVec = getObDimensions(temp);
tempPoint.x = xy.x-tempVec.x/spacing/2;
tempPoint.y = xy.y-tempVec.y/spacing/2;
rect = new Rectangle(0,0,tempVec.x/spacing, tempVec.y/spacing);
dispBtmpD.copyPixels(temp,rect,tempPoint,null,null ,true);
} catch (e:Error){
}
}
public function render(r:RenderOptions):void{
temp = objects[r.item];
rect.width = temp.width/obDim.x;
rect.height = temp.height/obDim.y;
tempPoint.x = r.pos.x-rect.width/spacing/2;
tempPoint.y = r.pos.y-rect.height/spacing/2;
rot = ((r.rotation-360*((r.rotation/360) << 0))/rotInterval) << 0;
row = (rot/obDim.x) << 0;
rect.y = row*rect.height;
rect.x = rect.width*(rot-(row*obDim.x));
rect.width /= spacing;
rect.height /= spacing;
dispBtmpD.copyPixels(temp,rect,tempPoint,null,null ,true);
}
public function onBeforeRendering():void{
counter++;
if(counter>1000){
counter = 1;
}
dispBtmpD = new BitmapData(dim.x, dim.y, true, 0x00000000);
dispBtmpD.lock();
}
public function onAfterRendering():void{
dispBtmpD.applyFilter(dispBtmpD, dispBtmpD.rect, new Point(0,0),new BlurFilter(2,2));
dispBtmpD.unlock();
dispBtmp.bitmapData = dispBtmpD;
if(counter%blurInterval==0){
blurBtmpD.copyPixels(dispBtmpD,dispBtmpD.rect,new Point(),null,null,true);
}
blurBtmpD.colorTransform(new Rectangle(0,0, dim.x, dim.y), new ColorTransform(1,1,1,blurDecay));
}
public function checkHit(v:Vector):Boolean{
return dispBtmpD.hitTest(new Point(0,0),0x55,new Point(v.x, v.y));
}
}
}