more versions added

This commit is contained in:
Tubix
2024-10-05 12:11:16 +01:00
parent 413f563f33
commit c32c7e8c34
7661 changed files with 1343635 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
K 25
svn:wc:ra_dav:version-url
V 105
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin
END
DirectSkin.as
K 25
svn:wc:ra_dav:version-url
V 119
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/DirectSkin.as
END
DummySkin.as
K 25
svn:wc:ra_dav:version-url
V 118
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/DummySkin.as
END
HelperSkin.as
K 25
svn:wc:ra_dav:version-url
V 119
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/HelperSkin.as
END
Skin.as
K 25
svn:wc:ra_dav:version-url
V 113
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/Skin.as
END
TextureSkin.as
K 25
svn:wc:ra_dav:version-url
V 120
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/TextureSkin.as
END
OmniSkin.as
K 25
svn:wc:ra_dav:version-url
V 117
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/OmniSkin.as
END
FillSkin.as
K 25
svn:wc:ra_dav:version-url
V 117
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/FillSkin.as
END
ObjectSkin.as
K 25
svn:wc:ra_dav:version-url
V 119
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/ObjectSkin.as
END
SpriteSkin.as
K 25
svn:wc:ra_dav:version-url
V 119
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/SpriteSkin.as
END
WireSkin.as
K 25
svn:wc:ra_dav:version-url
V 117
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/WireSkin.as
END
PolygonSkin.as
K 25
svn:wc:ra_dav:version-url
V 120
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin/PolygonSkin.as
END

View File

@@ -0,0 +1,160 @@
8
dir
46043
http://svndev.alternativaplatform.com/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/skin
http://svndev.alternativaplatform.com
2008-08-25T13:05:49.549299Z
154
int
svn:special svn:externals svn:needs-lock
d9e2387a-1f3e-40e2-b57f-9df5970a2fa5
DirectSkin.as
file
2010-10-28T04:34:04.000000Z
d98bf64dcab4def45d2b9d085bc59afe
2008-08-25T13:05:49.549299Z
154
int
DummySkin.as
file
2010-10-28T04:34:04.000000Z
2078b8178f99ee8f848293cfb369a6a4
2008-08-25T13:05:49.549299Z
154
int
HelperSkin.as
file
2010-10-28T04:34:04.000000Z
440d4bbb793dd16f997eaab1b8a32f47
2008-08-25T13:05:49.549299Z
154
int
Skin.as
file
2010-10-28T04:34:04.000000Z
10bdf8c24bc2df734a5ad82c649cf1b4
2008-08-25T13:05:49.549299Z
154
int
TextureSkin.as
file
2010-10-28T04:34:04.000000Z
d71c24b4f532729571516d1526a96fb4
2008-08-25T13:05:49.549299Z
154
int
OmniSkin.as
file
2010-10-28T04:34:04.000000Z
3aa4ebca2e3ee1d72b55b3b553eeda2d
2008-08-25T13:05:49.549299Z
154
int
FillSkin.as
file
2010-10-28T04:34:04.000000Z
bf38feb89b8a2b102a87d1e979e64b50
2008-08-25T13:05:49.549299Z
154
int
ObjectSkin.as
file
2010-10-28T04:34:04.000000Z
ed50e0062d6f76f7dd206011bee63209
2008-08-25T13:05:49.549299Z
154
int
SpriteSkin.as
file
2010-10-28T04:34:04.000000Z
34aed963dda9650b501fa39a9dbaac6d
2008-08-25T13:05:49.549299Z
154
int
WireSkin.as
file
2010-10-28T04:34:04.000000Z
ba9e232038951b303dfa574471d169bd
2008-08-25T13:05:49.549299Z
154
int
PolygonSkin.as
file
2010-10-28T04:34:04.000000Z
c18c42f0fd1bf53d10bd79332f574509
2008-08-25T13:05:49.549299Z
154
int

View File

@@ -0,0 +1 @@
8

View File

@@ -0,0 +1,64 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Math3D;
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.HelperMaterial;
import com.alternativagame.engine3d.object.light.Direct3D;
import com.alternativagame.type.RGB;
use namespace engine3d;
public class DirectSkin extends HelperSkin {
use namespace engine3d;
public function DirectSkin(object:Direct3D) {
super(object);
}
override engine3d function draw():void {
super.draw();
// Чистим
gfx.graphics.clear();
var material:HelperMaterial = HelperMaterial(this.material);
var direct:Direct3D = Direct3D(object);
var color:RGB = (direct.color == null) ? new RGB() : direct.color.clone();
color.limit();
// Рисуем ромбик
if (material.body) {
with (gfx.graphics) {
lineStyle(1, color.toInt());
moveTo(-8, 0);
lineTo(0, -8);
lineTo(8, 0);
lineTo(0, 8);
lineTo(-8, 0);
}
}
// Рисуем стрелку направления
if (material.gizmo && direct.color != null) {
with (gfx.graphics) {
lineStyle(1, color.toInt(), 0.5);
moveTo(0, 0);
var x0:Number = direct.canvasVector.x*30;
var y0:Number = -direct.canvasVector.z*30;
lineTo(x0, y0);
var ang:Number = Math.atan2(y0, x0);
var x1:Number = Math.cos(ang + 2.5)*5 + x0;
var y1:Number = Math.sin(ang + 2.5)*5 + y0;
var x2:Number = Math.cos(ang - 2.5)*5 + x0;
var y2:Number = Math.sin(ang - 2.5)*5 + y0;
moveTo(x1, y1);
lineTo(x0, y0);
lineTo(x2, y2);
}
}
}
}
}

View File

