mirror of
https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
synced 2025-10-26 09:49:07 -07:00
105 lines
3.1 KiB
Plaintext
105 lines
3.1 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
} |