mirror of
https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
synced 2025-10-26 09:49:07 -07:00
74 lines
2.4 KiB
ActionScript
74 lines
2.4 KiB
ActionScript
package alternativa.engine3d.sorting {
|
||
|
||
import alternativa.engine3d.*;
|
||
import alternativa.types.Set;
|
||
import alternativa.engine3d.core.Space;
|
||
|
||
use namespace alternativa3d;
|
||
|
||
public class DistanceNode extends Node {
|
||
|
||
// Список пространств
|
||
alternativa3d var spaces:Set = new Set();
|
||
// Список спрайтов
|
||
alternativa3d var sprites:Set = new Set();
|
||
// Список граней
|
||
alternativa3d var faces:Set = new Set();
|
||
|
||
// Хранилище неиспользуемых нод
|
||
static private var collector:Array = new Array();
|
||
|
||
static alternativa3d function create():DistanceNode {
|
||
var node:DistanceNode;
|
||
if ((node = collector.pop()) == null) {
|
||
// Если коллектор пуст, создаём новую ноду
|
||
return new DistanceNode();
|
||
}
|
||
return node;
|
||
}
|
||
|
||
static alternativa3d function destroy(node:DistanceNode):void {
|
||
// Удаляем ссылку на уровень
|
||
node.sortingLevel = null;
|
||
// Отправляем ноду в коллектор
|
||
collector.push(node);
|
||
}
|
||
/*
|
||
override alternativa3d function addDistancePrimitive(primitive:DistancePrimitive):void {
|
||
// Пометка в уровне об изменении примитива
|
||
sortingLevel.changedPrimitives[primitive] = true;
|
||
// Устанавливаем связь примитива и ноды
|
||
primitives[primitive] = true;
|
||
primitive.node = this;
|
||
}
|
||
*/
|
||
alternativa3d function removeSpace(space:Space):void {
|
||
trace("removeSpace", sortingLevel, space);
|
||
|
||
// Пометка в уровне об изменении примитива
|
||
sortingLevel.changed[space] = true;
|
||
// Удаляем связь пространства и ноды
|
||
space.node = null;
|
||
delete spaces[space];
|
||
// Если в ноде примитивов больше нет
|
||
if (spaces.isEmpty() && sprites.isEmpty() && faces.isEmpty()) {
|
||
// Если есть родительская нода
|
||
if (parent != null) {
|
||
// Удаляем связь ноды с родительской нодой
|
||
if (parent.backDistance == this) {
|
||
parent.backDistance = null;
|
||
} else {
|
||
parent.frontDistance = null;
|
||
}
|
||
parent = null;
|
||
} else {
|
||
// Удаляем корневую ноду из уровня
|
||
sortingLevel.distanceNode = null;
|
||
}
|
||
// Отправляем ноду в коллектор
|
||
destroy(this);
|
||
}
|
||
}
|
||
|
||
}
|
||
} |