@zephyr3d/scene 0.9.4 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/animation/animationmask.js +224 -0
  2. package/dist/animation/animationmask.js.map +1 -0
  3. package/dist/animation/animationset.js +268 -67
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js.map +1 -1
  6. package/dist/animation/eulerrotationtrack.js +3 -0
  7. package/dist/animation/eulerrotationtrack.js.map +1 -1
  8. package/dist/animation/fixed_geometry_cache_track.js +7 -0
  9. package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +6 -4
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  13. package/dist/animation/joint_dynamics/controller.js +390 -43
  14. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  15. package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
  16. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  17. package/dist/animation/joint_dynamics/solver.js +4 -3
  18. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  19. package/dist/animation/joint_dynamics/types.js.map +1 -1
  20. package/dist/animation/joint_dynamics_modifier.js +2 -0
  21. package/dist/animation/joint_dynamics_modifier.js.map +1 -1
  22. package/dist/animation/morphtarget.js +3 -72
  23. package/dist/animation/morphtarget.js.map +1 -1
  24. package/dist/animation/morphtrack.js +3 -0
  25. package/dist/animation/morphtrack.js.map +1 -1
  26. package/dist/animation/pca_geometry_cache_track.js +3 -0
  27. package/dist/animation/pca_geometry_cache_track.js.map +1 -1
  28. package/dist/animation/proptrack.js +3 -0
  29. package/dist/animation/proptrack.js.map +1 -1
  30. package/dist/animation/rotationtrack.js +3 -0
  31. package/dist/animation/rotationtrack.js.map +1 -1
  32. package/dist/animation/scaletrack.js +3 -0
  33. package/dist/animation/scaletrack.js.map +1 -1
  34. package/dist/animation/skeleton.js +254 -79
  35. package/dist/animation/skeleton.js.map +1 -1
  36. package/dist/animation/skeleton_modifier.js.map +1 -1
  37. package/dist/animation/spring_modifier.js.map +1 -1
  38. package/dist/animation/translationtrack.js +3 -0
  39. package/dist/animation/translationtrack.js.map +1 -1
  40. package/dist/app/engine.js +171 -107
  41. package/dist/app/engine.js.map +1 -1
  42. package/dist/app/scriptregistry.js +251 -80
  43. package/dist/app/scriptregistry.js.map +1 -1
  44. package/dist/asset/assetmanager.js +344 -365
  45. package/dist/asset/assetmanager.js.map +1 -1
  46. package/dist/asset/loaders/gltf/gltf_loader.js +17 -14
  47. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  48. package/dist/asset/loaders/loader.js +1 -6
  49. package/dist/asset/loaders/loader.js.map +1 -1
  50. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
  51. package/dist/asset/model.js +1000 -131
  52. package/dist/asset/model.js.map +1 -1
  53. package/dist/avatar/wardrobe.js +474 -0
  54. package/dist/avatar/wardrobe.js.map +1 -0
  55. package/dist/index.d.ts +1125 -199
  56. package/dist/index.js +3 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
  59. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  60. package/dist/material/mixins/pbr/common.js +72 -15
  61. package/dist/material/mixins/pbr/common.js.map +1 -1
  62. package/dist/material/msdf_text_sprite.js +4 -4
  63. package/dist/material/msdf_text_sprite.js.map +1 -1
  64. package/dist/material/pbrblueprint.js +102 -102
  65. package/dist/material/pbrblueprint.js.map +1 -1
  66. package/dist/render/envlight.js +54 -1
  67. package/dist/render/envlight.js.map +1 -1
  68. package/dist/render/sky.js +9 -0
  69. package/dist/render/sky.js.map +1 -1
  70. package/dist/scene/batchgroup.js +11 -13
  71. package/dist/scene/batchgroup.js.map +1 -1
  72. package/dist/scene/environment.js +15 -2
  73. package/dist/scene/environment.js.map +1 -1
  74. package/dist/scene/mesh.js +79 -16
  75. package/dist/scene/mesh.js.map +1 -1
  76. package/dist/scene/scene.js +1 -0
  77. package/dist/scene/scene.js.map +1 -1
  78. package/dist/scene/scene_node.js +203 -2
  79. package/dist/scene/scene_node.js.map +1 -1
  80. package/dist/text/font/font_asset.js.map +1 -1
  81. package/dist/text/msdf/generator.js.map +1 -1
  82. package/dist/text/msdf/shape.js +4 -1
  83. package/dist/text/msdf/shape.js.map +1 -1
  84. package/dist/text/runtime/msdf_text_atlas_manager.js +4 -1
  85. package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -1
  86. package/dist/utility/blueprint/material/inputs.js +1157 -1154
  87. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  88. package/dist/utility/bounding_volume.js.map +1 -1
  89. package/dist/utility/pmrem.js +34 -8
  90. package/dist/utility/pmrem.js.map +1 -1
  91. package/dist/utility/serialization/manager.js +22 -9
  92. package/dist/utility/serialization/manager.js.map +1 -1
  93. package/dist/utility/serialization/scene/animation.js +700 -7
  94. package/dist/utility/serialization/scene/animation.js.map +1 -1
  95. package/dist/utility/serialization/scene/mesh.js +64 -4
  96. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  97. package/dist/utility/serialization/scene/node.js +187 -8
  98. package/dist/utility/serialization/scene/node.js.map +1 -1
  99. package/dist/utility/serialization/types.js.map +1 -1
  100. package/dist/utility/textures/sheenlut.js +138 -0
  101. package/dist/utility/textures/sheenlut.js.map +1 -0
  102. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"shape.js","sources":["../../../src/text/msdf/shape.ts"],"sourcesContent":["import type { GlyphContour, GlyphPoint } from '../font';\r\nimport type { ColoredEdge, EdgeColor, MSDFShape } from './types';\r\n\r\nexport function buildMSDFShape(contours: GlyphContour[]): MSDFShape {\r\n return {\r\n sourceContours: contours.map((contour) => contour.map(clonePoint)),\r\n contours: contours.map((contour) => colorizeContour(buildContourEdges(contour)))\r\n };\r\n}\r\n\r\nfunction clonePoint(point: GlyphPoint) {\r\n return { x: point.x, y: point.y, onCurve: point.onCurve };\r\n}\r\n\r\nfunction buildContourEdges(contour: GlyphContour): ColoredEdge[] {\r\n contour = normalizeContourStart(contour);\r\n if (contour.length < 2) {\r\n return [];\r\n }\r\n const edges: ColoredEdge[] = [];\r\n let i = 0;\r\n while (i < contour.length) {\r\n const p0 = contour[i];\r\n const p1 = contour[(i + 1) % contour.length];\r\n if (p0.onCurve && p1.onCurve) {\r\n edges.push({\r\n kind: 'line',\r\n color: 7,\r\n p0: { x: p0.x, y: p0.y },\r\n p1: { x: p1.x, y: p1.y }\r\n });\r\n i += 1;\r\n continue;\r\n }\r\n if (p0.onCurve && !p1.onCurve) {\r\n const p2 = contour[(i + 2) % contour.length];\r\n if (!p2.onCurve) {\r\n throw new Error('Implicit midpoint contours must be expanded before MSDF conversion');\r\n }\r\n edges.push({\r\n kind: 'quadratic',\r\n color: 7,\r\n p0: { x: p0.x, y: p0.y },\r\n p1: { x: p1.x, y: p1.y },\r\n p2: { x: p2.x, y: p2.y }\r\n });\r\n i += 2;\r\n continue;\r\n }\r\n throw new Error('MSDF contour must start edge on an on-curve point');\r\n }\r\n return edges;\r\n}\r\n\r\nfunction normalizeContourStart(contour: GlyphContour) {\r\n if (contour.length === 0) {\r\n return contour;\r\n }\r\n const firstOnCurve = contour.findIndex((point) => point.onCurve);\r\n if (firstOnCurve < 0 || firstOnCurve === 0) {\r\n return contour;\r\n }\r\n return contour.slice(firstOnCurve).concat(contour.slice(0, firstOnCurve));\r\n}\r\n\r\nfunction colorizeContour(edges: ColoredEdge[]) {\r\n if (edges.length === 0) {\r\n return edges;\r\n }\r\n const corners = detectCorners(edges);\r\n if (corners.length === 0) {\r\n for (let i = 0; i < edges.length; i++) {\r\n edges[i].color = 7;\r\n }\r\n return edges;\r\n }\r\n let color: EdgeColor = 5;\r\n const cornerSet = new Set(corners);\r\n for (let i = 0; i < edges.length; i++) {\r\n edges[i].color = color;\r\n if (cornerSet.has((i + 1) % edges.length)) {\r\n color = color === 3 ? 6 : 3;\r\n }\r\n }\r\n return edges;\r\n}\r\n\r\nfunction detectCorners(edges: ColoredEdge[]) {\r\n const result: number[] = [];\r\n for (let i = 0; i < edges.length; i++) {\r\n const prev = edges[(i + edges.length - 1) % edges.length];\r\n const curr = edges[i];\r\n const prevDir = normalize(getEdgeEndDirection(prev));\r\n const currDir = normalize(getEdgeStartDirection(curr));\r\n const dot = prevDir.x * currDir.x + prevDir.y * currDir.y;\r\n if (dot < 0.35) {\r\n result.push(i);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction getEdgeStartDirection(edge: ColoredEdge) {\r\n return edge.kind === 'quadratic'\r\n ? { x: edge.p1.x - edge.p0.x, y: edge.p1.y - edge.p0.y }\r\n : { x: edge.p1.x - edge.p0.x, y: edge.p1.y - edge.p0.y };\r\n}\r\n\r\nfunction getEdgeEndDirection(edge: ColoredEdge) {\r\n return edge.kind === 'quadratic'\r\n ? { x: edge.p2!.x - edge.p1.x, y: edge.p2!.y - edge.p1.y }\r\n : { x: edge.p1.x - edge.p0.x, y: edge.p1.y - edge.p0.y };\r\n}\r\n\r\nfunction normalize(v: { x: number; y: number }) {\r\n const len = Math.hypot(v.x, v.y);\r\n return len > 1e-8 ? { x: v.x / len, y: v.y / len } : { x: 1, y: 0 };\r\n}\r\n"],"names":["buildMSDFShape","contours","sourceContours","map","contour","clonePoint","colorizeContour","buildContourEdges","point","x","y","onCurve","normalizeContourStart","length","edges","i","p0","p1","push","kind","color","p2","Error","firstOnCurve","findIndex","slice","concat","corners","detectCorners","cornerSet","Set","has","result","prev","curr","prevDir","normalize","getEdgeEndDirection","currDir","getEdgeStartDirection","dot","edge","v","len","Math","hypot"],"mappings":"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"}