@@ -0,0 +1,68 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.HelperMaterial;
import com.alternativagame.engine3d.object.Dummy3D;
import com.alternativagame.engine3d.object.Object3D;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
use namespace engine3d;
public class DummySkin extends HelperSkin {
use namespace engine3d;
public function DummySkin(object:Dummy3D) {
super(object);
}
override engine3d function draw():void {
super.draw();
// Чистим
gfx.graphics.clear();
var material:HelperMaterial = HelperMaterial(this.material);
if (material.body) {
// Рисуем точку
with (gfx.graphics) {
beginFill(material.bodyColor.toInt());
drawCircle(0,0,3);
}
}
// Рисуем оси
if (material.gizmo) {
var transform:Matrix3D = object.transform;
// Координаты осей
var xx:Number = transform.a*40;
var xy:Number = -transform.i*40;
var yx:Number = transform.b*40;
var yy:Number = -transform.j*40;
var zx:Number = transform.c*40;
var zy:Number = -transform.k*40;
with (gfx.graphics) {
moveTo(0,0);
lineStyle(1, 0xFF0000);
lineTo(xx, xy);
moveTo(0,0);
lineStyle(1, 0x00FF00);
lineTo(yx, yy);
moveTo(0,0);
lineStyle(1, 0x0000FF);
lineTo(zx, zy);
}
}
}
}
}

View File

@@ -0,0 +1,50 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Math3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.FillMaterial;
import com.alternativagame.engine3d.object.mesh.polygon.FillPolygon3D;
import com.alternativagame.type.RGB;
import com.alternativagame.type.Vector;
import flash.display.Sprite;
import flash.geom.ColorTransform;
use namespace engine3d;
public class FillSkin extends PolygonSkin {
use namespace engine3d;
public function FillSkin(polygon:FillPolygon3D) {
super(polygon);
// Изначально осветить
light();
}
override protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {
with (graphics) {
clear();
beginFill(FillMaterial(polygon.material).color.toInt());
lineTo(bx, by);
lineTo(cx, cy);
}
}
override engine3d function light():void {
var color:RGB = FillPolygon3D(polygon).lightColor.clone();
// Добавить самосвечение
var selfIllumination:RGB = FillMaterial(polygon.material).selfIllumination;
color.add(selfIllumination);
var redMultiplier:Number = (color.red/5 + color.red*0.6 + 30) / 127;
var greenMultiplier:Number = (color.green/5 + color.green*0.6 + 30) / 127;
var blueMultiplier:Number = (color.blue/5 + color.blue*0.6 + 30) / 127;
var redOffset:Number = (color.red - 127) * 0.65;
var greenOffset:Number = (color.green - 127) * 0.65;
var blueOffset:Number = (color.blue - 127) * 0.65;
transform.colorTransform = new ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alpha, redOffset, greenOffset, blueOffset);
}
}
}

View File

@@ -0,0 +1,97 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Math3D;
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.HelperMaterial;
import com.alternativagame.engine3d.object.Object3D;
import com.alternativagame.engine3d.object.SkinObject3D;
import com.alternativagame.engine3d.object.light.Light3D;
import com.alternativagame.type.RGB;
import com.alternativagame.type.Vector;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
use namespace engine3d;
public class HelperSkin extends ObjectSkin {
use namespace engine3d;
private var tf:TextField = null;
private var link:Shape;
protected var gfx:Shape;
public function HelperSkin(object:SkinObject3D) {
super(object);
link = new Shape();
addChild(link);
gfx = new Shape();
addChild(gfx);
}
override engine3d function position():void {
super.position();
drawLink();
}
override engine3d function draw():void {
super.draw();
var material:HelperMaterial = HelperMaterial(this.material);
// Если в материале есть текст
if (material.text) {
// Создаём текстовое поле если надо
if (tf == null) {
tf = new TextField();
var f:TextFormat = new TextFormat("Courier", 11);
f.align = "center";
tf.defaultTextFormat = f;
tf.autoSize = TextFieldAutoSize.LEFT;
tf.selectable = false;
tf.mouseEnabled = false;
addChild(tf);
}
// Обновляем данные текстового поля
tf.text = object.name;
tf.textColor = material.textColor.toInt();
tf.x = -tf.width/2;
} else {
// Удаляем текстовое поле если оно не нужно
if (tf != null) {
removeChild(tf);
tf = null;
}
}
drawLink();
}
// Рисуем связь с родителем
private function drawLink():void {
link.graphics.clear();
if (HelperMaterial(material).link && object.parent != null) {
var px:Number = object.parent.transform.d - x;
var py:Number = - object.parent.transform.l - y;
with (link.graphics) {
moveTo(0,0);
lineStyle(1, 0xFFFFFF, 0.3);
lineTo(px, py);
}
}
}
override protected function drawDefaultHit():void {
with (graphics) {
drawCircle(0, 0, 3);
}
}
}
}

View File

@@ -0,0 +1,73 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Event3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.Material;
import com.alternativagame.engine3d.material.ObjectMaterial;
import com.alternativagame.engine3d.object.SkinObject3D;
import com.alternativagame.type.Vector;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.geom.Point;
use namespace engine3d;
public class ObjectSkin extends Skin {
use namespace engine3d;
private var hit:Array;
public function ObjectSkin(object:SkinObject3D) {
super(object);
}
override engine3d function draw():void {
super.draw();
var material:ObjectMaterial = ObjectMaterial(this.material);
alpha = material.alpha;
blendMode = material.blendMode;
// Отрисовка хит-области
if (hit != material.hit) {
hit = material.hit;
with (graphics) {
clear();
beginFill(0, 0);
if (hit.length > 2) {
moveTo(hit[hit.length-1].x, hit[hit.length-1].y);
for (var i:uint = 0; i < hit.length; i++) {
lineTo(hit[i].x, hit[i].y);
}
} else {
drawDefaultHit();
}
endFill();
}
}
}
protected function drawDefaultHit():void {}
override protected function updateCoords():void {
var canvasCoords:Vector = object.canvasCoords;
x = canvasCoords.x;
y = -canvasCoords.z;
}
override engine3d function get interactive():Boolean {
return object.interactive;
}
override engine3d function get material():Material {
return SkinObject3D(object).material;
}
override engine3d function getIntersectionCoords(canvasCoords:Point):Vector {
return new Vector(canvasCoords.x, object.canvasCoords.y, -canvasCoords.y);
}
}
}

