From 265755d95e57a638ee249674f443560343e5046d Mon Sep 17 00:00:00 2001 From: Roland Csibrei Date: Thu, 10 Oct 2024 20:00:31 +0200 Subject: [PATCH 1/2] Added options to SpriteManager --- .../dev/core/src/Sprites/spriteManager.ts | 15 +++++++++-- .../dev/core/src/Sprites/spriteRenderer.ts | 25 +++++++++++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/packages/dev/core/src/Sprites/spriteManager.ts b/packages/dev/core/src/Sprites/spriteManager.ts index 9540253d5a6..e3a2cf8d3d1 100644 --- a/packages/dev/core/src/Sprites/spriteManager.ts +++ b/packages/dev/core/src/Sprites/spriteManager.ts @@ -12,6 +12,7 @@ import { SceneComponentConstants } from "../sceneComponent"; import { Logger } from "../Misc/logger"; import { Tools } from "../Misc/tools"; import { WebRequest } from "../Misc/webRequest"; +import type { SpriteRendererOptions } from "./spriteRenderer"; import { SpriteRenderer } from "./spriteRenderer"; import type { ThinSprite } from "./thinSprite"; import type { ISize } from "../Maths/math.size"; @@ -107,6 +108,14 @@ export interface ISpriteManager extends IDisposable { serialize(serializeTexture?: boolean): any; } +/** + * Options for the SpriteManager + */ +export interface SpriteManagerOptions { + /** Options for the sprite renderer */ + spriteRendererOptions: SpriteRendererOptions; +} + /** * Class used to manage multiple sprites on the same spritesheet * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites @@ -286,6 +295,7 @@ export class SpriteManager implements ISpriteManager { * @param samplingMode defines the sampling mode to use with spritesheet * @param fromPacked set to false; do not alter * @param spriteJSON null otherwise a JSON object defining sprite sheet data; do not alter + * @param options options used to create the SpriteManager instance */ constructor( /** defines the manager's name */ @@ -297,7 +307,8 @@ export class SpriteManager implements ISpriteManager { epsilon: number = 0.01, samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE, fromPacked: boolean = false, - spriteJSON: any | null = null + spriteJSON: any | null = null, + options?: SpriteManagerOptions ) { if (!scene) { scene = EngineStore.LastCreatedScene!; @@ -310,7 +321,7 @@ export class SpriteManager implements ISpriteManager { this._scene = scene; const engine = this._scene.getEngine(); - this._spriteRenderer = new SpriteRenderer(engine, capacity, epsilon, scene); + this._spriteRenderer = new SpriteRenderer(engine, capacity, epsilon, scene, options?.spriteRendererOptions); if (cellSize.width && cellSize.height) { this.cellWidth = cellSize.width; diff --git a/packages/dev/core/src/Sprites/spriteRenderer.ts b/packages/dev/core/src/Sprites/spriteRenderer.ts index 7ab1014e0fe..87fe28e45fe 100644 --- a/packages/dev/core/src/Sprites/spriteRenderer.ts +++ b/packages/dev/core/src/Sprites/spriteRenderer.ts @@ -11,9 +11,22 @@ import type { ISize } from "../Maths/math.size"; import type { ThinTexture } from "../Materials/Textures/thinTexture"; import type { Scene } from "../scene"; import type { ThinEngine } from "../Engines/thinEngine"; -import { Logger } from "core/Misc/logger"; -import { BindLogDepth } from "core/Materials/materialHelper.functions"; -import { ShaderLanguage } from "core/Materials/shaderLanguage"; +import { Logger } from "../Misc/logger"; +import { BindLogDepth } from "../Materials/materialHelper.functions"; +import { ShaderLanguage } from "../Materials/shaderLanguage"; + +/** + * Options for the SpriteRenderer + */ +export interface SpriteRendererOptions { + /** + * Sets a boolean indicating if the renderer must render sprites with pixel perfect rendering. + * In this mode, sprites are rendered as "pixel art", which means that they appear as pixelated but remain stable when moving or when rotated or scaled. + * Note that for this mode to work as expected, the sprite texture must use the BILINEAR sampling mode, not NEAREST! + * Default is false. + */ + pixelPerfect?: boolean; +} /** * Class used to render sprites. @@ -157,13 +170,15 @@ export class SpriteRenderer { private _isDisposed = false; /** - * Creates a new sprite Renderer + * Creates a new sprite renderer * @param engine defines the engine the renderer works with * @param capacity defines the maximum allowed number of sprites * @param epsilon defines the epsilon value to align texture (0.01 by default) * @param scene defines the hosting scene + * @param rendererOptions options for the sprite renderer */ - constructor(engine: AbstractEngine, capacity: number, epsilon: number = 0.01, scene: Nullable = null) { + constructor(engine: AbstractEngine, capacity: number, epsilon: number = 0.01, scene: Nullable = null, rendererOptions?: SpriteRendererOptions) { + this._pixelPerfect = rendererOptions?.pixelPerfect ?? false; this._capacity = capacity; this._epsilon = epsilon; From 846201926517f4e7a796f123532e18c7aac57b09 Mon Sep 17 00:00:00 2001 From: Roland Csibrei Date: Thu, 10 Oct 2024 20:06:14 +0200 Subject: [PATCH 2/2] Added options to SpritePackedManager --- packages/dev/core/src/Sprites/spritePackedManager.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/dev/core/src/Sprites/spritePackedManager.ts b/packages/dev/core/src/Sprites/spritePackedManager.ts index a89a7f0356a..7c8a3772d13 100644 --- a/packages/dev/core/src/Sprites/spritePackedManager.ts +++ b/packages/dev/core/src/Sprites/spritePackedManager.ts @@ -1,3 +1,4 @@ +import type { SpriteManagerOptions } from "./spriteManager"; import { SpriteManager } from "./spriteManager"; import type { Scene } from "../scene"; import { Texture } from "../Materials/Textures/texture"; @@ -7,6 +8,9 @@ import { Texture } from "../Materials/Textures/texture"; * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites */ +/** + * + */ export class SpritePackedManager extends SpriteManager { /** * Creates a new sprite manager from a packed sprite sheet @@ -18,6 +22,7 @@ export class SpritePackedManager extends SpriteManager { * @param epsilon defines the epsilon value to align texture (0.01 by default) * @param samplingMode defines the sampling mode to use with spritesheet * @param fromPacked set to true; do not alter + * @param options options for the sprite manager */ constructor( @@ -28,9 +33,10 @@ export class SpritePackedManager extends SpriteManager { scene: Scene, spriteJSON: string | null = null, epsilon: number = 0.01, - samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE + samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE, + options?: SpriteManagerOptions ) { //the cellSize parameter is not used when built from JSON which provides individual cell data, defaults to 64 if JSON load fails - super(name, imgUrl, capacity, 64, scene, epsilon, samplingMode, true, spriteJSON); + super(name, imgUrl, capacity, 64, scene, epsilon, samplingMode, true, spriteJSON, options); } }