1
+ {"version":3,"file":"shape.js","sources":["../../../src/text/msdf/shape.ts"],"sourcesContent":["import type { GlyphContour, GlyphPoint } from '../font';\r\nimport type { ColoredEdge, EdgeColor, MSDFShape } from './types';\r\n\r\n/**\r\n * Builds an MSDF shape from glyph contours.\r\n * @public\r\n */\r\nexport function buildMSDFShape(contours: GlyphContour[]): MSDFShape {\r\n return {\r\n sourceContours: contours.map((contour) => contour.map(clonePoint)),\r\n contours: contours.map((contour) => colorizeContour(buildContourEdges(contour)))\r\n };\r\n}\r\n\r\nfunction clonePoint(point: GlyphPoint) {\r\n return { x: point.x, y: point.y, onCurve: point.onCurve };\r\n}\r\n\r\nfunction buildContourEdges(contour: GlyphContour): ColoredEdge[] {\r\n contour = normalizeContourStart(contour);\r\n if (contour.length < 2) {\r\n return [];\r\n }\r\n const edges: ColoredEdge[] = [];\r\n let i = 0;\r\n while (i < contour.length) {\r\n const p0 = contour[i];\r\n const p1 = contour[(i + 1) % contour.length];\r\n if (p0.onCurve && p1.onCurve) {\r\n edges.push({\r\n kind: 'line',\r\n color: 7,\r\n p0: { x: p0.x, y: p0.y },\r\n p1: { x: p1.x, y: p1.y }\r\n });\r\n i += 1;\r\n continue;\r\n }\r\n if (p0.onCurve && !p1.onCurve) {\r\n const p2 = contour[(i + 2) % contour.length];\r\n if (!p2.onCurve) {\r\n throw new Error('Implicit midpoint contours must be expanded before MSDF conversion');\r\n }\r\n edges.push({\r\n kind: 'quadratic',\r\n color: 7,\r\n p0: { x: p0.x, y: p0.y },\r\n p1: { x: p1.x, y: p1.y },\r\n p2: { x: p2.x, y: p2.y }\r\n });\r\n i += 2;\r\n continue;\r\n }\r\n throw new Error('MSDF contour must start edge on an on-curve point');\r\n }\r\n return edges;\r\n}\r\n\r\nfunction normalizeContourStart(contour: GlyphContour) {\r\n if (contour.length === 0) {\r\n return contour;\r\n }\r\n const firstOnCurve = contour.findIndex((point) => point.onCurve);\r\n if (firstOnCurve < 0 || firstOnCurve === 0) {\r\n return contour;\r\n }\r\n return contour.slice(firstOnCurve).concat(contour.slice(0, firstOnCurve));\r\n}\r\n\r\nfunction colorizeContour(edges: ColoredEdge[]) {\r\n if (edges.length === 0) {\r\n return edges;\r\n }\r\n const corners = detectCorners(edges);\r\n if (corners.length === 0) {\r\n for (let i = 0; i < edges.length; i++) {\r\n edges[i].color = 7;\r\n }\r\n return edges;\r\n }\r\n let color: EdgeColor = 5;\r\n const cornerSet = new Set(corners);\r\n for (let i = 0; i < edges.length; i++) {\r\n edges[i].color = color;\r\n if (cornerSet.has((i + 1) % edges.length)) {\r\n color = color === 3 ? 6 : 3;\r\n }\r\n }\r\n return edges;\r\n}\r\n\r\nfunction detectCorners(edges: ColoredEdge[]) {\r\n const result: number[] = [];\r\n for (let i = 0; i < edges.length; i++) {\r\n const prev = edges[(i + edges.length - 1) % edges.length];\r\n const curr = edges[i];\r\n const prevDir = normalize(getEdgeEndDirection(prev));\r\n const currDir = normalize(getEdgeStartDirection(curr));\r\n const dot = prevDir.x * currDir.x + prevDir.y * currDir.y;\r\n if (dot < 0.35) {\r\n result.push(i);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction getEdgeStartDirection(edge: ColoredEdge) {\r\n return edge.kind === 'quadratic'\r\n ? { x: edge.p1.x - edge.p0.x, y: edge.p1.y - edge.p0.y }\r\n : { x: edge.p1.x - edge.p0.x, y: edge.p1.y - edge.p0.y };\r\n}\r\n\r\nfunction getEdgeEndDirection(edge: ColoredEdge) {\r\n return edge.kind === 'quadratic'\r\n ? { x: edge.p2!.x - edge.p1.x, y: edge.p2!.y - edge.p1.y }\r\n : { x: edge.p1.x - edge.p0.x, y: edge.p1.y - edge.p0.y };\r\n}\r\n\r\nfunction normalize(v: { x: number; y: number }) {\r\n const len = Math.hypot(v.x, v.y);\r\n return len > 1e-8 ? { x: v.x / len, y: v.y / len } : { x: 1, y: 0 };\r\n}\r\n"],"names":["buildMSDFShape","contours","sourceContours","map","contour","clonePoint","colorizeContour","buildContourEdges","point","x","y","onCurve","normalizeContourStart","length","edges","i","p0","p1","push","kind","color","p2","Error","firstOnCurve","findIndex","slice","concat","corners","detectCorners","cornerSet","Set","has","result","prev","curr","prevDir","normalize","getEdgeEndDirection","currDir","getEdgeStartDirection","dot","edge","v","len","Math","hypot"],"mappings":"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"}
@@ -3,7 +3,10 @@ import { MSDFGlyphAtlas } from './msdf_glyph_atlas.js';
3
3
 
