diff --git a/src/away3d/cameras/lenses/LensBase.as b/src/away3d/cameras/lenses/LensBase.as index 406f758..2530096 100644 --- a/src/away3d/cameras/lenses/LensBase.as +++ b/src/away3d/cameras/lenses/LensBase.as @@ -158,9 +158,9 @@ package away3d.cameras.lenses /** * Calculates a projectionmatrix for an (potientally off-centre) subfrustum */ - public function getSubFrustumMatrix(ratioLeft : Number, ratioRight : Number, ratioTop : Number, ratioBottom : Number, matrix : Matrix3D, corners : Vector.) : void - { - throw new AbstractMethodError(); - } +// public function getSubFrustumMatrix(ratioLeft : Number, ratioRight : Number, ratioTop : Number, ratioBottom : Number, matrix : Matrix3D, corners : Vector.) : void +// { +// throw new AbstractMethodError(); +// } } } \ No newline at end of file diff --git a/src/away3d/cameras/lenses/OrthographicLens.as b/src/away3d/cameras/lenses/OrthographicLens.as index 15fde12..cd8f816 100644 --- a/src/away3d/cameras/lenses/OrthographicLens.as +++ b/src/away3d/cameras/lenses/OrthographicLens.as @@ -16,7 +16,6 @@ package away3d.cameras.lenses /** * Creates a new OrthogonalLens object. - * @param fieldOfView The vertical field of view of the projection. */ public function OrthographicLens(projectionHeight : Number = 500) { @@ -71,7 +70,7 @@ package away3d.cameras.lenses /** * @inheritDoc */ - override public function getSubFrustumMatrix(ratioLeft : Number, ratioRight : Number, ratioTop : Number, ratioBottom : Number, matrix : Matrix3D, corners : Vector.) : void + /*override public function getSubFrustumMatrix(ratioLeft : Number, ratioRight : Number, ratioTop : Number, ratioBottom : Number, matrix : Matrix3D, corners : Vector.) : void { var source : Matrix3D = this.matrix; var raw : Vector. = Matrix3DUtils.RAW_DATA_CONTAINER; @@ -101,6 +100,6 @@ package away3d.cameras.lenses corners[7] = corners[10] = corners[19] = corners[22] = b; corners[2] = corners[5] = corners[8] = corners[11] = _near; corners[14] = corners[17] = corners[20] = corners[23] = _far; - } + } */ } } \ No newline at end of file diff --git a/src/away3d/cameras/lenses/OrthographicOffCenterLens.as b/src/away3d/cameras/lenses/OrthographicOffCenterLens.as index 7da5dc1..3f7a5a0 100644 --- a/src/away3d/cameras/lenses/OrthographicOffCenterLens.as +++ b/src/away3d/cameras/lenses/OrthographicOffCenterLens.as @@ -78,12 +78,12 @@ package away3d.cameras.lenses { var raw : Vector. = Matrix3DUtils.RAW_DATA_CONTAINER; - raw[0] = 2/(_maxX-_minX); - raw[5] = 2/(_maxY-_minY); - raw[10] = 1/(_far-_near); - raw[12] = (_maxX + _minX)/(_minX-_maxX); - raw[13] = (_maxY + _minY)/(_minY-_maxY); - raw[14] = _near/(_near-_far); + raw[0] = 2/(_maxX - _minX); + raw[5] = 2/(_maxY - _minY); + raw[10] = 1/(_far - _near); + raw[12] = (_maxX + _minX)/(_minX - _maxX); + raw[13] = (_maxY + _minY)/(_minY - _maxY); + raw[14] = _near/(_near - _far); raw[15] = 1; raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; diff --git a/src/away3d/cameras/lenses/PerspectiveLens.as b/src/away3d/cameras/lenses/PerspectiveLens.as index 493662f..a7aa006 100644 --- a/src/away3d/cameras/lenses/PerspectiveLens.as +++ b/src/away3d/cameras/lenses/PerspectiveLens.as @@ -84,7 +84,7 @@ package away3d.cameras.lenses /** * @inheritDoc */ - override public function getSubFrustumMatrix(ratioLeft : Number, ratioRight : Number, ratioTop : Number, ratioBottom : Number, matrix : Matrix3D, corners : Vector.) : void + /*override public function getSubFrustumMatrix(ratioLeft : Number, ratioRight : Number, ratioTop : Number, ratioBottom : Number, matrix : Matrix3D, corners : Vector.) : void { // trigger rebuild var source : Matrix3D = this.matrix; @@ -126,6 +126,6 @@ package away3d.cameras.lenses corners[2] = corners[5] = corners[8] = corners[11] = _near; corners[14] = corners[17] = corners[20] = corners[23] = _far; - } + } */ } } \ No newline at end of file diff --git a/src/away3d/containers/View3D.as b/src/away3d/containers/View3D.as index 24e1788..c05b46e 100644 --- a/src/away3d/containers/View3D.as +++ b/src/away3d/containers/View3D.as @@ -144,6 +144,8 @@ package away3d.containers public function set filters3d(value : Array) : void { + if (value && value.length == 0) value = null; + if (_filter3DRenderer && !value) { _filter3DRenderer.dispose(); _filter3DRenderer = null; diff --git a/src/away3d/core/base/Geometry.as b/src/away3d/core/base/Geometry.as index da75639..28732bd 100644 --- a/src/away3d/core/base/Geometry.as +++ b/src/away3d/core/base/Geometry.as @@ -135,9 +135,10 @@ use namespace arcane; public function dispose() : void { var numSubGeoms : uint = _subGeometries.length; + for (var i : uint = 0; i < numSubGeoms; ++i) { - var subGeom:SubGeometry = _subGeometries.shift(); + var subGeom:SubGeometry = _subGeometries[0]; removeSubGeometry(subGeom); subGeom.dispose(); } diff --git a/src/away3d/core/managers/Mouse3DManager.as b/src/away3d/core/managers/Mouse3DManager.as index 06748f3..0d08925 100644 --- a/src/away3d/core/managers/Mouse3DManager.as +++ b/src/away3d/core/managers/Mouse3DManager.as @@ -176,16 +176,15 @@ package away3d.core.managers */ private function getObjectHitData() : void { - if (!_forceMouseMove && _queuedEvents.length == 0) { - _activeObject = null; + if (!_forceMouseMove && _queuedEvents.length == 0) return; - } - - var collector : EntityCollector = _view.entityCollector; _previousActiveObject = _activeObject; _previousActiveRenderable = _activeRenderable; + + var collector : EntityCollector = _view.entityCollector; + // todo: would it be faster to run a custom ray-intersect collector instead of using entity collector's data? // todo: shouldn't render it every time, only when invalidated (on move or view render) if (collector.numMouseEnableds > 0) { @@ -195,6 +194,7 @@ package away3d.core.managers } else { _activeObject = null; + _activeRenderable = null; } } diff --git a/src/away3d/entities/Mesh.as b/src/away3d/entities/Mesh.as index dcb73e0..c4c9b89 100644 --- a/src/away3d/entities/Mesh.as +++ b/src/away3d/entities/Mesh.as @@ -50,8 +50,6 @@ if (geometry) initGeometry(); } - - public override function get assetType() : String { return AssetType.MESH; diff --git a/src/away3d/lights/LightBase.as b/src/away3d/lights/LightBase.as index a6faa85..e8dd59c 100644 --- a/src/away3d/lights/LightBase.as +++ b/src/away3d/lights/LightBase.as @@ -209,5 +209,10 @@ package away3d.lights { return _shadowMapper; } + + public function set shadowMapper(value : ShadowMapperBase) : void + { + _shadowMapper = value; + } } } \ No newline at end of file diff --git a/src/away3d/lights/shadowmaps/DirectionalShadowMapper.as b/src/away3d/lights/shadowmaps/DirectionalShadowMapper.as index ace2e8b..f88ac3f 100644 --- a/src/away3d/lights/shadowmaps/DirectionalShadowMapper.as +++ b/src/away3d/lights/shadowmaps/DirectionalShadowMapper.as @@ -17,7 +17,6 @@ package away3d.lights.shadowmaps public class DirectionalShadowMapper extends PlanarShadowMapper { - private var _frustumSegment : Vector.; private var _depthLens : OrthographicOffCenterLens; private var _mtx : Matrix3D = new Matrix3D(); private var _localFrustum : Vector.; @@ -27,7 +26,6 @@ package away3d.lights.shadowmaps super(light); _depthCamera.lens = _depthLens = new OrthographicOffCenterLens(-10, -10, 10, 10); _localFrustum = new Vector.(8*3); - _frustumSegment = new Vector.(8*3); } /** @@ -74,8 +72,8 @@ package away3d.lights.shadowmaps _depthLens.near = minZ; _depthLens.far = maxZ; _depthLens.minX = minX-10; - _depthLens.maxX = maxX+10; _depthLens.minY = minY-10; + _depthLens.maxX = maxX+10; _depthLens.maxY = maxY+10; _depthCamera.transform = _light.sceneTransform; } diff --git a/src/away3d/materials/DefaultMaterialBase.as b/src/away3d/materials/DefaultMaterialBase.as index d6a289c..4087186 100644 --- a/src/away3d/materials/DefaultMaterialBase.as +++ b/src/away3d/materials/DefaultMaterialBase.as @@ -5,6 +5,7 @@ import away3d.core.managers.BitmapDataTextureCache; import away3d.core.managers.Stage3DProxy; import away3d.core.managers.Texture3DProxy; + import away3d.lights.LightBase; import away3d.materials.methods.BasicAmbientMethod; import away3d.materials.methods.BasicDiffuseMethod; import away3d.materials.methods.BasicNormalMethod; @@ -36,6 +37,13 @@ addPass(_screenPass = new DefaultScreenPass(this)); } + + override public function set lights(value : Array) : void + { + super.lights = value; + _screenPass.lights = value? Vector.(value) : null; + } + /** * The minimum alpha value for which pixels should be drawn. This is used for transparency that is either * invisible or entirely opaque, often used with textures for foliage, etc. diff --git a/src/away3d/materials/methods/EnvMapMethod.as b/src/away3d/materials/methods/EnvMapMethod.as index 20b0a2a..5621d0d 100644 --- a/src/away3d/materials/methods/EnvMapMethod.as +++ b/src/away3d/materials/methods/EnvMapMethod.as @@ -76,11 +76,12 @@ package away3d.materials.methods _cubeMapIndex = cubeMapReg.index; _dataIndex = dataRegister.index; - // r = V - 2(V.N)*N + // r = I - 2(I.N)*N code += "dp3 " + temp + ".w, " + _viewDirFragmentReg + ".xyz, " + _normalFragmentReg + ".xyz \n" + "add " + temp + ".w, " + temp + ".w, " + temp + ".w \n" + "mul " + temp + ".xyz, " + _normalFragmentReg + ".xyz, " + temp + ".w \n" + "sub " + temp + ".xyz, " + _viewDirFragmentReg + ".xyz, " + temp + ".xyz \n" + + // (I = -V, so invert vector) "neg " + temp + ".xyz, " + temp + ".xyz \n" + "tex " + temp + ", " + temp + ", " + cubeMapReg + " \n" + "sub " + temp + ", " + temp + ", " + targetReg + " \n" + diff --git a/src/away3d/materials/methods/FilteredShadowMapMethod.as b/src/away3d/materials/methods/FilteredShadowMapMethod.as index 6762cdf..d26f4df 100644 --- a/src/away3d/materials/methods/FilteredShadowMapMethod.as +++ b/src/away3d/materials/methods/FilteredShadowMapMethod.as @@ -14,19 +14,8 @@ package away3d.materials.methods use namespace arcane; - public class FilteredShadowMapMethod extends ShadingMethodBase + public class FilteredShadowMapMethod extends ShadowMapMethodBase { - private var _castingLight : LightBase; - private var _depthMapIndex : int; - private var _depthMapVar : ShaderRegisterElement; - private var _depthProjIndex : int; - private var _offsetData : Vector. = Vector.([.5, -.5, 1.0, 1.0]); - private var _toTexIndex : int; - private var _data : Vector.; - private var _decIndex : int; - private var _projMatrix : Matrix3D = new Matrix3D(); - private var _stepSize : Number; - /** * Creates a new BasicDiffuseMethod object. * @@ -34,81 +23,10 @@ package away3d.materials.methods */ public function FilteredShadowMapMethod(castingLight : LightBase) { - super(false, true, false); - _stepSize = stepSize; - castingLight.castsShadows = true; - _castingLight = castingLight; - _data = Vector.([1.0, 1/255.0, 1/65025.0, 1/16581375.0, -.003, .5, castingLight.shadowMapper.depthMapSize, 1/castingLight.shadowMapper.depthMapSize]); - } - - - arcane override function reset() : void - { - super.reset(); - _depthProjIndex = -1; - _depthMapIndex = -1; - _toTexIndex = -1; - _decIndex = -1; - } - - arcane override function cleanCompilationData() : void - { - super.cleanCompilationData(); - _depthMapVar = null; - } - - public function get epsilon() : Number - { - return -_data[4]; - } - - public function set epsilon(value : Number) : void - { - _data[4] = -value; - } - - public function get stepSize() : Number - { - return _stepSize; - } - - public function set stepSize(value : Number) : void - { - _stepSize = value; - _data[6] = _stepSize; - } - - /** - * @inheritDoc - */ - override arcane function set numLights(value : int) : void - { - _needsNormals = value > 0; - super.numLights = value; - } - - arcane override function getVertexCode(regCache : ShaderRegisterCache) : String - { - var code : String = ""; - var toTexReg : ShaderRegisterElement = regCache.getFreeVertexConstant(); - var temp : ShaderRegisterElement = regCache.getFreeVertexVectorTemp(); - var depthMapProj : ShaderRegisterElement = regCache.getFreeVertexConstant(); - regCache.getFreeVertexConstant(); - regCache.getFreeVertexConstant(); - regCache.getFreeVertexConstant(); - _depthProjIndex = depthMapProj.index; - _depthMapVar = regCache.getFreeVarying(); - _toTexIndex = toTexReg.index; - - code += "m44 " + temp + ", vt0, " + depthMapProj + " \n" + - "rcp " + temp + ".w, " + temp + ".w \n" + - "mul " + temp + ".xyz, " + temp + ".xyz, " + temp + ".w \n" + - "mul " + temp + ".xy, " + temp + ".xy, " + toTexReg + ".xy \n" + - "add " + temp + ".xy, " + temp + ".xy, " + toTexReg + ".xx \n" + - "mov " + _depthMapVar + ".xyz, " + temp + ".xyz \n" + - "mov " + _depthMapVar + ".w, va0.w \n"; - - return code; + super(castingLight); + _data[5] = .5; + _data[6] = castingLight.shadowMapper.depthMapSize; + _data[7] = 1/castingLight.shadowMapper.depthMapSize; } /** @@ -181,28 +99,5 @@ package away3d.materials.methods return code; } - - arcane override function setRenderState(renderable : IRenderable, stage3DProxy : Stage3DProxy, camera : Camera3D, lights : Vector.) : void - { - _projMatrix.copyFrom(_castingLight.shadowMapper.depthProjection); - _projMatrix.prepend(renderable.sceneTransform); - stage3DProxy._context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, _depthProjIndex, _projMatrix, true); - } - - /** - * @inheritDoc - */ - override arcane function activate(stage3DProxy : Stage3DProxy) : void - { - var context : Context3D = stage3DProxy._context3D; - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, _toTexIndex, _offsetData, 1); - context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, _decIndex, _data, 2); - stage3DProxy.setTextureAt(_depthMapIndex, _castingLight.shadowMapper.getDepthMap(stage3DProxy)); - } - -// arcane override function deactivate(stage3DProxy : Stage3DProxy) : void -// { -// stage3DProxy.setTextureAt(_depthMapIndex, null); -// } } } diff --git a/src/away3d/materials/methods/HardShadowMapMethod.as b/src/away3d/materials/methods/HardShadowMapMethod.as index 96be2a1..d4f3148 100644 --- a/src/away3d/materials/methods/HardShadowMapMethod.as +++ b/src/away3d/materials/methods/HardShadowMapMethod.as @@ -14,86 +14,14 @@ package away3d.materials.methods use namespace arcane; - public class HardShadowMapMethod extends ShadingMethodBase + public class HardShadowMapMethod extends ShadowMapMethodBase { - private var _castingLight : LightBase; - private var _depthMapIndex : int; - private var _depthMapVar : ShaderRegisterElement; - private var _depthProjIndex : int; - private var _offsetData : Vector. = Vector.([.5, -.5, 1.0, 1.0]); - private var _toTexIndex : int; - private var _dec : Vector.; - private var _decIndex : int; - private var _projMatrix : Matrix3D = new Matrix3D(); - /** * Creates a new BasicDiffuseMethod object. */ public function HardShadowMapMethod(castingLight : LightBase) { - super(false, false, false); - castingLight.castsShadows = true; - _castingLight = castingLight; - _dec = Vector.([1.0, 1/255.0, 1/65025.0, 1/16581375.0, -.003, 0.0, 0.0, 1.0]); - } - - - arcane override function reset() : void - { - super.reset(); - _depthMapIndex = -1; - _depthProjIndex = -1; - _toTexIndex = -1; - _decIndex = -1; - } - - arcane override function cleanCompilationData() : void - { - super.cleanCompilationData(); - _depthMapVar = null; - } - - public function get epsilon() : Number - { - return -_dec[4]; - } - - public function set epsilon(value : Number) : void - { - _dec[4] = -value; - } - - /** - * @inheritDoc - */ - override arcane function set numLights(value : int) : void - { - _needsNormals = value > 0; - super.numLights = value; - } - - arcane override function getVertexCode(regCache : ShaderRegisterCache) : String - { - var code : String = ""; - var toTexReg : ShaderRegisterElement = regCache.getFreeVertexConstant(); - var temp : ShaderRegisterElement = regCache.getFreeVertexVectorTemp(); - var depthMapProj : ShaderRegisterElement = regCache.getFreeVertexConstant(); - regCache.getFreeVertexConstant(); - regCache.getFreeVertexConstant(); - regCache.getFreeVertexConstant(); - _depthProjIndex = depthMapProj.index; - _depthMapVar = regCache.getFreeVarying(); - _toTexIndex = toTexReg.index; - - code += "m44 " + temp + ", vt0, " + depthMapProj + "\n" + - "rcp " + temp+".w, " + temp+".w\n" + - "mul " + temp+".xyz, " + temp+".xyz, " + temp+".w\n" + - "mul " + temp+".xy, " + temp+".xy, " + toTexReg+".xy\n" + - "add " + temp+".xy, " + temp+".xy, " + toTexReg+".xx\n" + - "mov " + _depthMapVar+".xyz, " + temp+".xyz\n" + - "mov " + _depthMapVar+".w, va0.w\n"; - - return code; + super(castingLight); } /** @@ -106,41 +34,19 @@ package away3d.materials.methods var epsReg : ShaderRegisterElement = regCache.getFreeFragmentConstant(); var depthCol : ShaderRegisterElement = regCache.getFreeFragmentVectorTemp(); var code : String = ""; - _decIndex = decReg.index; + + _decIndex = decReg.index; code += "tex " + depthCol + ", " + _depthMapVar + ", " + depthMapRegister + " <2d, nearestNoMip, clamp>\n" + "dp4 " + depthCol+".z, " + depthCol + ", " + decReg + "\n" + - "add " + targetReg + ", " + _depthMapVar+".z, " + epsReg+".x\n" + // offset by epsilon + "add " + targetReg + ".w, " + _depthMapVar+".z, " + epsReg+".x\n" + // offset by epsilon - "slt " + targetReg + ", " + targetReg + ", " + depthCol+".z\n"; // 0 if in shadow + "slt " + targetReg + ".w, " + targetReg + ".w, " + depthCol+".z\n"; // 0 if in shadow _depthMapIndex = depthMapRegister.index; return code; } - - arcane override function setRenderState(renderable : IRenderable, stage3DProxy : Stage3DProxy, camera : Camera3D, lights : Vector.) : void - { - _projMatrix.copyFrom(_castingLight.shadowMapper.depthProjection); - _projMatrix.prepend(renderable.sceneTransform); - stage3DProxy._context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, _depthProjIndex, _projMatrix, true); - } - - /** - * @inheritDoc - */ - override arcane function activate(stage3DProxy : Stage3DProxy) : void - { - var context : Context3D = stage3DProxy._context3D; - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, _toTexIndex, _offsetData, 1); - context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, _decIndex, _dec, 2); - stage3DProxy.setTextureAt(_depthMapIndex, _castingLight.shadowMapper.getDepthMap(stage3DProxy)); - } - -// arcane override function deactivate(stage3DProxy : Stage3DProxy) : void -// { -// stage3DProxy.setTextureAt(_depthMapIndex, null); -// } } } diff --git a/src/away3d/materials/methods/ProjectiveTextureMethod.as b/src/away3d/materials/methods/ProjectiveTextureMethod.as index 22a7a49..8dcc9ad 100644 --- a/src/away3d/materials/methods/ProjectiveTextureMethod.as +++ b/src/away3d/materials/methods/ProjectiveTextureMethod.as @@ -79,7 +79,6 @@ package away3d.materials.methods arcane override function getVertexCode(regCache : ShaderRegisterCache) : String { - var code : String = ""; var projReg : ShaderRegisterElement = regCache.getFreeVertexConstant(); regCache.getFreeVertexConstant(); regCache.getFreeVertexConstant(); @@ -88,8 +87,7 @@ package away3d.materials.methods _projectionIndex = projReg.index; _uvVarying = regCache.getFreeVarying(); - code += "m44 " + _uvVarying + ", vt0, " + projReg + "\n"; - return code; + return "m44 " + _uvVarying + ", vt0, " + projReg + "\n"; } /** diff --git a/src/away3d/materials/methods/ShadingMethodBase.as b/src/away3d/materials/methods/ShadingMethodBase.as index d956821..e25be3f 100644 --- a/src/away3d/materials/methods/ShadingMethodBase.as +++ b/src/away3d/materials/methods/ShadingMethodBase.as @@ -21,12 +21,14 @@ package away3d.materials.methods protected var _needsView : Boolean; protected var _needsNormals : Boolean; protected var _needsUV : Boolean; + protected var _needsSecondaryUV : Boolean; protected var _needsGlobalPos : Boolean; protected var _viewDirVaryingReg : ShaderRegisterElement; protected var _viewDirFragmentReg : ShaderRegisterElement; protected var _normalFragmentReg : ShaderRegisterElement; protected var _uvFragmentReg : ShaderRegisterElement; + protected var _secondaryUVFragmentReg : ShaderRegisterElement; protected var _globalPosVertexReg : ShaderRegisterElement; protected var _projectionReg : ShaderRegisterElement; @@ -40,6 +42,7 @@ package away3d.materials.methods protected var _numLights : int; + /** * Create a new ShadingMethodBase object. * @param needsNormals Defines whether or not the method requires normals. @@ -168,6 +171,15 @@ package away3d.materials.methods return _needsUV; } + /** + * Indicates whether the material requires uv coordinates. + * @private + */ + arcane function get needsSecondaryUV() : Boolean + { + return _needsSecondaryUV; + } + /** * Indicates whether the material requires the view direction. * @private @@ -234,6 +246,20 @@ package away3d.materials.methods _uvFragmentReg = value; } + /** + * The fragment register in which the uv coordinates are stored. + * @private + */ + arcane function get secondaryUVFragmentReg() : ShaderRegisterElement + { + return _secondaryUVFragmentReg; + } + + arcane function set secondaryUVFragmentReg(value : ShaderRegisterElement) : void + { + _secondaryUVFragmentReg = value; + } + /** * The fragment register in which the view direction is stored. * @private diff --git a/src/away3d/materials/methods/ShadowMapMethodBase.as b/src/away3d/materials/methods/ShadowMapMethodBase.as new file mode 100644 index 0000000..323db22 --- /dev/null +++ b/src/away3d/materials/methods/ShadowMapMethodBase.as @@ -0,0 +1,116 @@ +package away3d.materials.methods +{ + import away3d.arcane; + import away3d.cameras.Camera3D; + import away3d.core.base.IRenderable; + import away3d.core.managers.Stage3DProxy; + import away3d.lights.LightBase; + import away3d.materials.utils.ShaderRegisterCache; + import away3d.materials.utils.ShaderRegisterElement; + + import flash.display3D.Context3D; + + import flash.display3D.Context3DProgramType; + + import flash.geom.Matrix3D; + + use namespace arcane; + + public class ShadowMapMethodBase extends ShadingMethodBase + { + private var _castingLight : LightBase; + protected var _depthMapIndex : int; + protected var _depthMapVar : ShaderRegisterElement; + private var _depthProjIndex : int; + private var _offsetData : Vector. = Vector.([.5, -.5, 1.0, 1.0]); + private var _toTexIndex : int; + protected var _data : Vector.; + protected var _decIndex : int; + private var _projMatrix : Matrix3D = new Matrix3D(); + + + public function ShadowMapMethodBase(castingLight : LightBase) + { + super(false, true, false); + _castingLight = castingLight; + castingLight.castsShadows = true; + _data = Vector.([1.0, 1/255.0, 1/65025.0, 1/16581375.0, -.003, 0, 0, 1]); + } + + public function get epsilon() : Number + { + return -_data[4]; + } + + public function set epsilon(value : Number) : void + { + _data[4] = -value; + } + + + arcane override function reset() : void + { + super.reset(); + _depthMapIndex = -1; + _depthProjIndex = -1; + _toTexIndex = -1; + _decIndex = -1; + } + + + arcane override function set numLights(value : int) : void + { + super.numLights = value; + _needsNormals = value > 0; + } + + arcane override function cleanCompilationData() : void + { + super.cleanCompilationData(); + + _depthMapVar = null; + } + + arcane override function getVertexCode(regCache : ShaderRegisterCache) : String + { + var code : String = ""; + var toTexReg : ShaderRegisterElement = regCache.getFreeVertexConstant(); + var temp : ShaderRegisterElement = regCache.getFreeVertexVectorTemp(); + var depthMapProj : ShaderRegisterElement = regCache.getFreeVertexConstant(); + regCache.getFreeVertexConstant(); + regCache.getFreeVertexConstant(); + regCache.getFreeVertexConstant(); + _depthProjIndex = depthMapProj.index; + _depthMapVar = regCache.getFreeVarying(); + _toTexIndex = toTexReg.index; + + code += "m44 " + temp + ", vt0, " + depthMapProj + "\n" + + "rcp " + temp+".w, " + temp+".w\n" + + "mul " + temp+".xyz, " + temp+".xyz, " + temp+".w\n" + + "mul " + temp+".xy, " + temp+".xy, " + toTexReg+".xy\n" + + "add " + temp+".xy, " + temp+".xy, " + toTexReg+".xx\n" + + "mov " + _depthMapVar+".xyz, " + temp+".xyz\n" + + "mov " + _depthMapVar+".w, va0.w\n"; + + return code; + } + + arcane override function setRenderState(renderable : IRenderable, stage3DProxy : Stage3DProxy, camera : Camera3D, lights : Vector.) : void + { + _projMatrix.copyFrom(_castingLight.shadowMapper.depthProjection); + _projMatrix.prepend(renderable.sceneTransform); + stage3DProxy._context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, _depthProjIndex, _projMatrix, true); + } + + /** + * @inheritDoc + */ + override arcane function activate(stage3DProxy : Stage3DProxy) : void + { + var context : Context3D = stage3DProxy._context3D; + context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, _toTexIndex, _offsetData, 1); + context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, _decIndex, _data, 2); + stage3DProxy.setTextureAt(_depthMapIndex, _castingLight.shadowMapper.getDepthMap(stage3DProxy)); + } + } +} diff --git a/src/away3d/materials/methods/SlowFilteredShadowMapMethod.as b/src/away3d/materials/methods/SlowFilteredShadowMapMethod.as index 0560a08..e2e4119 100644 --- a/src/away3d/materials/methods/SlowFilteredShadowMapMethod.as +++ b/src/away3d/materials/methods/SlowFilteredShadowMapMethod.as @@ -14,6 +14,7 @@ package away3d.materials.methods use namespace arcane; + // doesn't work anymore public class SlowFilteredShadowMapMethod extends ShadingMethodBase { private var _castingLight : LightBase; diff --git a/src/away3d/materials/methods/SoftShadowMapMethod.as b/src/away3d/materials/methods/SoftShadowMapMethod.as index f682517..fabf0f3 100644 --- a/src/away3d/materials/methods/SoftShadowMapMethod.as +++ b/src/away3d/materials/methods/SoftShadowMapMethod.as @@ -5,6 +5,7 @@ package away3d.materials.methods import away3d.core.base.IRenderable; import away3d.core.managers.Stage3DProxy; import away3d.lights.LightBase; + import away3d.lights.shadowmaps.ShadowMapperBase; import away3d.materials.utils.ShaderRegisterCache; import away3d.materials.utils.ShaderRegisterElement; @@ -14,17 +15,8 @@ package away3d.materials.methods use namespace arcane; - public class SoftShadowMapMethod extends ShadingMethodBase + public class SoftShadowMapMethod extends ShadowMapMethodBase { - private var _castingLight : LightBase; - private var _depthMapIndex : int; - private var _depthMapVar : ShaderRegisterElement; - private var _depthProjIndex : int; - private var _offsetData : Vector. = Vector.([.5, -.5, 1.0, 1.0]); - private var _toTexIndex : int; - private var _data : Vector.; - private var _decIndex : int; - private var _projMatrix : Matrix3D = new Matrix3D(); private var _stepSize : Number; /** @@ -32,38 +24,11 @@ package away3d.materials.methods */ public function SoftShadowMapMethod(castingLight : LightBase, stepSize : Number = .00025) { - super(false, false, false); + super(castingLight); _stepSize = stepSize; - castingLight.castsShadows = true; - _castingLight = castingLight; - _data = Vector.([1.0, 1/255.0, 1/65025.0, 1/16581375.0, -.003, 1/9, stepSize, 0]); - } - - - arcane override function reset() : void - { - super.reset(); - _depthMapIndex = -1; - _depthProjIndex = -1; - _toTexIndex = -1; - _decIndex = -1; - } - - arcane override function cleanCompilationData() : void - { - super.cleanCompilationData(); - - _depthMapVar = null; - } - - public function get epsilon() : Number - { - return -_data[4]; - } - - public function set epsilon(value : Number) : void - { - _data[4] = -value; + _data[5] = 1/9; + _data[6] = stepSize; + _data[7] = 0; } public function get stepSize() : Number @@ -77,39 +42,6 @@ package away3d.materials.methods _data[6] = _stepSize; } - /** - * @inheritDoc - */ - override arcane function set numLights(value : int) : void - { - _needsNormals = value > 0; - super.numLights = value; - } - - arcane override function getVertexCode(regCache : ShaderRegisterCache) : String - { - var code : String = ""; - var toTexReg : ShaderRegisterElement = regCache.getFreeVertexConstant(); - var temp : ShaderRegisterElement = regCache.getFreeVertexVectorTemp(); - var depthMapProj : ShaderRegisterElement = regCache.getFreeVertexConstant(); - regCache.getFreeVertexConstant(); - regCache.getFreeVertexConstant(); - regCache.getFreeVertexConstant(); - _depthProjIndex = depthMapProj.index; - _depthMapVar = regCache.getFreeVarying(); - _toTexIndex = toTexReg.index; - - code += "m44 " + temp + ", vt0, " + depthMapProj + "\n" + - "rcp " + temp+".w, " + temp+".w\n" + - "mul " + temp+".xyz, " + temp+".xyz, " + temp+".w\n" + - "mul " + temp+".xy, " + temp+".xy, " + toTexReg+".xy\n" + - "add " + temp+".xy, " + temp+".xy, " + toTexReg+".xx\n" + - "mov " + _depthMapVar+".xyz, " + temp+".xyz\n" + - "mov " + _depthMapVar+".w, va0.w\n"; - - return code; - } - /** * @inheritDoc */ @@ -190,28 +122,5 @@ package away3d.materials.methods return code; } - - arcane override function setRenderState(renderable : IRenderable, stage3DProxy : Stage3DProxy, camera : Camera3D, lights : Vector.) : void - { - _projMatrix.copyFrom(_castingLight.shadowMapper.depthProjection); - _projMatrix.prepend(renderable.sceneTransform); - stage3DProxy._context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, _depthProjIndex, _projMatrix, true); - } - - /** - * @inheritDoc - */ - override arcane function activate(stage3DProxy : Stage3DProxy) : void - { - var context : Context3D = stage3DProxy._context3D; - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, _toTexIndex, _offsetData, 1); - context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, _decIndex, _data, 2); - stage3DProxy.setTextureAt(_depthMapIndex, _castingLight.shadowMapper.getDepthMap(stage3DProxy)); - } - -// arcane override function deactivate(stage3DProxy : Stage3DProxy) : void -// { -// stage3DProxy.setTextureAt(_depthMapIndex, null); -// } } } diff --git a/src/away3d/materials/methods/TerrainDiffuseMethod.as b/src/away3d/materials/methods/TerrainDiffuseMethod.as index 1a1df1b..0a95a98 100644 --- a/src/away3d/materials/methods/TerrainDiffuseMethod.as +++ b/src/away3d/materials/methods/TerrainDiffuseMethod.as @@ -87,6 +87,8 @@ package away3d.materials.methods // incorporate input from ambient if (_numLights > 0) { + if (_shadowRegister) + code += "mul " + _totalLightColorReg+".xyz, " + _totalLightColorReg+".xyz, " + _shadowRegister+".w\n"; code += "add " + targetReg+".xyz, " + _totalLightColorReg+".xyz, " + targetReg+".xyz\n" + "sat " + targetReg+".xyz, " + targetReg+".xyz\n"; regCache.removeFragmentTempUsage(_totalLightColorReg); diff --git a/src/away3d/materials/methods/WrapDiffuseMethod.as b/src/away3d/materials/methods/WrapDiffuseMethod.as index a3961e8..c10e1f8 100644 --- a/src/away3d/materials/methods/WrapDiffuseMethod.as +++ b/src/away3d/materials/methods/WrapDiffuseMethod.as @@ -279,11 +279,6 @@ package away3d.materials.methods /** * @inheritDoc */ - override arcane function get globalPosVertexReg() : ShaderRegisterElement - { - return _globalPosVertexReg; - } - override arcane function set globalPosVertexReg(value : ShaderRegisterElement) : void { _baseDiffuseMethod.globalPosVertexReg = _globalPosVertexReg = value; @@ -292,14 +287,17 @@ package away3d.materials.methods /** * @inheritDoc */ - override arcane function get UVFragmentReg() : ShaderRegisterElement + override arcane function set UVFragmentReg(value : ShaderRegisterElement) : void { - return _uvFragmentReg; + _baseDiffuseMethod.UVFragmentReg = _uvFragmentReg = value; } - override arcane function set UVFragmentReg(value : ShaderRegisterElement) : void + /** + * @inheritDoc + */ + override arcane function set secondaryUVFragmentReg(value : ShaderRegisterElement) : void { - _baseDiffuseMethod.UVFragmentReg = _uvFragmentReg = value; + _baseDiffuseMethod.secondaryUVFragmentReg = _secondaryUVFragmentReg = value; } /** diff --git a/src/away3d/materials/methods/WrapSpecularMethod.as b/src/away3d/materials/methods/WrapSpecularMethod.as index 135ffd0..9a0b474 100644 --- a/src/away3d/materials/methods/WrapSpecularMethod.as +++ b/src/away3d/materials/methods/WrapSpecularMethod.as @@ -244,6 +244,14 @@ package away3d.materials.methods _baseSpecularMethod.UVFragmentReg = value; } + /** + * @inheritDoc + */ + override arcane function set secondaryUVFragmentReg(value : ShaderRegisterElement) : void + { + _baseSpecularMethod.secondaryUVFragmentReg = _secondaryUVFragmentReg = value; + } + /** * @inheritDoc */ diff --git a/src/away3d/materials/passes/DefaultScreenPass.as b/src/away3d/materials/passes/DefaultScreenPass.as index b44c079..fc31658 100644 --- a/src/away3d/materials/passes/DefaultScreenPass.as +++ b/src/away3d/materials/passes/DefaultScreenPass.as @@ -51,10 +51,12 @@ package away3d.materials.passes private var _normalDependencies : uint; private var _viewDirDependencies : uint; private var _uvDependencies : uint; + private var _secondaryUVDependencies : uint; private var _globalPosDependencies : uint; // registers protected var _uvBufferIndex : int; + protected var _secondaryUVBufferIndex : int; protected var _normalBufferIndex : int; protected var _tangentBufferIndex : int; protected var _sceneMatrixIndex : int; @@ -73,6 +75,7 @@ package away3d.materials.passes private var _tangentVarying : ShaderRegisterElement; private var _bitangentVarying : ShaderRegisterElement; private var _uvVaryingReg : ShaderRegisterElement; + private var _secondaryUVVaryingReg : ShaderRegisterElement; private var _viewDirVaryingReg : ShaderRegisterElement; private var _shadedTargetReg : ShaderRegisterElement; @@ -93,6 +96,7 @@ package away3d.materials.passes private var _animateUVs : Boolean; + /** * Creates a new DefaultScreenPass objects. */ @@ -408,6 +412,7 @@ package away3d.materials.passes { var context : Context3D = stage3DProxy._context3D; if (_uvBufferIndex >= 0) stage3DProxy.setSimpleVertexBuffer(_uvBufferIndex, renderable.getUVBuffer(stage3DProxy), Context3DVertexBufferFormat.FLOAT_2); + if (_secondaryUVBufferIndex >= 0) stage3DProxy.setSimpleVertexBuffer(_secondaryUVBufferIndex, renderable.getSecondaryUVBuffer(stage3DProxy), Context3DVertexBufferFormat.FLOAT_2); if (_normalBufferIndex >= 0) stage3DProxy.setSimpleVertexBuffer(_normalBufferIndex, renderable.getVertexNormalBuffer(stage3DProxy), Context3DVertexBufferFormat.FLOAT_3); if (_tangentBufferIndex >= 0) stage3DProxy.setSimpleVertexBuffer(_tangentBufferIndex, renderable.getVertexTangentBuffer(stage3DProxy), Context3DVertexBufferFormat.FLOAT_3); if (_sceneMatrixIndex >= 0) context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, _sceneMatrixIndex, renderable.sceneTransform, true); @@ -538,6 +543,7 @@ package away3d.materials.passes _tangentVarying = null; _bitangentVarying = null; _uvVaryingReg = null; + _secondaryUVVaryingReg = null; _viewDirVaryingReg = null; _shadedTargetReg = null; @@ -590,6 +596,7 @@ package away3d.materials.passes if (_projectionDependencies > 0) compileProjCode(); if (_uvDependencies > 0) compileUVCode(); + if (_secondaryUVDependencies > 0) compileSecondaryUVCode(); if (_globalPosDependencies > 0) compileGlobalPositionCode(); if (_normalDependencies > 0) { // needs to be created before view @@ -628,7 +635,7 @@ package away3d.materials.passes _projectionFragmentReg = _registerCache.getFreeVarying(); _projectedTargetRegister = _registerCache.getFreeVertexVectorTemp().toString(); - _vertexCode += "mov " + _projectionFragmentReg.toString() +", " + _projectedTargetRegister + "\n"; + _vertexCode += "mov " + _projectionFragmentReg + ", " + _projectedTargetRegister + "\n"; } private function setMethodRegs(method : ShadingMethodBase) : void @@ -637,6 +644,7 @@ package away3d.materials.passes method.normalFragmentReg = _normalFragmentReg; method.projectionReg = _projectionFragmentReg; method.UVFragmentReg = _uvVaryingReg; + method.secondaryUVFragmentReg = _secondaryUVVaryingReg; method.viewDirFragmentReg = _viewDirFragmentReg; method.viewDirVaryingReg = _viewDirVaryingReg; } @@ -666,12 +674,14 @@ package away3d.materials.passes _normalDependencies = 0; _viewDirDependencies = 0; _uvDependencies = 0; + _secondaryUVDependencies = 0; _globalPosDependencies = 0; _uvTransformIndex = -1; _cameraPositionIndex = -1; _commonsRegIndex = -1; _uvBufferIndex = -1; + _secondaryUVBufferIndex = -1; _normalBufferIndex = -1; _tangentBufferIndex = -1; _lightsColorIndex = -1; @@ -707,6 +717,7 @@ package away3d.materials.passes if (method.needsNormals) ++_normalDependencies; if (method.needsView) ++_viewDirDependencies; if (method.needsUV) ++_uvDependencies; + if (method.needsSecondaryUV) ++_secondaryUVDependencies; } private function compileGlobalPositionCode() : void @@ -749,6 +760,16 @@ package away3d.materials.passes } } + private function compileSecondaryUVCode() : void + { + var uvAttributeReg : ShaderRegisterElement = _registerCache.getFreeVertexAttribute(); + + _secondaryUVVaryingReg = _registerCache.getFreeVarying(); + _secondaryUVBufferIndex = uvAttributeReg.index; + + _vertexCode += "mov " + _secondaryUVVaryingReg + ", " + uvAttributeReg + "\n"; + } + private function compileNormalCode() : void { var normalMatrix : Vector. = new Vector.(3, true); @@ -971,8 +992,8 @@ package away3d.materials.passes if (_shadowMethod) { _vertexCode += _shadowMethod.getVertexCode(_registerCache); // shadowReg = _registerCache.getFreeFragmentSingleTemp(); - // risky :s - // todo: improve compilation with lifetime analysis so this isn't necessary + // using normal to contain shadow data if available is perhaps risky :s + // todo: improve compilation with lifetime analysis so this isn't necessary? if (_normalDependencies == 0) { shadowReg = _registerCache.getFreeFragmentVectorTemp(); _registerCache.addFragmentTempUsages(shadowReg, 1);