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,65 @@
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 109
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material
|
||||
END
|
||||
HelperMaterial.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 127
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/HelperMaterial.as
|
||||
END
|
||||
Material.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 121
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/Material.as
|
||||
END
|
||||
TextureMaterial.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 128
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/TextureMaterial.as
|
||||
END
|
||||
Hit.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 116
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/Hit.as
|
||||
END
|
||||
FillMaterial.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 125
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/FillMaterial.as
|
||||
END
|
||||
ObjectMaterial.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 127
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/ObjectMaterial.as
|
||||
END
|
||||
SpriteMaterial.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 127
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/SpriteMaterial.as
|
||||
END
|
||||
WireMaterial.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 125
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/WireMaterial.as
|
||||
END
|
||||
PolygonMaterial.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 128
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/PolygonMaterial.as
|
||||
END
|
||||
SpritePhase.as
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 124
|
||||
/!svn/ver/154/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material/SpritePhase.as
|
||||
END
|
||||
@@ -0,0 +1,148 @@
|
||||
8
|
||||
|
||||
dir
|
||||
46043
|
||||
http://svndev.alternativaplatform.com/platform/clients/fp9/libraries/Alternativa3D/branches/2.0/com/alternativagame/engine3d/material
|
||||
http://svndev.alternativaplatform.com
|
||||
|
||||
|
||||
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
|
||||
svn:special svn:externals svn:needs-lock
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
d9e2387a-1f3e-40e2-b57f-9df5970a2fa5
|
||||
|
||||
HelperMaterial.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
d7d8be858db9e57e34b271b088279ff1
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
Material.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
c9d48a2cc61f6b802a0d8119e4a43e3e
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
TextureMaterial.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
db1c1757075341b32fa63173f97714f7
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
Hit.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
2b42963f326ef68c0aa3fe1fb6de5fa0
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
FillMaterial.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
c89150d47576ca2c7478ae0200b12215
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
ObjectMaterial.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
14d5f2b73bc1c620499cf213edf2d6c2
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
SpriteMaterial.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
23b7814c94cf9a6a92e522c0d1dc60d9
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
WireMaterial.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
25a8f37607fb392bceb3c84d533279c7
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
PolygonMaterial.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
a95823ced8c29dac440bc000593c517d
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
SpritePhase.as
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2010-10-28T04:34:04.000000Z
|
||||
db52856a883993329978d783c1c820d7
|
||||
2008-08-25T13:05:49.549299Z
|
||||
154
|
||||
int
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
8
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
public class FillMaterial extends PolygonMaterial {
|
||||
|
||||
// Цвет при отсутствии текстуры
|
||||
public var color:RGB;
|
||||
|
||||
// Цвет самосвечения материала
|
||||
public var selfIllumination:RGB = new RGB();
|
||||
|
||||
public function FillMaterial(color:RGB = null, twoSided:Boolean = false) {
|
||||
this.color = (color == null) ? new RGB(0x7F7F7F) : color;
|
||||
this.twoSided = twoSided;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:FillMaterial = new FillMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:FillMaterial = FillMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.color = color.clone();
|
||||
mat.selfIllumination = selfIllumination.clone();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
public class HelperMaterial extends ObjectMaterial {
|
||||
|
||||
// Показывать подпись
|
||||
public var text:Boolean;
|
||||
|
||||
// Цвет подписи
|
||||
public var textColor:RGB = new RGB(0xFFFFFF);
|
||||
|
||||
// Показывать связь с родителем
|
||||
public var link:Boolean;
|
||||
|
||||
// Показывать тело объекта
|
||||
public var body:Boolean;
|
||||
|
||||
// Показывать вспомогательную графику объекта
|
||||
public var gizmo:Boolean;
|
||||
|
||||
// Цвет тела объекта
|
||||
public var bodyColor:RGB = new RGB(0xCCCCCC);
|
||||
|
||||
|
||||
public function HelperMaterial(text:Boolean = true, link:Boolean = true, gizmo:Boolean = true, body:Boolean = true) {
|
||||
this.text = text;
|
||||
this.link = link;
|
||||
this.gizmo = gizmo;
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:HelperMaterial = new HelperMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:HelperMaterial = HelperMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.text = text;
|
||||
mat.textColor = textColor.clone();
|
||||
mat.body = body;
|
||||
mat.gizmo = gizmo;
|
||||
mat.bodyColor = bodyColor.clone();
|
||||
mat.link = link;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import flash.geom.Point;
|
||||
import com.alternativagame.engine3d.Math3D;
|
||||
|
||||
public final class Hit {
|
||||
|
||||
static public function ngon(n:uint, radiusX:Number, radiusY:Number = -1, offsetX:Number = 0, offsetY:Number = 0, angle:Number = 0):Array {
|
||||
var res:Array = new Array();
|
||||
n = (n < 3) ? 3 : n;
|
||||
radiusY = (radiusY < 0) ? radiusX : radiusY;
|
||||
angle = Math3D.toRadian(angle);
|
||||
var sin:Number = Math.sin(angle);
|
||||
var cos:Number = Math.cos(angle);
|
||||
|
||||
var a:Number = (Math.PI+Math.PI) / n;
|
||||
for (var i:uint = 0; i < n; i++) {
|
||||
var x:Number = offsetX + Math.sin(a*i)*radiusX;
|
||||
var y:Number = offsetY - Math.cos(a*i)*radiusY;
|
||||
|
||||
var cx:Number = x*cos - y*sin;
|
||||
var cy:Number = y*cos + x*sin;
|
||||
|
||||
res.push(new Point(cx, cy));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static public function rectangle(width:Number, height:Number, offsetX:Number = 0, offsetY:Number = 0):Array {
|
||||
var res:Array = new Array();
|
||||
var hw:Number = width/2;
|
||||
var hh:Number = height/2;
|
||||
res.push(new Point(offsetX - hw, offsetY - hh));
|
||||
res.push(new Point(offsetX + hw, offsetY - hh));
|
||||
res.push(new Point(offsetX + hw, offsetY + hh));
|
||||
res.push(new Point(offsetX - hw, offsetY + hh));
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
|
||||
public class Material {
|
||||
|
||||
// Прозрачность материала
|
||||
public var alpha:Number = 1;
|
||||
|
||||
// Метод наложения
|
||||
public var blendMode:String = "normal";
|
||||
|
||||
// Смещение глубины
|
||||
public var depthOffset:Number = 0;
|
||||
|
||||
// Клон
|
||||
public function clone():Material {
|
||||
var res:Material = new Material();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
protected function cloneParams(material:*):void {
|
||||
var mat:Material = Material(material);
|
||||
mat.alpha = alpha;
|
||||
mat.blendMode = blendMode;
|
||||
mat.depthOffset = depthOffset;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
public class ObjectMaterial extends Material {
|
||||
|
||||
// Массив точек хит-области
|
||||
public var hit:Array = new Array();
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:ObjectMaterial = new ObjectMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:ObjectMaterial = ObjectMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.hit = hit;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
public class PolygonMaterial extends Material {
|
||||
|
||||
// Двусторонний материал
|
||||
public var twoSided:Boolean;
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:PolygonMaterial = new PolygonMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:PolygonMaterial = PolygonMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.twoSided = twoSided;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.engine3d.Math3D;
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
import flash.display.BitmapData;
|
||||
import flash.geom.Point;
|
||||
|
||||
public class SpriteMaterial extends ObjectMaterial {
|
||||
|
||||
// Массив фаз
|
||||
private var states:Array = new Array();
|
||||
|
||||
// Сглаженность
|
||||
public var smoothing:Boolean;
|
||||
|
||||
// Цвет самосвечения материала
|
||||
public var selfIllumination:RGB = new RGB();
|
||||
|
||||
// Флаги искажения спрайта
|
||||
public var scale:Boolean;
|
||||
public var rotate:Boolean;
|
||||
|
||||
public function SpriteMaterial(smoothing:Boolean = false, scale:Boolean = false, rotate:Boolean = false) {
|
||||
this.smoothing = smoothing;
|
||||
this.scale = scale;
|
||||
this.rotate = rotate;
|
||||
}
|
||||
|
||||
public function setPhase(bitmapData:BitmapData, pivot:Point = null, state:String = "default", pitch:Number = 0, yaw:Number = 0):void {
|
||||
|
||||
// Добавляем состояние, если надо
|
||||
if (states[state] == undefined) {
|
||||
states[state] = new Array();
|
||||
}
|
||||
|
||||
states[state].push(new SpritePhase(bitmapData, pivot, pitch, yaw));
|
||||
}
|
||||
|
||||
// Возвращает фазу
|
||||
public function getPhase(state:String = "default", pitch:Number = 0, yaw:Number = 0):SpritePhase {
|
||||
var res:SpritePhase = null;
|
||||
|
||||
// Проверка на наличие состояние
|
||||
if (states[state] != undefined) {
|
||||
var phases:Array = states[state];
|
||||
var num:uint = phases.length;
|
||||
|
||||
var i:uint;
|
||||
var phase:SpritePhase;
|
||||
var resPitch:Number;
|
||||
var currentDiff:Number;
|
||||
|
||||
// Находим ближайший pitch
|
||||
var minDiff:Number = Number.MAX_VALUE;
|
||||
for (i = 0; i < num; i++) {
|
||||
phase = phases[i];
|
||||
currentDiff = Math.abs(phase.pitch - pitch);
|
||||
if (currentDiff < minDiff) {
|
||||
minDiff = currentDiff;
|
||||
resPitch = phase.pitch;
|
||||
}
|
||||
}
|
||||
|
||||
// Находим ближайший yaw и сохраняем результат
|
||||
minDiff = Number.MAX_VALUE;
|
||||
for (i = 0; i < num; i++) {
|
||||
phase = phases[i];
|
||||
if (phase.pitch == resPitch) {
|
||||
currentDiff = Math.abs(Math3D.deltaAngle(phase.yaw, yaw));
|
||||
if (currentDiff < minDiff) {
|
||||
minDiff = currentDiff;
|
||||
res = phase;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:SpriteMaterial = new SpriteMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:SpriteMaterial = SpriteMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.smoothing = smoothing;
|
||||
mat.selfIllumination = selfIllumination.clone();
|
||||
mat.scale = scale;
|
||||
mat.rotate = rotate;
|
||||
for (var state:String in states) {
|
||||
for (var i:uint = 0; i < states[state].length; i++) {
|
||||
var phase:SpritePhase = states[state][i];
|
||||
mat.setPhase(phase.bitmapData, phase.pivot.clone(), state, phase.pitch, phase.yaw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import flash.display.BitmapData;
|
||||
import flash.geom.Point;
|
||||
import com.alternativagame.engine3d.Matrix3D;
|
||||
import com.alternativagame.engine3d.Math3D;
|
||||
|
||||
public class SpritePhase {
|
||||
|
||||
// Битмапа фазы
|
||||
public var bitmapData:BitmapData;
|
||||
|
||||
// Точка привязки битмапы
|
||||
private var _pivot:Point;
|
||||
|
||||
private var _transform:Matrix3D;
|
||||
|
||||
private var _pitch:Number;
|
||||
private var _yaw:Number;
|
||||
|
||||
public function SpritePhase(bitmapData:BitmapData, pivot:Point, pitch:Number, yaw:Number) {
|
||||
this.bitmapData = bitmapData;
|
||||
_pivot = (pivot == null) ? new Point(bitmapData.width / 2, bitmapData.height / 2) : pivot;
|
||||
|
||||
// Проверка углов
|
||||
pitch = Math3D.limitAngle(pitch);
|
||||
if (pitch < 0) {
|
||||
if (pitch < -90) {
|
||||
pitch = -180 - pitch;
|
||||
yaw += 180;
|
||||
}
|
||||
} else {
|
||||
if (pitch > 90) {
|
||||
pitch = 180 - pitch;
|
||||
yaw += 180;
|
||||
}
|
||||
}
|
||||
yaw = Math3D.limitAngle(yaw);
|
||||
|
||||
// Сохраняем углы
|
||||
_pitch = pitch;
|
||||
_yaw = yaw;
|
||||
|
||||
// Формируем матрицу трансформации фазы
|
||||
_transform = new Matrix3D();
|
||||
Math3D.translateMatrix(_transform, -_pivot.x, 0, _pivot.y);
|
||||
|
||||
Math3D.rotateXMatrix(_transform, -_pitch);
|
||||
Math3D.rotateZMatrix(_transform, -_yaw);
|
||||
}
|
||||
|
||||
public function get transform():Matrix3D {
|
||||
return _transform;
|
||||
}
|
||||
|
||||
public function get pitch():Number {
|
||||
return _pitch;
|
||||
}
|
||||
|
||||
public function get yaw():Number {
|
||||
return _yaw;
|
||||
}
|
||||
|
||||
public function get pivot():Point {
|
||||
return _pivot;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
import flash.display.BitmapData;
|
||||
|
||||
public final class TextureMaterial extends FillMaterial {
|
||||
|
||||
// Текстура
|
||||
public var texture:BitmapData = null;
|
||||
|
||||
// Сглаженность
|
||||
public var smoothing:Boolean;
|
||||
|
||||
public function TextureMaterial(texture:BitmapData = null, smoothing:Boolean = true, color:RGB = null, twoSided:Boolean = false) {
|
||||
super(color, twoSided);
|
||||
this.texture = texture;
|
||||
this.smoothing = smoothing;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:TextureMaterial = new TextureMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:TextureMaterial = TextureMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.texture = texture;
|
||||
mat.smoothing = smoothing;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
public class WireMaterial extends PolygonMaterial {
|
||||
|
||||
// Цвет рёбер
|
||||
public var color:RGB;
|
||||
|
||||
// Толщина рёбер
|
||||
public var thickness:Number;
|
||||
|
||||
public function WireMaterial(color:RGB = null, thickness:Number = 1, twoSided:Boolean = false) {
|
||||
this.color = (color == null) ? new RGB(0xFFFFFF) : color;
|
||||
this.thickness = thickness;
|
||||
this.twoSided = twoSided;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:WireMaterial = new WireMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:WireMaterial = WireMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.color = color.clone();
|
||||
mat.thickness = thickness;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
public class FillMaterial extends PolygonMaterial {
|
||||
|
||||
// Цвет при отсутствии текстуры
|
||||
public var color:RGB;
|
||||
|
||||
// Цвет самосвечения материала
|
||||
public var selfIllumination:RGB = new RGB();
|
||||
|
||||
public function FillMaterial(color:RGB = null, twoSided:Boolean = false) {
|
||||
this.color = (color == null) ? new RGB(0x7F7F7F) : color;
|
||||
this.twoSided = twoSided;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:FillMaterial = new FillMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:FillMaterial = FillMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.color = color.clone();
|
||||
mat.selfIllumination = selfIllumination.clone();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
public class HelperMaterial extends ObjectMaterial {
|
||||
|
||||
// Показывать подпись
|
||||
public var text:Boolean;
|
||||
|
||||
// Цвет подписи
|
||||
public var textColor:RGB = new RGB(0xFFFFFF);
|
||||
|
||||
// Показывать связь с родителем
|
||||
public var link:Boolean;
|
||||
|
||||
// Показывать тело объекта
|
||||
public var body:Boolean;
|
||||
|
||||
// Показывать вспомогательную графику объекта
|
||||
public var gizmo:Boolean;
|
||||
|
||||
// Цвет тела объекта
|
||||
public var bodyColor:RGB = new RGB(0xCCCCCC);
|
||||
|
||||
|
||||
public function HelperMaterial(text:Boolean = true, link:Boolean = true, gizmo:Boolean = true, body:Boolean = true) {
|
||||
this.text = text;
|
||||
this.link = link;
|
||||
this.gizmo = gizmo;
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:HelperMaterial = new HelperMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:HelperMaterial = HelperMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.text = text;
|
||||
mat.textColor = textColor.clone();
|
||||
mat.body = body;
|
||||
mat.gizmo = gizmo;
|
||||
mat.bodyColor = bodyColor.clone();
|
||||
mat.link = link;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import flash.geom.Point;
|
||||
import com.alternativagame.engine3d.Math3D;
|
||||
|
||||
public final class Hit {
|
||||
|
||||
static public function ngon(n:uint, radiusX:Number, radiusY:Number = -1, offsetX:Number = 0, offsetY:Number = 0, angle:Number = 0):Array {
|
||||
var res:Array = new Array();
|
||||
n = (n < 3) ? 3 : n;
|
||||
radiusY = (radiusY < 0) ? radiusX : radiusY;
|
||||
angle = Math3D.toRadian(angle);
|
||||
var sin:Number = Math.sin(angle);
|
||||
var cos:Number = Math.cos(angle);
|
||||
|
||||
var a:Number = (Math.PI+Math.PI) / n;
|
||||
for (var i:uint = 0; i < n; i++) {
|
||||
var x:Number = offsetX + Math.sin(a*i)*radiusX;
|
||||
var y:Number = offsetY - Math.cos(a*i)*radiusY;
|
||||
|
||||
var cx:Number = x*cos - y*sin;
|
||||
var cy:Number = y*cos + x*sin;
|
||||
|
||||
res.push(new Point(cx, cy));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static public function rectangle(width:Number, height:Number, offsetX:Number = 0, offsetY:Number = 0):Array {
|
||||
var res:Array = new Array();
|
||||
var hw:Number = width/2;
|
||||
var hh:Number = height/2;
|
||||
res.push(new Point(offsetX - hw, offsetY - hh));
|
||||
res.push(new Point(offsetX + hw, offsetY - hh));
|
||||
res.push(new Point(offsetX + hw, offsetY + hh));
|
||||
res.push(new Point(offsetX - hw, offsetY + hh));
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
|
||||
public class Material {
|
||||
|
||||
// Прозрачность материала
|
||||
public var alpha:Number = 1;
|
||||
|
||||
// Метод наложения
|
||||
public var blendMode:String = "normal";
|
||||
|
||||
// Смещение глубины
|
||||
public var depthOffset:Number = 0;
|
||||
|
||||
// Клон
|
||||
public function clone():Material {
|
||||
var res:Material = new Material();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
protected function cloneParams(material:*):void {
|
||||
var mat:Material = Material(material);
|
||||
mat.alpha = alpha;
|
||||
mat.blendMode = blendMode;
|
||||
mat.depthOffset = depthOffset;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
public class ObjectMaterial extends Material {
|
||||
|
||||
// Массив точек хит-области
|
||||
public var hit:Array = new Array();
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:ObjectMaterial = new ObjectMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:ObjectMaterial = ObjectMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.hit = hit;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
public class PolygonMaterial extends Material {
|
||||
|
||||
// Двусторонний материал
|
||||
public var twoSided:Boolean;
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:PolygonMaterial = new PolygonMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:PolygonMaterial = PolygonMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.twoSided = twoSided;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.engine3d.Math3D;
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
import flash.display.BitmapData;
|
||||
import flash.geom.Point;
|
||||
|
||||
public class SpriteMaterial extends ObjectMaterial {
|
||||
|
||||
// Массив фаз
|
||||
private var states:Array = new Array();
|
||||
|
||||
// Сглаженность
|
||||
public var smoothing:Boolean;
|
||||
|
||||
// Цвет самосвечения материала
|
||||
public var selfIllumination:RGB = new RGB();
|
||||
|
||||
// Флаги искажения спрайта
|
||||
public var scale:Boolean;
|
||||
public var rotate:Boolean;
|
||||
|
||||
public function SpriteMaterial(smoothing:Boolean = false, scale:Boolean = false, rotate:Boolean = false) {
|
||||
this.smoothing = smoothing;
|
||||
this.scale = scale;
|
||||
this.rotate = rotate;
|
||||
}
|
||||
|
||||
public function setPhase(bitmapData:BitmapData, pivot:Point = null, state:String = "default", pitch:Number = 0, yaw:Number = 0):void {
|
||||
|
||||
// Добавляем состояние, если надо
|
||||
if (states[state] == undefined) {
|
||||
states[state] = new Array();
|
||||
}
|
||||
|
||||
states[state].push(new SpritePhase(bitmapData, pivot, pitch, yaw));
|
||||
}
|
||||
|
||||
// Возвращает фазу
|
||||
public function getPhase(state:String = "default", pitch:Number = 0, yaw:Number = 0):SpritePhase {
|
||||
var res:SpritePhase = null;
|
||||
|
||||
// Проверка на наличие состояние
|
||||
if (states[state] != undefined) {
|
||||
var phases:Array = states[state];
|
||||
var num:uint = phases.length;
|
||||
|
||||
var i:uint;
|
||||
var phase:SpritePhase;
|
||||
var resPitch:Number;
|
||||
var currentDiff:Number;
|
||||
|
||||
// Находим ближайший pitch
|
||||
var minDiff:Number = Number.MAX_VALUE;
|
||||
for (i = 0; i < num; i++) {
|
||||
phase = phases[i];
|
||||
currentDiff = Math.abs(phase.pitch - pitch);
|
||||
if (currentDiff < minDiff) {
|
||||
minDiff = currentDiff;
|
||||
resPitch = phase.pitch;
|
||||
}
|
||||
}
|
||||
|
||||
// Находим ближайший yaw и сохраняем результат
|
||||
minDiff = Number.MAX_VALUE;
|
||||
for (i = 0; i < num; i++) {
|
||||
phase = phases[i];
|
||||
if (phase.pitch == resPitch) {
|
||||
currentDiff = Math.abs(Math3D.deltaAngle(phase.yaw, yaw));
|
||||
if (currentDiff < minDiff) {
|
||||
minDiff = currentDiff;
|
||||
res = phase;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:SpriteMaterial = new SpriteMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:SpriteMaterial = SpriteMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.smoothing = smoothing;
|
||||
mat.selfIllumination = selfIllumination.clone();
|
||||
mat.scale = scale;
|
||||
mat.rotate = rotate;
|
||||
for (var state:String in states) {
|
||||
for (var i:uint = 0; i < states[state].length; i++) {
|
||||
var phase:SpritePhase = states[state][i];
|
||||
mat.setPhase(phase.bitmapData, phase.pivot.clone(), state, phase.pitch, phase.yaw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import flash.display.BitmapData;
|
||||
import flash.geom.Point;
|
||||
import com.alternativagame.engine3d.Matrix3D;
|
||||
import com.alternativagame.engine3d.Math3D;
|
||||
|
||||
public class SpritePhase {
|
||||
|
||||
// Битмапа фазы
|
||||
public var bitmapData:BitmapData;
|
||||
|
||||
// Точка привязки битмапы
|
||||
private var _pivot:Point;
|
||||
|
||||
private var _transform:Matrix3D;
|
||||
|
||||
private var _pitch:Number;
|
||||
private var _yaw:Number;
|
||||
|
||||
public function SpritePhase(bitmapData:BitmapData, pivot:Point, pitch:Number, yaw:Number) {
|
||||
this.bitmapData = bitmapData;
|
||||
_pivot = (pivot == null) ? new Point(bitmapData.width / 2, bitmapData.height / 2) : pivot;
|
||||
|
||||
// Проверка углов
|
||||
pitch = Math3D.limitAngle(pitch);
|
||||
if (pitch < 0) {
|
||||
if (pitch < -90) {
|
||||
pitch = -180 - pitch;
|
||||
yaw += 180;
|
||||
}
|
||||
} else {
|
||||
if (pitch > 90) {
|
||||
pitch = 180 - pitch;
|
||||
yaw += 180;
|
||||
}
|
||||
}
|
||||
yaw = Math3D.limitAngle(yaw);
|
||||
|
||||
// Сохраняем углы
|
||||
_pitch = pitch;
|
||||
_yaw = yaw;
|
||||
|
||||
// Формируем матрицу трансформации фазы
|
||||
_transform = new Matrix3D();
|
||||
Math3D.translateMatrix(_transform, -_pivot.x, 0, _pivot.y);
|
||||
|
||||
Math3D.rotateXMatrix(_transform, -_pitch);
|
||||
Math3D.rotateZMatrix(_transform, -_yaw);
|
||||
}
|
||||
|
||||
public function get transform():Matrix3D {
|
||||
return _transform;
|
||||
}
|
||||
|
||||
public function get pitch():Number {
|
||||
return _pitch;
|
||||
}
|
||||
|
||||
public function get yaw():Number {
|
||||
return _yaw;
|
||||
}
|
||||
|
||||
public function get pivot():Point {
|
||||
return _pivot;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
import flash.display.BitmapData;
|
||||
|
||||
public final class TextureMaterial extends FillMaterial {
|
||||
|
||||
// Текстура
|
||||
public var texture:BitmapData = null;
|
||||
|
||||
// Сглаженность
|
||||
public var smoothing:Boolean;
|
||||
|
||||
public function TextureMaterial(texture:BitmapData = null, smoothing:Boolean = true, color:RGB = null, twoSided:Boolean = false) {
|
||||
super(color, twoSided);
|
||||
this.texture = texture;
|
||||
this.smoothing = smoothing;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:TextureMaterial = new TextureMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:TextureMaterial = TextureMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.texture = texture;
|
||||
mat.smoothing = smoothing;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
public class WireMaterial extends PolygonMaterial {
|
||||
|
||||
// Цвет рёбер
|
||||
public var color:RGB;
|
||||
|
||||
// Толщина рёбер
|
||||
public var thickness:Number;
|
||||
|
||||
public function WireMaterial(color:RGB = null, thickness:Number = 1, twoSided:Boolean = false) {
|
||||
this.color = (color == null) ? new RGB(0xFFFFFF) : color;
|
||||
this.thickness = thickness;
|
||||
this.twoSided = twoSided;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:WireMaterial = new WireMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:WireMaterial = WireMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.color = color.clone();
|
||||
mat.thickness = thickness;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user