Compare commits

...

8 Commits

Author SHA1 Message Date
Divinezx eadb181d30
Merge branch 'billsonnn:v2' into v2 2024-03-28 00:49:46 +00:00
billsonnn d992214c10 Update loading things 2024-03-26 22:43:29 -04:00
billsonnn d372ecd599 Fix badge loading 2024-03-26 22:43:17 -04:00
billsonnn 38a9c746bf Update config 2024-03-26 22:43:01 -04:00
billsonnn e96869d7eb Fix pet palettes 2024-03-26 22:10:07 -04:00
billsonnn fe20138abf More plane updates 2024-03-26 21:27:28 -04:00
billsonnn 2ef9d01fa4 Comment out tint 2024-03-26 21:08:36 -04:00
billsonnn a445f91fdc Updates 2024-03-26 20:54:29 -04:00
18 changed files with 95 additions and 82 deletions

View File

@ -16,7 +16,7 @@ export interface IAvatarImage extends IDisposable
getLayerData(_arg_1: ISpriteDataContainer): IAnimationLayerData;
getImage(setType: string, hightlight: boolean, scale?: number, cache?: boolean): Texture;
getImageAsSprite(setType: string, scale?: number): Sprite;
getCroppedImage(setType: string, scale?: number): Promise<HTMLImageElement>;
getCroppedImageUrl(setType: string, scale?: number): Promise<string>;
getAsset(_arg_1: string): IGraphicAsset;
getDirection(): number;
getFigure(): IAvatarFigureContainer;

View File

@ -16,7 +16,8 @@
"@nitrots/api": "1.0.0",
"@nitrots/eslint-config": "1.0.0",
"@nitrots/utils": "1.0.0",
"pixi.js": "^8.0.4"
"pixi.js": "^8.0.4",
"@pixi/gif": "^3.0.0"
},
"devDependencies": {
"typescript": "~5.4.2"

View File

@ -1,5 +1,6 @@
import { IAssetData, IAssetManager, IGraphicAsset, IGraphicAssetCollection } from '@nitrots/api';
import { ArrayBufferToBase64, NitroBundle, NitroLogger } from '@nitrots/utils';
import { NitroBundle, NitroLogger } from '@nitrots/utils';
import '@pixi/gif';
import { Assets, Spritesheet, SpritesheetData, Texture } from 'pixi.js';
import { GraphicAssetCollection } from './GraphicAssetCollection';
@ -100,6 +101,15 @@ export class AssetManager implements IAssetManager
{
if(!url || !url.length) return false;
if(url.endsWith('.png') || url.endsWith('.jpg') || url.endsWith('.jpeg') || url.endsWith('.gif'))
{
const texture = await Assets.load<Texture>(url);
this.setTexture(url, texture);
return true;
}
const response = await fetch(url);
if(response.status !== 200) return false;
@ -117,16 +127,6 @@ export class AssetManager implements IAssetManager
await this.processAsset(nitroBundle.texture, nitroBundle.jsonFile as IAssetData);
break;
}
case 'image/png':
case 'image/jpeg':
case 'image/gif': {
const buffer = await response.arrayBuffer();
const base64 = ArrayBufferToBase64(buffer);
const texture = await Assets.load<Texture>(`data:${ contentType };base64,${ base64 }`);
this.setTexture(url, texture);
break;
}
}
return true;

View File

