Skip to content

Commit

Permalink
Abstracted parts of shadow mapping methods, fixed directional shadow …
Browse files Browse the repository at this point in the history
…mapping near plane, fixed unwanted triggers of mouseOut and mouseOver events. Closes away3d#63
  • Loading branch information
DerSchmale committed Sep 2, 2011
1 parent 5a7a5bc commit 33ca597
Show file tree
Hide file tree
Showing 23 changed files with 241 additions and 349 deletions.
8 changes: 4 additions & 4 deletions src/away3d/cameras/lenses/LensBase.as
Original file line number Diff line number Diff line change
Expand Up @@ -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.<Number>) : void
{
throw new AbstractMethodError();
}
// public function getSubFrustumMatrix(ratioLeft : Number, ratioRight : Number, ratioTop : Number, ratioBottom : Number, matrix : Matrix3D, corners : Vector.<Number>) : void
// {
// throw new AbstractMethodError();
// }
}
}
5 changes: 2 additions & 3 deletions src/away3d/cameras/lenses/OrthographicLens.as
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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.<Number>) : void
/*override public function getSubFrustumMatrix(ratioLeft : Number, ratioRight : Number, ratioTop : Number, ratioBottom : Number, matrix : Matrix3D, corners : Vector.<Number>) : void
{
var source : Matrix3D = this.matrix;
var raw : Vector.<Number> = Matrix3DUtils.RAW_DATA_CONTAINER;
Expand Down Expand Up @@ -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;
}
} */
}
}
12 changes: 6 additions & 6 deletions src/away3d/cameras/lenses/OrthographicOffCenterLens.as
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,12 @@ package away3d.cameras.lenses
{
var raw : Vector.<Number> = 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;
Expand Down
4 changes: 2 additions & 2 deletions src/away3d/cameras/lenses/PerspectiveLens.as
Original file line number Diff line number Diff line change
Expand Up @@ -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.<Number>) : void
/*override public function getSubFrustumMatrix(ratioLeft : Number, ratioRight : Number, ratioTop : Number, ratioBottom : Number, matrix : Matrix3D, corners : Vector.<Number>) : void
{
// trigger rebuild
var source : Matrix3D = this.matrix;
Expand Down Expand Up @@ -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;
}
} */
}
}
2 changes: 2 additions & 0 deletions src/away3d/containers/View3D.as
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion src/away3d/core/base/Geometry.as
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
10 changes: 5 additions & 5 deletions src/away3d/core/managers/Mouse3DManager.as
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -195,6 +194,7 @@ package away3d.core.managers
}
else {
_activeObject = null;
_activeRenderable = null;
}
}

Expand Down
2 changes: 0 additions & 2 deletions src/away3d/entities/Mesh.as
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,6 @@
if (geometry) initGeometry();
}



public override function get assetType() : String
{
return AssetType.MESH;
Expand Down
5 changes: 5 additions & 0 deletions src/away3d/lights/LightBase.as
Original file line number Diff line number Diff line change
Expand Up @@ -209,5 +209,10 @@ package away3d.lights
{
return _shadowMapper;
}

public function set shadowMapper(value : ShadowMapperBase) : void
{
_shadowMapper = value;
}
}
}
4 changes: 1 addition & 3 deletions src/away3d/lights/shadowmaps/DirectionalShadowMapper.as
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ package away3d.lights.shadowmaps

public class DirectionalShadowMapper extends PlanarShadowMapper
{
private var _frustumSegment : Vector.<Number>;
private var _depthLens : OrthographicOffCenterLens;
private var _mtx : Matrix3D = new Matrix3D();
private var _localFrustum : Vector.<Number>;
Expand All @@ -27,7 +26,6 @@ package away3d.lights.shadowmaps
super(light);
_depthCamera.lens = _depthLens = new OrthographicOffCenterLens(-10, -10, 10, 10);
_localFrustum = new Vector.<Number>(8*3);
_frustumSegment = new Vector.<Number>(8*3);
}

/**
Expand Down Expand Up @@ -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;
}
Expand Down
8 changes: 8 additions & 0 deletions src/away3d/materials/DefaultMaterialBase.as
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -36,6 +37,13 @@
addPass(_screenPass = new DefaultScreenPass(this));
}


override public function set lights(value : Array) : void
{
super.lights = value;
_screenPass.lights = value? Vector.<LightBase>(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.
Expand Down
3 changes: 2 additions & 1 deletion src/away3d/materials/methods/EnvMapMethod.as
Original file line number Diff line number Diff line change
Expand Up @@ -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 + " <cube, " + (_smooth? "linear" : "nearest") + ",miplinear,clamp>\n" +
"sub " + temp + ", " + temp + ", " + targetReg + " \n" +
Expand Down
115 changes: 5 additions & 110 deletions src/away3d/materials/methods/FilteredShadowMapMethod.as
Original file line number Diff line number Diff line change
Expand Up @@ -14,101 +14,19 @@ 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.<Number> = Vector.<Number>([.5, -.5, 1.0, 1.0]);
private var _toTexIndex : int;
private var _data : Vector.<Number>;
private var _decIndex : int;
private var _projMatrix : Matrix3D = new Matrix3D();
private var _stepSize : Number;

/**
* Creates a new BasicDiffuseMethod object.
*
* @param castingLight The light casting the shadow
*/
public function FilteredShadowMapMethod(castingLight : LightBase)
{
super(false, true, false);
_stepSize = stepSize;
castingLight.castsShadows = true;
_castingLight = castingLight;
_data = Vector.<Number>([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;
}

/**
Expand Down Expand Up @@ -181,28 +99,5 @@ package away3d.materials.methods

return code;
}

arcane override function setRenderState(renderable : IRenderable, stage3DProxy : Stage3DProxy, camera : Camera3D, lights : Vector.<LightBase>) : 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);
// }
}
}
Loading

0 comments on commit 33ca597

Please sign in to comment.