Files
alternativa3d-archive/Alternativa3D5/5.3/alternativa/engine3d/materials/DevMaterial.as
Pyogenics c58621fb99 Add A3D5
2024-09-28 17:29:26 +01:00

198 lines
4.9 KiB
ActionScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package alternativa.engine3d.materials {
import alternativa.engine3d.*;
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.display.Skin;
import flash.display.BlendMode;
import flash.display.Graphics;
import alternativa.utils.ColorUtils;
import alternativa.engine3d.core.PolyPrimitive;
import alternativa.engine3d.core.BSPNode;
use namespace alternativa3d;
/**
* @private
* Материал, заполняющий грань сплошной заливкой цветом в соответствии с уровнем мобильности. Помимо заливки материал может рисовать границу
* полигона линией заданной толщины и цвета.
*/
public class DevMaterial extends SurfaceMaterial {
/**
* @private
* Цвет
*/
alternativa3d var _color:uint;
/**
* @private
* Толщина линий обводки
*/
alternativa3d var _wireThickness:Number;
/**
* @private
* Цвет линий обводки
*/
alternativa3d var _wireColor:uint;
/**
* Создание экземпляра класса.
*
* @param color цвет заливки
* @param alpha прозрачность
* @param blendMode режим наложения цвета
* @param wireThickness толщина линии обводки
* @param wireColor цвет линии обводки
*/
public function DevMaterial(color:uint = 0xFFFFFF, alpha:Number = 1, blendMode:String = BlendMode.NORMAL, wireThickness:Number = -1, wireColor:uint = 0) {
super(alpha, blendMode);
_color = color;
_wireThickness = wireThickness;
_wireColor = wireColor;
}
/**
* @private
*
* @param camera
* @param skin
* @param length
* @param points
*/
override alternativa3d function draw(camera:Camera3D, skin:Skin, length:uint, points:Array):void {
skin.alpha = _alpha;
skin.blendMode = _blendMode;
var i:uint;
var point:DrawPoint;
var gfx:Graphics = skin.gfx;
/*
//Мобильность
var param:int = skin.primitive.mobility*10;
*/
/*
// Уровень распиленности
var param:int = 0;
var prm:PolyPrimitive = skin.primitive;
while (prm != null) {
prm = prm.parent;
param++;
}
param *= 10;
*/
// Уровень в BSP-дереве
var param:int = 0;
var node:BSPNode = skin.primitive.node;
while (node != null) {
node = node.parent;
param++;
}
param *= 5;
var c:uint = ColorUtils.rgb(param, param, param);
if (camera._orthographic) {
gfx.beginFill(c);
if (_wireThickness >= 0) {
gfx.lineStyle(_wireThickness, _wireColor);
}
point = points[0];
gfx.moveTo(point.x, point.y);
for (i = 1; i < length; i++) {
point = points[i];
gfx.lineTo(point.x, point.y);
}
if (_wireThickness >= 0) {
point = points[0];
gfx.lineTo(point.x, point.y);
}
} else {
gfx.beginFill(c);
if (_wireThickness >= 0) {
gfx.lineStyle(_wireThickness, _wireColor);
}
point = points[0];
var perspective:Number = camera.focalLength/point.z;
gfx.moveTo(point.x*perspective, point.y*perspective);
for (i = 1; i < length; i++) {
point = points[i];
perspective = camera.focalLength/point.z;
gfx.lineTo(point.x*perspective, point.y*perspective);
}
if (_wireThickness >= 0) {
point = points[0];
perspective = camera.focalLength/point.z;
gfx.lineTo(point.x*perspective, point.y*perspective);
}
}
}
/**
* Цвет заливки.
*/
public function get color():uint {
return _color;
}
/**
* @private
*/
public function set color(value:uint):void {
if (_color != value) {
_color = value;
if (_surface != null) {
_surface.addMaterialChangedOperationToScene();
}
}
}
/**
* Толщина линии обводки. Если значение отрицательное, то отрисовка линии не выполняется.
*/
public function get wireThickness():Number {
return _wireThickness;
}
/**
* @private
*/
public function set wireThickness(value:Number):void {
if (_wireThickness != value) {
_wireThickness = value;
if (_surface != null) {
_surface.addMaterialChangedOperationToScene();
}
}
}
/**
* Цвет линии обводки.
*/
public function get wireColor():uint {
return _wireColor;
}
/**
* @private
*/
public function set wireColor(value:uint):void {
if (_wireColor != value) {
_wireColor = value;
if (_surface != null) {
_surface.addMaterialChangedOperationToScene();
}
}
}
/**
* @inheritDoc
*/
override public function clone():Material {
var res:DevMaterial = new DevMaterial(_color, _alpha, _blendMode, _wireThickness, _wireColor);
return res;
}
}
}