mirror of
https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
synced 2025-10-30 08:55:21 -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 + "]";
|
|
}
|
|
|
|
}
|
|
} |