View File

@@ -0,0 +1,60 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.HelperMaterial;
import com.alternativagame.engine3d.object.Object3D;
import com.alternativagame.engine3d.object.light.Omni3D;
import com.alternativagame.type.RGB;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
use namespace engine3d;
public class OmniSkin extends HelperSkin {
use namespace engine3d;
public function OmniSkin(object:Omni3D) {
super(object);
}
override engine3d function draw():void {
super.draw();
// Чистим
gfx.graphics.clear();
var material:HelperMaterial = HelperMaterial(this.material);
var omni:Omni3D = Omni3D(object);
var color:RGB = (omni.color == null) ? new RGB() : omni.color.clone();
color.limit();
// Рисуем звёздочку
if (material.body) {
with (gfx.graphics) {
lineStyle(1, color.toInt());
moveTo(-8, 0);
lineTo(8, 0);
moveTo(0, -8);
lineTo(0, 8);
moveTo(-6, -6);
lineTo(6, 6);
moveTo(6, -6);
lineTo(-6, 6);
}
}
// Рисуем границы
if (material.gizmo && omni.color != null) {
with (gfx.graphics) {
lineStyle(1, color.toInt(), 0.5);
drawCircle(0, 0, omni.canvasFar);
drawCircle(0, 0, omni.canvasNear);
}
}
}
}
}

View File

@@ -0,0 +1,121 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Event3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.Material;
import com.alternativagame.engine3d.material.PolygonMaterial;
import com.alternativagame.engine3d.object.mesh.polygon.Polygon3D;
import com.alternativagame.type.Vector;
import flash.geom.Point;
use namespace engine3d;
public class PolygonSkin extends Skin {
use namespace engine3d;
public function PolygonSkin(polygon:Polygon3D) {
super(polygon.mesh);
this.polygon = polygon;
}
override engine3d function draw():void {
super.draw();
var material:PolygonMaterial = polygon.material;
alpha = material.alpha;
blendMode = material.blendMode;
var bx:int = polygon.b.canvasX - x;
var by:int = polygon.b.canvasY - y;
var cx:int = polygon.c.canvasX - x;
var cy:int = polygon.c.canvasY - y;
drawPolygon(bx, by, cx, cy);
}
protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {}
override protected function updateCoords():void {
x = polygon.a.canvasX;
y = polygon.a.canvasY;
}
override engine3d function get interactive():Boolean {
return polygon.interactive;
}
override engine3d function get material():Material {
return polygon.material;
}
override engine3d function getIntersectionCoords(canvasCoords:Point):Vector {
var res:Vector = new Vector(canvasCoords.x, 0, -canvasCoords.y);
var a:Vector = polygon.a.canvasCoords;
var b:Vector = polygon.b.canvasCoords;
var c:Vector = polygon.c.canvasCoords;
// Определение порядка вершин
var top:Vector;
var middle:Vector;
var bottom:Vector;
if (a.z > b.z) {
if (a.z > c.z) {
top = a;
if (b.z > c.z) {
middle = b;
bottom = c;
} else {
middle = c;
bottom = b;
}
} else {
top = c;
middle = a;
bottom = b;
}
} else {
if (b.z > c.z) {
top = b;
if (a.z > c.z) {
middle = a;
bottom = c;
} else {
middle = c;
bottom = a;
}
} else {
top = c;
middle = b;
bottom = a;
}
}
var k1:Number = (top.z - res.z)/(top.z - bottom.z);
var x1:Number = top.x - (top.x - bottom.x)*k1;
var y1:Number = top.y - (top.y - bottom.y)*k1;
var k2:Number;
var x2:Number;
var y2:Number;
if (res.z > middle.z) {
// В верхней части
k2 = (top.z - res.z)/(top.z - middle.z);
x2 = top.x - (top.x - middle.x)*k2;
y2 = top.y - (top.y - middle.y)*k2;
} else {
// В нижней части
k2 = (middle.z - res.z)/(middle.z - bottom.z);
x2 = middle.x - (middle.x - bottom.x)*k2;
y2 = middle.y - (middle.y - bottom.y)*k2;
}
res.y = y1 - (y1 - y2)*(x1 - res.x)/(x1-x2);
return res;
}
}
}

View File

@@ -0,0 +1,57 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.Material;
import com.alternativagame.engine3d.object.Object3D;
import com.alternativagame.engine3d.object.SkinObject3D;
import com.alternativagame.engine3d.object.mesh.polygon.Polygon3D;
import com.alternativagame.type.Vector;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
use namespace engine3d;
public class Skin extends Sprite {
use namespace engine3d;
engine3d var object:Object3D;
engine3d var polygon:Polygon3D = null;
engine3d var depth:Number;
public function Skin(object:Object3D) {
this.object = object;
}
engine3d function position():void {
updateCoords();
}
engine3d function draw():void {
updateCoords();
}
protected function updateCoords():void {}
engine3d function light():void {}
public function get sortDepth():Number {
return depth + ((material != null) ? material.depthOffset : 0);
}
engine3d function get interactive():Boolean {
return false;
}
engine3d function get material():Material {
return null;
}
// Получить координаты точки пересечения скина с вектором (x, 1, -y) - координаты на экране
engine3d function getIntersectionCoords(canvasCoords:Point):Vector {
return null;
}
}
}

View File

@@ -0,0 +1,131 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Math3D;
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.SpriteMaterial;
import com.alternativagame.engine3d.material.SpritePhase;
import com.alternativagame.engine3d.object.Object3D;
import com.alternativagame.engine3d.object.SkinObject3D;
import com.alternativagame.engine3d.object.Sprite3D;
import com.alternativagame.type.RGB;
import com.alternativagame.type.Vector;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.filters.GlowFilter;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Point;
use namespace engine3d;
public class SpriteSkin extends ObjectSkin {
use namespace engine3d;
// Битмапа
private var bitmap:Bitmap;
public function SpriteSkin(object:Sprite3D) {
super(object);
bitmap = new Bitmap();
addChild(bitmap);
}
private function viewAngle(vector:Vector):Number {
var len:Number = Math3D.vectorLength(vector);
// Если вектор нулевой, угол - 0 градусов
var cos:Number = (len != 0) ? (vector.y / len) : 1;
return Math.acos(cos);
}
override engine3d function draw():void {
super.draw();
var objTransform:Matrix3D = object.transform.clone();
objTransform.d = 0;
objTransform.h = 0;
objTransform.l = 0;
var material:SpriteMaterial = SpriteMaterial(this.material);
// Угол оси Z с вектором камеры
var pitchAngle:Number = viewAngle(new Vector(objTransform.c, objTransform.g, objTransform.k)) - Math.PI/2;
// Угол оси X с вектором камеры
var yawAngle:Number = viewAngle(new Vector(objTransform.a, objTransform.e, objTransform.i));
if (objTransform.f > 0) yawAngle = -yawAngle;
yawAngle += Math.PI/2;
// Находим подходящую фазу
var phase:SpritePhase = material.getPhase(Sprite3D(object).state, Math3D.toDegree(pitchAngle), Math3D.toDegree(yawAngle));
if (phase != null) {
bitmap.bitmapData = phase.bitmapData;
bitmap.smoothing = material.smoothing;
// Матрица преобразования скина
var matrix:Matrix = new Matrix();
matrix.tx = x;
matrix.ty = y;
var pivot:Point = new Point();
// Трансформация в зависимости от флагов
if (material.scale || material.rotate) {
var m:Matrix3D = Math3D.combineMatrix(objTransform, phase.transform);
}
if (material.scale) {
if (material.rotate) {
// Полная трансформация
matrix.a = m.a;
matrix.b = -m.i;
matrix.c = -m.c;
matrix.d = m.k;
} else {
// Только масштабирование
matrix.a = Math.sqrt(m.a*m.a + m.c*m.c);
matrix.d = Math.sqrt(m.i*m.i + m.k*m.k);
}
} else {
if (material.rotate) {
// Только поворот
var lenX:Number = Math.sqrt(m.a*m.a + m.c*m.c);
var ma:Number = m.a/lenX;
var mc:Number = m.c/lenX;
matrix.a = ma;
matrix.b = mc;
matrix.c = -mc;
matrix.d = ma;
}
}
// Наложить матрицу на битмапу
bitmap.x = -phase.pivot.x;
bitmap.y = -phase.pivot.y;
transform.matrix = matrix;
} else {
bitmap.bitmapData = null;
}
}
override engine3d function light():void {
var color:RGB = SkinObject3D(object).lightColor.clone();
// Добавить самосвечение
var selfIllumination:RGB = SpriteMaterial(this.material).selfIllumination;
color.add(selfIllumination);
var redMultiplier:Number = (color.red/5 + color.red*0.6 + 30) / 127;
var greenMultiplier:Number = (color.green/5 + color.green*0.6 + 30) / 127;
var blueMultiplier:Number = (color.blue/5 + color.blue*0.6 + 30) / 127;
var redOffset:Number = (color.red - 127) * 0.65;
var greenOffset:Number = (color.green - 127) * 0.65;
var blueOffset:Number = (color.blue - 127) * 0.65;
transform.colorTransform = new ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alpha, redOffset, greenOffset, blueOffset);
}
}
}

View File

@@ -0,0 +1,68 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.object.mesh.polygon.TexturePolygon3D;
import com.alternativagame.engine3d.material.TextureMaterial;
import com.alternativagame.type.RGB;
import com.alternativagame.engine3d.engine3d;
import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Point;
use namespace engine3d;
public class TextureSkin extends FillSkin {
use namespace engine3d;
private var textureMatrix:Matrix;
private var texture:BitmapData = null;
private var aUV:Point;
private var bUV:Point;
private var cUV:Point;
public function TextureSkin(polygon:TexturePolygon3D) {
super(polygon);
}
override protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {
var poly:TexturePolygon3D = TexturePolygon3D(polygon);
var material:TextureMaterial = TextureMaterial(poly.material);
var textureEnabled:Boolean = (material.texture != null) && (poly.aUV != null) && (poly.bUV != null) && (poly.cUV != null);
if (textureEnabled) {
// Если изменилась текстура или UV-координаты, пересчитываем матрицу текстуры
if ((texture != material.texture) || (aUV != poly.aUV) || (bUV != poly.bUV) || (cUV != poly.cUV)) {
// Сохраняем ссылки на текстуру и UV-координаты
texture = material.texture;
aUV = poly.aUV;
bUV = poly.bUV;
cUV = poly.cUV;
// Преобразование текстуры под UV координаты
textureMatrix = new Matrix();
textureMatrix.tx = aUV.x * texture.width;
textureMatrix.ty = -aUV.y * texture.height;
textureMatrix.a = (bUV.x - aUV.x) * texture.width;
textureMatrix.b = (aUV.y - bUV.y) * texture.height;
textureMatrix.c = (cUV.x - aUV.x) * texture.width;
textureMatrix.d = (aUV.y - cUV.y) * texture.height;
textureMatrix.invert();
}
var drawMatrix:Matrix = textureMatrix.clone();
drawMatrix.concat(new Matrix(bx, by, cx, cy));
with (graphics) {
clear();
beginBitmapFill(texture, drawMatrix, true, material.smoothing);
lineTo(bx, by);
lineTo(cx, cy);
}
} else {
super.drawPolygon(bx, by, cx, cy);
}
}
}
}

View File

@@ -0,0 +1,55 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.WireMaterial;
import com.alternativagame.engine3d.object.mesh.polygon.WirePolygon3D;
import com.alternativagame.type.Vector;
use namespace engine3d;
public class WireSkin extends PolygonSkin {
use namespace engine3d;
public function WireSkin(polygon:WirePolygon3D) {
super(polygon);
}
override protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {
var material:WireMaterial = WireMaterial(polygon.material);
var wire:WirePolygon3D = WirePolygon3D(polygon);
with (graphics) {
clear();
lineStyle(material.thickness, material.color.toInt());
if (wire.edgeAB) {
lineTo(bx, by);
if (wire.edgeBC) {
lineTo(cx, cy);
if (wire.edgeCA) {
lineTo(0, 0);
}
} else {
if (wire.edgeCA) {
moveTo(cx, cy);
lineTo(0, 0);
}
}
} else {
if (wire.edgeBC) {
moveTo(bx, by);
lineTo(cx, cy);
if (wire.edgeCA) {
lineTo(0, 0);
}
} else {
if (wire.edgeCA) {
lineTo(cx, cy);
}
}
}
}
}
}
}

View File

@@ -0,0 +1,64 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Math3D;
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.HelperMaterial;
import com.alternativagame.engine3d.object.light.Direct3D;
import com.alternativagame.type.RGB;
use namespace engine3d;
public class DirectSkin extends HelperSkin {
use namespace engine3d;
public function DirectSkin(object:Direct3D) {
super(object);
}
override engine3d function draw():void {
super.draw();
// Чистим
gfx.graphics.clear();
var material:HelperMaterial = HelperMaterial(this.material);
var direct:Direct3D = Direct3D(object);
var color:RGB = (direct.color == null) ? new RGB() : direct.color.clone();
color.limit();
// Рисуем ромбик
if (material.body) {
with (gfx.graphics) {
lineStyle(1, color.toInt());
moveTo(-8, 0);
lineTo(0, -8);
lineTo(8, 0);
lineTo(0, 8);
lineTo(-8, 0);
}
}
// Рисуем стрелку направления
if (material.gizmo && direct.color != null) {
with (gfx.graphics) {
lineStyle(1, color.toInt(), 0.5);
moveTo(0, 0);
var x0:Number = direct.canvasVector.x*30;
var y0:Number = -direct.canvasVector.z*30;
lineTo(x0, y0);
var ang:Number = Math.atan2(y0, x0);
var x1:Number = Math.cos(ang + 2.5)*5 + x0;
var y1:Number = Math.sin(ang + 2.5)*5 + y0;
var x2:Number = Math.cos(ang - 2.5)*5 + x0;
var y2:Number = Math.sin(ang - 2.5)*5 + y0;
moveTo(x1, y1);
lineTo(x0, y0);
lineTo(x2, y2);
}
}
}
}
}

View File

@@ -0,0 +1,68 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.HelperMaterial;
import com.alternativagame.engine3d.object.Dummy3D;
import com.alternativagame.engine3d.object.Object3D;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
use namespace engine3d;
public class DummySkin extends HelperSkin {
use namespace engine3d;
public function DummySkin(object:Dummy3D) {
super(object);
}
override engine3d function draw():void {
super.draw();
// Чистим
gfx.graphics.clear();
var material:HelperMaterial = HelperMaterial(this.material);
if (material.body) {
// Рисуем точку
with (gfx.graphics) {
beginFill(material.bodyColor.toInt());
drawCircle(0,0,3);
}
}
// Рисуем оси
if (material.gizmo) {
var transform:Matrix3D = object.transform;
// Координаты осей
var xx:Number = transform.a*40;
var xy:Number = -transform.i*40;
var yx:Number = transform.b*40;
var yy:Number = -transform.j*40;
var zx:Number = transform.c*40;
var zy:Number = -transform.k*40;
with (gfx.graphics) {
moveTo(0,0);
lineStyle(1, 0xFF0000);
lineTo(xx, xy);
moveTo(0,0);
lineStyle(1, 0x00FF00);
lineTo(yx, yy);
moveTo(0,0);
lineStyle(1, 0x0000FF);
lineTo(zx, zy);
}
}
}
}
}

View File

@@ -0,0 +1,50 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Math3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.FillMaterial;
import com.alternativagame.engine3d.object.mesh.polygon.FillPolygon3D;
import com.alternativagame.type.RGB;
import com.alternativagame.type.Vector;
import flash.display.Sprite;
import flash.geom.ColorTransform;
use namespace engine3d;
public class FillSkin extends PolygonSkin {
use namespace engine3d;
public function FillSkin(polygon:FillPolygon3D) {
super(polygon);
// Изначально осветить
light();
}
override protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {
with (graphics) {
clear();
beginFill(FillMaterial(polygon.material).color.toInt());
lineTo(bx, by);
lineTo(cx, cy);
}
}
override engine3d function light():void {
var color:RGB = FillPolygon3D(polygon).lightColor.clone();
// Добавить самосвечение
var selfIllumination:RGB = FillMaterial(polygon.material).selfIllumination;
color.add(selfIllumination);
var redMultiplier:Number = (color.red/5 + color.red*0.6 + 30) / 127;
var greenMultiplier:Number = (color.green/5 + color.green*0.6 + 30) / 127;
var blueMultiplier:Number = (color.blue/5 + color.blue*0.6 + 30) / 127;
var redOffset:Number = (color.red - 127) * 0.65;
var greenOffset:Number = (color.green - 127) * 0.65;
var blueOffset:Number = (color.blue - 127) * 0.65;
transform.colorTransform = new ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alpha, redOffset, greenOffset, blueOffset);
}
}
}

View File

@@ -0,0 +1,97 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Math3D;
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.HelperMaterial;
import com.alternativagame.engine3d.object.Object3D;
import com.alternativagame.engine3d.object.SkinObject3D;
import com.alternativagame.engine3d.object.light.Light3D;
import com.alternativagame.type.RGB;
import com.alternativagame.type.Vector;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
use namespace engine3d;
public class HelperSkin extends ObjectSkin {
use namespace engine3d;
private var tf:TextField = null;
private var link:Shape;
protected var gfx:Shape;
public function HelperSkin(object:SkinObject3D) {
super(object);
link = new Shape();
addChild(link);
gfx = new Shape();
addChild(gfx);
}
override engine3d function position():void {
super.position();
drawLink();
}
override engine3d function draw():void {
super.draw();
var material:HelperMaterial = HelperMaterial(this.material);
// Если в материале есть текст
if (material.text) {
// Создаём текстовое поле если надо
if (tf == null) {
tf = new TextField();
var f:TextFormat = new TextFormat("Courier", 11);
f.align = "center";
tf.defaultTextFormat = f;
tf.autoSize = TextFieldAutoSize.LEFT;
tf.selectable = false;
tf.mouseEnabled = false;
addChild(tf);
}
// Обновляем данные текстового поля
tf.text = object.name;
tf.textColor = material.textColor.toInt();
tf.x = -tf.width/2;
} else {
// Удаляем текстовое поле если оно не нужно
if (tf != null) {
removeChild(tf);
tf = null;
}
}
drawLink();
}
// Рисуем связь с родителем
private function drawLink():void {
link.graphics.clear();
if (HelperMaterial(material).link && object.parent != null) {
var px:Number = object.parent.transform.d - x;
var py:Number = - object.parent.transform.l - y;
with (link.graphics) {
moveTo(0,0);
lineStyle(1, 0xFFFFFF, 0.3);
lineTo(px, py);
}
}
}
override protected function drawDefaultHit():void {
with (graphics) {
drawCircle(0, 0, 3);
}
}
}
}

View File

@@ -0,0 +1,73 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Event3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.Material;
import com.alternativagame.engine3d.material.ObjectMaterial;
import com.alternativagame.engine3d.object.SkinObject3D;
import com.alternativagame.type.Vector;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.geom.Point;
use namespace engine3d;
public class ObjectSkin extends Skin {
use namespace engine3d;
private var hit:Array;
public function ObjectSkin(object:SkinObject3D) {
super(object);
}
override engine3d function draw():void {
super.draw();
var material:ObjectMaterial = ObjectMaterial(this.material);
alpha = material.alpha;
blendMode = material.blendMode;
// Отрисовка хит-области
if (hit != material.hit) {
hit = material.hit;
with (graphics) {
clear();
beginFill(0, 0);
if (hit.length > 2) {
moveTo(hit[hit.length-1].x, hit[hit.length-1].y);
for (var i:uint = 0; i < hit.length; i++) {
lineTo(hit[i].x, hit[i].y);
}
} else {
drawDefaultHit();
}
endFill();
}
}
}
protected function drawDefaultHit():void {}
override protected function updateCoords():void {
var canvasCoords:Vector = object.canvasCoords;
x = canvasCoords.x;
y = -canvasCoords.z;
}
override engine3d function get interactive():Boolean {
return object.interactive;
}
override engine3d function get material():Material {
return SkinObject3D(object).material;
}
override engine3d function getIntersectionCoords(canvasCoords:Point):Vector {
return new Vector(canvasCoords.x, object.canvasCoords.y, -canvasCoords.y);
}
}
}

View File

@@ -0,0 +1,60 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.HelperMaterial;
import com.alternativagame.engine3d.object.Object3D;
import com.alternativagame.engine3d.object.light.Omni3D;
import com.alternativagame.type.RGB;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
use namespace engine3d;
public class OmniSkin extends HelperSkin {
use namespace engine3d;
public function OmniSkin(object:Omni3D) {
super(object);
}
override engine3d function draw():void {
super.draw();
// Чистим
gfx.graphics.clear();
var material:HelperMaterial = HelperMaterial(this.material);
var omni:Omni3D = Omni3D(object);
var color:RGB = (omni.color == null) ? new RGB() : omni.color.clone();
color.limit();
// Рисуем звёздочку
if (material.body) {
with (gfx.graphics) {
lineStyle(1, color.toInt());
moveTo(-8, 0);
lineTo(8, 0);
moveTo(0, -8);
lineTo(0, 8);
moveTo(-6, -6);
lineTo(6, 6);
moveTo(6, -6);
lineTo(-6, 6);
}
}
// Рисуем границы
if (material.gizmo && omni.color != null) {
with (gfx.graphics) {
lineStyle(1, color.toInt(), 0.5);
drawCircle(0, 0, omni.canvasFar);
drawCircle(0, 0, omni.canvasNear);
}
}
}
}
}

View File

@@ -0,0 +1,121 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Event3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.Material;
import com.alternativagame.engine3d.material.PolygonMaterial;
import com.alternativagame.engine3d.object.mesh.polygon.Polygon3D;
import com.alternativagame.type.Vector;
import flash.geom.Point;
use namespace engine3d;
public class PolygonSkin extends Skin {
use namespace engine3d;
public function PolygonSkin(polygon:Polygon3D) {
super(polygon.mesh);
this.polygon = polygon;
}
override engine3d function draw():void {
super.draw();
var material:PolygonMaterial = polygon.material;
alpha = material.alpha;
blendMode = material.blendMode;
var bx:int = polygon.b.canvasX - x;
var by:int = polygon.b.canvasY - y;
var cx:int = polygon.c.canvasX - x;
var cy:int = polygon.c.canvasY - y;
drawPolygon(bx, by, cx, cy);
}
protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {}
override protected function updateCoords():void {
x = polygon.a.canvasX;
y = polygon.a.canvasY;
}
override engine3d function get interactive():Boolean {
return polygon.interactive;
}
override engine3d function get material():Material {
return polygon.material;
}
override engine3d function getIntersectionCoords(canvasCoords:Point):Vector {
var res:Vector = new Vector(canvasCoords.x, 0, -canvasCoords.y);
var a:Vector = polygon.a.canvasCoords;
var b:Vector = polygon.b.canvasCoords;
var c:Vector = polygon.c.canvasCoords;
// Определение порядка вершин
var top:Vector;
var middle:Vector;
var bottom:Vector;
if (a.z > b.z) {
if (a.z > c.z) {
top = a;
if (b.z > c.z) {
middle = b;
bottom = c;
} else {
middle = c;
bottom = b;
}
} else {
top = c;
middle = a;
bottom = b;
}
} else {
if (b.z > c.z) {
top = b;
if (a.z > c.z) {
middle = a;
bottom = c;
} else {
middle = c;
bottom = a;
}
} else {
top = c;
middle = b;
bottom = a;
}
}
var k1:Number = (top.z - res.z)/(top.z - bottom.z);
var x1:Number = top.x - (top.x - bottom.x)*k1;
var y1:Number = top.y - (top.y - bottom.y)*k1;
var k2:Number;
var x2:Number;
var y2:Number;
if (res.z > middle.z) {
// В верхней части
k2 = (top.z - res.z)/(top.z - middle.z);
x2 = top.x - (top.x - middle.x)*k2;
y2 = top.y - (top.y - middle.y)*k2;
} else {
// В нижней части
k2 = (middle.z - res.z)/(middle.z - bottom.z);
x2 = middle.x - (middle.x - bottom.x)*k2;
y2 = middle.y - (middle.y - bottom.y)*k2;
}
res.y = y1 - (y1 - y2)*(x1 - res.x)/(x1-x2);
return res;
}
}
}

View File

@@ -0,0 +1,57 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.Material;
import com.alternativagame.engine3d.object.Object3D;
import com.alternativagame.engine3d.object.SkinObject3D;
import com.alternativagame.engine3d.object.mesh.polygon.Polygon3D;
import com.alternativagame.type.Vector;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
use namespace engine3d;
public class Skin extends Sprite {
use namespace engine3d;
engine3d var object:Object3D;
engine3d var polygon:Polygon3D = null;
engine3d var depth:Number;
public function Skin(object:Object3D) {
this.object = object;
}
engine3d function position():void {
updateCoords();
}
engine3d function draw():void {
updateCoords();
}
protected function updateCoords():void {}
engine3d function light():void {}
public function get sortDepth():Number {
return depth + ((material != null) ? material.depthOffset : 0);
}
engine3d function get interactive():Boolean {
return false;
}
engine3d function get material():Material {
return null;
}
// Получить координаты точки пересечения скина с вектором (x, 1, -y) - координаты на экране
engine3d function getIntersectionCoords(canvasCoords:Point):Vector {
return null;
}
}
}

View File

