package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import flash.geom.Point;
import flash.ui.ContextMenu;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.special.ParticleMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.special.ParticleField;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.BitmapViewport3D;
public class Anaglyph extends Sprite
{
private var scene :Scene3D;
private var camera :Camera3D;
private var viewport :BitmapViewport3D;
private var renderer :BasicRenderEngine;
private var bitmap :Bitmap;
private var material :ColorMaterial;
private var material2 :ParticleMaterial;
private var object :Glasses;
private var object2 :ParticleField;
private var left :String;
public function Anaglyph()
{
var menu :ContextMenu = new ContextMenu();
menu.hideBuiltInItems();
contextMenu = menu;
scene = new Scene3D();
camera = new Camera3D();
camera.target = DisplayObject3D.ZERO;
viewport = new BitmapViewport3D(640, 480, true, true, 0x000000, true, true);
addChild(viewport);
renderer = new BasicRenderEngine();
bitmap = new Bitmap(new BitmapData(viewport.width, viewport.height, false, 0x000000));
addChild(bitmap);
material = new ColorMaterial(0xffffff);
material.interactive = true;
material2 = new ParticleMaterial(0xffffff, 1);
material2.doubleSided = true;
object = new Glasses(material);
object.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, handleObjectOver);
object.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, handleObjectOut);
object.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, handleObjectPress);
scene.addChild(object);
object2 = new ParticleField(material2);
scene.addChild(object2);
handleEnterFrame();
//addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
//addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
//addEventListener(MouseEvent.MOUSE_OVER, handleMouseOver);
addEventListener(MouseEvent.MOUSE_OUT, handleMouseOut);
}
private function handleEnterFrame(e:Event=null):void
{
movement();
if ((bitmap.bitmapData.height != Math.round(stage.stageHeight)) ||
(bitmap.bitmapData.width != Math.round(stage.stageWidth))) {
bitmap.bitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0x000000);
}
//left
camera.moveLeft(4);
camera.target.moveLeft(4);
renderer.renderScene(scene, camera, viewport);
if (left == "green") {
//viewport.transform.colorTransform = new ColorTransform(0, 1, 0, 1);
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.GREEN, BitmapDataChannel.GREEN);
} else if (left == "blue") {
//viewport.transform.colorTransform = new ColorTransform(0, 0, 1, 1);
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE);
} else {
//viewport.transform.colorTransform = new ColorTransform(1, 0, 0, 1);
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.RED, BitmapDataChannel.RED);
}
//right
camera.moveRight(8);
camera.target.moveRight(8);
renderer.renderScene(scene, camera, viewport);
if (left == "green") {
//viewport.transform.colorTransform = new ColorTransform(1, 0, 1, 1);
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.RED, BitmapDataChannel.RED);
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE);
} else if (left == "blue") {
//viewport.transform.colorTransform = new ColorTransform(1, 1, 0, 1);
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.RED, BitmapDataChannel.RED);
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.GREEN, BitmapDataChannel.GREEN);
} else {
//viewport.transform.colorTransform = new ColorTransform(0, 1, 1, 1);
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.GREEN, BitmapDataChannel.GREEN);
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE);
}
bitmap.bitmapData.copyChannel(viewport.bitmapData, viewport.bitmapData.rect, new Point(), BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA);
//center
camera.moveLeft(4);
camera.target.moveLeft(4);
}
private function handleMouseDown(e:MouseEvent):void
{
addEventListener(Event.ENTER_FRAME, handleEnterFrame);
}
private function handleMouseUp(e:MouseEvent):void
{
removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
}
private function handleMouseOver(e:MouseEvent):void
{
addEventListener(Event.ENTER_FRAME, handleEnterFrame);
}
private function handleMouseOut(e:MouseEvent):void
{
removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
}
private function handleObjectOver(e:InteractiveScene3DEvent):void
{
viewport.containerSprite.buttonMode = true;
}
private function handleObjectOut(e:InteractiveScene3DEvent):void
{
viewport.containerSprite.buttonMode = false;
}
private function handleObjectPress(e:InteractiveScene3DEvent):void
{
if (left == "green") {
left = "blue";
} else if (left == "blue") {
left = "red";
} else {
left = "green";
}
}
private function movement():void
{
if (left == "red") {
object.pitch(2);
object2.pitch(2);
} else if (left == "green") {
object.roll(2);
object2.roll(2);
} else {
object.yaw(2);
object2.yaw(2);
}
}
}
}Download