nitro/libs/renderer/src/nitro/avatar/AvatarStructure.ts

583 lines
16 KiB
TypeScript

import {Point} from "@pixi/math";
import {
AvatarDirectionAngle,
IActionDefinition,
IActiveActionData,
IAssetAnimation,
IAssetManager,
IAvatarFigureContainer,
IAvatarImage,
IAvatarRenderManager,
IFigureData,
IFigurePartSet,
IPartColor,
IStructureData,
} from "../../api";
import {EventDispatcher} from "../../core";
import {AvatarImagePartContainer} from "./AvatarImagePartContainer";
import {AvatarRenderManager} from "./AvatarRenderManager";
import {ActionDefinition, AvatarActionManager} from "./actions";
import {Animation, AnimationManager, AvatarAnimationLayerData} from "./animation";
import {AvatarModelGeometry} from "./geometry";
import {AnimationAction, AvatarAnimationData, AvatarAnimationFrame, AvatarCanvas, FigureSetData, PartSetsData} from "./structure";
export class AvatarStructure extends EventDispatcher {
private _renderManager: AvatarRenderManager;
private _geometry: AvatarModelGeometry;
private _figureData: FigureSetData;
private _partSetsData: PartSetsData;
private _animationData: AvatarAnimationData;
private _animationManager: AnimationManager;
private _mandatorySetTypeIds: {[index: string]: {[index: number]: string[]}};
private _actionManager: AvatarActionManager;
private _defaultAction: IActionDefinition;
constructor(renderManager: AvatarRenderManager) {
super();
this._renderManager = renderManager;
this._geometry = null;
this._figureData = new FigureSetData();
this._partSetsData = new PartSetsData();
this._animationData = new AvatarAnimationData();
this._animationManager = new AnimationManager();
this._mandatorySetTypeIds = {};
this._actionManager = null;
this._defaultAction = null;
}
public init(): void {}
public override dispose(): void {
if (this.disposed) return;
super.dispose();
this._renderManager = null;
this._figureData = null;
this._partSetsData = null;
this._animationData = null;
this._mandatorySetTypeIds = null;
}
public initGeometry(k: any): void {
if (!k) return;
this._geometry = new AvatarModelGeometry(k);
}
public initActions(k: IAssetManager, _arg_2: any): void {
if (!_arg_2) return;
this._actionManager = new AvatarActionManager(k, _arg_2);
this._defaultAction = this._actionManager.getDefaultAction();
}
public updateActions(data: any): void {
this._actionManager.updateActions(data);
this._defaultAction = this._actionManager.getDefaultAction();
}
public initPartSets(k: any): boolean {
if (!k) return false;
if (this._partSetsData.parse(k)) {
this._partSetsData.getPartDefinition("ri").appendToFigure = true;
this._partSetsData.getPartDefinition("li").appendToFigure = true;
return true;
}
return false;
}
public initAnimation(k: any): boolean {
if (!k) return false;
return this._animationData.parse(k);
}
public initFigureData(k: IFigureData): boolean {
if (!k) return false;
return this._figureData.parse(k);
}
public injectFigureData(data: IFigureData): void {
this._figureData.injectJSON(data);
}
public registerAnimations(k: IAssetManager, _arg_2: string = "fx", _arg_3: number = 200): void {
let index = 0;
while (index < _arg_3) {
const collection = k.getCollection(_arg_2 + index);
if (collection) {
const animationData = collection.data;
this._animationManager.registerAnimation(this, animationData.animations);
}
index++;
}
}
public registerAnimation(data: {[index: string]: IAssetAnimation}): void {
this._animationManager.registerAnimation(this, data);
}
public getPartColor(k: IAvatarFigureContainer, _arg_2: string, _arg_3: number = 0): IPartColor {
const _local_4 = k.getPartColorIds(_arg_2);
if (!_local_4 || _local_4.length < _arg_3) return null;
const _local_5 = this._figureData.getSetType(_arg_2);
if (_local_5 == null) return null;
const _local_6 = this._figureData.getPalette(_local_5.paletteID);
if (!_local_6) return null;
return _local_6.getColor(_local_4[_arg_3]);
}
public getBodyPartData(animation: string, frameCount: number, spriteId: string): AvatarAnimationLayerData {
return this._animationManager.getLayerData(animation, frameCount, spriteId) as AvatarAnimationLayerData;
}
public getAnimation(k: string): Animation {
return this._animationManager.getAnimation(k) as Animation;
}
public getActionDefinition(k: string): ActionDefinition {
return this._actionManager.getActionDefinition(k);
}
public getActionDefinitionWithState(k: string): ActionDefinition {
return this._actionManager.getActionDefinitionWithState(k);
}
public isMainAvatarSet(k: string): boolean {
return this._geometry.isMainAvatarSet(k);
}
public sortActions(k: IActiveActionData[]): IActiveActionData[] {
return this._actionManager.sortActions(k);
}
public maxFrames(k: IActiveActionData[]): number {
let _local_2 = 0;
for (const _local_3 of k) {
_local_2 = Math.max(_local_2, this._animationData.getFrameCount(_local_3.definition));
}
return _local_2;
}
public getMandatorySetTypeIds(k: string, _arg_2: number): string[] {
if (!this._mandatorySetTypeIds[k]) {
this._mandatorySetTypeIds[k] = [];
}
if (this._mandatorySetTypeIds[k][_arg_2]) {
return this._mandatorySetTypeIds[k][_arg_2];
}
this._mandatorySetTypeIds[k][_arg_2] = this._figureData.getMandatorySetTypeIds(k, _arg_2);
return this._mandatorySetTypeIds[k][_arg_2];
}
public getDefaultPartSet(k: string, _arg_2: string): IFigurePartSet {
return this._figureData.getDefaultPartSet(k, _arg_2);
}
public getCanvasOffsets(k: IActiveActionData[], _arg_2: string, _arg_3: number): number[] {
return this._actionManager.getCanvasOffsets(k, _arg_2, _arg_3);
}
public getCanvas(k: string, _arg_2: string): AvatarCanvas {
return this._geometry.getCanvas(k, _arg_2);
}
public removeDynamicItems(k: IAvatarImage): void {
this._geometry.removeDynamicItems(k);
}
public getActiveBodyPartIds(k: IActiveActionData, _arg_2: IAvatarImage): string[] {
let _local_3: string[] = [];
const _local_4: string[] = [];
const _local_5 = k.definition.geometryType;
if (k.definition.isAnimation) {
const _local_7 = k.definition.state + "." + k.actionParameter;
const _local_8 = this._animationManager.getAnimation(_local_7);
if (_local_8) {
_local_3 = _local_8.getAnimatedBodyPartIds(0, k.overridingAction);
if (_local_8.hasAddData()) {
const _local_11 = {
id: "",
x: 0,
y: 0,
z: 0,
radius: 0.01,
nx: 0,
ny: 0,
nz: -1,
double: 1,
};
const _local_12 = {
setType: "",
};
for (const _local_13 of _local_8.addData) {
const _local_6 = this._geometry.getBodyPart(_local_5, _local_13.align);
if (_local_6) {
_local_11.id = _local_13.id;
_local_6.addPart(_local_11, _arg_2);
_local_12.setType = _local_13.id;
const _local_10 = this._partSetsData.addPartDefinition(_local_12);
_local_10.appendToFigure = true;
if (_local_13.base === "") _local_10.staticId = 1;
if (_local_4.indexOf(_local_6.id) === -1) _local_4.push(_local_6.id);
}
}
}
}
for (const _local_9 of _local_3) {
const _local_6 = this._geometry.getBodyPart(_local_5, _local_9);
if (_local_6 && _local_4.indexOf(_local_6.id) === -1) _local_4.push(_local_6.id);
}
} else {
_local_3 = this._partSetsData.getActiveParts(k.definition);
for (const _local_14 of _local_3) {
const _local_6 = this._geometry.getBodyPartOfItem(_local_5, _local_14, _arg_2);
if (_local_6 && _local_4.indexOf(_local_6.id) === -1) _local_4.push(_local_6.id);
}
}
return _local_4;
}
public getBodyPartsUnordered(k: string): string[] {
return this._geometry.getBodyPartIdsInAvatarSet(k);
}
public getBodyParts(k: string, _arg_2: string, _arg_3: number): string[] {
const _local_4 = AvatarDirectionAngle.DIRECTION_TO_ANGLE[_arg_3];
return this._geometry.getBodyPartsAtAngle(k, _local_4, _arg_2);
}
public getFrameBodyPartOffset(k: IActiveActionData, _arg_2: number, _arg_3: number, _arg_4: string): Point {
const _local_5 = this._animationData.getAction(k.definition);
if (_local_5) return _local_5.getFrameBodyPartOffset(_arg_2, _arg_3, _arg_4);
return AnimationAction.DEFAULT_OFFSET;
}
public getParts(
k: string,
_arg_2: IAvatarFigureContainer,
_arg_3: IActiveActionData,
_arg_4: string,
_arg_5: number,
removes: string[],
_arg_7: IAvatarImage,
_arg_8: Map<string, string> = null
): AvatarImagePartContainer[] {
const _local_10: Animation = null;
let _local_34: IActionDefinition = null;
let _local_20: AvatarAnimationFrame[] = [];
let _local_36: IPartColor = null;
if (!_arg_3 == null) return [];
const _local_9 = this._partSetsData.getActiveParts(_arg_3.definition);
const _local_11: AvatarImagePartContainer[] = [];
let _local_14: any[] = [0];
const _local_15 = this._animationData.getAction(_arg_3.definition);
if (_arg_3.definition.isAnimation) {
const _local_24 = _arg_3.definition.state + "." + _arg_3.actionParameter;
const _local_10 = this._animationManager.getAnimation(_local_24);
if (_local_10) {
_local_14 = this.getPopulatedArray(_local_10.frameCount(_arg_3.overridingAction));
for (const _local_25 of _local_10.getAnimatedBodyPartIds(0, _arg_3.overridingAction)) {
if (_local_25 === k) {
const _local_26 = this._geometry.getBodyPart(_arg_4, _local_25);
if (_local_26) {
for (const _local_27 of _local_26.getDynamicParts(_arg_7)) {
_local_9.push(_local_27.id);
}
}
}
}
}
}
const _local_16 = this._geometry.getParts(_arg_4, k, _arg_5, _local_9, _arg_7);
const _local_21 = _arg_2.getPartTypeIds();
for (const _local_17 of _local_21) {
if (_arg_8) {
if (_arg_8.get(_local_17)) continue;
}
const _local_28 = _arg_2.getPartSetId(_local_17);
const _local_29 = _arg_2.getPartColorIds(_local_17);
const _local_30 = this._figureData.getSetType(_local_17);
if (_local_30) {
const _local_31 = this._figureData.getPalette(_local_30.paletteID);
if (_local_31) {
const _local_32 = _local_30.getPartSet(_local_28);
if (_local_32) {
removes = removes.concat(_local_32.hiddenLayers);
for (const _local_33 of _local_32.parts) {
if (_local_16.indexOf(_local_33.type) > -1) {
if (_local_15) {
const _local_19 = _local_15.getPart(_local_33.type);
if (_local_19) {
_local_20 = _local_19.frames;
} else {
_local_20 = _local_14;
}
} else {
_local_20 = _local_14;
}
_local_34 = _arg_3.definition;
if (_local_9.indexOf(_local_33.type) === -1) _local_34 = this._defaultAction;
const _local_13 = this._partSetsData.getPartDefinition(_local_33.type);
let _local_35 = !_local_13 ? _local_33.type : _local_13.flippedSetType;
if (!_local_35 || _local_35 === "") _local_35 = _local_33.type;
if (_local_29 && _local_29.length > _local_33.colorLayerIndex - 1) {
_local_36 = _local_31.getColor(_local_29[_local_33.colorLayerIndex - 1]);
}
const _local_37 = _local_33.colorLayerIndex > 0;
const _local_18 = new AvatarImagePartContainer(
k,
_local_33.type,
_local_33.id.toString(),
_local_36,
_local_20,
_local_34,
_local_37,
_local_33.paletteMap,
_local_35
);
_local_11.push(_local_18);
}
}
}
}
}
}
const _local_22: AvatarImagePartContainer[] = [];
for (const _local_12 of _local_16) {
let _local_39: IPartColor = null;
let _local_38 = false;
const _local_40 = _arg_8 && _arg_8.get(_local_12);
for (const _local_23 of _local_11) {
if (_local_23.partType === _local_12) {
if (_local_40) {
_local_39 = _local_23.color;
} else {
_local_38 = true;
if (removes.indexOf(_local_12) === -1) _local_22.push(_local_23);
}
}
}
if (!_local_38) {
if (_local_40) {
const _local_41 = _arg_8.get(_local_12);
let _local_42 = 0;
let _local_43 = 0;
while (_local_43 < _local_41.length) {
_local_42 = _local_42 + _local_41.charCodeAt(_local_43);
_local_43++;
}
if (_local_15) {
const _local_19 = _local_15.getPart(_local_12);
if (_local_19) {
_local_20 = _local_19.frames;
} else {
_local_20 = _local_14;
}
} else {
_local_20 = _local_14;
}
const _local_18 = new AvatarImagePartContainer(
k,
_local_12,
_local_41,
_local_39,
_local_20,
_arg_3.definition,
!(_local_39 == null),
-1,
_local_12,
false,
1
);
_local_22.push(_local_18);
} else {
if (_local_9.indexOf(_local_12) > -1) {
const _local_44 = this._geometry.getBodyPartOfItem(_arg_4, _local_12, _arg_7);
if (k !== _local_44.id) {
//
} else {
const _local_13 = this._partSetsData.getPartDefinition(_local_12);
let _local_45 = false;
let _local_46 = 1;
if (_local_13.appendToFigure) {
let _local_47 = "1";
if (_arg_3.actionParameter !== "") {
_local_47 = _arg_3.actionParameter;
}
if (_local_13.hasStaticId()) {
_local_47 = _local_13.staticId.toString();
}
if (_local_10 != null) {
const _local_48 = _local_10.getAddData(_local_12);
if (_local_48) {
_local_45 = _local_48.isBlended;
_local_46 = _local_48.blend;
}
}
if (_local_15) {
const _local_19 = _local_15.getPart(_local_12);
if (_local_19) {
_local_20 = _local_19.frames;
} else {
_local_20 = _local_14;
}
} else {
_local_20 = _local_14;
}
const _local_18 = new AvatarImagePartContainer(
k,
_local_12,
_local_47,
null,
_local_20,
_arg_3.definition,
false,
-1,
_local_12,
_local_45,
_local_46
);
_local_22.push(_local_18);
}
}
}
}
}
}
return _local_22;
}
private getPopulatedArray(k: number): number[] {
const _local_2: number[] = [];
let index = 0;
while (index < k) {
_local_2.push(index);
index++;
}
return _local_2;
}
public getItemIds(): string[] {
if (this._actionManager) {
const k = this._actionManager.getActionDefinition("CarryItem").params;
const _local_2 = [];
for (const _local_3 of k.values()) _local_2.push(_local_3);
return _local_2;
}
return [];
}
public get renderManager(): IAvatarRenderManager {
return this._renderManager;
}
public get figureData(): IStructureData {
return this._figureData;
}
public get partData(): PartSetsData {
return this._partSetsData;
}
public get animationManager(): AnimationManager {
return this._animationManager;
}
}