5cf7c5c708d15b237ed25122c73f31f3f58dd6a7f1f74cd7164ede1faa785f09.json 73 KB

1
  1. {"ast":null,"code":"import { Observable } from \"../Misc/observable.js\";\nimport { Vector3, TmpVectors, Matrix } from \"../Maths/math.vector.js\";\nimport { Sprite } from \"./sprite.js\";\nimport { SpriteSceneComponent } from \"./spriteSceneComponent.js\";\nimport { PickingInfo } from \"../Collisions/pickingInfo.js\";\nimport { Texture } from \"../Materials/Textures/texture.js\";\nimport { SceneComponentConstants } from \"../sceneComponent.js\";\nimport { Logger } from \"../Misc/logger.js\";\nimport { Tools } from \"../Misc/tools.js\";\nimport { WebRequest } from \"../Misc/webRequest.js\";\nimport { SpriteRenderer } from \"./spriteRenderer.js\";\nimport { EngineStore } from \"../Engines/engineStore.js\";\n\n/**\n * Class used to manage multiple sprites on the same spritesheet\n * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites\n */\nexport class SpriteManager {\n /**\n * Callback called when the manager is disposed\n */\n set onDispose(callback) {\n if (this._onDisposeObserver) {\n this.onDisposeObservable.remove(this._onDisposeObserver);\n }\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\n }\n /**\n * Gets the array of sprites\n */\n get children() {\n return this.sprites;\n }\n /**\n * Gets the hosting scene\n */\n get scene() {\n return this._scene;\n }\n /**\n * Gets the capacity of the manager\n */\n get capacity() {\n return this._spriteRenderer.capacity;\n }\n /**\n * Gets or sets the spritesheet texture\n */\n get texture() {\n return this._spriteRenderer.texture;\n }\n set texture(value) {\n value.wrapU = Texture.CLAMP_ADDRESSMODE;\n value.wrapV = Texture.CLAMP_ADDRESSMODE;\n this._spriteRenderer.texture = value;\n this._textureContent = null;\n }\n /** Defines the default width of a cell in the spritesheet */\n get cellWidth() {\n return this._spriteRenderer.cellWidth;\n }\n set cellWidth(value) {\n this._spriteRenderer.cellWidth = value;\n }\n /** Defines the default height of a cell in the spritesheet */\n get cellHeight() {\n return this._spriteRenderer.cellHeight;\n }\n set cellHeight(value) {\n this._spriteRenderer.cellHeight = value;\n }\n /** Gets or sets a boolean indicating if the manager must consider scene fog when rendering */\n get fogEnabled() {\n return this._spriteRenderer.fogEnabled;\n }\n set fogEnabled(value) {\n this._spriteRenderer.fogEnabled = value;\n }\n /** Gets or sets a boolean indicating if the manager must use logarithmic depth when rendering */\n get useLogarithmicDepth() {\n return this._spriteRenderer.useLogarithmicDepth;\n }\n set useLogarithmicDepth(value) {\n this._spriteRenderer.useLogarithmicDepth = value;\n }\n /**\n * Blend mode use to render the particle, it can be any of\n * the static undefined properties provided in this class.\n * Default value is 2\n */\n get blendMode() {\n return this._spriteRenderer.blendMode;\n }\n set blendMode(blendMode) {\n this._spriteRenderer.blendMode = blendMode;\n }\n /** Disables writing to the depth buffer when rendering the sprites.\n * It can be handy to disable depth writing when using textures without alpha channel\n * and setting some specific blend modes.\n */\n get disableDepthWrite() {\n return this._disableDepthWrite;\n }\n set disableDepthWrite(value) {\n this._disableDepthWrite = value;\n this._spriteRenderer.disableDepthWrite = value;\n }\n /**\n * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering\n * 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.\n * Note that for this mode to work as expected, the sprite texture must use the BILINEAR sampling mode, not NEAREST!\n */\n get pixelPerfect() {\n return this._spriteRenderer.pixelPerfect;\n }\n set pixelPerfect(value) {\n this._spriteRenderer.pixelPerfect = value;\n if (value && this.texture.samplingMode !== 3) {\n this.texture.updateSamplingMode(3);\n }\n }\n /**\n * Creates a new sprite manager\n * @param name defines the manager's name\n * @param imgUrl defines the sprite sheet url\n * @param capacity defines the maximum allowed number of sprites\n * @param cellSize defines the size of a sprite cell\n * @param scene defines the hosting scene\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\n * @param samplingMode defines the sampling mode to use with spritesheet\n * @param fromPacked set to false; do not alter\n * @param spriteJSON null otherwise a JSON object defining sprite sheet data; do not alter\n * @param options options used to create the SpriteManager instance\n */\n constructor( /** defines the manager's name */\n name, imgUrl, capacity, cellSize, scene, epsilon = 0.01, samplingMode = Texture.TRILINEAR_SAMPLINGMODE, fromPacked = false, spriteJSON = null, options) {\n this.name = name;\n /** Gets the list of sprites */\n this.sprites = [];\n /** Gets or sets the rendering group id (0 by default) */\n this.renderingGroupId = 0;\n /** Gets or sets camera layer mask */\n this.layerMask = 0x0fffffff;\n /** Gets or sets a boolean indicating if the sprites are pickable */\n this.isPickable = false;\n /**\n * Gets or sets an object used to store user defined information for the sprite manager\n */\n this.metadata = null;\n /** @internal */\n this._wasDispatched = false;\n /**\n * An event triggered when the manager is disposed.\n */\n this.onDisposeObservable = new Observable();\n this._disableDepthWrite = false;\n /** True when packed cell data from JSON file is ready*/\n this._packedAndReady = false;\n this._customUpdate = (sprite, baseSize) => {\n if (!sprite.cellRef) {\n sprite.cellIndex = 0;\n }\n const num = sprite.cellIndex;\n if (typeof num === \"number\" && isFinite(num) && Math.floor(num) === num) {\n sprite.cellRef = this._spriteMap[sprite.cellIndex];\n }\n sprite._xOffset = this._cellData[sprite.cellRef].frame.x / baseSize.width;\n sprite._yOffset = this._cellData[sprite.cellRef].frame.y / baseSize.height;\n sprite._xSize = this._cellData[sprite.cellRef].frame.w;\n sprite._ySize = this._cellData[sprite.cellRef].frame.h;\n };\n if (!scene) {\n scene = EngineStore.LastCreatedScene;\n }\n if (!scene._getComponent(SceneComponentConstants.NAME_SPRITE)) {\n scene._addComponent(new SpriteSceneComponent(scene));\n }\n this._fromPacked = fromPacked;\n this._scene = scene;\n const engine = this._scene.getEngine();\n this._spriteRenderer = new SpriteRenderer(engine, capacity, epsilon, scene, options === null || options === void 0 ? void 0 : options.spriteRendererOptions);\n if (cellSize.width && cellSize.height) {\n this.cellWidth = cellSize.width;\n this.cellHeight = cellSize.height;\n } else if (cellSize !== undefined) {\n this.cellWidth = cellSize;\n this.cellHeight = cellSize;\n } else {\n this._spriteRenderer = null;\n return;\n }\n this._scene.spriteManagers && this._scene.spriteManagers.push(this);\n this.uniqueId = this.scene.getUniqueId();\n if (imgUrl) {\n this.texture = new Texture(imgUrl, scene, true, false, samplingMode);\n }\n if (this._fromPacked) {\n this._makePacked(imgUrl, spriteJSON);\n }\n }\n /**\n * Returns the string \"SpriteManager\"\n * @returns \"SpriteManager\"\n */\n getClassName() {\n return \"SpriteManager\";\n }\n _makePacked(imgUrl, spriteJSON) {\n if (spriteJSON !== null) {\n try {\n //Get the JSON and Check its structure. If its an array parse it if its a JSON string etc...\n let celldata;\n if (typeof spriteJSON === \"string\") {\n celldata = JSON.parse(spriteJSON);\n } else {\n celldata = spriteJSON;\n }\n if (celldata.frames.length) {\n const frametemp = {};\n for (let i = 0; i < celldata.frames.length; i++) {\n const _f = celldata.frames[i];\n if (typeof Object.keys(_f)[0] !== \"string\") {\n throw new Error(\"Invalid JSON Format. Check the frame values and make sure the name is the first parameter.\");\n }\n const name = _f[Object.keys(_f)[0]];\n frametemp[name] = _f;\n }\n celldata.frames = frametemp;\n }\n const spritemap = Reflect.ownKeys(celldata.frames);\n this._spriteMap = spritemap;\n this._packedAndReady = true;\n this._cellData = celldata.frames;\n } catch (e) {\n this._fromPacked = false;\n this._packedAndReady = false;\n throw new Error(\"Invalid JSON from string. Spritesheet managed with constant cell size.\");\n }\n } else {\n const re = /\\./g;\n let li;\n do {\n li = re.lastIndex;\n re.test(imgUrl);\n } while (re.lastIndex > 0);\n const jsonUrl = imgUrl.substring(0, li - 1) + \".json\";\n const onerror = () => {\n Logger.Error(\"JSON ERROR: Unable to load JSON file.\");\n this._fromPacked = false;\n this._packedAndReady = false;\n };\n const onload = data => {\n try {\n const celldata = JSON.parse(data);\n const spritemap = Reflect.ownKeys(celldata.frames);\n this._spriteMap = spritemap;\n this._packedAndReady = true;\n this._cellData = celldata.frames;\n } catch (e) {\n this._fromPacked = false;\n this._packedAndReady = false;\n throw new Error(\"Invalid JSON format. Please check documentation for format specifications.\");\n }\n };\n Tools.LoadFile(jsonUrl, onload, undefined, undefined, false, onerror);\n }\n }\n _checkTextureAlpha(sprite, ray, distance, min, max) {\n if (!sprite.useAlphaForPicking || !this.texture) {\n return true;\n }\n const textureSize = this.texture.getSize();\n if (!this._textureContent) {\n this._textureContent = new Uint8Array(textureSize.width * textureSize.height * 4);\n this.texture.readPixels(0, 0, this._textureContent);\n }\n const contactPoint = TmpVectors.Vector3[0];\n contactPoint.copyFrom(ray.direction);\n contactPoint.normalize();\n contactPoint.scaleInPlace(distance);\n contactPoint.addInPlace(ray.origin);\n const contactPointU = (contactPoint.x - min.x) / (max.x - min.x);\n const contactPointV = 1.0 - (contactPoint.y - min.y) / (max.y - min.y);\n const u = sprite._xOffset * textureSize.width + contactPointU * sprite._xSize | 0;\n const v = sprite._yOffset * textureSize.height + contactPointV * sprite._ySize | 0;\n const alpha = this._textureContent[(u + v * textureSize.width) * 4 + 3];\n return alpha > 0.5;\n }\n /**\n * Intersects the sprites with a ray\n * @param ray defines the ray to intersect with\n * @param camera defines the current active camera\n * @param predicate defines a predicate used to select candidate sprites\n * @param fastCheck defines if a fast check only must be done (the first potential sprite is will be used and not the closer)\n * @returns null if no hit or a PickingInfo\n */\n intersects(ray, camera, predicate, fastCheck) {\n const count = Math.min(this.capacity, this.sprites.length);\n const min = Vector3.Zero();\n const max = Vector3.Zero();\n let distance = Number.MAX_VALUE;\n let currentSprite = null;\n const pickedPoint = TmpVectors.Vector3[0];\n const cameraSpacePosition = TmpVectors.Vector3[1];\n const cameraView = camera.getViewMatrix();\n let activeRay = ray;\n let pickedRay = ray;\n for (let index = 0; index < count; index++) {\n const sprite = this.sprites[index];\n if (!sprite) {\n continue;\n }\n if (predicate) {\n if (!predicate(sprite)) {\n continue;\n }\n } else if (!sprite.isPickable) {\n continue;\n }\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\n if (sprite.angle) {\n // Create a rotation matrix to rotate the ray to the sprite's rotation\n Matrix.TranslationToRef(-cameraSpacePosition.x, -cameraSpacePosition.y, 0, TmpVectors.Matrix[1]);\n Matrix.TranslationToRef(cameraSpacePosition.x, cameraSpacePosition.y, 0, TmpVectors.Matrix[2]);\n Matrix.RotationZToRef(-sprite.angle, TmpVectors.Matrix[3]);\n // inv translation x rotation x translation\n TmpVectors.Matrix[1].multiplyToRef(TmpVectors.Matrix[3], TmpVectors.Matrix[4]);\n TmpVectors.Matrix[4].multiplyToRef(TmpVectors.Matrix[2], TmpVectors.Matrix[0]);\n activeRay = ray.clone();\n Vector3.TransformCoordinatesToRef(ray.origin, TmpVectors.Matrix[0], activeRay.origin);\n Vector3.TransformNormalToRef(ray.direction, TmpVectors.Matrix[0], activeRay.direction);\n } else {\n activeRay = ray;\n }\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\n if (activeRay.intersectsBoxMinMax(min, max)) {\n const currentDistance = Vector3.Distance(cameraSpacePosition, activeRay.origin);\n if (distance > currentDistance) {\n if (!this._checkTextureAlpha(sprite, activeRay, currentDistance, min, max)) {\n continue;\n }\n pickedRay = activeRay;\n distance = currentDistance;\n currentSprite = sprite;\n if (fastCheck) {\n break;\n }\n }\n }\n }\n if (currentSprite) {\n const result = new PickingInfo();\n cameraView.invertToRef(TmpVectors.Matrix[0]);\n result.hit = true;\n result.pickedSprite = currentSprite;\n result.distance = distance;\n // Get picked point\n const direction = TmpVectors.Vector3[2];\n direction.copyFrom(pickedRay.direction);\n direction.normalize();\n direction.scaleInPlace(distance);\n pickedRay.origin.addToRef(direction, pickedPoint);\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\n return result;\n }\n return null;\n }\n /**\n * Intersects the sprites with a ray\n * @param ray defines the ray to intersect with\n * @param camera defines the current active camera\n * @param predicate defines a predicate used to select candidate sprites\n * @returns null if no hit or a PickingInfo array\n */\n multiIntersects(ray, camera, predicate) {\n const count = Math.min(this.capacity, this.sprites.length);\n const min = Vector3.Zero();\n const max = Vector3.Zero();\n let distance;\n const results = [];\n const pickedPoint = TmpVectors.Vector3[0].copyFromFloats(0, 0, 0);\n const cameraSpacePosition = TmpVectors.Vector3[1].copyFromFloats(0, 0, 0);\n const cameraView = camera.getViewMatrix();\n for (let index = 0; index < count; index++) {\n const sprite = this.sprites[index];\n if (!sprite) {\n continue;\n }\n if (predicate) {\n if (!predicate(sprite)) {\n continue;\n }\n } else if (!sprite.isPickable) {\n continue;\n }\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\n if (ray.intersectsBoxMinMax(min, max)) {\n distance = Vector3.Distance(cameraSpacePosition, ray.origin);\n if (!this._checkTextureAlpha(sprite, ray, distance, min, max)) {\n continue;\n }\n const result = new PickingInfo();\n results.push(result);\n cameraView.invertToRef(TmpVectors.Matrix[0]);\n result.hit = true;\n result.pickedSprite = sprite;\n result.distance = distance;\n // Get picked point\n const direction = TmpVectors.Vector3[2];\n direction.copyFrom(ray.direction);\n direction.normalize();\n direction.scaleInPlace(distance);\n ray.origin.addToRef(direction, pickedPoint);\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\n }\n }\n return results;\n }\n /**\n * Render all child sprites\n */\n render() {\n // Check\n if (this._fromPacked && (!this._packedAndReady || !this._spriteMap || !this._cellData)) {\n return;\n }\n const engine = this._scene.getEngine();\n const deltaTime = engine.getDeltaTime();\n if (this._packedAndReady) {\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix(), this._customUpdate);\n } else {\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix());\n }\n }\n /**\n * Rebuilds the manager (after a context lost, for eg)\n */\n rebuild() {\n var _this$_spriteRenderer;\n (_this$_spriteRenderer = this._spriteRenderer) === null || _this$_spriteRenderer === void 0 || _this$_spriteRenderer.rebuild();\n }\n /**\n * Release associated resources\n */\n dispose() {\n if (this._spriteRenderer) {\n this._spriteRenderer.dispose();\n this._spriteRenderer = null;\n }\n this._textureContent = null;\n // Remove from scene\n if (this._scene.spriteManagers) {\n const index = this._scene.spriteManagers.indexOf(this);\n this._scene.spriteManagers.splice(index, 1);\n }\n // Callback\n this.onDisposeObservable.notifyObservers(this);\n this.onDisposeObservable.clear();\n this.metadata = null;\n }\n /**\n * Serializes the sprite manager to a JSON object\n * @param serializeTexture defines if the texture must be serialized as well\n * @returns the JSON object\n */\n serialize(serializeTexture = false) {\n const serializationObject = {};\n serializationObject.name = this.name;\n serializationObject.capacity = this.capacity;\n serializationObject.cellWidth = this.cellWidth;\n serializationObject.cellHeight = this.cellHeight;\n serializationObject.fogEnabled = this.fogEnabled;\n serializationObject.blendMode = this.blendMode;\n serializationObject.disableDepthWrite = this.disableDepthWrite;\n serializationObject.pixelPerfect = this.pixelPerfect;\n serializationObject.useLogarithmicDepth = this.useLogarithmicDepth;\n if (this.texture) {\n if (serializeTexture) {\n serializationObject.texture = this.texture.serialize();\n } else {\n serializationObject.textureUrl = this.texture.name;\n serializationObject.invertY = this.texture._invertY;\n }\n }\n serializationObject.sprites = [];\n for (const sprite of this.sprites) {\n serializationObject.sprites.push(sprite.serialize());\n }\n serializationObject.metadata = this.metadata;\n return serializationObject;\n }\n /**\n * Parses a JSON object to create a new sprite manager.\n * @param parsedManager The JSON object to parse\n * @param scene The scene to create the sprite manager\n * @param rootUrl The root url to use to load external dependencies like texture\n * @returns the new sprite manager\n */\n static Parse(parsedManager, scene, rootUrl) {\n const manager = new SpriteManager(parsedManager.name, \"\", parsedManager.capacity, {\n width: parsedManager.cellWidth,\n height: parsedManager.cellHeight\n }, scene);\n if (parsedManager.fogEnabled !== undefined) {\n manager.fogEnabled = parsedManager.fogEnabled;\n }\n if (parsedManager.blendMode !== undefined) {\n manager.blendMode = parsedManager.blendMode;\n }\n if (parsedManager.disableDepthWrite !== undefined) {\n manager.disableDepthWrite = parsedManager.disableDepthWrite;\n }\n if (parsedManager.pixelPerfect !== undefined) {\n manager.pixelPerfect = parsedManager.pixelPerfect;\n }\n if (parsedManager.useLogarithmicDepth !== undefined) {\n manager.useLogarithmicDepth = parsedManager.useLogarithmicDepth;\n }\n if (parsedManager.metadata !== undefined) {\n manager.metadata = parsedManager.metadata;\n }\n if (parsedManager.texture) {\n manager.texture = Texture.Parse(parsedManager.texture, scene, rootUrl);\n } else if (parsedManager.textureName) {\n manager.texture = new Texture(rootUrl + parsedManager.textureUrl, scene, false, parsedManager.invertY !== undefined ? parsedManager.invertY : true);\n }\n for (const parsedSprite of parsedManager.sprites) {\n Sprite.Parse(parsedSprite, manager);\n }\n return manager;\n }\n /**\n * Creates a sprite manager from a snippet saved in a remote file\n * @param name defines the name of the sprite manager to create (can be null or empty to use the one from the json data)\n * @param url defines the url to load from\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new sprite manager\n */\n static ParseFromFileAsync(name, url, scene, rootUrl = \"\") {\n return new Promise((resolve, reject) => {\n const request = new WebRequest();\n request.addEventListener(\"readystatechange\", () => {\n if (request.readyState == 4) {\n if (request.status == 200) {\n const serializationObject = JSON.parse(request.responseText);\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\n if (name) {\n output.name = name;\n }\n resolve(output);\n } else {\n reject(\"Unable to load the sprite manager\");\n }\n }\n });\n request.open(\"GET\", url);\n request.send();\n });\n }\n /**\n * Creates a sprite manager from a snippet saved by the sprite editor\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new sprite manager\n */\n static ParseFromSnippetAsync(snippetId, scene, rootUrl = \"\") {\n if (snippetId === \"_BLANK\") {\n return Promise.resolve(new SpriteManager(\"Default sprite manager\", \"//playground.babylonjs.com/textures/player.png\", 500, 64, scene));\n }\n return new Promise((resolve, reject) => {\n const request = new WebRequest();\n request.addEventListener(\"readystatechange\", () => {\n if (request.readyState == 4) {\n if (request.status == 200) {\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\n const serializationObject = JSON.parse(snippet.spriteManager);\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\n output.snippetId = snippetId;\n resolve(output);\n } else {\n reject(\"Unable to load the snippet \" + snippetId);\n }\n }\n });\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\n request.send();\n });\n }\n}\n/** Define the Url to load snippets */\nSpriteManager.SnippetUrl = `https://snippet.babylonjs.com`;\n/**\n * Creates a sprite manager from a snippet saved by the sprite editor\n * @deprecated Please use ParseFromSnippetAsync instead\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new sprite manager\n */\nSpriteManager.CreateFromSnippetAsync = SpriteManager.ParseFromSnippetAsync;","map":{"version":3,"names":["Observable","Vector3","TmpVectors","Matrix","Sprite","SpriteSceneComponent","PickingInfo","Texture","SceneComponentConstants","Logger","Tools","WebRequest","SpriteRenderer","EngineStore","SpriteManager","onDispose","callback","_onDisposeObserver","onDisposeObservable","remove","add","children","sprites","scene","_scene","capacity","_spriteRenderer","texture","value","wrapU","CLAMP_ADDRESSMODE","wrapV","_textureContent","cellWidth","cellHeight","fogEnabled","useLogarithmicDepth","blendMode","disableDepthWrite","_disableDepthWrite","pixelPerfect","samplingMode","updateSamplingMode","constructor","name","imgUrl","cellSize","epsilon","TRILINEAR_SAMPLINGMODE","fromPacked","spriteJSON","options","renderingGroupId","layerMask","isPickable","metadata","_wasDispatched","_packedAndReady","_customUpdate","sprite","baseSize","cellRef","cellIndex","num","isFinite","Math","floor","_spriteMap","_xOffset","_cellData","frame","x","width","_yOffset","y","height","_xSize","w","_ySize","h","LastCreatedScene","_getComponent","NAME_SPRITE","_addComponent","_fromPacked","engine","getEngine","spriteRendererOptions","undefined","spriteManagers","push","uniqueId","getUniqueId","_makePacked","getClassName","celldata","JSON","parse","frames","length","frametemp","i","_f","Object","keys","Error","spritemap","Reflect","ownKeys","e","re","li","lastIndex","test","jsonUrl","substring","onerror","onload","data","LoadFile","_checkTextureAlpha","ray","distance","min","max","useAlphaForPicking","textureSize","getSize","Uint8Array","readPixels","contactPoint","copyFrom","direction","normalize","scaleInPlace","addInPlace","origin","contactPointU","contactPointV","u","v","alpha","intersects","camera","predicate","fastCheck","count","Zero","Number","MAX_VALUE","currentSprite","pickedPoint","cameraSpacePosition","cameraView","getViewMatrix","activeRay","pickedRay","index","TransformCoordinatesToRef","position","angle","TranslationToRef","RotationZToRef","multiplyToRef","clone","TransformNormalToRef","copyFromFloats","z","intersectsBoxMinMax","currentDistance","Distance","result","invertToRef","hit","pickedSprite","addToRef","TransformCoordinates","multiIntersects","results","render","deltaTime","getDeltaTime","getProjectionMatrix","rebuild","_this$_spriteRenderer","dispose","indexOf","splice","notifyObservers","clear","serialize","serializeTexture","serializationObject","textureUrl","invertY","_invertY","Parse","parsedManager","rootUrl","manager","textureName","parsedSprite","ParseFromFileAsync","url","Promise","resolve","reject","request","addEventListener","readyState","status","responseText","output","open","send","ParseFromSnippetAsync","snippetId","snippet","jsonPayload","spriteManager","SnippetUrl","replace","CreateFromSnippetAsync"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Sprites/spriteManager.js"],"sourcesContent":["import { Observable } from \"../Misc/observable.js\";\nimport { Vector3, TmpVectors, Matrix } from \"../Maths/math.vector.js\";\nimport { Sprite } from \"./sprite.js\";\nimport { SpriteSceneComponent } from \"./spriteSceneComponent.js\";\nimport { PickingInfo } from \"../Collisions/pickingInfo.js\";\nimport { Texture } from \"../Materials/Textures/texture.js\";\nimport { SceneComponentConstants } from \"../sceneComponent.js\";\nimport { Logger } from \"../Misc/logger.js\";\nimport { Tools } from \"../Misc/tools.js\";\nimport { WebRequest } from \"../Misc/webRequest.js\";\nimport { SpriteRenderer } from \"./spriteRenderer.js\";\nimport { EngineStore } from \"../Engines/engineStore.js\";\n\n/**\n * Class used to manage multiple sprites on the same spritesheet\n * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites\n */\nexport class SpriteManager {\n /**\n * Callback called when the manager is disposed\n */\n set onDispose(callback) {\n if (this._onDisposeObserver) {\n this.onDisposeObservable.remove(this._onDisposeObserver);\n }\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\n }\n /**\n * Gets the array of sprites\n */\n get children() {\n return this.sprites;\n }\n /**\n * Gets the hosting scene\n */\n get scene() {\n return this._scene;\n }\n /**\n * Gets the capacity of the manager\n */\n get capacity() {\n return this._spriteRenderer.capacity;\n }\n /**\n * Gets or sets the spritesheet texture\n */\n get texture() {\n return this._spriteRenderer.texture;\n }\n set texture(value) {\n value.wrapU = Texture.CLAMP_ADDRESSMODE;\n value.wrapV = Texture.CLAMP_ADDRESSMODE;\n this._spriteRenderer.texture = value;\n this._textureContent = null;\n }\n /** Defines the default width of a cell in the spritesheet */\n get cellWidth() {\n return this._spriteRenderer.cellWidth;\n }\n set cellWidth(value) {\n this._spriteRenderer.cellWidth = value;\n }\n /** Defines the default height of a cell in the spritesheet */\n get cellHeight() {\n return this._spriteRenderer.cellHeight;\n }\n set cellHeight(value) {\n this._spriteRenderer.cellHeight = value;\n }\n /** Gets or sets a boolean indicating if the manager must consider scene fog when rendering */\n get fogEnabled() {\n return this._spriteRenderer.fogEnabled;\n }\n set fogEnabled(value) {\n this._spriteRenderer.fogEnabled = value;\n }\n /** Gets or sets a boolean indicating if the manager must use logarithmic depth when rendering */\n get useLogarithmicDepth() {\n return this._spriteRenderer.useLogarithmicDepth;\n }\n set useLogarithmicDepth(value) {\n this._spriteRenderer.useLogarithmicDepth = value;\n }\n /**\n * Blend mode use to render the particle, it can be any of\n * the static undefined properties provided in this class.\n * Default value is 2\n */\n get blendMode() {\n return this._spriteRenderer.blendMode;\n }\n set blendMode(blendMode) {\n this._spriteRenderer.blendMode = blendMode;\n }\n /** Disables writing to the depth buffer when rendering the sprites.\n * It can be handy to disable depth writing when using textures without alpha channel\n * and setting some specific blend modes.\n */\n get disableDepthWrite() {\n return this._disableDepthWrite;\n }\n set disableDepthWrite(value) {\n this._disableDepthWrite = value;\n this._spriteRenderer.disableDepthWrite = value;\n }\n /**\n * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering\n * 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.\n * Note that for this mode to work as expected, the sprite texture must use the BILINEAR sampling mode, not NEAREST!\n */\n get pixelPerfect() {\n return this._spriteRenderer.pixelPerfect;\n }\n set pixelPerfect(value) {\n this._spriteRenderer.pixelPerfect = value;\n if (value && this.texture.samplingMode !== 3) {\n this.texture.updateSamplingMode(3);\n }\n }\n /**\n * Creates a new sprite manager\n * @param name defines the manager's name\n * @param imgUrl defines the sprite sheet url\n * @param capacity defines the maximum allowed number of sprites\n * @param cellSize defines the size of a sprite cell\n * @param scene defines the hosting scene\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\n * @param samplingMode defines the sampling mode to use with spritesheet\n * @param fromPacked set to false; do not alter\n * @param spriteJSON null otherwise a JSON object defining sprite sheet data; do not alter\n * @param options options used to create the SpriteManager instance\n */\n constructor(\n /** defines the manager's name */\n name, imgUrl, capacity, cellSize, scene, epsilon = 0.01, samplingMode = Texture.TRILINEAR_SAMPLINGMODE, fromPacked = false, spriteJSON = null, options) {\n this.name = name;\n /** Gets the list of sprites */\n this.sprites = [];\n /** Gets or sets the rendering group id (0 by default) */\n this.renderingGroupId = 0;\n /** Gets or sets camera layer mask */\n this.layerMask = 0x0fffffff;\n /** Gets or sets a boolean indicating if the sprites are pickable */\n this.isPickable = false;\n /**\n * Gets or sets an object used to store user defined information for the sprite manager\n */\n this.metadata = null;\n /** @internal */\n this._wasDispatched = false;\n /**\n * An event triggered when the manager is disposed.\n */\n this.onDisposeObservable = new Observable();\n this._disableDepthWrite = false;\n /** True when packed cell data from JSON file is ready*/\n this._packedAndReady = false;\n this._customUpdate = (sprite, baseSize) => {\n if (!sprite.cellRef) {\n sprite.cellIndex = 0;\n }\n const num = sprite.cellIndex;\n if (typeof num === \"number\" && isFinite(num) && Math.floor(num) === num) {\n sprite.cellRef = this._spriteMap[sprite.cellIndex];\n }\n sprite._xOffset = this._cellData[sprite.cellRef].frame.x / baseSize.width;\n sprite._yOffset = this._cellData[sprite.cellRef].frame.y / baseSize.height;\n sprite._xSize = this._cellData[sprite.cellRef].frame.w;\n sprite._ySize = this._cellData[sprite.cellRef].frame.h;\n };\n if (!scene) {\n scene = EngineStore.LastCreatedScene;\n }\n if (!scene._getComponent(SceneComponentConstants.NAME_SPRITE)) {\n scene._addComponent(new SpriteSceneComponent(scene));\n }\n this._fromPacked = fromPacked;\n this._scene = scene;\n const engine = this._scene.getEngine();\n this._spriteRenderer = new SpriteRenderer(engine, capacity, epsilon, scene, options?.spriteRendererOptions);\n if (cellSize.width && cellSize.height) {\n this.cellWidth = cellSize.width;\n this.cellHeight = cellSize.height;\n }\n else if (cellSize !== undefined) {\n this.cellWidth = cellSize;\n this.cellHeight = cellSize;\n }\n else {\n this._spriteRenderer = null;\n return;\n }\n this._scene.spriteManagers && this._scene.spriteManagers.push(this);\n this.uniqueId = this.scene.getUniqueId();\n if (imgUrl) {\n this.texture = new Texture(imgUrl, scene, true, false, samplingMode);\n }\n if (this._fromPacked) {\n this._makePacked(imgUrl, spriteJSON);\n }\n }\n /**\n * Returns the string \"SpriteManager\"\n * @returns \"SpriteManager\"\n */\n getClassName() {\n return \"SpriteManager\";\n }\n _makePacked(imgUrl, spriteJSON) {\n if (spriteJSON !== null) {\n try {\n //Get the JSON and Check its structure. If its an array parse it if its a JSON string etc...\n let celldata;\n if (typeof spriteJSON === \"string\") {\n celldata = JSON.parse(spriteJSON);\n }\n else {\n celldata = spriteJSON;\n }\n if (celldata.frames.length) {\n const frametemp = {};\n for (let i = 0; i < celldata.frames.length; i++) {\n const _f = celldata.frames[i];\n if (typeof Object.keys(_f)[0] !== \"string\") {\n throw new Error(\"Invalid JSON Format. Check the frame values and make sure the name is the first parameter.\");\n }\n const name = _f[Object.keys(_f)[0]];\n frametemp[name] = _f;\n }\n celldata.frames = frametemp;\n }\n const spritemap = Reflect.ownKeys(celldata.frames);\n this._spriteMap = spritemap;\n this._packedAndReady = true;\n this._cellData = celldata.frames;\n }\n catch (e) {\n this._fromPacked = false;\n this._packedAndReady = false;\n throw new Error(\"Invalid JSON from string. Spritesheet managed with constant cell size.\");\n }\n }\n else {\n const re = /\\./g;\n let li;\n do {\n li = re.lastIndex;\n re.test(imgUrl);\n } while (re.lastIndex > 0);\n const jsonUrl = imgUrl.substring(0, li - 1) + \".json\";\n const onerror = () => {\n Logger.Error(\"JSON ERROR: Unable to load JSON file.\");\n this._fromPacked = false;\n this._packedAndReady = false;\n };\n const onload = (data) => {\n try {\n const celldata = JSON.parse(data);\n const spritemap = Reflect.ownKeys(celldata.frames);\n this._spriteMap = spritemap;\n this._packedAndReady = true;\n this._cellData = celldata.frames;\n }\n catch (e) {\n this._fromPacked = false;\n this._packedAndReady = false;\n throw new Error(\"Invalid JSON format. Please check documentation for format specifications.\");\n }\n };\n Tools.LoadFile(jsonUrl, onload, undefined, undefined, false, onerror);\n }\n }\n _checkTextureAlpha(sprite, ray, distance, min, max) {\n if (!sprite.useAlphaForPicking || !this.texture) {\n return true;\n }\n const textureSize = this.texture.getSize();\n if (!this._textureContent) {\n this._textureContent = new Uint8Array(textureSize.width * textureSize.height * 4);\n this.texture.readPixels(0, 0, this._textureContent);\n }\n const contactPoint = TmpVectors.Vector3[0];\n contactPoint.copyFrom(ray.direction);\n contactPoint.normalize();\n contactPoint.scaleInPlace(distance);\n contactPoint.addInPlace(ray.origin);\n const contactPointU = (contactPoint.x - min.x) / (max.x - min.x);\n const contactPointV = 1.0 - (contactPoint.y - min.y) / (max.y - min.y);\n const u = (sprite._xOffset * textureSize.width + contactPointU * sprite._xSize) | 0;\n const v = (sprite._yOffset * textureSize.height + contactPointV * sprite._ySize) | 0;\n const alpha = this._textureContent[(u + v * textureSize.width) * 4 + 3];\n return alpha > 0.5;\n }\n /**\n * Intersects the sprites with a ray\n * @param ray defines the ray to intersect with\n * @param camera defines the current active camera\n * @param predicate defines a predicate used to select candidate sprites\n * @param fastCheck defines if a fast check only must be done (the first potential sprite is will be used and not the closer)\n * @returns null if no hit or a PickingInfo\n */\n intersects(ray, camera, predicate, fastCheck) {\n const count = Math.min(this.capacity, this.sprites.length);\n const min = Vector3.Zero();\n const max = Vector3.Zero();\n let distance = Number.MAX_VALUE;\n let currentSprite = null;\n const pickedPoint = TmpVectors.Vector3[0];\n const cameraSpacePosition = TmpVectors.Vector3[1];\n const cameraView = camera.getViewMatrix();\n let activeRay = ray;\n let pickedRay = ray;\n for (let index = 0; index < count; index++) {\n const sprite = this.sprites[index];\n if (!sprite) {\n continue;\n }\n if (predicate) {\n if (!predicate(sprite)) {\n continue;\n }\n }\n else if (!sprite.isPickable) {\n continue;\n }\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\n if (sprite.angle) {\n // Create a rotation matrix to rotate the ray to the sprite's rotation\n Matrix.TranslationToRef(-cameraSpacePosition.x, -cameraSpacePosition.y, 0, TmpVectors.Matrix[1]);\n Matrix.TranslationToRef(cameraSpacePosition.x, cameraSpacePosition.y, 0, TmpVectors.Matrix[2]);\n Matrix.RotationZToRef(-sprite.angle, TmpVectors.Matrix[3]);\n // inv translation x rotation x translation\n TmpVectors.Matrix[1].multiplyToRef(TmpVectors.Matrix[3], TmpVectors.Matrix[4]);\n TmpVectors.Matrix[4].multiplyToRef(TmpVectors.Matrix[2], TmpVectors.Matrix[0]);\n activeRay = ray.clone();\n Vector3.TransformCoordinatesToRef(ray.origin, TmpVectors.Matrix[0], activeRay.origin);\n Vector3.TransformNormalToRef(ray.direction, TmpVectors.Matrix[0], activeRay.direction);\n }\n else {\n activeRay = ray;\n }\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\n if (activeRay.intersectsBoxMinMax(min, max)) {\n const currentDistance = Vector3.Distance(cameraSpacePosition, activeRay.origin);\n if (distance > currentDistance) {\n if (!this._checkTextureAlpha(sprite, activeRay, currentDistance, min, max)) {\n continue;\n }\n pickedRay = activeRay;\n distance = currentDistance;\n currentSprite = sprite;\n if (fastCheck) {\n break;\n }\n }\n }\n }\n if (currentSprite) {\n const result = new PickingInfo();\n cameraView.invertToRef(TmpVectors.Matrix[0]);\n result.hit = true;\n result.pickedSprite = currentSprite;\n result.distance = distance;\n // Get picked point\n const direction = TmpVectors.Vector3[2];\n direction.copyFrom(pickedRay.direction);\n direction.normalize();\n direction.scaleInPlace(distance);\n pickedRay.origin.addToRef(direction, pickedPoint);\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\n return result;\n }\n return null;\n }\n /**\n * Intersects the sprites with a ray\n * @param ray defines the ray to intersect with\n * @param camera defines the current active camera\n * @param predicate defines a predicate used to select candidate sprites\n * @returns null if no hit or a PickingInfo array\n */\n multiIntersects(ray, camera, predicate) {\n const count = Math.min(this.capacity, this.sprites.length);\n const min = Vector3.Zero();\n const max = Vector3.Zero();\n let distance;\n const results = [];\n const pickedPoint = TmpVectors.Vector3[0].copyFromFloats(0, 0, 0);\n const cameraSpacePosition = TmpVectors.Vector3[1].copyFromFloats(0, 0, 0);\n const cameraView = camera.getViewMatrix();\n for (let index = 0; index < count; index++) {\n const sprite = this.sprites[index];\n if (!sprite) {\n continue;\n }\n if (predicate) {\n if (!predicate(sprite)) {\n continue;\n }\n }\n else if (!sprite.isPickable) {\n continue;\n }\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\n if (ray.intersectsBoxMinMax(min, max)) {\n distance = Vector3.Distance(cameraSpacePosition, ray.origin);\n if (!this._checkTextureAlpha(sprite, ray, distance, min, max)) {\n continue;\n }\n const result = new PickingInfo();\n results.push(result);\n cameraView.invertToRef(TmpVectors.Matrix[0]);\n result.hit = true;\n result.pickedSprite = sprite;\n result.distance = distance;\n // Get picked point\n const direction = TmpVectors.Vector3[2];\n direction.copyFrom(ray.direction);\n direction.normalize();\n direction.scaleInPlace(distance);\n ray.origin.addToRef(direction, pickedPoint);\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\n }\n }\n return results;\n }\n /**\n * Render all child sprites\n */\n render() {\n // Check\n if (this._fromPacked && (!this._packedAndReady || !this._spriteMap || !this._cellData)) {\n return;\n }\n const engine = this._scene.getEngine();\n const deltaTime = engine.getDeltaTime();\n if (this._packedAndReady) {\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix(), this._customUpdate);\n }\n else {\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix());\n }\n }\n /**\n * Rebuilds the manager (after a context lost, for eg)\n */\n rebuild() {\n this._spriteRenderer?.rebuild();\n }\n /**\n * Release associated resources\n */\n dispose() {\n if (this._spriteRenderer) {\n this._spriteRenderer.dispose();\n this._spriteRenderer = null;\n }\n this._textureContent = null;\n // Remove from scene\n if (this._scene.spriteManagers) {\n const index = this._scene.spriteManagers.indexOf(this);\n this._scene.spriteManagers.splice(index, 1);\n }\n // Callback\n this.onDisposeObservable.notifyObservers(this);\n this.onDisposeObservable.clear();\n this.metadata = null;\n }\n /**\n * Serializes the sprite manager to a JSON object\n * @param serializeTexture defines if the texture must be serialized as well\n * @returns the JSON object\n */\n serialize(serializeTexture = false) {\n const serializationObject = {};\n serializationObject.name = this.name;\n serializationObject.capacity = this.capacity;\n serializationObject.cellWidth = this.cellWidth;\n serializationObject.cellHeight = this.cellHeight;\n serializationObject.fogEnabled = this.fogEnabled;\n serializationObject.blendMode = this.blendMode;\n serializationObject.disableDepthWrite = this.disableDepthWrite;\n serializationObject.pixelPerfect = this.pixelPerfect;\n serializationObject.useLogarithmicDepth = this.useLogarithmicDepth;\n if (this.texture) {\n if (serializeTexture) {\n serializationObject.texture = this.texture.serialize();\n }\n else {\n serializationObject.textureUrl = this.texture.name;\n serializationObject.invertY = this.texture._invertY;\n }\n }\n serializationObject.sprites = [];\n for (const sprite of this.sprites) {\n serializationObject.sprites.push(sprite.serialize());\n }\n serializationObject.metadata = this.metadata;\n return serializationObject;\n }\n /**\n * Parses a JSON object to create a new sprite manager.\n * @param parsedManager The JSON object to parse\n * @param scene The scene to create the sprite manager\n * @param rootUrl The root url to use to load external dependencies like texture\n * @returns the new sprite manager\n */\n static Parse(parsedManager, scene, rootUrl) {\n const manager = new SpriteManager(parsedManager.name, \"\", parsedManager.capacity, {\n width: parsedManager.cellWidth,\n height: parsedManager.cellHeight,\n }, scene);\n if (parsedManager.fogEnabled !== undefined) {\n manager.fogEnabled = parsedManager.fogEnabled;\n }\n if (parsedManager.blendMode !== undefined) {\n manager.blendMode = parsedManager.blendMode;\n }\n if (parsedManager.disableDepthWrite !== undefined) {\n manager.disableDepthWrite = parsedManager.disableDepthWrite;\n }\n if (parsedManager.pixelPerfect !== undefined) {\n manager.pixelPerfect = parsedManager.pixelPerfect;\n }\n if (parsedManager.useLogarithmicDepth !== undefined) {\n manager.useLogarithmicDepth = parsedManager.useLogarithmicDepth;\n }\n if (parsedManager.metadata !== undefined) {\n manager.metadata = parsedManager.metadata;\n }\n if (parsedManager.texture) {\n manager.texture = Texture.Parse(parsedManager.texture, scene, rootUrl);\n }\n else if (parsedManager.textureName) {\n manager.texture = new Texture(rootUrl + parsedManager.textureUrl, scene, false, parsedManager.invertY !== undefined ? parsedManager.invertY : true);\n }\n for (const parsedSprite of parsedManager.sprites) {\n Sprite.Parse(parsedSprite, manager);\n }\n return manager;\n }\n /**\n * Creates a sprite manager from a snippet saved in a remote file\n * @param name defines the name of the sprite manager to create (can be null or empty to use the one from the json data)\n * @param url defines the url to load from\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new sprite manager\n */\n static ParseFromFileAsync(name, url, scene, rootUrl = \"\") {\n return new Promise((resolve, reject) => {\n const request = new WebRequest();\n request.addEventListener(\"readystatechange\", () => {\n if (request.readyState == 4) {\n if (request.status == 200) {\n const serializationObject = JSON.parse(request.responseText);\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\n if (name) {\n output.name = name;\n }\n resolve(output);\n }\n else {\n reject(\"Unable to load the sprite manager\");\n }\n }\n });\n request.open(\"GET\", url);\n request.send();\n });\n }\n /**\n * Creates a sprite manager from a snippet saved by the sprite editor\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new sprite manager\n */\n static ParseFromSnippetAsync(snippetId, scene, rootUrl = \"\") {\n if (snippetId === \"_BLANK\") {\n return Promise.resolve(new SpriteManager(\"Default sprite manager\", \"//playground.babylonjs.com/textures/player.png\", 500, 64, scene));\n }\n return new Promise((resolve, reject) => {\n const request = new WebRequest();\n request.addEventListener(\"readystatechange\", () => {\n if (request.readyState == 4) {\n if (request.status == 200) {\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\n const serializationObject = JSON.parse(snippet.spriteManager);\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\n output.snippetId = snippetId;\n resolve(output);\n }\n else {\n reject(\"Unable to load the snippet \" + snippetId);\n }\n }\n });\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\n request.send();\n });\n }\n}\n/** Define the Url to load snippets */\nSpriteManager.SnippetUrl = `https://snippet.babylonjs.com`;\n/**\n * Creates a sprite manager from a snippet saved by the sprite editor\n * @deprecated Please use ParseFromSnippetAsync instead\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\n * @param scene defines the hosting scene\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\n * @returns a promise that will resolve to the new sprite manager\n */\nSpriteManager.CreateFromSnippetAsync = SpriteManager.ParseFromSnippetAsync;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}