@@ -0,0 +1,131 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Math3D;
import com.alternativagame.engine3d.Matrix3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.SpriteMaterial;
import com.alternativagame.engine3d.material.SpritePhase;
import com.alternativagame.engine3d.object.Object3D;
import com.alternativagame.engine3d.object.SkinObject3D;
import com.alternativagame.engine3d.object.Sprite3D;
import com.alternativagame.type.RGB;
import com.alternativagame.type.Vector;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.filters.GlowFilter;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Point;
use namespace engine3d;
public class SpriteSkin extends ObjectSkin {
use namespace engine3d;
// Битмапа
private var bitmap:Bitmap;
public function SpriteSkin(object:Sprite3D) {
super(object);
bitmap = new Bitmap();
addChild(bitmap);
}
private function viewAngle(vector:Vector):Number {
var len:Number = Math3D.vectorLength(vector);
// Если вектор нулевой, угол - 0 градусов
var cos:Number = (len != 0) ? (vector.y / len) : 1;
return Math.acos(cos);
}
override engine3d function draw():void {
super.draw();
var objTransform:Matrix3D = object.transform.clone();
objTransform.d = 0;
objTransform.h = 0;
objTransform.l = 0;
var material:SpriteMaterial = SpriteMaterial(this.material);
// Угол оси Z с вектором камеры
var pitchAngle:Number = viewAngle(new Vector(objTransform.c, objTransform.g, objTransform.k)) - Math.PI/2;
// Угол оси X с вектором камеры
var yawAngle:Number = viewAngle(new Vector(objTransform.a, objTransform.e, objTransform.i));
if (objTransform.f > 0) yawAngle = -yawAngle;
yawAngle += Math.PI/2;
// Находим подходящую фазу
var phase:SpritePhase = material.getPhase(Sprite3D(object).state, Math3D.toDegree(pitchAngle), Math3D.toDegree(yawAngle));
if (phase != null) {
bitmap.bitmapData = phase.bitmapData;
bitmap.smoothing = material.smoothing;
// Матрица преобразования скина
var matrix:Matrix = new Matrix();
matrix.tx = x;
matrix.ty = y;
var pivot:Point = new Point();
// Трансформация в зависимости от флагов
if (material.scale || material.rotate) {
var m:Matrix3D = Math3D.combineMatrix(objTransform, phase.transform);
}
if (material.scale) {
if (material.rotate) {
// Полная трансформация
matrix.a = m.a;
matrix.b = -m.i;
matrix.c = -m.c;
matrix.d = m.k;
} else {
// Только масштабирование
matrix.a = Math.sqrt(m.a*m.a + m.c*m.c);
matrix.d = Math.sqrt(m.i*m.i + m.k*m.k);
}
} else {
if (material.rotate) {
// Только поворот
var lenX:Number = Math.sqrt(m.a*m.a + m.c*m.c);
var ma:Number = m.a/lenX;
var mc:Number = m.c/lenX;
matrix.a = ma;
matrix.b = mc;
matrix.c = -mc;
matrix.d = ma;
}
}
// Наложить матрицу на битмапу
bitmap.x = -phase.pivot.x;
bitmap.y = -phase.pivot.y;
transform.matrix = matrix;
} else {
bitmap.bitmapData = null;
}
}
override engine3d function light():void {
var color:RGB = SkinObject3D(object).lightColor.clone();
// Добавить самосвечение
var selfIllumination:RGB = SpriteMaterial(this.material).selfIllumination;
color.add(selfIllumination);
var redMultiplier:Number = (color.red/5 + color.red*0.6 + 30) / 127;
var greenMultiplier:Number = (color.green/5 + color.green*0.6 + 30) / 127;
var blueMultiplier:Number = (color.blue/5 + color.blue*0.6 + 30) / 127;
var redOffset:Number = (color.red - 127) * 0.65;
var greenOffset:Number = (color.green - 127) * 0.65;
var blueOffset:Number = (color.blue - 127) * 0.65;
transform.colorTransform = new ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alpha, redOffset, greenOffset, blueOffset);
}
}
}

View File

@@ -0,0 +1,68 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.object.mesh.polygon.TexturePolygon3D;
import com.alternativagame.engine3d.material.TextureMaterial;
import com.alternativagame.type.RGB;
import com.alternativagame.engine3d.engine3d;
import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Point;
use namespace engine3d;
public class TextureSkin extends FillSkin {
use namespace engine3d;
private var textureMatrix:Matrix;
private var texture:BitmapData = null;
private var aUV:Point;
private var bUV:Point;
private var cUV:Point;
public function TextureSkin(polygon:TexturePolygon3D) {
super(polygon);
}
override protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {
var poly:TexturePolygon3D = TexturePolygon3D(polygon);
var material:TextureMaterial = TextureMaterial(poly.material);
var textureEnabled:Boolean = (material.texture != null) && (poly.aUV != null) && (poly.bUV != null) && (poly.cUV != null);
if (textureEnabled) {
// Если изменилась текстура или UV-координаты, пересчитываем матрицу текстуры
if ((texture != material.texture) || (aUV != poly.aUV) || (bUV != poly.bUV) || (cUV != poly.cUV)) {
// Сохраняем ссылки на текстуру и UV-координаты
texture = material.texture;
aUV = poly.aUV;
bUV = poly.bUV;
cUV = poly.cUV;
// Преобразование текстуры под UV координаты
textureMatrix = new Matrix();
textureMatrix.tx = aUV.x * texture.width;
textureMatrix.ty = -aUV.y * texture.height;
textureMatrix.a = (bUV.x - aUV.x) * texture.width;
textureMatrix.b = (aUV.y - bUV.y) * texture.height;
textureMatrix.c = (cUV.x - aUV.x) * texture.width;
textureMatrix.d = (aUV.y - cUV.y) * texture.height;
textureMatrix.invert();
}
var drawMatrix:Matrix = textureMatrix.clone();
drawMatrix.concat(new Matrix(bx, by, cx, cy));
with (graphics) {
clear();
beginBitmapFill(texture, drawMatrix, true, material.smoothing);
lineTo(bx, by);
lineTo(cx, cy);
}
} else {
super.drawPolygon(bx, by, cx, cy);
}
}
}
}

View File

@@ -0,0 +1,55 @@
package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.WireMaterial;
import com.alternativagame.engine3d.object.mesh.polygon.WirePolygon3D;
import com.alternativagame.type.Vector;
use namespace engine3d;
public class WireSkin extends PolygonSkin {
use namespace engine3d;
public function WireSkin(polygon:WirePolygon3D) {
super(polygon);
}
override protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {
var material:WireMaterial = WireMaterial(polygon.material);
var wire:WirePolygon3D = WirePolygon3D(polygon);
with (graphics) {
clear();
lineStyle(material.thickness, material.color.toInt());
if (wire.edgeAB) {
lineTo(bx, by);
if (wire.edgeBC) {
lineTo(cx, cy);
if (wire.edgeCA) {
lineTo(0, 0);
}
} else {
if (wire.edgeCA) {
moveTo(cx, cy);
lineTo(0, 0);
}
}
} else {
if (wire.edgeBC) {
moveTo(bx, by);
lineTo(cx, cy);
if (wire.edgeCA) {
lineTo(0, 0);
}
} else {
if (wire.edgeCA) {
lineTo(cx, cy);
}
}
}
}
}
}
}