@ -1,5 +1,5 @@
import { IGraphicAssetPalette } from '@nitrots/api';
import { TextureUtils } from '@nitrots/utils';
import { GetRenderer } from '@nitrots/utils';
import { Texture } from 'pixi.js';
export class GraphicAssetPalette implements IGraphicAssetPalette
@ -20,18 +20,13 @@ export class GraphicAssetPalette implements IGraphicAssetPalette
public applyPalette(texture: Texture): Texture
{
const pixelOutput = TextureUtils.getPixels(texture);
const pixels = pixelOutput?.pixels;
if(!pixels) return texture;
const canvas = document.createElement('canvas');
const canvas = GetRenderer().texture.generateCanvas(texture);
const ctx = canvas.getContext('2d');
const imageData = ctx.createImageData(texture.width, texture.height);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
for(let i = 0; i < pixels.length; i += 4)
for(let i = 0; i < imageData.data.length; i += 4)
{
let paletteColor = this._palette[pixels[i + 1]];
let paletteColor = this._palette[imageData.data[i + 1]];
if(paletteColor === undefined) paletteColor = [0, 0, 0];
@ -42,7 +37,12 @@ export class GraphicAssetPalette implements IGraphicAssetPalette
ctx.putImageData(imageData, 0, 0);
return Texture.from(canvas);
const newTexture = Texture.from(canvas);
//@ts-ignore
newTexture.source.hitMap = imageData.data;
return newTexture;
}
public get primaryColor(): number

View File

@ -1,5 +1,5 @@
import { AvatarAction, AvatarDirectionAngle, AvatarScaleType, AvatarSetType, IActionDefinition, IActiveActionData, IAdvancedMap, IAnimationLayerData, IAvatarDataContainer, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IGraphicAsset, IPartColor, ISpriteDataContainer } from '@nitrots/api';
import { AdvancedMap, GetTickerTime, TextureUtils } from '@nitrots/utils';
import { AvatarAction, AvatarDirectionAngle, AvatarScaleType, AvatarSetType, IActionDefinition, IActiveActionData, IAnimationLayerData, IAvatarDataContainer, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IGraphicAsset, IPartColor, ISpriteDataContainer } from '@nitrots/api';
import { GetRenderer, GetTickerTime, TextureUtils } from '@nitrots/utils';
import { ColorMatrixFilter, Container, Rectangle, RenderTexture, Sprite, Texture } from 'pixi.js';
import { AvatarFigureContainer } from './AvatarFigureContainer';
import { AvatarStructure } from './AvatarStructure';
@ -46,8 +46,6 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
private _sortedActions: IActiveActionData[];
private _lastActionsString: string;
private _currentActionsString: string;
private _fullImageCache: IAdvancedMap<string, Texture>;
private _fullImageCacheSize: number = 5;
protected _isCachedImage: boolean = false;
private _useFullImageCache: boolean = false;
private _effectIdInUse: number = -1;
@ -86,7 +84,6 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
this._defaultAction = new ActiveActionData(AvatarAction.POSTURE_STAND);
this._defaultAction.definition = this._structure.getActionDefinition(AvatarImage.DEFAULT_ACTION);
this.resetActions();
this._fullImageCache = new AdvancedMap();
this._animationFrameCount = 0;
}
@ -121,13 +118,6 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
this._cache = null;
}
if(this._fullImageCache)
{
for(const k of this._fullImageCache.getValues()) (k && k.destroy());
this._fullImageCache = null;
}
this._image = null;
this._canvasOffsets = null;
this._disposed = true;
@ -534,7 +524,7 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
return container;
}
public async getCroppedImage(setType: string, scale: number = 1): Promise<HTMLImageElement>
public async getCroppedImageUrl(setType: string, scale: number = 1): Promise<string>
{
if(!this._mainAction) return null;
@ -547,6 +537,13 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
const setTypes = this.getBodyParts(setType, this._mainAction.definition.geometryType, this._mainDirection);
const container = new Container();
/* const sprite = new Sprite(Texture.EMPTY);
sprite.width = avatarCanvas.width;
sprite.height = avatarCanvas.height;
container.addChild(sprite); */
let partCount = (setTypes.length - 1);
while(partCount >= 0)
@ -593,10 +590,18 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
partCount--;
}
return await TextureUtils.generateImage(TextureUtils.generateTexture({
const texture = TextureUtils.generateTexture({
target: container,
frame: new Rectangle(0, 0, avatarCanvas.width, avatarCanvas.height)
}));
});
let canvas = GetRenderer().texture.generateCanvas(texture);
const base64 = canvas.toDataURL('image/png');
canvas = null;
texture.destroy(true);
return base64;
}
public getAsset(k: string): IGraphicAsset

