package com.dafishinsea.deepsee { import com.dafishinsea.models.IModel; import com.dafishinsea.renderers.PerspectiveRenderer; import com.dafishinsea.shaders.NormalMapShader; import flash.display.Sprite; import flash.geom.Matrix3D; import flash.geom.Vector3D; public class DeepScene { private var _canvas:Sprite; private var _shaders:Array; private var _models:Array; private var _lightDir:Vector3D = new Vector3D(1,1,1); private var _renderer:PerspectiveRenderer; /** * lightDir - sets direction of main light */ public function get lightDir():Vector3D { return _lightDir; } public function set lightDir(newValue:Vector3D):void { _lightDir.x = newValue.x; _lightDir.y = newValue.y; _lightDir.z = newValue.z; _lightDir.normalize(); } public function DeepScene(canvas:Sprite) { _canvas = canvas; _renderer = new PerspectiveRenderer(_canvas); _models = []; _shaders = []; } /** * add model to scene */ public function addModel(model:IModel):void { _models.push(model); //for now the only kind of shader... var shader:NormalMapShader = new NormalMapShader(model, _lightDir); _shaders.push( shader ); shader.start(); } /** * render scene onto canvas */ public function render():void { _canvas.graphics.clear(); for(var m:int = 0; m < _models.length; ++m) { var model:IModel = _models[m]; var shader:NormalMapShader = _shaders[m]; //update shader var invMatrix:Matrix3D = model.matrix.clone(); invMatrix.invert(); shader.lightDir = invMatrix.deltaTransformVector(_lightDir); _renderer.renderModel( model ); } } } }