mirror of
https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
synced 2025-10-30 08:55:21 -07:00
130 lines
3.8 KiB
ActionScript
130 lines
3.8 KiB
ActionScript
package alternativa.engine3d.core {
|
|
import alternativa.engine3d.*;
|
|
|
|
use namespace alternativa3d;
|
|
|
|
/**
|
|
* @private
|
|
* Примитивный полигон (примитив), хранящийся в узле BSP-дерева.
|
|
*/
|
|
public class PolyPrimitive {
|
|
|
|
/**
|
|
* @private
|
|
* Количество точек
|
|
*/
|
|
alternativa3d var num:uint;
|
|
/**
|
|
* @private
|
|
* Точки
|
|
*/
|
|
alternativa3d var points:Array = new Array();
|
|
/**
|
|
* @private
|
|
* UV-координаты
|
|
*/
|
|
alternativa3d var uvs:Array = new Array();
|
|
/**
|
|
* @private
|
|
* Грань
|
|
*/
|
|
alternativa3d var face:Face;
|
|
/**
|
|
* @private
|
|
* Родительский примитив
|
|
*/
|
|
alternativa3d var parent:PolyPrimitive;
|
|
/**
|
|
* @private
|
|
* Соседний примитив (при наличии родительского)
|
|
*/
|
|
alternativa3d var sibling:PolyPrimitive;
|
|
/**
|
|
* @private
|
|
* Фрагменты
|
|
*/
|
|
alternativa3d var backFragment:PolyPrimitive;
|
|
/**
|
|
* @private
|
|
*/
|
|
alternativa3d var frontFragment:PolyPrimitive;
|
|
/**
|
|
* @private
|
|
* Рассечения
|
|
*/
|
|
alternativa3d var splitTime1:Number;
|
|
/**
|
|
* @private
|
|
*/
|
|
alternativa3d var splitTime2:Number;
|
|
/**
|
|
* @private
|
|
* BSP-нода, в которой находится примитив
|
|
*/
|
|
alternativa3d var node:BSPNode;
|
|
/**
|
|
* @private
|
|
* Значения для расчёта качества сплиттера
|
|
*/
|
|
alternativa3d var splits:uint;
|
|
/**
|
|
* @private
|
|
*/
|
|
alternativa3d var disbalance:int;
|
|
/**
|
|
* @private
|
|
* Качество примитива как сплиттера (меньше - лучше)
|
|
*/
|
|
public var splitQuality:Number;
|
|
/**
|
|
* @private
|
|
* Приоритет в BSP-дереве. Чем ниже мобильность, тем примитив выше в дереве.
|
|
*/
|
|
public var mobility:int;
|
|
|
|
// Хранилище неиспользуемых примитивов
|
|
static private var collector:Array = new Array();
|
|
|
|
/**
|
|
* @private
|
|
* Создать примитив
|
|
*/
|
|
static alternativa3d function createPolyPrimitive():PolyPrimitive {
|
|
// Достаём примитив из коллектора
|
|
var primitive:PolyPrimitive = collector.pop();
|
|
// Если коллектор пуст, создаём новый примитив
|
|
if (primitive == null) {
|
|
primitive = new PolyPrimitive();
|
|
}
|
|
//trace(primitive.num, primitive.points.length, primitive.face, primitive.parent, primitive.sibling, primitive.fragment1, primitive.fragment2, primitive.node);
|
|
return primitive;
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
* Кладёт примитив в коллектор для последующего реиспользования.
|
|
* Ссылка на грань и массивы точек зачищаются в этом методе.
|
|
* Ссылки на фрагменты (parent, sibling, back, front) должны быть зачищены перед запуском метода.
|
|
*
|
|
* Исключение:
|
|
* при сборке примитивов в сцене ссылки на back и front зачищаются после запуска метода.
|
|
*
|
|
* @param primitive примитив на реиспользование
|
|
*/
|
|
static alternativa3d function destroyPolyPrimitive(primitive:PolyPrimitive):void {
|
|
primitive.face = null;
|
|
for (var i:uint = 0; i < primitive.num; i++) {
|
|
primitive.points.pop();
|
|
primitive.uvs.pop();
|
|
}
|
|
collector.push(primitive);
|
|
}
|
|
|
|
/**
|
|
* Строковое представление объекта.
|
|
*/
|
|
public function toString():String {
|
|
return "[Primitive " + face._mesh._name + "]";
|
|
}
|
|
}
|
|
} |