package alternativa.engine3d.materials {
import alternativa.engine3d.*;
import alternativa.engine3d.display.Skin;
import flash.display.BlendMode;
import flash.geom.ColorTransform;
import alternativa.engine3d.display.DisplayItem;
use namespace alternativa3d;
/**
* Базовый класс для материалов.
*/
public class Material {
/**
* @private
* Видимость
*/
alternativa3d var _visible:Boolean = true;
/**
* @private
* Режим наложения
*/
alternativa3d var _blendMode:String = BlendMode.NORMAL;
/**
* @private
* Трансформация цвета
*/
alternativa3d var _colorTransform:ColorTransform = new ColorTransform();
// Флаг трансформации цвета по умолчанию
private var defaultColorTransform:Boolean = true;
/**
* Видимость.
*/
public function get visible():Boolean {
return _visible;
}
/**
* @private
*/
public function set visible(value:Boolean):void {
if (_visible != value) {
_visible = value;
markToChange();
}
}
/**
* Прозрачность.
*/
public function get alpha():Number {
return _colorTransform.alphaMultiplier;
}
/**
* @private
*/
public function set alpha(value:Number):void {
if (_colorTransform.alphaMultiplier != value) {
_colorTransform.alphaMultiplier = value;
markToChange();
}
}
/**
* Режим наложения.
*/
public function get blendMode():String {
return _blendMode;
}
/**
* @private
*/
public function set blendMode(value:String):void {
if (_blendMode != value) {
_blendMode = value;
markToChange();
}
}
/**
* Трансформация цвета.
*/
public function get colorTransform():ColorTransform {
return new ColorTransform(_colorTransform.redMultiplier, _colorTransform.greenMultiplier, _colorTransform.blueMultiplier, _colorTransform.alphaMultiplier, _colorTransform.redOffset, _colorTransform.greenOffset, _colorTransform.blueOffset, _colorTransform.alphaOffset);
}
/**
* @private
*/
public function set colorTransform(value:ColorTransform):void {
if (value == null) {
throw new TypeError("Parameter colorTransform must be non-null.");
}
if (_colorTransform.redMultiplier != value.redMultiplier || _colorTransform.greenMultiplier != value.greenMultiplier || _colorTransform.blueMultiplier != value.blueMultiplier || _colorTransform.alphaMultiplier != value.alphaMultiplier || _colorTransform.redOffset != value.redOffset || _colorTransform.greenOffset != value.greenOffset || _colorTransform.blueOffset != value.blueOffset || _colorTransform.alphaOffset != value.alphaOffset) {
_colorTransform.redMultiplier = value.redMultiplier;
_colorTransform.greenMultiplier = value.greenMultiplier;
_colorTransform.blueMultiplier = value.blueMultiplier;
_colorTransform.alphaMultiplier = value.alphaMultiplier;
_colorTransform.redOffset = value.redOffset;
_colorTransform.greenOffset = value.greenOffset;
_colorTransform.blueOffset = value.blueOffset;
_colorTransform.alphaOffset = value.alphaOffset;
defaultColorTransform = value.redMultiplier == 1 && value.greenMultiplier == 1 && value.blueMultiplier == 1 && value.redOffset == 0 && value.greenOffset == 0 && value.blueOffset == 0 && value.alphaOffset == 0;
markToChange();
}
}
/**
* Отметить изменение материала.
*/
protected function markToChange():void {}
alternativa3d function draw(item:DisplayItem):void {}
alternativa3d function clear(item:DisplayItem):void {}
/**
* Клонирование объекта. При расширении класса, в наследниках должны быть переопределены вспомогательные
* методы create() и cloneProperties().
* @return клон объекта
* @see #create()
* @see #cloneProperties()
*/
public function clone():Material {
var res:Material = create();
res.cloneProperties(this);
return res;
}
/**
* Вспомогательный для клонирования метод. Создание нового экземпляра, который выступит в качестве клона после копирования в него свойств.
* Вызывается внутри метода clone().
* При переопределении метод должен перекрываться полностью.
* @return новый материал
* @see #clone()
*/
protected function create():Material {
return new Material();
}
/**
* Вспомогательный для клонирования метод. Копирование свойств из другого объекта. Вызывается внутри метода clone()
* объектом, который создан с помощью метода create().
* При переопределении нужно вызывать super.cloneProperties().
* @param source В качестве источника выступает клонируемый объект
* @see #clone()
* @see #create()
*/
protected function cloneProperties(source:Material):void {
_visible = source._visible;
_blendMode = source._blendMode;
_colorTransform.redMultiplier = source._colorTransform.redMultiplier;
_colorTransform.greenMultiplier = source._colorTransform.greenMultiplier;
_colorTransform.blueMultiplier = source._colorTransform.blueMultiplier;
_colorTransform.alphaMultiplier = source._colorTransform.alphaMultiplier;
_colorTransform.redOffset = source._colorTransform.redOffset;
_colorTransform.greenOffset = source._colorTransform.greenOffset;
_colorTransform.blueOffset = source._colorTransform.blueOffset;
_colorTransform.alphaOffset = source._colorTransform.alphaOffset;
}
}
}