View File

@ -157,8 +157,7 @@ export class ConfigurationManager implements IConfigurationManager
public getDefaultConfig(): { [index: string]: any }
{
//@ts-ignore
return NitroConfig as { [index: string]: any };
return window.NitroConfig;
}
public get definitions(): Map<string, unknown>

View File

@ -42,6 +42,8 @@ export class RoomContentLoader implements IRoomContentLoader
this.processFurnitureData(GetSessionDataManager().getAllFurnitureData());
for(const [index, name] of GetConfiguration().getValue<string[]>('pet.types').entries()) this._pets[name] = index;
await Promise.all(RoomContentLoader.MANDATORY_LIBRARIES.map(value => this.downloadAsset(value)));
}
public processFurnitureData(furnitureData: IFurnitureData[]): void

View File

@ -4,7 +4,6 @@ import { NitroLogger } from '@nitrots/utils';
import { GetRoomContentLoader } from './GetRoomContentLoader';
import { GetRoomObjectLogicFactory } from './GetRoomObjectLogicFactory';
import { GetRoomObjectVisualizationFactory } from './GetRoomObjectVisualizationFactory';
import { RoomContentLoader } from './RoomContentLoader';
import { RoomInstance } from './RoomInstance';
import { RoomObjectManager } from './RoomObjectManager';
@ -30,10 +29,6 @@ export class RoomManager implements IRoomManager, IRoomInstanceContainer
GetEventDispatcher().addEventListener(RoomContentLoadedEvent.RCLE_SUCCESS, this.onRoomContentLoadedEvent);
GetEventDispatcher().addEventListener(RoomContentLoadedEvent.RCLE_FAILURE, this.onRoomContentLoadedEvent);
GetEventDispatcher().addEventListener(RoomContentLoadedEvent.RCLE_CANCEL, this.onRoomContentLoadedEvent);
const promises = RoomContentLoader.MANDATORY_LIBRARIES.map(value => GetRoomContentLoader().downloadAsset(value));
await Promise.all(promises);
}
public getRoomInstance(roomId: string): IRoomInstance

View File

@ -446,7 +446,7 @@ export class RoomPreviewer
backgroundSprite.width = width;
backgroundSprite.height = height;
backgroundSprite.tint = this._backgroundColor;
//backgroundSprite.tint = this._backgroundColor;
}
this._roomEngine.setRoomInstanceRenderingCanvasMask(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, true);
@ -494,7 +494,7 @@ export class RoomPreviewer
public updatePreviewObjectBoundingRectangle(point: Point = null): void
{
if(!point) point = new Point(0, 0);
const objectBounds = this._roomEngine.getRoomObjectBoundingRectangle(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory, RoomPreviewer.PREVIEW_CANVAS_ID);
if(objectBounds && point)

View File

@ -1,7 +1,7 @@
import { IAssetPlaneVisualizationLayer, IAssetRoomVisualizationData, IRoomGeometry, IRoomPlane, IVector3D } from '@nitrots/api';
import { GetAssetManager } from '@nitrots/assets';
import { GetRenderer, PlaneMaskFilter, TextureUtils, Vector3d } from '@nitrots/utils';
import { Container, Matrix, Point, Sprite, Texture, TilingSprite } from 'pixi.js';
import { Container, Filter, Matrix, Point, Sprite, Texture, TilingSprite } from 'pixi.js';
import { RoomGeometry } from '../../../utils';
import { RoomPlaneBitmapMask } from './RoomPlaneBitmapMask';
import { RoomPlaneRectangleMask } from './RoomPlaneRectangleMask';
@ -13,6 +13,7 @@ export class RoomPlane implements IRoomPlane
public static HORIZONTAL_ANGLE_DEFAULT: number = 45;
public static VERTICAL_ANGLE_DEFAULT: number = 30;
public static PLANE_GEOMETRY: IRoomGeometry = new RoomGeometry(64, new Vector3d(RoomPlane.HORIZONTAL_ANGLE_DEFAULT, RoomPlane.VERTICAL_ANGLE_DEFAULT), new Vector3d(-10, 0, 0));
private static LANDSCAPE_COLOR: number = 0x0082F0;
public static TYPE_UNDEFINED: number = 0;
public static TYPE_WALL: number = 1;
@ -59,6 +60,7 @@ export class RoomPlane implements IRoomPlane
private _planeSprite: TilingSprite = null;
private _planeTexture: Texture = null;
private _maskFilter: Filter = null;
constructor(origin: IVector3D, location: IVector3D, leftSide: IVector3D, rightSide: IVector3D, type: number, usesMask: boolean, secondaryNormals: IVector3D[], randomSeed: number, textureOffsetX: number = 0, textureOffsetY: number = 0, textureMaxX: number = 0, textureMaxY: number = 0)
{
@ -120,13 +122,16 @@ export class RoomPlane implements IRoomPlane
this._disposed = true;
}
public update(geometry: IRoomGeometry, timeSinceStartMs: number): boolean
public update(geometry: IRoomGeometry, timeSinceStartMs: number, needsUpdate: boolean = false): boolean
{
if(!geometry || this._disposed) return false;
let needsUpdate = false;
if(this._geometryUpdateId !== geometry.updateId)
{
this._geometryUpdateId = geometry.updateId;
if(this._geometryUpdateId !== geometry.updateId) needsUpdate = true;
needsUpdate = true;
}
if(!needsUpdate || !this._canBeVisible)
{
@ -187,7 +192,6 @@ export class RoomPlane implements IRoomPlane
this._relativeDepth = relativeDepth;
this._isVisible = true;
this._geometryUpdateId = geometry.updateId;
Randomizer.setSeed(this._randomSeed);
@ -195,17 +199,6 @@ export class RoomPlane implements IRoomPlane
let height = (this._rightSide.length * geometry.scale);
const normal = geometry.getCoordinatePosition(this._normal);
const getRandomColor = () =>
{
const letters = '0123456789ABCDEF';
let color = '0x';
for(let i = 0; i < 6; i++)
{
color += letters[Math.floor(Math.random() * 16)];
}
return parseInt(color, 16);
};
const getTextureAndColorForPlane = (planeId: string, planeType: number) =>
{
const dataType: keyof IAssetRoomVisualizationData = (planeType === RoomPlane.TYPE_FLOOR) ? 'floorData' : (planeType === RoomPlane.TYPE_WALL) ? 'wallData' : 'landscapeData';
@ -316,7 +309,7 @@ export class RoomPlane implements IRoomPlane
x: renderOffsetX,
y: renderOffsetY
},
tint: getRandomColor()
tint: RoomPlane.LANDSCAPE_COLOR
});
break;
}
@ -549,9 +542,9 @@ export class RoomPlane implements IRoomPlane
this._maskChanged = false;
container.filterArea = container.getBounds().rectangle;
if(!this._maskFilter) this._maskFilter = new PlaneMaskFilter({});
container.filters = [ new PlaneMaskFilter({}) ];
if(!container.filters) container.filters = [ this._maskFilter ];
return true;
}

View File

@ -141,7 +141,7 @@ export class RoomVisualization extends RoomObjectSpriteVisualization implements
if(this.updatePlaneTexturesAndVisibilities(objectModel)) needsUpdate = true;
if(this.updatePlanes(geometry, geometryUpdate, time)) needsUpdate = true;
if(this.updatePlanes(geometry, geometryUpdate, time, needsUpdate)) needsUpdate = true;
if(needsUpdate)
{
@ -576,7 +576,7 @@ export class RoomVisualization extends RoomObjectSpriteVisualization implements
return true;
}
protected updatePlanes(geometry: IRoomGeometry, geometryUpdate: boolean, timeSinceStartMs: number): boolean
protected updatePlanes(geometry: IRoomGeometry, geometryUpdate: boolean, timeSinceStartMs: number, needsUpdate: boolean = false): boolean
{
if(!geometry || !this.object) return false;
@ -614,7 +614,7 @@ export class RoomVisualization extends RoomObjectSpriteVisualization implements
{
sprite.id = plane.uniqueId;
if(plane.update(geometry, timeSinceStartMs))
if(plane.update(geometry, timeSinceStartMs, needsUpdate))
{
if(plane.visible)
{

View File

@ -155,7 +155,7 @@ export class PlaneMaskManager
if(!texture) return true;
const point = new Point(Math.round(posX) + asset.offsetX, Math.round(posY) + asset.offsetY);
const point = new Point((posX + asset.offsetX), (posY + asset.offsetY));
const matrix = new Matrix();

View File

@ -1,5 +1,5 @@
import { AlphaTolerance } from '@nitrots/api';
import { TextureUtils } from '@nitrots/utils';
import { GetRenderer } from '@nitrots/utils';
import { Point, Sprite, Texture, TextureSource } from 'pixi.js';
export class ExtendedSprite extends Sprite
@ -78,10 +78,12 @@ export class ExtendedSprite extends Sprite
if(!textureSource) return false;
const texture = new Texture(textureSource);
const pixels = TextureUtils.getPixels(texture);
const canvas = GetRenderer().texture.generateCanvas(texture);
const ctx = canvas.getContext('2d');
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
//@ts-ignore
textureSource.hitMap = pixels.pixels;
textureSource.hitMap = imageData.data;
texture.destroy();
return true;

View File

@ -56,12 +56,13 @@ export class SessionDataManager implements ISessionDataManager
public async init(): Promise<void>
{
await this._furnitureData.init();
await this._productData.init();
this._badgeImageManager.init();
this._ignoredUsersManager.init();
this._groupInformationManager.init();
await Promise.all([
this._furnitureData.init(),
this._productData.init(),
this._badgeImageManager.init(),
this._ignoredUsersManager.init(),
this._groupInformationManager.init()
]);
GetCommunication().registerMessageEvent(new FigureUpdateEvent((event: FigureUpdateEvent) =>
{

View File

@ -0,0 +1,9 @@
export { };
declare global
{
interface Window
{
NitroConfig?: { [index: string]: any };
}
}

View File

@ -16,6 +16,7 @@ export * from './LegacyExternalInterface';
export * from './LinkTracker';
export * from './Matrix4x4';
export * from './NitroBundle';
export * from './NitroConfig';
export * from './NitroLogger';
export * from './NitroVersion';
export * from './Node3D';

View File

@ -1,8 +1,8 @@
import { AbstractRenderer, BrowserAdapter, DOMAdapter, HelloSystem } from 'pixi.js';
import { AbstractRenderer, BrowserAdapter, DOMAdapter, HelloSystem, TextureSource } from 'pixi.js';
HelloSystem.defaultOptions.hello = true;
AbstractRenderer.defaultOptions.failIfMajorPerformanceCaveat = false;
//TextureSource.defaultOptions.scaleMode = 'nearest';
TextureSource.defaultOptions.scaleMode = (!(window.devicePixelRatio % 1)) ? 'nearest' : 'linear';
DOMAdapter.set(BrowserAdapter);
export * from '@nitrots/api';

View File

@ -199,6 +199,11 @@
resolved "https://registry.yarnpkg.com/@pixi/colord/-/colord-2.9.6.tgz#7e4e7851480da6fd3cef4e331f008d60be7e1204"
integrity sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==
"@pixi/gif@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@pixi/gif/-/gif-3.0.0.tgz#dbd3e1bfb2a5d83a84965f5b517cc5dcb8407862"
integrity sha512-0am94k1SEwacW6anOiNT9vt3vnefEaiMxkg30nMwvqU3XkIO6sSsFBgQM3UArjDG/quYsujjyZZkyhl7yBF6GQ==
"@rollup/plugin-typescript@^11.1.6":
version "11.1.6"
resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz#724237d5ec12609ec01429f619d2a3e7d4d1b22b"