mirror of
https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
synced 2025-10-27 18:29:07 -07:00
more versions added
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
8
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
57
Alternativa3D2/2.0/com/alternativagame/engine3d/skin/Skin.as
Normal file
57
Alternativa3D2/2.0/com/alternativagame/engine3d/skin/Skin.as
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user