package com.
hydrotik.
bannerflip3d {
/**
* @author Donovan Adams
* @version December 9, 2007
* @usage Example:<div class="codesnip-container" ></div>
* @description
* @history
* @sends
* @todo
*
*/
import flash.
display.*;
import flash.
events.
Event;
import flash.
events.
EventDispatcher;
import flash.
events.
TimerEvent;
import flash.
utils.
Timer;
import flash.
utils.
setTimeout;
import org.
papervision3d.
cameras.
Camera3D;
import org.
papervision3d.
core.
proto.
SceneObject3D;
import org.
papervision3d.
events.
FileLoadEvent;
import org.
papervision3d.
materials.
BitmapFileMaterial;
import org.
papervision3d.
materials.
ColorMaterial;
import org.
papervision3d.
objects.
DisplayObject3D;
import org.
papervision3d.
objects.
primitives.
Plane;
import org.
papervision3d.
render.
BasicRenderEngine;
import org.
papervision3d.
scenes.
Scene3D;
import org.
papervision3d.
view.
Viewport3D;
import com.
hydrotik.
go.
PapervisionTween;
import fl.
motion.
easing.*;
import org.
papervision3d.
core.
proto.
MaterialObject3D;
[Event
(name=
“COMPLETE”,
type=
“com.hydrotik.bannerflip3d.FlipEvent”)]
[Event
(name=
“ON_FLIP”,
type=
“com.hydrotik.bannerflip3d.FlipEvent”)]
public class Flip
extends EventDispatcher
{
public static const VERBOSE:Boolean = true;
private var _scope:Sprite;
private var _stage:Stage;
private var _oCore:*;
private var _assetPath:String;
private var _materialArray:Array;
private var _planeArray:Array;
private var _array:XMLList;
private var _count:int = 0;
private var _next:int;
private var _prev:int;
private var _loader:Sprite;
private var _seconds:int;
//New 2.0 Privates
private var renderer:BasicRenderEngine;
private var camera:Camera3D;
private var viewport:Viewport3D;
private var debug : Function;
private var scene : Scene3D;
private var white : MaterialObject3D;
private var bg : Plane;
public function Flip(scope:Sprite, stage:Stage, core:*, a:XMLList, assetPath:String = “../flashassets/”, s:int = 10):void {
debug = trace;
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
_scope = scope;
_stage = stage;
_oCore = core;
_array = a;
_assetPath = assetPath;
_seconds = s;
_materialArray = [];
_planeArray = [];
scene = new Scene3D();
renderer = new BasicRenderEngine();
camera = new Camera3D();
camera.z = -100;
viewport = new Viewport3D(500,300,true);
viewport.alpha = 0;
_scope.addChild(viewport);
white = new ColorMaterial(0xFFFFFF);
setTimeout(addedToStage, 100);
}
private function addedToStage():void{
if(VERBOSE) debug(“\n\n>> Flip.addedToStage(); - args: “+[]);
_loader = new Sprite();
_loader.graphics.beginFill(0×000000);
_loader.graphics.drawRect(0, 0, 1, 4);
_scope.addChild(_loader);
_loader.x = (_stage.stageWidth/2) - 50;
_loader.y = (_stage.stageHeight/2) - 2;
for (var i:int = 0; i < _array.length(); i++) {
_materialArray[i] = new BitmapFileMaterial(_array[i].attribute(’src’));
_materialArray[i].oneSide = true;
_materialArray[i].smooth = true;
_materialArray[i].addEventListener(FileLoadEvent.LOAD_PROGRESS, onFileProgress);
_materialArray[i].addEventListener(FileLoadEvent.LOAD_COMPLETE, onFileComplete);
_planeArray[i] = new Plane( _materialArray[i], 300, 156, 6, 6);
scene.addChild(_planeArray[i]);
_planeArray[i].name = i.toString();
_planeArray[i].rotationY = -180;
}
// PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system
// The init function passes the rendering info so that PapervisionTween can take care of updating the renderer
PapervisionTween.init(renderer, scene, camera, viewport);
}
private function onFileProgress(event:FileLoadEvent):void {
if(VERBOSE) debug(“\t percentage: “+Math.round((event.bytesLoaded/event.bytesTotal)*100) + “%”);
var sec:Number = 100/_array.length();
_loader.width = ((_count * sec) + ((event.bytesLoaded/event.bytesTotal) * sec));
}
private function onFileComplete(event:FileLoadEvent):void {
if(VERBOSE) debug(“complete!”);
//
_count++;
if (_count == _array.length()) {
onImageQueueCompleteHandler();
}
}
private function onImageQueueCompleteHandler():void {
// PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system
var l:PapervisionTween = new PapervisionTween(_loader, {alpha:0}, 0, .2, Quintic.easeInOut, loaderFade);
l.start();
// PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system
var b:PapervisionTween = new PapervisionTween(_planeArray[0], {rotationY:0}, 0, 1, Quintic.easeInOut, onFlipDone);
b.start();
// PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system
var c:PapervisionTween = new PapervisionTween(camera, {z:-100}, 0, 1, Quintic.easeInOut, onFlipDone);
c.start();
_next = 0;
_count = -1;
bg = new Plane(white,5120,2560,10,10);
bg.y = -200;
bg.z = 500;
bg.pitch(0);
scene.addChild(bg);
dispatchEvent(new FlipEvent(FlipEvent.COMPLETE, _next, _array[0].attribute(‘link’), _array[0].attribute(‘target’)));
var myTimer:Timer = new Timer(_seconds * 1000);
myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
myTimer.start();
}
private function flip(id:int):void {
// PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system
var a:PapervisionTween = new PapervisionTween(_planeArray[_next], {rotationY:180}, 0, 1, Quintic.easeInOut, onOldFlipDone);
a.start();
// Update Data
_prev = _next;
_next = (id == _array.length() - 1) ? 0 : id + 1;
var url:String = _array[_next].attribute(‘link’);
var targ:String = _array[_next].attribute(‘target’);
trace(url, targ);
dispatchEvent(new FlipEvent(FlipEvent.ON_FLIP, _next, url, targ));
// PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system
var b:PapervisionTween = new PapervisionTween(_planeArray[_next], {rotationY:0}, 0, 1, Quintic.easeInOut, onFlipDone);
b.start();
// PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system
var c:PapervisionTween = new PapervisionTween(camera, {z:-350}, 0, .5, Quintic.easeIn, onCameraHalf);
c.start();
}
private function onCameraHalf(event:Event = null):void {
viewport.alpha = 1;
var c:PapervisionTween = new PapervisionTween(camera, {z:-100}, 0, .5, Quintic.easeOut);
c.start();
}
public function timerHandler(event:TimerEvent):void {
if(VERBOSE) debug(“timerHandler: “ + event);
_count = (_count == _array.length() - 1) ? 0 : _count + 1;
flip(_count);
}
private function onFlipDone(event:Event = null):void {
if(VERBOSE) debug(“flip done!”);
}
private function loaderFade(event:Event = null):void {
viewport.alpha = 1;
_scope.removeChild(_loader);
}
private function onOldFlipDone(event:Event = null):void {
if(VERBOSE) debug(“old flip done!”);
_planeArray[_prev].rotationY = -180;
}
}
}