<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
                backgroundColor="0"
                creationComplete="init()" color="#aaaaaa" viewSourceURL="srcview/index.html">
    <mx:Script>
        <![CDATA[
            import com.derschmale.light.SpecularLightMap;
            import com.derschmale.light.DiffuseLightMap;
            import caurina.transitions.Tweener;
            import com.derschmale.bumpmaps.BumpMap;
            
            /* just a whole wad of embedded assets */
            [Embed(source="../embeds/images/preview_stone-01_d100.jpg")]
            private var _stoneSource : Class;
            
            [Embed(source="../embeds/images/preview_stone-01_b030-p050.jpg")]
            private var _stoneDiffuse : Class;
            
            [Embed(source="../embeds/images/preview_stone-01_s050-g050.jpg")]
            private var _stoneSpecular : Class;
            
            [Embed(source="../embeds/images/preview_stone-42_d100.jpg")]
            private var _wallSource : Class;
            
            [Embed(source="../embeds/images/preview_stone-42_b005.jpg")]
            private var _wallDiffuse : Class;
            
            [Embed(source="../embeds/images/preview_stone-42_s100-g050-r.jpg")]
            private var _wallSpecular : Class;
            
            [Embed(source="../embeds/images/bennylava.jpg")]
            private var _bennySource : Class;
            
            [Embed(source="../embeds/images/fibre.jpg")]
            private var _bennyDiffuse : Class;
            
            [Embed(source="../embeds/images/drops01.jpg")]
            private var _bennySpecular : Class;
            
            [Embed(source="../embeds/images/tiles-source.jpg")]
            private var _tilesSource : Class;
            
            [Embed(source="../embeds/images/tiles-bump.jpg")]
            private var _tilesDiffuse : Class;
            
            [Embed(source="../embeds/images/tiles-spec.jpg")]
            private var _tilesSpecular : Class;
            
            [Embed(source="../embeds/images/steel-source.jpg")]
            private var _steelSource : Class;
            
            [Embed(source="../embeds/images/steel-bump.jpg")]
            private var _steelDiffuse : Class;
            
            [Embed(source="../embeds/images/steel-spec.jpg")]
            private var _steelSpecular : Class;
            
            private var _diffuseBumpMap : BumpMap;
            private var _specularBumpMap : BumpMap;
            private var _diffuseMap : DiffuseLightMap;
            private var _specularMap : SpecularLightMap;
            
            private var _sourceAssets : Array;
            private var _diffuseAssets : Array;
            private var _specularAssets : Array;
            
            [Bindable]
            private var _currentImage : Image;
            
            [Bindable]
            private var _textureNames : Array = ["Cobble wall", "Sandstone wall", "Water drops", "Tiles", "Rusted steel"];
            
            private function init() : void
            {
                _diffuseMap = new DiffuseLightMap(512);
                _specularMap = new SpecularLightMap(512);
                
                diffuseLightSource.source = _diffuseMap;
                specularLightSource.source = _specularMap;
                
                initAssets();
                setTexture(2);
                
                //sourceImage.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
                addEventListener(Event.ENTER_FRAME, handleEnterFrame);
            }
            
            private function initAssets() : void
            {
                _sourceAssets = new Array();
                _diffuseAssets = new Array();
                _specularAssets = new Array();
                
                _sourceAssets[0] = _stoneSource;
                _diffuseAssets[0] = new _stoneDiffuse();
                _specularAssets[0] = new _stoneSpecular();
                _sourceAssets[1] = _wallSource;
                _diffuseAssets[1] = new _wallDiffuse();
                _specularAssets[1] = new _wallSpecular();
                _sourceAssets[2] = _bennySource;
                _diffuseAssets[2] = new _bennyDiffuse();
                _specularAssets[2] = new _bennySpecular();
                _sourceAssets[3] = _tilesSource;
                _diffuseAssets[3] = new _tilesDiffuse();
                _specularAssets[3] = new _tilesSpecular();
                _sourceAssets[4] = _steelSource;
                _diffuseAssets[4] = new _steelDiffuse();
                _specularAssets[4] = new _steelSpecular();
            }
            
            private function setTexture(id : uint) : void
            {
                sourceImage.source = new _sourceAssets[id]();
                _diffuseBumpMap = new BumpMap(diffuseLightSource, _diffuseAssets[id].bitmapData, 256);
                _specularBumpMap = new BumpMap(specularLightSource, _specularAssets[id].bitmapData, 512);
            }
            
            private function handleEnterFrame(event : Event) : void
            {
                diffuseLightSource.x = sourceImage.mouseX-256;
                diffuseLightSource.y = sourceImage.mouseY-256;
                specularLightSource.x = sourceImage.mouseX-256;
                specularLightSource.y = sourceImage.mouseY-256;
                _diffuseBumpMap.update();
                _specularBumpMap.update();
            }
        ]]>
    </mx:Script>
    
    <mx:VBox horizontalCenter="0" horizontalAlign="center">
        <mx:Label text="move your mouse around" />
        <mx:Canvas backgroundColor="0">
            <mx:Image id="sourceImage" />
            
            <mx:Canvas     id="diffuseContainer" blendMode="multiply" mouseEnabled="false" mouseChildren="false"
                        width="100%" height="{sourceImage.height}" backgroundColor="0x000000"
                        horizontalScrollPolicy="off" verticalScrollPolicy="off"
                        visible="{diffuseCheck.selected}">
                <mx:Image id="diffuseLightSource" />
            </mx:Canvas>
            
            <mx:Canvas     id="specularContainer" blendMode="screen" mouseEnabled="false" mouseChildren="false"
                        width="{sourceImage.width}" height="{sourceImage.height}"
                        verticalScrollPolicy="off" horizontalScrollPolicy="off"
                        visible="{specularCheck.selected}">
                <mx:Image id="specularLightSource" />
            </mx:Canvas>

        </mx:Canvas>
    
    <!-- controls -->
        <mx:HBox>
            <mx:Label text="Texture: " />
            <mx:ComboBox id="texturePicker" selectedIndex="2" dataProvider="{_textureNames}" change="setTexture(texturePicker.selectedIndex)" />
        </mx:HBox>
        
        <mx:HBox width="650">
            <mx:Label text="Diffuse Bump:" width="100" />
            <mx:HSlider id="diffuseStrengthSlide" liveDragging="true"
                        minimum="0" maximum="1024" value="256"
                        width="400"
                        change="{_diffuseBumpMap.strength = diffuseStrengthSlide.value}" />
            <mx:CheckBox id="diffuseCheck" selected="true" label="Show diffuse" width="120" />
        </mx:HBox>
        <mx:HBox width="650">
            <mx:Label text="Specular Bump:" width="100" />
            <mx:HSlider id="specularStrengthSlide" liveDragging="true"
                        value="512" minimum="0" maximum="1024"
                        width="400"
                        change="{_specularBumpMap.strength = specularStrengthSlide.value}" />
            <mx:CheckBox id="specularCheck" selected="true" label="Show specular" width="120" />
        </mx:HBox>
        <mx:HBox width="650">
            <mx:Label text="specular gloss" width="120" />
            <mx:HSlider id="glossSlide"
                        value="20" minimum="1" maximum="50"
                        width="400"
                        change="{_specularMap.gloss = glossSlide.value}" />
        </mx:HBox>
        <mx:HBox width="650">
            <mx:Label text="specular strength" width="120" />
            <mx:HSlider id="specularSlide"
                        value="20" minimum="1" maximum="50"
                        width="400"
                        change="{_specularMap.strength = specularSlide.value}" />
        </mx:HBox>
    </mx:VBox>
</mx:Application>