Skip to content

Commit

Permalink
Merge pull request #15688 from RolandCsibrei/master
Browse files Browse the repository at this point in the history
Added options to SpriteManager
  • Loading branch information
sebavan authored Oct 10, 2024
2 parents 9491831 + 8462019 commit 1a27c46
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 9 deletions.
15 changes: 13 additions & 2 deletions packages/dev/core/src/Sprites/spriteManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 */
Expand All @@ -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!;
Expand All @@ -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;
Expand Down
10 changes: 8 additions & 2 deletions packages/dev/core/src/Sprites/spritePackedManager.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { SpriteManagerOptions } from "./spriteManager";
import { SpriteManager } from "./spriteManager";
import type { Scene } from "../scene";
import { Texture } from "../Materials/Textures/texture";
Expand All @@ -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
Expand All @@ -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(
Expand All @@ -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);
}
}
25 changes: 20 additions & 5 deletions packages/dev/core/src/Sprites/spriteRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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<Scene> = null) {
constructor(engine: AbstractEngine, capacity: number, epsilon: number = 0.01, scene: Nullable<Scene> = null, rendererOptions?: SpriteRendererOptions) {
this._pixelPerfect = rendererOptions?.pixelPerfect ?? false;
this._capacity = capacity;
this._epsilon = epsilon;

Expand Down

0 comments on commit 1a27c46

Please sign in to comment.