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 _baseNode2:DisplayObject3D; //instancia el base node (del segundo marcador)
private var _plane:Plane;
private var _plane2:Plane; //instancia el plano (del segundo marcador)
//Este es el video que se representa en el marker
private var _video:VideoStreamMaterial;
private var _video2:VideoStreamMaterial;//instancia el material de vídeo (del segundo marcador)
private var _ns:NetStream;
private var _ns2:NetStream;//instancia streaming (del segundo marcador)
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();
this._baseNode2= new DisplayObject3D(); //genera el base node antes instanciado(del segundo marcador)
//A metaData object handler was set up to catch any metadata content coming from the FLV
var customClient:Object = new Object();
customClient.onMetaData = metaDataHandler;
var customClient2:Object = new Object();
customClient2.onMetaData = metaDataHandler; //instancia el cliente para los datos de vídeo del streaming (del segundo marcador)
//Set up a video file to handle the FLV
var videoFile:Video = new Video();
var nc:NetConnection = new NetConnection();
nc.connect(null);
var videoFile2:Video = new Video(); //crea e instancia el archivo de video que tomará el streaming (del segundo marcador)
var nc2:NetConnection = new NetConnection(); //crea e instancia la conexión para el streaming (del segundo marcador)
nc2.connect(null);
//Set up a video to handle the netStream connection
_ns = new NetStream(nc);
_ns.play("assets/reel.flv");
_ns.pause();
_ns.client = customClient;
videoFile.attachNetStream(_ns);
_ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler);
_ns2 = new NetStream(nc2); //crea el streaming antes instanciado (del segundo marcador)
_ns2.play("assets/pepe.flv"); //instancia la reproducción de qué vídeo se hará en streaming (del segundo marcador)
_ns2.pause(); //instancia la función pause de streaming (del segundo marcador)
_ns2.client = customClient2; //instancia como cliente para el streaming el cliente antes creado (del segundo marcador)
videoFile2.attachNetStream(_ns2); //instancia el base node (del segundo marcador)
_ns2.addEventListener(NetStatusEvent.NET_STATUS, statusHandler2); //instancia un listener para enviar el estado de la conexión streaming (del segundo marcador)
//This function is called when metaData is dispatched
function metaDataHandler(infoObject:Object):void { }
//Instantiate the VideoStreamMaterial
_video = new VideoStreamMaterial(videoFile, _ns, true, true);
_video2 = new VideoStreamMaterial(videoFile2, _ns2, true, true); //crea material de vídeo antes instanciado (del segundo marcador)
this._plane = new Plane(_video, 160, 120);
this._plane.rotationX = 180;
this._plane.rotationZ = 90;
this._plane.scale = 0;
this._plane2 = new Plane(_video2, 160, 120); //crea el plano antes instanciado (del segundo marcador)
this._plane2.rotationX = 180;
this._plane2.rotationZ = 90;
this._plane2.scale = 0;
this._baseNode.addChild(this._plane);
this._baseNode2.addChild(this._plane2); //crea el base node antes instanciado (del segundo marcador)
this._scene.addChild(this._baseNode);
this._scene.addChild(this._baseNode2); //anida el base node a la escena (del segundo marcador)
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 {
trace(evt.marker.patternId.toString());
if (evt.marker.patternId == 0) { //indica el caso del primer marcador añadido
_ns.resume();
Tweener.addTween(_plane, {scale:1, time: 1});
}
else if (evt.marker.patternId == 1) { //indica el caso del segundo marcador añadido
_ns2.resume();
Tweener.addTween(_plane2, {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);
_baseNode2.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 (evt.marker.patternId == 0) { //indica el caso del primer marcador quitado
_ns.pause();
Tweener.addTween(_plane, {scale:0, time: 0.5});
}
else if (evt.marker.patternId == 1) { //indica el caso del segundo marcador quitado
_ns2.pause();
Tweener.addTween(_plane2, {scale:0, time: 0.5});
}
}
//Se dispara cada Frame
private function onEnterFrame (e:Event) :void {
_renderer.render();
}
private function statusHandler(eventObject:Object):void{
if(eventObject.info.code == "NetStream.Play.Stop"){
// loop video
_ns.play("assets/reel.flv");
}
}
private function statusHandler2(eventObject:Object):void{
if(eventObject.info.code == "NetStream.Play.Stop"){
// loop video (del segundo marcador)
_ns2.play("assets/pepe.flv");
}
}
}
}