mirror of
				https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
				synced 2025-10-31 01:06:16 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			ActionScript
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			ActionScript
		
	
	
	
	
	
| package alternativa.engine3d.core {
 | |
| 	import alternativa.engine3d.*;
 | |
| 	import alternativa.types.Set;
 | |
| 	
 | |
| 	use namespace alternativa3d;
 | |
| 	
 | |
| 	/**
 | |
| 	 * @private
 | |
| 	 */
 | |
| 	public class Operation {
 | |
| 		
 | |
| 		alternativa3d static const OBJECT_CALCULATE_TRANSFORMATION:uint = 0x01000000;
 | |
| 		alternativa3d static const OBJECT_CALCULATE_MOBILITY:uint = 0x02000000;
 | |
| 		alternativa3d static const VERTEX_CALCULATE_COORDS:uint = 0x03000000;
 | |
| 		alternativa3d static const FACE_CALCULATE_NORMAL:uint = 0x04000000;
 | |
| 		alternativa3d static const FACE_CALCULATE_UV:uint = 0x05000000;
 | |
| 		alternativa3d static const FACE_UPDATE_PRIMITIVE:uint = 0x06000000;
 | |
| 		alternativa3d static const SCENE_CALCULATE_BSP:uint = 0x07000000;
 | |
| 		alternativa3d static const FACE_UPDATE_MATERIAL:uint = 0x08000000;
 | |
| 		alternativa3d static const FACE_CALCULATE_FRAGMENTS_UV:uint = 0x09000000;
 | |
| 		alternativa3d static const CAMERA_CALCULATE_MATRIX:uint = 0x0A000000;
 | |
| 		alternativa3d static const CAMERA_CALCULATE_PLANES:uint = 0x0B000000;
 | |
| 		alternativa3d static const CAMERA_RENDER:uint = 0x0C000000;
 | |
| 		alternativa3d static const SCENE_CLEAR_PRIMITIVES:uint = 0x0D000000;
 | |
| 		
 | |
| 		// Объект
 | |
| 		alternativa3d var object:Object;
 | |
| 		
 | |
| 		// Метод
 | |
| 		alternativa3d var method:Function;
 | |
| 		
 | |
| 		// Название метода
 | |
| 		alternativa3d var name:String;
 | |
| 		
 | |
| 		// Последствия
 | |
| 		private var sequel:Operation; 
 | |
| 		private var sequels:Set;
 | |
| 		
 | |
|   		// Приоритет операции
 | |
| 		alternativa3d var priority:uint;
 | |
| 
 | |
| 		// Находится ли операция в очереди
 | |
| 		alternativa3d var queued:Boolean = false;
 | |
| 		
 | |
| 		public function Operation(name:String, object:Object = null, method:Function = null, priority:uint = 0) {
 | |
| 			this.object = object;
 | |
| 			this.method = method;
 | |
| 			this.name = name;
 | |
| 			this.priority = priority;
 | |
| 		}
 | |
| 		
 | |
| 		// Добавить последствие
 | |
| 		alternativa3d function addSequel(operation:Operation):void {
 | |
| 			if (sequel == null) {
 | |
| 				if (sequels == null) {
 | |
| 					sequel = operation;
 | |
| 				} else {
 | |
| 					sequels[operation] = true;
 | |
| 				}
 | |
| 			} else {
 | |
| 				if (sequel != operation) {
 | |
| 					sequels = new Set(true);
 | |
| 					sequels[sequel] = true;
 | |
| 					sequels[operation] = true;
 | |
| 					sequel = null;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Удалить последствие
 | |
| 		alternativa3d function removeSequel(operation:Operation):void {
 | |
| 			if (sequel == null) {
 | |
| 				if (sequels != null) {
 | |
| 					delete sequels[operation];
 | |
| 					var key:*;
 | |
| 					var single:Boolean = false;
 | |
| 					for (key in sequels) {
 | |
| 						if (single) {
 | |
| 							single = false;
 | |
| 							break;
 | |
| 						}
 | |
| 						single = true;
 | |
| 					}
 | |
| 					if (single) {
 | |
| 						sequel = key;
 | |
| 						sequels = null;
 | |
| 					}
 | |
| 				}
 | |
| 			} else {
 | |
| 				if (sequel == operation) {
 | |
| 					sequel = null;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		alternativa3d function collectSequels(collector:Array):void {
 | |
| 			if (sequel == null) {
 | |
| 				// Проверяем последствия
 | |
| 				for (var key:* in sequels) {
 | |
| 					var operation:Operation = key;
 | |
| 					// Если операция ещё не в очереди
 | |
| 					if (!operation.queued) {
 | |
| 						// Добавляем её в очередь
 | |
| 						collector.push(operation);
 | |
| 						// Устанавливаем флаг очереди
 | |
| 						operation.queued = true;
 | |
| 						// Вызываем добавление в очередь её последствий
 | |
| 						operation.collectSequels(collector);
 | |
| 					}
 | |
| 				}
 | |
| 			} else {
 | |
| 				if (!sequel.queued) {
 | |
| 					collector.push(sequel);
 | |
| 					sequel.queued = true;
 | |
| 					sequel.collectSequels(collector);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public function toString():String {
 | |
| 			return "[Operation " + (priority >>> 24) + "/" + (priority & 0xFFFFFF) + " " + object + "." + name + "]";
 | |
| 		}
 | |
| 		
 | |
| 	}
 | |
| } | 
