mirror of
https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
synced 2025-10-26 09:49:07 -07:00
149 lines
4.0 KiB
Plaintext
149 lines
4.0 KiB
Plaintext
package alternativa.engine3d.display {
|
||
import alternativa.engine3d.*;
|
||
|
||
import flash.display.Sprite;
|
||
import flash.geom.Rectangle;
|
||
import alternativa.engine3d.core.Camera3D;
|
||
|
||
use namespace alternativa3d;
|
||
|
||
/**
|
||
* Область для вывода изображения с камеры. Для отображения сцены через камеру, необходимо назначить камере область вывода.
|
||
*/
|
||
public class View extends Sprite {
|
||
|
||
/**
|
||
* @private
|
||
* Область отрисовки спрайтов
|
||
*/
|
||
alternativa3d var canvas:Sprite;
|
||
|
||
private var _camera:Camera3D;
|
||
|
||
/**
|
||
* @private
|
||
* Ширина области вывода
|
||
*/
|
||
alternativa3d var _width:Number;
|
||
/**
|
||
* @private
|
||
* Высота области вывода
|
||
*/
|
||
alternativa3d var _height:Number;
|
||
|
||
/**
|
||
* Создание экземпляра области вывода изображения камеры.
|
||
*
|
||
* @param camera камера, изображение с которой должно выводиться
|
||
* @param width ширина области вывода
|
||
* @param height высота области вывода
|
||
*/
|
||
public function View(camera:Camera3D = null, width:Number = 0, height:Number = 0) {
|
||
canvas = new Sprite();
|
||
canvas.mouseEnabled = false;
|
||
canvas.mouseChildren = false;
|
||
canvas.tabEnabled = false;
|
||
canvas.tabChildren = false;
|
||
addChild(canvas);
|
||
|
||
this.camera = camera;
|
||
this.width = width;
|
||
this.height = height;
|
||
}
|
||
|
||
/**
|
||
* Камера с которой ведется отображение.
|
||
*/
|
||
public function get camera():Camera3D {
|
||
return _camera;
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
*/
|
||
public function set camera(value:Camera3D):void {
|
||
if (_camera != value) {
|
||
// Если была камера
|
||
if (_camera != null) {
|
||
// Удалить камеру
|
||
_camera.removeFromView(this);
|
||
}
|
||
// Если новая камера
|
||
if (value != null) {
|
||
// Если камера была в другом вьюпорте
|
||
if (value._view != null) {
|
||
// Удалить её оттуда
|
||
value._view.camera = null;
|
||
}
|
||
// Добавить камеру
|
||
value.addToView(this);
|
||
} else {
|
||
// Зачистка скинов
|
||
if (canvas.numChildren > 0) {
|
||
var skin:Skin = Skin(canvas.getChildAt(0));
|
||
while (skin != null) {
|
||
// Сохраняем следующий
|
||
var next:Skin = skin.nextSkin;
|
||
// Удаляем из канваса
|
||
canvas.removeChild(skin);
|
||
// Очистка скина
|
||
if (skin.material != null) {
|
||
skin.material.clear(skin);
|
||
}
|
||
// Зачищаем ссылки
|
||
skin.nextSkin = null;
|
||
skin.primitive = null;
|
||
skin.material = null;
|
||
// Удаляем
|
||
Skin.destroySkin(skin);
|
||
// Следующий устанавливаем текущим
|
||
skin = next;
|
||
}
|
||
}
|
||
}
|
||
// Сохраняем камеру
|
||
_camera = value;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Ширина области вывода в пикселях.
|
||
*/
|
||
override public function get width():Number {
|
||
return _width;
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
*/
|
||
override public function set width(value:Number):void {
|
||
if (_width != value) {
|
||
_width = value;
|
||
canvas.x = _width*0.5;
|
||
if (_camera != null) {
|
||
camera.addOperationToScene(camera.calculatePlanesOperation);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Высота области вывода в пикселях.
|
||
*/
|
||
override public function get height():Number {
|
||
return _height;
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
*/
|
||
override public function set height(value:Number):void {
|
||
if (_height != value) {
|
||
_height = value;
|
||
canvas.y = _height*0.5;
|
||
if (_camera != null) {
|
||
camera.addOperationToScene(camera.calculatePlanesOperation);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |