mirror of
				https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
				synced 2025-10-31 01:06:16 -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 + "]";
 | |
| 		}
 | |
| 	}
 | |
| } | 
