Omni cull catch

This commit is contained in:
Yaski
2012-04-27 17:10:10 +06:00
parent 9da1b80004
commit 24dc612ae5

View File

@@ -216,7 +216,7 @@ package alternativa.engine3d.shadows {
var castersCount:int = _casters.length; var castersCount:int = _casters.length;
// calculating some transformation matrices // calculating some transformation matrices
// TODO: not transform invisible objects // TODO: skip invisible objects
for (i = 0; i < castersCount; i++) { for (i = 0; i < castersCount; i++) {
caster = _casters[i]; caster = _casters[i];
@@ -249,6 +249,14 @@ package alternativa.engine3d.shadows {
// проверяем, есть ли видимые кастеры попадающие на грань куба // проверяем, есть ли видимые кастеры попадающие на грань куба
actualCastersCount = 0; actualCastersCount = 0;
numCulled = 0;
var flipX:Boolean = edgeCamera.scaleX < 0;
var flipY:Boolean = edgeCamera.scaleY < 0;
edgeCamera.scaleX = 1;
edgeCamera.scaleY = 1;
edgeCamera.composeTransforms();
for (j = 0; j < castersCount; j++) { for (j = 0; j < castersCount; j++) {
caster = _casters[j]; caster = _casters[j];
@@ -264,6 +272,11 @@ package alternativa.engine3d.shadows {
calculateVisibility(caster, edgeCamera); calculateVisibility(caster, edgeCamera);
} }
} }
// trace("face:" + i + " culled:" + numCulled + " rest:" + actualCastersCount);
if (flipX) edgeCamera.scaleX = -1;
if (flipY) edgeCamera.scaleY = -1;
edgeCamera.composeTransforms();
if (actualCastersCount > 0) { if (actualCastersCount > 0) {
// Настройка параметров рендеринга: // Настройка параметров рендеринга:
@@ -320,9 +333,12 @@ package alternativa.engine3d.shadows {
for (var child:Object3D = root.childrenList; child != null; child = child.next) { for (var child:Object3D = root.childrenList; child != null; child = child.next) {
// расчет матриц трансформаций для объектов // расчет матриц трансформаций для объектов
if (child.transformChanged) child.composeTransforms(); // if (child.transformChanged) child.composeTransforms();
child.localToLightTransform.combine(root.localToLightTransform, child.transform); // child.localToLightTransform.combine(root.localToLightTransform, child.transform);
child.lightToLocalTransform.combine(child.inverseTransform, root.lightToLocalTransform); // child.lightToLocalTransform.combine(child.inverseTransform, root.lightToLocalTransform);
child.lightToLocalTransform.combine(child.cameraToLocalTransform, _light.localToCameraTransform);
child.localToLightTransform.combine(_light.cameraToLocalTransform, child.localToCameraTransform);
var skin:Skin = child as Skin; var skin:Skin = child as Skin;
if (skin != null) { if (skin != null) {
@@ -342,13 +358,13 @@ package alternativa.engine3d.shadows {
} }
} }
private static var numCulled:int;
// собирает список actualCasters для одной из 6-и камер // собирает список actualCasters для одной из 6-и камер
private function calculateVisibility(root:Object3D, camera:Camera3D):void{ private function calculateVisibility(root:Object3D, camera:Camera3D):void{
var casterCulling:int; var casterCulling:int;
if (root.visible) { if (root.visible) {
var skin:Skin = root as Skin;
// Вычисляем результат кулинга для объекта // Вычисляем результат кулинга для объекта
if (root.boundBox != null) { if (root.boundBox != null) {
edgeCameraToCasterTransform.combine(root.lightToLocalTransform, camera.transform); edgeCameraToCasterTransform.combine(root.lightToLocalTransform, camera.transform);
@@ -358,9 +374,13 @@ package alternativa.engine3d.shadows {
casterCulling = 63; casterCulling = 63;
} }
if (casterCulling <= 0) numCulled++;
// добавляем кастер в список актуальных кастеров // добавляем кастер в список актуальных кастеров
if (casterCulling) if (casterCulling >= 0) {
actualCasters[actualCastersCount++] = root; actualCasters[actualCastersCount] = root;
actualCastersCount++
}
// Если есть дочерние объекты, // Если есть дочерние объекты,
// Проверяем их на кулинг // Проверяем их на кулинг
@@ -370,7 +390,6 @@ package alternativa.engine3d.shadows {
} }
} }
private function collectDraws(context:Context3D, caster:Object3D, edgeCamera:Camera3D):void{ private function collectDraws(context:Context3D, caster:Object3D, edgeCamera:Camera3D):void{
// если объект является мешем, собираем для него дроуколы // если объект является мешем, собираем для него дроуколы
var mesh:Mesh = caster as Mesh; var mesh:Mesh = caster as Mesh;