OmniShadows tuned and finished

This commit is contained in:
Yaski
2012-05-04 18:45:49 +06:00
parent 23aaee2f75
commit f48bbd16ce

View File

@@ -47,6 +47,7 @@ package alternativa.engine3d.shadows {
*/ */
public var biasMultiplier:Number = 0.99; public var biasMultiplier:Number = 0.99;
private static const DIFFERENCE_MULTIPLIER:Number = 32768; private static const DIFFERENCE_MULTIPLIER:Number = 32768;
private static const DEBUG_TYPE:String = "Sphere"; // Box
private var renderer:Renderer = new Renderer(); private var renderer:Renderer = new Renderer();
@@ -140,8 +141,7 @@ package alternativa.engine3d.shadows {
private function createDebugObject(material:Material, context:Context3D):Mesh{ private function createDebugObject(material:Material, context:Context3D):Mesh{
var geometry:Geometry; var geometry:Geometry;
var mesh:Mesh; var mesh:Mesh;
var isBox:Boolean = false; if (DEBUG_TYPE == "Box") {
if (isBox) {
mesh = new Mesh(); mesh = new Mesh();
geometry = new Geometry(8); geometry = new Geometry(8);
mesh.geometry = geometry; mesh.geometry = geometry;
@@ -245,7 +245,7 @@ package alternativa.engine3d.shadows {
if (caster.boundBox != null) { if (caster.boundBox != null) {
// 1 - calculate planes in object space // 1 - calculate planes in object space
calculatePlanes(_light.lightToObjectTransform); calculatePlanes(caster.localToLightTransform);
// 2 - check object location cameras (sections) // 2 - check object location cameras (sections)
caster.culling |= recognizeObjectCameras(caster.boundBox); caster.culling |= recognizeObjectCameras(caster.boundBox);
} }
@@ -297,10 +297,9 @@ package alternativa.engine3d.shadows {
} }
} }
// TODO: remove debug culling rendering // if (renderer.drawUnits.length == 0) context.clear(0, 0, 0, 0.0);
// if (renderer.drawUnits.length == 0) context.clear(0, 0, 0, 0.0);
// Отрисовка дроуколов // Drawing
renderer.render(context); renderer.render(context);
prevActualCastersMask |= edgeBit; prevActualCastersMask |= edgeBit;
} }
@@ -328,9 +327,7 @@ package alternativa.engine3d.shadows {
// Create debug object if needed // Create debug object if needed
if (debugObject == null) { if (debugObject == null) {
debugObject = createDebugObject(debugMaterial, camera.context3D); debugObject = createDebugObject(debugMaterial, camera.context3D);
// TODO: select right radius
} }
// debugObject.scaleX = debugObject.scaleY = debugObject.scaleZ = radius/12;
debugObject.scaleX = debugObject.scaleY = debugObject.scaleZ = radius; debugObject.scaleX = debugObject.scaleY = debugObject.scaleZ = radius;
debugObject.composeTransforms(); debugObject.composeTransforms();
@@ -355,72 +352,107 @@ package alternativa.engine3d.shadows {
var planeRF:SectionPlane = sections.next.next.next.next; var planeRF:SectionPlane = sections.next.next.next.next;
var planeRB:SectionPlane = sections.next.next.next.next.next; var planeRB:SectionPlane = sections.next.next.next.next.next;
// TODO: reuse points // 1, 0, 1
var ax:Number = transform.c - transform.a + transform.b; // E planeRU.x = transform.a + transform.i;
var ay:Number = transform.g - transform.e + transform.f; planeRU.y = transform.b + transform.j;
var az:Number = transform.k - transform.i + transform.j; planeRU.z = transform.c + transform.k;
var bx:Number = transform.c - transform.a - transform.b; // H planeRU.offset = -(transform.d + transform.l);
var by:Number = transform.g - transform.e - transform.f;
var bz:Number = transform.k - transform.i - transform.j;
planeRU.x = bz * ay - by * az;
planeRU.y = bx * az - bz * ax;
planeRU.z = by * ax - bx * ay;
planeRU.offset = transform.d*planeRU.x + transform.h*planeRU.y + transform.l*planeRU.z;
ax = transform.c + transform.a - transform.b; // D // -1, 0, 1
ay = transform.g + transform.e - transform.f; planeLU.x = transform.i - transform.a;
az = transform.k + transform.i - transform.j; planeLU.y = transform.j - transform.b;
bx = transform.c + transform.a + transform.b; // A planeLU.z = transform.k - transform.c;
by = transform.g + transform.e + transform.f; planeLU.offset = transform.d - transform.l;
bz = transform.k + transform.i + transform.j;
planeLU.x = bz * ay - by * az;
planeLU.y = bx * az - bz * ax;
planeLU.z = by * ax - bx * ay;
planeLU.offset = transform.d*planeLU.x + transform.h*planeLU.y + transform.l*planeLU.z;
ax = transform.c - transform.a - transform.b; // H // 0, 1, 1
ay = transform.g - transform.e - transform.f; planeFU.x = transform.e + transform.i;
az = transform.k - transform.i - transform.j; planeFU.y = transform.f + transform.j;
bx = transform.c + transform.a - transform.b; // D planeFU.z = transform.g + transform.k;
by = transform.g + transform.e - transform.f; planeFU.offset = -(transform.h + transform.l);
bz = transform.k + transform.i - transform.j;
planeFU.x = bz * ay - by * az;
planeFU.y = bx * az - bz * ax;
planeFU.z = by * ax - bx * ay;
planeFU.offset = transform.d*planeFU.x + transform.h*planeFU.y + transform.l*planeFU.z;
ax = transform.c + transform.a + transform.b; // A // 0, -1, 1
ay = transform.g + transform.e + transform.f; planeBU.x = transform.i - transform.e;
az = transform.k + transform.i + transform.j; planeBU.y = transform.j - transform.f;
bx = transform.c - transform.a + transform.b; // E planeBU.z = transform.k - transform.g;
by = transform.g - transform.e + transform.f; planeBU.offset = transform.h - transform.l;
bz = transform.k - transform.i + transform.j;
planeBU.x = bz * ay - by * az;
planeBU.y = bx * az - bz * ax;
planeBU.z = by * ax - bx * ay;
planeBU.offset = transform.d*planeBU.x + transform.h*planeBU.y + transform.l*planeBU.z;
ax = transform.a - transform.b + transform.c; // D // 1, 1, 0
ay = transform.e - transform.f + transform.g; planeRF.x = transform.a + transform.e;
az = transform.i - transform.j + transform.k; planeRF.y = transform.b + transform.f;
bx = transform.a - transform.b - transform.c; // C planeRF.z = transform.c + transform.g;
by = transform.e - transform.f - transform.g; planeRF.offset = -(transform.d + transform.h);
bz = transform.i - transform.j - transform.k;
planeRF.x = bz * ay - by * az;
planeRF.y = bx * az - bz * ax;
planeRF.z = by * ax - bx * ay;
planeRF.offset = transform.d*planeRF.x + transform.h*planeRF.y + transform.l*planeRF.z;
ax = transform.a + transform.b - transform.c; // B // 1, -1, 0
ay = transform.e + transform.f - transform.g; planeRB.x = transform.a - transform.e;
az = transform.i + transform.j - transform.k; planeRB.y = transform.b - transform.f;
bx = transform.a + transform.b + transform.c; // A planeRB.z = transform.c - transform.g;
by = transform.e + transform.f + transform.g; planeRB.offset = transform.h - transform.d;
bz = transform.i + transform.j + transform.k;
planeRB.x = bz * ay - by * az; // var ax:Number = transform.c - transform.a + transform.b; // E
planeRB.y = bx * az - bz * ax; // var ay:Number = transform.g - transform.e + transform.f;
planeRB.z = by * ax - bx * ay; // var az:Number = transform.k - transform.i + transform.j;
planeRB.offset = transform.d*planeRB.x + transform.h*planeRB.y + transform.l*planeRB.z; // var bx:Number = transform.c - transform.a - transform.b; // H
// var by:Number = transform.g - transform.e - transform.f;
// var bz:Number = transform.k - transform.i - transform.j;
// planeRU.x = bz * ay - by * az;
// planeRU.y = bx * az - bz * ax;
// planeRU.z = by * ax - bx * ay;
// planeRU.offset = transform.d*planeRU.x + transform.h*planeRU.y + transform.l*planeRU.z;
//
// ax = transform.c + transform.a - transform.b; // D
// ay = transform.g + transform.e - transform.f;
// az = transform.k + transform.i - transform.j;
// bx = transform.c + transform.a + transform.b; // A
// by = transform.g + transform.e + transform.f;
// bz = transform.k + transform.i + transform.j;
// planeLU.x = bz * ay - by * az;
// planeLU.y = bx * az - bz * ax;
// planeLU.z = by * ax - bx * ay;
// planeLU.offset = transform.d*planeLU.x + transform.h*planeLU.y + transform.l*planeLU.z;
//
// ax = transform.c - transform.a - transform.b; // H
// ay = transform.g - transform.e - transform.f;
// az = transform.k - transform.i - transform.j;
// bx = transform.c + transform.a - transform.b; // D
// by = transform.g + transform.e - transform.f;
// bz = transform.k + transform.i - transform.j;
// planeFU.x = bz * ay - by * az;
// planeFU.y = bx * az - bz * ax;
// planeFU.z = by * ax - bx * ay;
// planeFU.offset = transform.d*planeFU.x + transform.h*planeFU.y + transform.l*planeFU.z;
//
// ax = transform.c + transform.a + transform.b; // A
// ay = transform.g + transform.e + transform.f;
// az = transform.k + transform.i + transform.j;
// bx = transform.c - transform.a + transform.b; // E
// by = transform.g - transform.e + transform.f;
// bz = transform.k - transform.i + transform.j;
// planeBU.x = bz * ay - by * az;
// planeBU.y = bx * az - bz * ax;
// planeBU.z = by * ax - bx * ay;
// planeBU.offset = transform.d*planeBU.x + transform.h*planeBU.y + transform.l*planeBU.z;
//
// ax = transform.a - transform.b + transform.c; // D
// ay = transform.e - transform.f + transform.g;
// az = transform.i - transform.j + transform.k;
// bx = transform.a - transform.b - transform.c; // C
// by = transform.e - transform.f - transform.g;
// bz = transform.i - transform.j - transform.k;
// planeRF.x = bz * ay - by * az;
// planeRF.y = bx * az - bz * ax;
// planeRF.z = by * ax - bx * ay;
// planeRF.offset = transform.d*planeRF.x + transform.h*planeRF.y + transform.l*planeRF.z;
//
// ax = transform.a + transform.b - transform.c; // B
// ay = transform.e + transform.f - transform.g;
// az = transform.i + transform.j - transform.k;
// bx = transform.a + transform.b + transform.c; // A
// by = transform.e + transform.f + transform.g;
// bz = transform.i + transform.j + transform.k;
// planeRB.x = bz * ay - by * az;
// planeRB.y = bx * az - bz * ax;
// planeRB.z = by * ax - bx * ay;
// planeRB.offset = transform.d*planeRB.x + transform.h*planeRB.y + transform.l*planeRB.z;
} }
private function recognizeObjectCameras(bb:BoundBox):int { private function recognizeObjectCameras(bb:BoundBox):int {
@@ -481,7 +513,7 @@ package alternativa.engine3d.shadows {
if (child.boundBox != null) { if (child.boundBox != null) {
// 1 - calculate planes in object space // 1 - calculate planes in object space
calculatePlanes(_light.lightToObjectTransform); calculatePlanes(child.localToLightTransform);
// 2 - check object location cameras (sections) // 2 - check object location cameras (sections)
child.culling |= recognizeObjectCameras(child.boundBox); child.culling |= recognizeObjectCameras(child.boundBox);
} }