classes

SimpleDisplacerAW.as

Stiahnuť SimpleDisplacerAW.as

package sk.yoz.displacing
{
    import away3dlite.cameras.Camera3D;
    import away3dlite.containers.Scene3D;
    import away3dlite.containers.View3D;
    import away3dlite.core.render.FastRenderer;
    import away3dlite.core.render.Renderer;
    import away3dlite.materials.BitmapMaterial;
    import away3dlite.primitives.Plane;
    
    import flash.display.BitmapData;
    
    public class SimpleDisplacerAW extends AbstractDisplacer
    {
        public var viewport:View3D;
        public var scene:Scene3D;
        public var camera:Camera3D;
        public var renderer:Renderer;
        
        public var viewportWidth:Number;
        public var viewportHeight:Number;
        
        public var plane:Plane;
        public var depth:Number = 100;
        public var segmentsW:uint = 15;
        public var segmentsH:uint = 15;
        
        public function SimpleDisplacerAW(
            viewportWidth:Number, viewportHeight:Number,
            image:BitmapData, map:BitmapData, 
            rotationXMax:Number = 30, rotationYMax:Number = 30,
            depth:Number = 100, segmentsW:uint = 15, segmentsH:uint = 15):void
        {
            super(image, map, rotationXMax, rotationYMax, 0, 0);
            
            this.viewportWidth = viewportWidth;
            this.viewportHeight = viewportHeight;
            this.depth = depth || this.depth;
            this.segmentsW = segmentsW || this.segmentsW;
            this.segmentsH = segmentsH || this.segmentsH;
            
            scene = new Scene3D();
            
            camera = new Camera3D();
            camera.z = -1000;
            
            renderer = new FastRenderer();
            
            viewport = new View3D(scene, camera, renderer);
            viewport.x = viewportWidth / 2;
            viewport.y = viewportHeight / 2;
            addChild(viewport);
            
            plane = new Plane(material, image.width, image.height,
                this.segmentsW, this.segmentsH, false);
            plane.bothsides = false;
            
            var length:uint = plane.vertices.length;
            var x:Number, y:Number;
            var color:uint;
            var w:Number = (image.width - 1) / 2;
            var h:Number = (image.height - 1) / 2;
            for(var i:uint = 0; i < length; i+=3)
            {
                x = plane.vertices[i];
                y = plane.vertices[i+1];
                color = map.getPixel(w + x, h + y);
                plane.vertices[i+2] = -(color >> 16) / 0xff * this.depth;
            }
            
            scene.addChild(plane);
        }
        
        protected function get material():BitmapMaterial
        {
            var material:BitmapMaterial = new BitmapMaterial(image);
            material.smooth = true;
            return material;
        }
        
        override public function set rotX(value:Number):void
        {
            super.rotX = value;
            plane.rotationX = -value;
        }
        
        override public function set rotY(value:Number):void
        {
            super.rotY = value;
            plane.rotationY = value;
        }
        
        override public function render():void
        {
            super.render();
            viewport.render();
        }
    }
}