4
4
  const DEFAULT_DISTANCE_RANGE = 8;
5
5
  const DEFAULT_PADDING = 6;
6
- class MSDFTextAtlasManager {
6
+ /**
7
+ * Manages MSDF glyph atlases for font assets.
8
+ * @public
9
+ */ class MSDFTextAtlasManager {
7
10
  _atlases;
8
11
  constructor(){
9
12
  this._atlases = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"msdf_text_atlas_manager.js","sources":["../../../src/text/runtime/msdf_text_atlas_manager.ts"],"sourcesContent":["import { getDevice } from '../../app/api';\r\nimport type { FontAsset } from '../font';\r\nimport { MSDFGlyphAtlas } from './msdf_glyph_atlas';\r\n\r\nconst DEFAULT_DISTANCE_RANGE = 8;\r\nconst DEFAULT_PADDING = 6;\r\n\r\nexport class MSDFTextAtlasManager {\r\n private readonly _atlases: Map<FontAsset, MSDFGlyphAtlas>;\r\n constructor() {\r\n this._atlases = new Map();\r\n }\r\n getAtlas(font: FontAsset) {\r\n let atlas = this._atlases.get(font);\r\n if (!atlas) {\r\n atlas = new MSDFGlyphAtlas(\r\n getDevice(),\r\n font,\r\n font.msdfGlyphSize,\r\n font.msdfAtlasPageSize,\r\n DEFAULT_DISTANCE_RANGE,\r\n DEFAULT_PADDING\r\n );\r\n this._atlases.set(font, atlas);\r\n }\r\n return atlas;\r\n }\r\n configureAtlas(\r\n font: FontAsset,\r\n glyphSize: number,\r\n atlasSize: number,\r\n distanceRange = DEFAULT_DISTANCE_RANGE,\r\n padding = DEFAULT_PADDING\r\n ) {\r\n let atlas = this._atlases.get(font);\r\n if (atlas) {\r\n atlas.clear();\r\n this._atlases.delete(font);\r\n }\r\n atlas = new MSDFGlyphAtlas(getDevice(), font, glyphSize, atlasSize, distanceRange, padding);\r\n this._atlases.set(font, atlas);\r\n return atlas;\r\n }\r\n releaseAtlas(font: FontAsset) {\r\n const atlas = this._atlases.get(font);\r\n if (atlas) {\r\n atlas.clear();\r\n this._atlases.delete(font);\r\n return true;\r\n }\r\n return false;\r\n }\r\n clear() {\r\n for (const atlas of this._atlases.values()) {\r\n atlas.clear();\r\n }\r\n this._atlases.clear();\r\n }\r\n}\r\n"],"names":["DEFAULT_DISTANCE_RANGE","DEFAULT_PADDING","MSDFTextAtlasManager","_atlases","Map","getAtlas","font","atlas","get","MSDFGlyphAtlas","getDevice","msdfGlyphSize","msdfAtlasPageSize","set","configureAtlas","glyphSize","atlasSize","distanceRange","padding","clear","delete","releaseAtlas","values"],"mappings":";;;AAIA,MAAMA,sBAAyB,GAAA,CAAA;AAC/B,MAAMC,eAAkB,GAAA,CAAA;AAEjB,MAAMC,oBAAAA,CAAAA;IACMC,QAAyC;IAC1D,WAAc,EAAA;QACZ,IAAI,CAACA,QAAQ,GAAG,IAAIC,GAAAA,EAAAA;AACtB;AACAC,IAAAA,QAAAA,CAASC,IAAe,EAAE;AACxB,QAAA,IAAIC,QAAQ,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AAC9B,QAAA,IAAI,CAACC,KAAO,EAAA;YACVA,KAAQ,GAAA,IAAIE,cACVC,CAAAA,SAAAA,EAAAA,EACAJ,IACAA,EAAAA,IAAAA,CAAKK,aAAa,EAClBL,IAAAA,CAAKM,iBAAiB,EACtBZ,sBACAC,EAAAA,eAAAA,CAAAA;AAEF,YAAA,IAAI,CAACE,QAAQ,CAACU,GAAG,CAACP,IAAMC,EAAAA,KAAAA,CAAAA;AAC1B;QACA,OAAOA,KAAAA;AACT;IACAO,cACER,CAAAA,IAAe,EACfS,SAAiB,EACjBC,SAAiB,EACjBC,aAAAA,GAAgBjB,sBAAsB,EACtCkB,OAAUjB,GAAAA,eAAe,EACzB;AACA,QAAA,IAAIM,QAAQ,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AAC9B,QAAA,IAAIC,KAAO,EAAA;AACTA,YAAAA,KAAAA,CAAMY,KAAK,EAAA;AACX,YAAA,IAAI,CAAChB,QAAQ,CAACiB,MAAM,CAACd,IAAAA,CAAAA;AACvB;AACAC,QAAAA,KAAAA,GAAQ,IAAIE,cAAeC,CAAAA,SAAAA,EAAAA,EAAaJ,IAAMS,EAAAA,SAAAA,EAAWC,WAAWC,aAAeC,EAAAA,OAAAA,CAAAA;AACnF,QAAA,IAAI,CAACf,QAAQ,CAACU,GAAG,CAACP,IAAMC,EAAAA,KAAAA,CAAAA;QACxB,OAAOA,KAAAA;AACT;AACAc,IAAAA,YAAAA,CAAaf,IAAe,EAAE;AAC5B,QAAA,MAAMC,QAAQ,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AAChC,QAAA,IAAIC,KAAO,EAAA;AACTA,YAAAA,KAAAA,CAAMY,KAAK,EAAA;AACX,YAAA,IAAI,CAAChB,QAAQ,CAACiB,MAAM,CAACd,IAAAA,CAAAA;YACrB,OAAO,IAAA;AACT;QACA,OAAO,KAAA;AACT;IACAa,KAAQ,GAAA;AACN,QAAA,KAAK,MAAMZ,KAAS,IAAA,IAAI,CAACJ,QAAQ,CAACmB,MAAM,EAAI,CAAA;AAC1Cf,YAAAA,KAAAA,CAAMY,KAAK,EAAA;AACb;QACA,IAAI,CAAChB,QAAQ,CAACgB,KAAK,EAAA;AACrB;AACF;;;;"}
1
+ {"version":3,"file":"msdf_text_atlas_manager.js","sources":["../../../src/text/runtime/msdf_text_atlas_manager.ts"],"sourcesContent":["import { getDevice } from '../../app/api';\r\nimport type { FontAsset } from '../font';\r\nimport { MSDFGlyphAtlas } from './msdf_glyph_atlas';\r\n\r\nconst DEFAULT_DISTANCE_RANGE = 8;\r\nconst DEFAULT_PADDING = 6;\r\n\r\n/**\r\n * Manages MSDF glyph atlases for font assets.\r\n * @public\r\n */\r\nexport class MSDFTextAtlasManager {\r\n private readonly _atlases: Map<FontAsset, MSDFGlyphAtlas>;\r\n constructor() {\r\n this._atlases = new Map();\r\n }\r\n getAtlas(font: FontAsset) {\r\n let atlas = this._atlases.get(font);\r\n if (!atlas) {\r\n atlas = new MSDFGlyphAtlas(\r\n getDevice(),\r\n font,\r\n font.msdfGlyphSize,\r\n font.msdfAtlasPageSize,\r\n DEFAULT_DISTANCE_RANGE,\r\n DEFAULT_PADDING\r\n );\r\n this._atlases.set(font, atlas);\r\n }\r\n return atlas;\r\n }\r\n configureAtlas(\r\n font: FontAsset,\r\n glyphSize: number,\r\n atlasSize: number,\r\n distanceRange = DEFAULT_DISTANCE_RANGE,\r\n padding = DEFAULT_PADDING\r\n ) {\r\n let atlas = this._atlases.get(font);\r\n if (atlas) {\r\n atlas.clear();\r\n this._atlases.delete(font);\r\n }\r\n atlas = new MSDFGlyphAtlas(getDevice(), font, glyphSize, atlasSize, distanceRange, padding);\r\n this._atlases.set(font, atlas);\r\n return atlas;\r\n }\r\n releaseAtlas(font: FontAsset) {\r\n const atlas = this._atlases.get(font);\r\n if (atlas) {\r\n atlas.clear();\r\n this._atlases.delete(font);\r\n return true;\r\n }\r\n return false;\r\n }\r\n clear() {\r\n for (const atlas of this._atlases.values()) {\r\n atlas.clear();\r\n }\r\n this._atlases.clear();\r\n }\r\n}\r\n"],"names":["DEFAULT_DISTANCE_RANGE","DEFAULT_PADDING","MSDFTextAtlasManager","_atlases","Map","getAtlas","font","atlas","get","MSDFGlyphAtlas","getDevice","msdfGlyphSize","msdfAtlasPageSize","set","configureAtlas","glyphSize","atlasSize","distanceRange","padding","clear","delete","releaseAtlas","values"],"mappings":";;;AAIA,MAAMA,sBAAyB,GAAA,CAAA;AAC/B,MAAMC,eAAkB,GAAA,CAAA;AAExB;;;AAGC,IACM,MAAMC,oBAAAA,CAAAA;IACMC,QAAyC;IAC1D,WAAc,EAAA;QACZ,IAAI,CAACA,QAAQ,GAAG,IAAIC,GAAAA,EAAAA;AACtB;AACAC,IAAAA,QAAAA,CAASC,IAAe,EAAE;AACxB,QAAA,IAAIC,QAAQ,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AAC9B,QAAA,IAAI,CAACC,KAAO,EAAA;YACVA,KAAQ,GAAA,IAAIE,cACVC,CAAAA,SAAAA,EAAAA,EACAJ,IACAA,EAAAA,IAAAA,CAAKK,aAAa,EAClBL,IAAAA,CAAKM,iBAAiB,EACtBZ,sBACAC,EAAAA,eAAAA,CAAAA;AAEF,YAAA,IAAI,CAACE,QAAQ,CAACU,GAAG,CAACP,IAAMC,EAAAA,KAAAA,CAAAA;AAC1B;QACA,OAAOA,KAAAA;AACT;IACAO,cACER,CAAAA,IAAe,EACfS,SAAiB,EACjBC,SAAiB,EACjBC,aAAAA,GAAgBjB,sBAAsB,EACtCkB,OAAUjB,GAAAA,eAAe,EACzB;AACA,QAAA,IAAIM,QAAQ,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AAC9B,QAAA,IAAIC,KAAO,EAAA;AACTA,YAAAA,KAAAA,CAAMY,KAAK,EAAA;AACX,YAAA,IAAI,CAAChB,QAAQ,CAACiB,MAAM,CAACd,IAAAA,CAAAA;AACvB;AACAC,QAAAA,KAAAA,GAAQ,IAAIE,cAAeC,CAAAA,SAAAA,EAAAA,EAAaJ,IAAMS,EAAAA,SAAAA,EAAWC,WAAWC,aAAeC,EAAAA,OAAAA,CAAAA;AACnF,QAAA,IAAI,CAACf,QAAQ,CAACU,GAAG,CAACP,IAAMC,EAAAA,KAAAA,CAAAA;QACxB,OAAOA,KAAAA;AACT;AACAc,IAAAA,YAAAA,CAAaf,IAAe,EAAE;AAC5B,QAAA,MAAMC,QAAQ,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AAChC,QAAA,IAAIC,KAAO,EAAA;AACTA,YAAAA,KAAAA,CAAMY,KAAK,EAAA;AACX,YAAA,IAAI,CAAChB,QAAQ,CAACiB,MAAM,CAACd,IAAAA,CAAAA;YACrB,OAAO,IAAA;AACT;QACA,OAAO,KAAA;AACT;IACAa,KAAQ,GAAA;AACN,QAAA,KAAK,MAAMZ,KAAS,IAAA,IAAI,CAACJ,QAAQ,CAACmB,MAAM,EAAI,CAAA;AAC1Cf,YAAAA,KAAAA,CAAMY,KAAK,EAAA;AACb;QACA,IAAI,CAAChB,QAAQ,CAACgB,KAAK,EAAA;AACrB;AACF;;;;"}