package com.dafishinsea.shaders { import com.dafishinsea.models.IModel; import flash.display.BitmapData; import flash.display.Shader; import flash.display.ShaderJob; import flash.events.Event; import flash.geom.Vector3D; import flash.utils.ByteArray; public class NormalMapShader { private var shaderJob:ShaderJob; private var shader:Shader; private var normalMap:BitmapData; private var colorMap:BitmapData; private var textureMap:BitmapData; private var _lightDir:Vector3D = new Vector3D(0,0,0); [Embed(source="NormalMapShader.pbj", mimeType="application/octet-stream")] private var NormalMapShaderKernel:Class; public function NormalMapShader(model:IModel, lightDir:Vector3D) { this.normalMap = model.normalMap; this.colorMap = model.colorMap; this.textureMap = model.textureMap; _lightDir = lightDir; init(); } /** * lightDir */ public function get lightDir():Vector3D { return _lightDir; } public function set lightDir(newValue:Vector3D):void { _lightDir = newValue; _lightDir.normalize(); } private function init():void { shader = new Shader(new NormalMapShaderKernel()); shader.data.src.width = normalMap.width shader.data.src.height = normalMap.height; shader.data.src.input = normalMap; shader.data.texture.width = textureMap.width; shader.data.texture.height = textureMap.height; shader.data.texture.input = colorMap; shaderJob = new ShaderJob(shader, textureMap, normalMap.width, normalMap.height); } /** * start shader */ public function start():void { shaderJob.addEventListener(Event.COMPLETE, shaderJobCompleteHandler); shaderJob.start(); } /** * shader job complete */ private function shaderJobCompleteHandler(event:Event):void { //update params and restart job //TODO : pass as 3 element array shader.data.xr.value = [_lightDir.x]; shader.data.yr.value = [_lightDir.y]; shader.data.zr.value = [_lightDir.z]; shaderJob = new ShaderJob(shader, textureMap, normalMap.width, normalMap.height); shaderJob.addEventListener(Event.COMPLETE, shaderJobCompleteHandler); shaderJob.start(); } } }