mirror of
https://github.com/MapMakersAndProgrammers/Alternativa3D.git
synced 2025-10-26 18:09:14 -07:00
Omni cull catch
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user