mirror of
				https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
				synced 2025-10-30 17:05:17 -07:00 
			
		
		
		
	more versions added
This commit is contained in:
		
							
								
								
									
										130
									
								
								Alternativa3D5/5.4.1/alternativa/engine3d/core/PolyPrimitive.as
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								Alternativa3D5/5.4.1/alternativa/engine3d/core/PolyPrimitive.as
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | ||||
| 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 + "]"; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Tubix
					Tubix