137 lines
4.7 KiB
TypeScript
137 lines
4.7 KiB
TypeScript
import { IAssetAnimationAvatar, IAvatarDataContainer } from '../../../api';
|
|
import { AdjustmentFilter } from '../../../pixi-proxy';
|
|
|
|
export class AvatarDataContainer implements IAvatarDataContainer
|
|
{
|
|
private _ink: number;
|
|
private _foreGround: number;
|
|
private _backGround: number;
|
|
private _colorTransform: AdjustmentFilter;
|
|
private _rgb: number;
|
|
private _r: number;
|
|
private _g: number;
|
|
private _b: number;
|
|
private _redMultiplier: number;
|
|
private _greenMultiplier: number;
|
|
private _blueMultiplier: number;
|
|
private _alphaMultiplier: number;
|
|
private _colorMap: Map<string, number[]>;
|
|
private _paletteIsGrayscale: boolean;
|
|
|
|
constructor(k: IAssetAnimationAvatar)
|
|
{
|
|
this._ink = k.ink;
|
|
|
|
let foreground = k.foreground;
|
|
let background = k.background;
|
|
|
|
foreground = foreground.replace('#', '');
|
|
background = background.replace('#', '');
|
|
|
|
this._foreGround = parseInt(foreground, 16);
|
|
this._backGround = parseInt(background, 16);
|
|
this._colorTransform = null;
|
|
this._rgb = parseInt(foreground, 16);
|
|
this._r = ((this._rgb >> 16) & 0xFF);
|
|
this._g = ((this._rgb >> 8) & 0xFF);
|
|
this._b = ((this._rgb >> 0) & 0xFF);
|
|
this._redMultiplier = ((this._r / 0xFF) * 1);
|
|
this._greenMultiplier = ((this._g / 0xFF) * 1);
|
|
this._blueMultiplier = ((this._b / 0xFF) * 1);
|
|
this._alphaMultiplier = 1;
|
|
this._paletteIsGrayscale = true;
|
|
|
|
if(this._ink === 37)
|
|
{
|
|
this._alphaMultiplier = 0.5;
|
|
this._paletteIsGrayscale = false;
|
|
}
|
|
|
|
this._colorTransform = new AdjustmentFilter({ red: (this._r / 255), green: (this._g / 255), blue: (this._b / 255), alpha: this._alphaMultiplier });
|
|
this._colorMap = this.generatePaletteMapForGrayscale(this._backGround, this._foreGround);
|
|
}
|
|
|
|
public get ink(): number
|
|
{
|
|
return this._ink;
|
|
}
|
|
|
|
public get colorTransform(): AdjustmentFilter
|
|
{
|
|
return this._colorTransform;
|
|
}
|
|
|
|
public get reds(): number[]
|
|
{
|
|
return this._colorMap.get('reds');
|
|
}
|
|
|
|
public get greens(): number[]
|
|
{
|
|
return this._colorMap.get('greens');
|
|
}
|
|
|
|
public get blues(): number[]
|
|
{
|
|
return this._colorMap.get('blues');
|
|
}
|
|
|
|
public get alphas(): number[]
|
|
{
|
|
return this._colorMap.get('alphas');
|
|
}
|
|
|
|
public get paletteIsGrayscale(): boolean
|
|
{
|
|
return this._paletteIsGrayscale;
|
|
}
|
|
|
|
private generatePaletteMapForGrayscale(background: number, foreground: number): Map<string, number[]>
|
|
{
|
|
const alphaBackground = ((background >> 24) & 0xFF);
|
|
const redBackground = ((background >> 16) & 0xFF);
|
|
const greenBackground = ((background >> 8) & 0xFF);
|
|
const blueBackground = ((background >> 0) & 0xFF);
|
|
const alphaForeground = ((foreground >> 24) & 0xFF);
|
|
const redForeground = ((foreground >> 16) & 0xFF);
|
|
const greenForeground = ((foreground >> 8) & 0xFF);
|
|
const blueForeground = ((foreground >> 0) & 0xFF);
|
|
const alphaDifference = ((alphaForeground - alphaBackground) / 0xFF);
|
|
const redDifference = ((redForeground - redBackground) / 0xFF);
|
|
const greenDifference = ((greenForeground - greenBackground) / 0xFF);
|
|
const blueDifference = ((blueForeground - blueBackground) / 0xFF);
|
|
const _local_15: Map<string, number[]> = new Map();
|
|
const _local_16: number[] = [];
|
|
const _local_17: number[] = [];
|
|
const _local_18: number[] = [];
|
|
const _local_19: number[] = [];
|
|
let _local_20 = alphaBackground;
|
|
let _local_21 = redBackground;
|
|
let _local_22 = greenBackground;
|
|
let _local_23 = blueBackground;
|
|
|
|
for(let i = 0; i < 256; i++)
|
|
{
|
|
if((((_local_21 == redBackground) && (_local_22 == greenBackground)) && (_local_23 == blueBackground)))
|
|
{
|
|
_local_20 = 0;
|
|
}
|
|
_local_20 = (_local_20 + alphaDifference);
|
|
_local_21 = (_local_21 + redDifference);
|
|
_local_22 = (_local_22 + greenDifference);
|
|
_local_23 = (_local_23 + blueDifference);
|
|
_local_19.push((_local_20 << 24));
|
|
_local_16.push(((((_local_20 << 24) | (_local_21 << 16)) | (_local_22 << 8)) | _local_23));
|
|
_local_17.push(((((_local_20 << 24) | (_local_21 << 16)) | (_local_22 << 8)) | _local_23));
|
|
_local_18.push(((((_local_20 << 24) | (_local_21 << 16)) | (_local_22 << 8)) | _local_23));
|
|
}
|
|
|
|
_local_15.set('alphas', _local_16);
|
|
_local_15.set('reds', _local_16);
|
|
_local_15.set('greens', _local_17);
|
|
_local_15.set('blues', _local_18);
|
|
|
|
return _local_15;
|
|
}
|
|
}
|