| 1 |
package org.papervision3d.materials.utils |
|---|
| 2 |
{ |
|---|
| 3 |
import org.papervision3d.Papervision3D; |
|---|
| 4 |
import org.papervision3d.core.math.Matrix3D; |
|---|
| 5 |
import org.papervision3d.core.math.Number3D; |
|---|
| 6 |
import org.papervision3d.core.proto.LightObject3D; |
|---|
| 7 |
import org.papervision3d.core.render.data.RenderSessionData; |
|---|
| 8 |
import org.papervision3d.lights.PointLight3D; |
|---|
| 9 |
import org.papervision3d.objects.DisplayObject3D; |
|---|
| 10 |
|
|---|
| 11 |
/** |
|---|
| 12 |
* @Author Tim Knip / Ralph Hauwert |
|---|
| 13 |
*/ |
|---|
| 14 |
public class LightMatrix |
|---|
| 15 |
{ |
|---|
| 16 |
|
|---|
| 17 |
private static var lightMatrix:Matrix3D = Matrix3D.IDENTITY; |
|---|
| 18 |
private static var invMatrix:Matrix3D = Matrix3D.IDENTITY; |
|---|
| 19 |
|
|---|
| 20 |
private static var _targetPos:Number3D = new Number3D(); |
|---|
| 21 |
private static var _lightPos:Number3D = new Number3D(); |
|---|
| 22 |
private static var _lightDir:Number3D = new Number3D(); |
|---|
| 23 |
private static var _lightUp:Number3D = new Number3D(); |
|---|
| 24 |
private static var _lightSide:Number3D = new Number3D(); |
|---|
| 25 |
|
|---|
| 26 |
protected static var UP:Number3D = new Number3D(0, 1, 0); |
|---|
| 27 |
|
|---|
| 28 |
/** |
|---|
| 29 |
* Gets the 'lightmatrix' for a light and object. |
|---|
| 30 |
* |
|---|
| 31 |
* @param light |
|---|
| 32 |
* @param object |
|---|
| 33 |
* @return |
|---|
| 34 |
*/ |
|---|
| 35 |
public static function getLightMatrix(light:LightObject3D, object:DisplayObject3D, renderSessionData:RenderSessionData, objectLightMatrix:Matrix3D):Matrix3D |
|---|
| 36 |
{ |
|---|
| 37 |
var lightMatrix:Matrix3D = objectLightMatrix ? objectLightMatrix : Matrix3D.IDENTITY; |
|---|
| 38 |
if(light == null){ |
|---|
| 39 |
light = new PointLight3D(); |
|---|
| 40 |
light.copyPosition(renderSessionData.camera); |
|---|
| 41 |
} |
|---|
| 42 |
_targetPos.reset(); |
|---|
| 43 |
_lightPos.reset(); |
|---|
| 44 |
_lightDir.reset(); |
|---|
| 45 |
_lightUp.reset(); |
|---|
| 46 |
_lightSide.reset(); |
|---|
| 47 |
|
|---|
| 48 |
if(!object) |
|---|
| 49 |
{ |
|---|
| 50 |
return lightMatrix; |
|---|
| 51 |
} |
|---|
| 52 |
// NOTE: we basically perform a lookAt. |
|---|
| 53 |
var ml:Matrix3D = light.transform; |
|---|
| 54 |
var mo:Matrix3D = object.world; |
|---|
| 55 |
|
|---|
| 56 |
// invert light position! |
|---|
| 57 |
_lightPos.x = -ml.n14; |
|---|
| 58 |
_lightPos.y = -ml.n24; |
|---|
| 59 |
_lightPos.z = -ml.n34; |
|---|
| 60 |
|
|---|
| 61 |
// object position |
|---|
| 62 |
_targetPos.x = -mo.n14; |
|---|
| 63 |
_targetPos.y = -mo.n24; |
|---|
| 64 |
_targetPos.z = -mo.n34; |
|---|
| 65 |
|
|---|
| 66 |
// direction vector from light to object |
|---|
| 67 |
_lightDir.x = _targetPos.x - _lightPos.x; |
|---|
| 68 |
_lightDir.y = _targetPos.y - _lightPos.y; |
|---|
| 69 |
_lightDir.z = _targetPos.z - _lightPos.z; |
|---|
| 70 |
|
|---|
| 71 |
// account for object's transformation |
|---|
| 72 |
invMatrix.calculateInverse(object.world); |
|---|
| 73 |
Matrix3D.multiplyVector3x3(invMatrix, _lightDir); |
|---|
| 74 |
|
|---|
| 75 |
// normalize! |
|---|
| 76 |
_lightDir.normalize(); |
|---|
| 77 |
|
|---|
| 78 |
// inlined: Number3D.cross(UP, _lightDir); |
|---|
| 79 |
_lightSide.x = (_lightDir.y * UP.z) - (_lightDir.z * UP.y); |
|---|
| 80 |
_lightSide.y = (_lightDir.z * UP.x) - (_lightDir.x * UP.z); |
|---|
| 81 |
_lightSide.z = (_lightDir.x * UP.y) - (_lightDir.y * UP.x); |
|---|
| 82 |
_lightSide.normalize(); // needed? |
|---|
| 83 |
|
|---|
| 84 |
// inlined: Number3D.cross(_lightDir, dir_x); |
|---|
| 85 |
_lightUp.x = (_lightSide.y * _lightDir.z) - (_lightSide.z * _lightDir.y); |
|---|
| 86 |
_lightUp.y = (_lightSide.z * _lightDir.x) - (_lightSide.x * _lightDir.z); |
|---|
| 87 |
_lightUp.z = (_lightSide.x * _lightDir.y) - (_lightSide.y * _lightDir.x); |
|---|
| 88 |
_lightUp.normalize(); // needed? |
|---|
| 89 |
|
|---|
| 90 |
if(Papervision3D.useRIGHTHANDED || object.flipLightDirection) |
|---|
| 91 |
{ |
|---|
| 92 |
_lightDir.x = -_lightDir.x; |
|---|
| 93 |
_lightDir.y = -_lightDir.y; |
|---|
| 94 |
_lightDir.z = -_lightDir.z; |
|---|
| 95 |
} |
|---|
| 96 |
|
|---|
| 97 |
// copy values |
|---|
| 98 |
lightMatrix.n11 = _lightSide.x; |
|---|
| 99 |
lightMatrix.n12 = _lightSide.y; |
|---|
| 100 |
lightMatrix.n13 = _lightSide.z; |
|---|
| 101 |
lightMatrix.n21 = _lightUp.x; |
|---|
| 102 |
lightMatrix.n22 = _lightUp.y; |
|---|
| 103 |
lightMatrix.n23 = _lightUp.z; |
|---|
| 104 |
lightMatrix.n31 = _lightDir.x; |
|---|
| 105 |
lightMatrix.n32 = _lightDir.y; |
|---|
| 106 |
lightMatrix.n33 = _lightDir.z; |
|---|
| 107 |
|
|---|
| 108 |
|
|---|
| 109 |
return lightMatrix; |
|---|
| 110 |
} |
|---|
| 111 |
} |
|---|
| 112 |
} |
|---|