package com.zerofractal {
import flash.display.Sprite;
import flash.events.Event;
import flash.media.Video;
import flash.net.*;
//Importa clases de FlarManager
import com.transmote.flar.FLARManager;
import com.transmote.flar.marker.FLARMarkerEvent;
import com.transmote.flar.utils.FLARPVGeomUtils;
import org.libspark.flartoolkit.pv3d.FLARCamera3D;
//Importa clases de Papervision 3D
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.materials.VideoStreamMaterial;
import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.render.LazyRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.view.layer.ViewportLayer;
import org.papervision3d.objects.parsers.DAE;
import org.papervision3d.events.FileLoadEvent;
import flash.events.NetStatusEvent;
//Importa el motor de Tween. Puede ser tweener, tweenmax, tweenlight, etc.
import caurina.transitions.Tweener;
public class Step7 extends Sprite {
//Este es el objeto que contiene el FLAR Manager
private var _flarManager:FLARManager;
private var _camera3d:FLARCamera3D;
//Estos son los objetos basicos de Papervision 3D
private var _viewport:Viewport3D;
private var _scene:Scene3D;
private var _renderer:LazyRenderEngine;
//Este es el Displayobject que contiene el objeto 3d que se ubica en la marca
private var _baseNode:DisplayObject3D;
private var _plane:Plane;
private var _dae:DAE;
private var _daeLayer:ViewportLayer;
//Este es el video que se representa en el marker
private var _video:VideoStreamMaterial;
private var _ns:NetStream;
public function Step7() {
this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage (e:Event):void {
this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
// Instancia y Carga el XML de configuracion de Flarmanager
this._flarManager = new FLARManager("assets/config.xml");
//Agrega handlers para los eventos claves de FLAR
this._flarManager.addEventListener(Event.INIT, this.onFlarInit);
this._flarManager.addEventListener(FLARMarkerEvent.MARKER_ADDED, this.onMarkerAdded);
this._flarManager.addEventListener(FLARMarkerEvent.MARKER_UPDATED, this.onMarkerUpdated);
this._flarManager.addEventListener(FLARMarkerEvent.MARKER_REMOVED, this.onMarkerRemoved);
var flarSource = Sprite(this._flarManager.flarSource);
//Agrega la webcam al escenario
this.addChild(flarSource);
}
//Se dispara cuando se inicializa FLAR
private function onFlarInit (evt:Event) :void {
this._flarManager.removeEventListener(Event.INIT, this.onFlarInit);
trace(this._flarManager.markerUpdateThreshold);
//Inicializa Papervision
this._scene = new Scene3D();
this._camera3d = new FLARCamera3D(this._flarManager.cameraParams);
this._viewport = new Viewport3D(640, 480);
this._viewport.x = -4;
this._viewport.y = -4;
this.addChild(this._viewport);
this._baseNode = new DisplayObject3D();
//A metaData object handler was set up to catch any metadata content coming from the FLV
var customClient:Object = new Object();
customClient.onMetaData = metaDataHandler;
//Set up a video to handle the FLV
var videoFile:Video = new Video();
var nc:NetConnection = new NetConnection();
nc.connect(null);
//Set up a video to handle the netStream connection
_ns = new NetStream(nc);
_ns.play("assets/reel.flv");
_ns.client = customClient;
videoFile.attachNetStream(_ns);
_ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler);
//This function is called when metaData is dispatched
function metaDataHandler(infoObject:Object):void { }
//Instantiate the VideoStreamMaterial
_video = new VideoStreamMaterial(videoFile, _ns, true, true);
this._plane = new Plane(_video, 160, 120);
this._plane.rotationX = 180;
this._plane.rotationZ = 90;
this._plane.scale = 0;
this._baseNode.addChild(this._plane);
_dae = new DAE(true,null,true);
_dae.rotationX = 90;
_dae.y = 5;
_dae.load("assets/duck.xml");
_dae.addEventListener(FileLoadEvent.LOAD_COMPLETE, onLoadComplete);
_dae.scaleX = _dae.scaleY = _dae.scaleZ = 3;
_dae.visible = false;
_baseNode.addChild(_dae);
this._scene.addChild(this._baseNode);
this._renderer = new LazyRenderEngine(_scene, _camera3d, _viewport);
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
//Se dispara cuando se encuentra un marker en FLAR
private function onMarkerAdded (evt:FLARMarkerEvent) :void {
if (_flarManager.activeMarkers.length == 0) {
_ns.play("assets/reel.flv");
_dae.visible = true;
Tweener.addTween(_plane, {scale:1, time: 1});
}
}
//Se dispara cuando se actualiza un marker en FLAR
private function onMarkerUpdated (evt:FLARMarkerEvent) :void {
//Aplica Posición al basenode
_baseNode.transform = FLARPVGeomUtils.convertFLARMatrixToPVMatrix(evt.marker.transformMatrix);
//this.log ("FLAR", "Marker [" + evt.marker.patternId + "] actualizado " + Math.round(evt.marker.confidence*100) + "%");
}
//Se dispara cuando se quita un marker en FLAR
private function onMarkerRemoved (evt:FLARMarkerEvent) :void {
if (_flarManager.activeMarkers.length == 0) {
_dae.visible = false;
Tweener.addTween(_plane, {scale:0, time: 0.5});
}
}
//Se dispara cada Frame
private function onEnterFrame (e:Event) :void {
_renderer.render();
}
//Se dispara cuando carga el DAE
private function onLoadComplete(e:FileLoadEvent):void{
_dae.removeEventListener(FileLoadEvent.LOAD_COMPLETE, onLoadComplete);
_daeLayer = _viewport.getChildLayer(_dae, true);
for each (var m:MaterialObject3D in _dae.materials.materialsByName) {
m.baked=true;
m.smooth=true;
BitmapMaterial(m).precise=true;
m.oneSide=true;
}
}
private function statusHandler(eventObject:Object):void
{
if(eventObject.info.code == "NetStream.Play.Stop")
{
// loop video
_ns.seek(0);
}
}
}
}