package { import flare.basic.*; import flare.core.*; import flare.flsl.*; import flare.materials.*; import flare.materials.filters.*; import flare.primitives.*; import flare.system.*; import flare.utils.*; import flash.display.*; import flash.events.*; import flash.geom.*; import flash.utils.*; /** * @author Jason Huang */ public class Test62_PlanarReflections extends Sprite { [Embed(source = "../bin/screenProj.flsl.compiled", mimeType = "application/octet-stream")] private var ScreenProj:Class; private var scene:Scene3D; private var model:Pivot3D; private var reflection:PlanarReflection; private var texture:Texture3D; private var material:Shader3D; private var filter:FLSLFilter; private var plane:Plane; public function Test62_PlanarReflections() { scene = new Viewer3D( this, null, 0.2 ); scene.autoResize = true; scene.camera = new Camera3D(); scene.camera.setPosition( 0, 100, -200 ); scene.camera.lookAt( 0, 0, 0 ); reflection = new PlanarReflection(); texture = new Texture3D( new Point( 512, 512 ) ); texture.wrapMode = Texture3D.WRAP_CLAMP; texture.upload( scene ); filter = new FLSLFilter( new ScreenProj ); filter.params.texture.value = texture; material = new Shader3D( "Mirror Material", [ filter ] ); plane = new Plane( "Mirror", 500, 500, 1, material, "+xz" ); model = scene.addChildFromFile( "elsa.zf3d" ); model.y = 30; scene.addEventListener( Scene3D.RENDER_EVENT, renderEvent ); } private function renderEvent(e:Event):void { model.rotateX( 1 ); model.rotateZ( 0.7 ); drawMirror(); } private function drawMirror():void { // try to get a small value, the large value would kill the far plane. reflection.accuracy = 1 / scene.camera.far; reflection.update( plane.world ); if ( reflection.isBehind( scene.camera ) ) return; reflection.setupCamera( scene.camera ); scene.context.setRenderToTexture( texture.texture, true ); scene.context.clear( scene.clearColor.x, scene.clearColor.y, scene.clearColor.z ); Device3D.invertCullFace = true; for each ( var p:Pivot3D in scene.renderList ) if ( p is Mesh3D ) p.draw( false ); Device3D.invertCullFace = false; scene.context.setRenderToBackBuffer(); scene.setupFrame( scene.camera ); plane.draw(); } } }