topical media & game development
student-ar-org-papervision3d-core-effects-view-ReflectionView.ax
student-ar-org-papervision3d-core-effects-view-ReflectionView.ax
[swf]
[flash]
flex
package org.papervision3d.core.effects.view {
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.core.math.Matrix3D;
import org.papervision3d.core.proto.CameraObject3D;
import org.papervision3d.view.BasicView;
import org.papervision3d.view.Viewport3D;
import flash.events.Event;
import flash.geom.ColorTransform;
public class @ax-student-ar-org-papervision3d-core-effects-view-ReflectionView extends BasicView
{
public var viewportReflection : Viewport3D;
public var cameraReflection : CameraObject3D;
public var surfaceHeight : Number = 0;
//public var reflectionMatrix : Matrix3D; // for future use...
private var _autoScaleToStage : Boolean;
public function @ax-student-ar-org-papervision3d-core-effects-view-ReflectionView(viewportWidth:Number=640, viewportHeight:Number=320, scaleToStage:Boolean=true, interactive:Boolean=false, cameraType:String="Target")
{
super(viewportWidth, viewportHeight, scaleToStage, interactive, cameraType);
//set up reflection viewport and camera
viewportReflection = new Viewport3D(viewportWidth, viewportHeight,scaleToStage, false);
// For future use...
//reflectionMatrix = new Matrix3D();
//createReflectionMatrix(null);
// add the reflection viewport to the stage
addChild(viewportReflection);
setChildIndex(viewportReflection,0);
// flip it
viewportReflection.scaleY = -1;
// and move it down
viewportReflection.y = viewportHeight;
cameraReflection = new Camera3D();
// SAVING THIS CODE FOR LATER (may require transparent reflections... )
/*var matrix:Array = new Array();
matrix = matrix.concat([0.4, 0, 0, 0, 0]); // red
matrix = matrix.concat([0, 0.4, 0, 0, 0]); // green
matrix = matrix.concat([0, 0, 0.4, 0, 0]); // blue
matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha
viewportReflection.filters = [new ColorMatrixFilter(matrix),new BlurFilter(8,8,1)];
*/
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
this.autoScaleToStage = scaleToStage;
setReflectionColor(0.5,0.5,0.5);
}
public override function singleRender():void
{
cameraReflection.zoom = camera.zoom;
cameraReflection.focus = camera.focus;
if(camera is Camera3D)
{
Camera3D(cameraReflection).useCulling = Camera3D(camera).useCulling;
}
//camera.updateTransform();
cameraReflection.transform.copy(camera.transform);
// reflection matrix! Doesn't work yet - turns planes inside out :-S
//cameraReflection.transform.calculateMultiply(cameraReflection.transform, reflectionMatrix);
cameraReflection.y=-camera.y;
cameraReflection.rotationX = -camera.rotationX;
cameraReflection.rotationY = camera.rotationY;
cameraReflection.rotationZ = -camera.rotationZ;
cameraReflection.y+=surfaceHeight;
renderer.renderScene(scene, cameraReflection, viewportReflection);
super.singleRender();
}
public function setReflectionColor(redMultiplier:Number=0, greenMultiplier:Number=0, blueMultiplier:Number=0, redOffset:Number=0, greenOffset:Number=0, blueOffset:Number=0): void
{
viewportReflection.transform.colorTransform = new ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, 1, redOffset, greenOffset, blueOffset);
}
/* For future use...
public function createReflectionMatrix(plane:Plane3D):void
{
var a:Number = 0;//plane.normal.x;
var b:Number = 1;//plane.normal.y;
var c:Number = 0;//plane.normal.z;
reflectionMatrix.n11 = 1-(2*a*a);
reflectionMatrix.n12 = 0-(2*a*b);
reflectionMatrix.n13 = 0-(2*a*c);
reflectionMatrix.n21 = 0-(2*a*b);
reflectionMatrix.n22 = 1-(2*b*b);
reflectionMatrix.n23 = 0-(2*b*c);
reflectionMatrix.n31 = 0-(2*a*c);
reflectionMatrix.n32 = 0-(2*b*c);
reflectionMatrix.n33 = 1-(2*c*c);
}
*/
We need to move the reflection view whenever the stage is resized so we have to implement
the same functionality as the Viewport3D, ie we add a stage resize listener (once we're on the stage).
public function set autoScaleToStage(scale:Boolean):void
{
_autoScaleToStage = scale;
if(scale && stage != null)
{
onStageResize();
}
}
Triggered when added to the stage to start listening to stage resizing
protected function onAddedToStage(event:Event):void
{
stage.addEventListener(Event.RESIZE, onStageResize);
onStageResize();
}
Triggered when removed from the stage to remove the stage resizing listener
protected function onRemovedFromStage(event:Event):void
{
stage.removeEventListener(Event.RESIZE, onStageResize);
}
// all we need to do is move the view down
private function onStageResize(e:Event = null) : void
{
viewportReflection.y = stage.stageHeight;
}
}
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.