package alternativa.engine3d.materials {
import alternativa.engine3d.*;
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.Mesh;
import alternativa.engine3d.core.PolyPrimitive;
import alternativa.engine3d.core.Scene3D;
import alternativa.engine3d.core.Surface;
import alternativa.engine3d.display.Skin;
import flash.display.BlendMode;
use namespace alternativa3d;
/**
* Базовый класс для материалов полигональных поверхностей.
*/
public class SurfaceMaterial extends Material {
/**
* @private
* Поверхность
*/
alternativa3d var _surface:Surface;
/**
* @private
* Альфа
*/
alternativa3d var _alpha:Number;
/**
* @private
* Режим наложения цвета
*/
alternativa3d var _blendMode:String = BlendMode.NORMAL;
/**
* @private
* Материал использует информация об UV-координатах
*/
alternativa3d var useUV:Boolean = false;
/**
* Создание экземпляра класса.
*
* @param alpha коэффициент непрозрачности материала. Значение 1 соответствует полной непрозрачности, значение 0 соответствует полной прозрачности.
* @param blendMode режим наложения цвета
*/
public function SurfaceMaterial(alpha:Number = 1, blendMode:String = BlendMode.NORMAL) {
_alpha = alpha;
_blendMode = blendMode;
}
/**
* Поверхность, которой назначен материал.
*/
public function get surface():Surface {
return _surface;
}
/**
* @private
* Добавление на сцену
*
* @param scene
*/
alternativa3d function addToScene(scene:Scene3D):void {}
/**
* @private
* Удаление из сцены
*
* @param scene
*/
alternativa3d function removeFromScene(scene:Scene3D):void {}
/**
* @private
* Добавление к мешу
*
* @param mesh
*/
alternativa3d function addToMesh(mesh:Mesh):void {}
/**
* @private
* Удаление из меша
*
* @param mesh
*/
alternativa3d function removeFromMesh(mesh:Mesh):void {}
/**
* @private
* Добавление на поверхность
*
* @param surface
*/
alternativa3d function addToSurface(surface:Surface):void {
// Сохраняем поверхность
_surface = surface;
}
/**
* @private
* Удаление с поверхности
*
* @param surface
*/
alternativa3d function removeFromSurface(surface:Surface):void {
// Удаляем ссылку на поверхность
_surface = null;
}
/**
* Коэффициент непрозрачности материала. Значение 1 соответствует полной непрозрачности, значение 0 соответствует полной прозрачности.
*/
public function get alpha():Number {
return _alpha;
}
/**
* @private
*/
public function set alpha(value:Number):void {
if (_alpha != value) {
_alpha = value;
if (_surface != null) {
_surface.addMaterialChangedOperationToScene();
}
}
}
/**
* Режим наложения цвета.
*/
public function get blendMode():String {
return _blendMode;
}
/**
* @private
*/
public function set blendMode(value:String):void {
if (_blendMode != value) {
_blendMode = value;
if (_surface != null) {
_surface.addMaterialChangedOperationToScene();
}
}
}
/**
* @private
* Метод определяет, может ли материал нарисовать указанный примитив. Метод используется в системе отрисовки сцены и должен использоваться
* наследниками для указания видимости связанной с материалом поверхности или отдельного примитива. Реализация по умолчанию возвращает
* true.
*
* @param primitive примитив для проверки
*
* @return true, если материал может отрисовать указанный примитив, иначе false
*/
alternativa3d function canDraw(primitive:PolyPrimitive):Boolean {
return true;
}
/**
* @private
* Метод очищает переданный скин (нарисованную графику, дочерние объекты и т.д.).
*
* @param skin скин для очистки
*/
alternativa3d function clear(skin:Skin):void {
skin.gfx.clear();
}
/**
* @private
* Метод выполняет отрисовку в заданный скин.
*
* @param camera камера, вызвавшая метод
* @param skin скин, в котором нужно рисовать
* @param length длина массива points
* @param points массив точек, определяющих отрисовываемый полигон. Каждый элемент массива является объектом класса
* alternativa.engine3d.materials.DrawPoint
*
* @see DrawPoint
*/
alternativa3d function draw(camera:Camera3D, skin:Skin, length:uint, points:Array):void {
skin.alpha = _alpha;
skin.blendMode = _blendMode;
}
/**
* @inheritDoc
*/
override public function clone():Material {
return new SurfaceMaterial(_alpha, _blendMode);
}
}
}