three-base 2.0.134 → 2.0.142

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 (305) hide show
  1. package/DirectionalLight.d.ts +6 -6
  2. package/DirectionalLight.js +68 -68
  3. package/DirectionalLight.ts +70 -0
  4. package/EventMap.d.ts +103 -0
  5. package/EventMap.js +17 -0
  6. package/EventMap.ts +139 -0
  7. package/EventMesh.d.ts +18 -18
  8. package/EventMesh.js +59 -59
  9. package/EventMesh.ts +60 -0
  10. package/ExtrudeMesh.d.ts +112 -112
  11. package/ExtrudeMesh.js +342 -366
  12. package/ExtrudeMesh.ts +553 -0
  13. package/FPScontrol.d.ts +511 -71
  14. package/FPScontrol.js +1799 -505
  15. package/FPScontrol.ts +1855 -0
  16. package/Fire/Fire.d.ts +28 -28
  17. package/Fire/Fire.js +80 -79
  18. package/Fire/Fire.ts +89 -0
  19. package/Fire/{FireGromtry.d.ts → FireGeometry.d.ts} +9 -9
  20. package/Fire/{FireGromtry.js → FireGeometry.js} +40 -40
  21. package/Fire/FireGeometry.ts +40 -0
  22. package/Fire/FireMaterial.d.ts +28 -28
  23. package/Fire/FireMaterial.js +32 -32
  24. package/Fire/FireMaterial.ts +89 -0
  25. package/Fire/index.d.ts +2 -1
  26. package/Fire/index.js +2 -1
  27. package/Fire/index.ts +2 -0
  28. package/GLTFDracoLoader.d.ts +71 -0
  29. package/GLTFDracoLoader.js +266 -0
  30. package/GLTFDracoLoader.ts +430 -0
  31. package/Grass/Grass.d.ts +8 -8
  32. package/Grass/Grass.js +38 -38
  33. package/Grass/Grass.ts +38 -0
  34. package/Grass/index.d.ts +2 -1
  35. package/Grass/index.js +2 -1
  36. package/Grass/index.ts +2 -0
  37. package/Ground1/Ground1.d.ts +10 -11
  38. package/Ground1/Ground1.js +95 -91
  39. package/Ground1/Ground1.ts +114 -0
  40. package/Ground1/index.d.ts +1 -1
  41. package/Ground1/index.js +1 -1
  42. package/Ground1/index.ts +1 -0
  43. package/MeshBase.d.ts +36 -35
  44. package/MeshBase.js +247 -223
  45. package/MeshBase.ts +253 -0
  46. package/Mirror.d.ts +25 -25
  47. package/Mirror.js +143 -139
  48. package/Mirror.ts +203 -0
  49. package/MktMesh/MktMesh.d.ts +291 -0
  50. package/MktMesh/MktMesh.js +1045 -0
  51. package/MktMesh/MktMesh.ts +1075 -0
  52. package/MktMesh/assetUrl.d.ts +35 -0
  53. package/MktMesh/assetUrl.js +69 -0
  54. package/MktMesh/assetUrl.ts +69 -0
  55. package/MktMesh/mktMappingShader.d.ts +12 -0
  56. package/MktMesh/mktMappingShader.js +139 -0
  57. package/MktMesh/mktMappingShader.ts +139 -0
  58. package/MktMesh/mktShader.d.ts +263 -0
  59. package/MktMesh/mktShader.js +1248 -0
  60. package/MktMesh/mktShader.ts +1344 -0
  61. package/MktMesh/panoBitmapTexture.d.ts +25 -0
  62. package/MktMesh/panoBitmapTexture.js +52 -0
  63. package/MktMesh/panoBitmapTexture.ts +54 -0
  64. package/MktMesh/panoSlotBind.d.ts +29 -0
  65. package/MktMesh/panoSlotBind.js +106 -0
  66. package/MktMesh/panoSlotBind.ts +153 -0
  67. package/MktMesh/panoSlotRoster.d.ts +22 -0
  68. package/MktMesh/panoSlotRoster.js +169 -0
  69. package/MktMesh/panoSlotRoster.ts +168 -0
  70. package/MktMesh/panoTileStitcher.d.ts +119 -0
  71. package/MktMesh/panoTileStitcher.js +533 -0
  72. package/MktMesh/panoTileStitcher.ts +616 -0
  73. package/MktMesh/types.d.ts +75 -0
  74. package/MktMesh/types.js +1 -0
  75. package/MktMesh/types.ts +87 -0
  76. package/MktMesh/wallCapTessellate.d.ts +33 -0
  77. package/MktMesh/wallCapTessellate.js +97 -0
  78. package/MktMesh/wallCapTessellate.ts +68 -0
  79. package/PipeMesh/PathGeometry.d.ts +44 -44
  80. package/PipeMesh/PathGeometry.js +307 -300
  81. package/PipeMesh/PathGeometry.ts +343 -0
  82. package/PipeMesh/PathPoint.d.ts +17 -17
  83. package/PipeMesh/PathPoint.js +31 -31
  84. package/PipeMesh/PathPoint.ts +36 -0
  85. package/PipeMesh/PathPointList.d.ts +31 -31
  86. package/PipeMesh/PathPointList.js +209 -208
  87. package/PipeMesh/PathPointList.ts +227 -0
  88. package/PipeMesh/PathTubeGeometry.d.ts +25 -25
  89. package/PipeMesh/PathTubeGeometry.js +130 -130
  90. package/PipeMesh/PathTubeGeometry.ts +146 -0
  91. package/PipeMesh/PipeMesh.d.ts +25 -25
  92. package/PipeMesh/PipeMesh.js +63 -63
  93. package/PipeMesh/PipeMesh.ts +76 -0
  94. package/PipeMesh/index.d.ts +1 -1
  95. package/PipeMesh/index.js +1 -1
  96. package/PipeMesh/index.ts +1 -0
  97. package/PlaneModal1/PlaneModal1.d.ts +34 -31
  98. package/PlaneModal1/PlaneModal1.js +109 -105
  99. package/PlaneModal1/PlaneModal1.ts +138 -0
  100. package/PlaneModal1/index.d.ts +1 -1
  101. package/PlaneModal1/index.js +1 -1
  102. package/PlaneModal1/index.ts +1 -0
  103. package/PlaneText.d.ts +27 -39
  104. package/PlaneText.js +35 -30
  105. package/PlaneText.ts +55 -0
  106. package/PlaneWithHtml.d.ts +13 -11
  107. package/PlaneWithHtml.js +64 -63
  108. package/PlaneWithHtml.ts +70 -0
  109. package/PointLight/PointLight.d.ts +13 -14
  110. package/PointLight/PointLight.js +64 -70
  111. package/PointLight/PointLight.ts +67 -0
  112. package/PointLight/index.d.ts +1 -1
  113. package/PointLight/index.js +1 -1
  114. package/PointLight/index.ts +1 -0
  115. package/README.md +110 -79
  116. package/Sky/Sky.d.ts +9 -9
  117. package/Sky/Sky.js +22 -22
  118. package/Sky/Sky.ts +22 -0
  119. package/Sky/index.d.ts +1 -1
  120. package/Sky/index.js +1 -1
  121. package/Sky/index.ts +1 -0
  122. package/SpotLight.d.ts +6 -6
  123. package/SpotLight.js +72 -72
  124. package/SpotLight.ts +74 -0
  125. package/SpriteModal1/SpriteModal1.d.ts +33 -30
  126. package/SpriteModal1/SpriteModal1.js +116 -110
  127. package/SpriteModal1/SpriteModal1.ts +146 -0
  128. package/SpriteModal1/index.d.ts +1 -1
  129. package/SpriteModal1/index.js +1 -1
  130. package/SpriteModal1/index.ts +1 -0
  131. package/SpriteText.d.ts +46 -45
  132. package/SpriteText.js +176 -163
  133. package/SpriteText.ts +205 -0
  134. package/SpriteText2.d.ts +48 -47
  135. package/SpriteText2.js +223 -198
  136. package/SpriteText2.ts +258 -0
  137. package/SpriteText3.d.ts +86 -0
  138. package/SpriteText3.js +519 -0
  139. package/SpriteText3.ts +599 -0
  140. package/SpriteWithHtml.d.ts +9 -7
  141. package/SpriteWithHtml.js +44 -44
  142. package/SpriteWithHtml.ts +50 -0
  143. package/Text3D/Text3D.d.ts +20 -20
  144. package/Text3D/Text3D.js +58 -62
  145. package/Text3D/Text3D.ts +77 -0
  146. package/Text3D/fontController.d.ts +60 -59
  147. package/Text3D/fontController.js +166 -199
  148. package/Text3D/fontController.ts +209 -0
  149. package/Text3D/index.d.ts +1 -1
  150. package/Text3D/index.js +1 -1
  151. package/Text3D/index.ts +1 -0
  152. package/ThreeBase.d.ts +248 -97
  153. package/ThreeBase.js +1202 -613
  154. package/ThreeBase.ts +1314 -0
  155. package/ThreeMouse.d.ts +54 -40
  156. package/ThreeMouse.js +453 -407
  157. package/ThreeMouse.ts +472 -0
  158. package/Transition.d.ts +45 -40
  159. package/Transition.js +209 -210
  160. package/Transition.ts +242 -0
  161. package/Water/Water.d.ts +5 -5
  162. package/Water/Water.js +44 -26
  163. package/Water/Water.ts +45 -0
  164. package/Water/index.d.ts +2 -0
  165. package/Water/index.js +2 -0
  166. package/Water/index.ts +2 -0
  167. package/WaterFlow/FloatingDuck.d.ts +88 -0
  168. package/WaterFlow/FloatingDuck.js +307 -0
  169. package/WaterFlow/FloatingDuck.ts +445 -0
  170. package/WaterFlow/GPUFluidSimulation.d.ts +56 -0
  171. package/WaterFlow/GPUFluidSimulation.js +785 -0
  172. package/WaterFlow/GPUFluidSimulation.ts +827 -0
  173. package/WaterFlow/ReservoirSystem.d.ts +106 -0
  174. package/WaterFlow/ReservoirSystem.js +621 -0
  175. package/WaterFlow/ReservoirSystem.ts +754 -0
  176. package/WaterFlow/SPHField.d.ts +35 -0
  177. package/WaterFlow/SPHField.js +204 -0
  178. package/WaterFlow/SPHField.ts +228 -0
  179. package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -0
  180. package/WaterFlow/ScreenSpaceFluidPass.js +736 -0
  181. package/WaterFlow/ScreenSpaceFluidPass.ts +789 -0
  182. package/WaterFlow/ShallowWaterSurface.d.ts +45 -0
  183. package/WaterFlow/ShallowWaterSurface.js +441 -0
  184. package/WaterFlow/ShallowWaterSurface.ts +510 -0
  185. package/WaterFlow/WaterFlow.d.ts +87 -0
  186. package/WaterFlow/WaterFlow.js +171 -0
  187. package/WaterFlow/WaterFlow.ts +219 -0
  188. package/WaterFlow/types.d.ts +161 -0
  189. package/WaterFlow/types.js +1 -0
  190. package/WaterFlow/types.ts +189 -0
  191. package/WaterFlow/waterFlowPass.d.ts +3 -0
  192. package/WaterFlow/waterFlowPass.js +20 -0
  193. package/WaterFlow/waterFlowPass.ts +40 -0
  194. package/collisionOBB.d.ts +42 -0
  195. package/collisionOBB.js +112 -0
  196. package/collisionOBB.ts +108 -0
  197. package/declare.d.ts +23 -165
  198. package/index.d.ts +1 -1
  199. package/index.js +1 -2
  200. package/index.ts +1 -0
  201. package/instanced/InstancedBatch.d.ts +57 -0
  202. package/instanced/InstancedBatch.js +348 -0
  203. package/instanced/InstancedBatch.ts +406 -0
  204. package/instanced/InstancedChild.d.ts +174 -0
  205. package/instanced/InstancedChild.js +264 -0
  206. package/instanced/InstancedChild.ts +327 -0
  207. package/instanced/InstancedGroup.d.ts +43 -0
  208. package/instanced/InstancedGroup.js +126 -0
  209. package/instanced/InstancedGroup.ts +137 -0
  210. package/{InstancedMeshBase.d.ts → instanced/InstancedMeshBase.d.ts} +38 -39
  211. package/{InstancedMeshBase.js → instanced/InstancedMeshBase.js} +282 -293
  212. package/instanced/InstancedMeshBase.ts +292 -0
  213. package/instanced/InstancedTemplate.d.ts +46 -0
  214. package/instanced/InstancedTemplate.js +125 -0
  215. package/instanced/InstancedTemplate.ts +188 -0
  216. package/keyControls.d.ts +30 -0
  217. package/{keyContorls.js → keyControls.js} +101 -98
  218. package/keyControls.ts +107 -0
  219. package/lensflare/LensFlare.d.ts +39 -0
  220. package/lensflare/LensFlare.js +373 -0
  221. package/lensflare/LensFlare.ts +448 -0
  222. package/lensflare/lensflare0.png +0 -0
  223. package/lensflare/lensflare3.png +0 -0
  224. package/lensflare/lensflare_custom.png +0 -0
  225. package/lensflare/lensflare_hex_ghost.png +0 -0
  226. package/lensflare/lensflare_hex_main.png +0 -0
  227. package/package.json +101 -26
  228. package/pass/bloom_pass.d.ts +2 -2
  229. package/pass/bloom_pass.js +188 -101
  230. package/pass/bloom_pass.ts +243 -0
  231. package/pass/cover_pass.d.ts +2 -2
  232. package/pass/cover_pass.js +122 -99
  233. package/pass/cover_pass.ts +182 -0
  234. package/pass/debugDepthState.d.ts +20 -0
  235. package/pass/debugDepthState.js +9 -0
  236. package/pass/debugDepthState.ts +22 -0
  237. package/pass/depthTestBias.d.ts +12 -0
  238. package/pass/depthTestBias.js +12 -0
  239. package/pass/depthTestBias.ts +12 -0
  240. package/pass/effectUserData.d.ts +27 -0
  241. package/pass/effectUserData.js +1 -0
  242. package/pass/effectUserData.ts +46 -0
  243. package/pass/frosted_glass_pass.d.ts +2 -2
  244. package/pass/frosted_glass_pass.js +167 -186
  245. package/pass/frosted_glass_pass.ts +288 -0
  246. package/pass/fsQuad.d.ts +9 -9
  247. package/pass/fsQuad.js +28 -28
  248. package/pass/fsQuad.ts +34 -0
  249. package/pass/glow_pass.d.ts +2 -2
  250. package/pass/glow_pass.js +449 -233
  251. package/pass/glow_pass.ts +654 -0
  252. package/pass/screen_bloom_pass.d.ts +11 -0
  253. package/pass/screen_bloom_pass.js +235 -0
  254. package/pass/screen_bloom_pass.ts +263 -0
  255. package/pass/ssao_pass.d.ts +88 -11
  256. package/pass/ssao_pass.js +802 -288
  257. package/pass/ssao_pass.ts +918 -0
  258. package/pass/stroke_pass.d.ts +2 -2
  259. package/pass/stroke_pass.js +329 -258
  260. package/pass/stroke_pass.ts +638 -0
  261. package/shaders/FXAAShaderMaterial.d.ts +3 -3
  262. package/shaders/FXAAShaderMaterial.js +23 -66
  263. package/shaders/FXAAShaderMaterial.ts +201 -0
  264. package/shaders/baseDepthVisShader.d.ts +11 -0
  265. package/shaders/baseDepthVisShader.js +36 -0
  266. package/shaders/baseDepthVisShader.ts +36 -0
  267. package/shaders/baseTextureToRenderShader.d.ts +2 -2
  268. package/shaders/baseTextureToRenderShader.js +55 -60
  269. package/shaders/baseTextureToRenderShader.ts +232 -0
  270. package/shaders/copyShader.d.ts +3 -3
  271. package/shaders/copyShader.js +13 -14
  272. package/shaders/copyShader.ts +32 -0
  273. package/shaders/debugDepthCompareShader.d.ts +14 -0
  274. package/shaders/debugDepthCompareShader.js +49 -0
  275. package/shaders/debugDepthCompareShader.ts +50 -0
  276. package/shaders/debugDepthJudgeShader.d.ts +18 -0
  277. package/shaders/debugDepthJudgeShader.js +52 -0
  278. package/shaders/debugDepthJudgeShader.ts +54 -0
  279. package/shaders/debugExcludedShader.d.ts +13 -0
  280. package/shaders/debugExcludedShader.js +46 -0
  281. package/shaders/debugExcludedShader.ts +48 -0
  282. package/spriteTextBg.d.ts +1 -0
  283. package/spriteTextBg.js +20 -0
  284. package/spriteTextBg.ts +20 -0
  285. package/threeLoader.d.ts +35 -34
  286. package/threeLoader.js +518 -527
  287. package/threeLoader.ts +525 -0
  288. package/threeUtils.d.ts +53 -52
  289. package/threeUtils.js +329 -330
  290. package/threeUtils.ts +373 -0
  291. package/types.d.ts +2 -0
  292. package/types.js +6 -0
  293. package/types.ts +8 -0
  294. package/ApngTexture.d.ts +0 -13
  295. package/ApngTexture.js +0 -61
  296. package/ApngTextureManage.d.ts +0 -18
  297. package/ApngTextureManage.js +0 -87
  298. package/KeyFrameAnimation.d.ts +0 -25
  299. package/KeyFrameAnimation.js +0 -78
  300. package/keyContorls.d.ts +0 -25
  301. package/lib/draco/draco_decoder.js +0 -34
  302. package/lib/draco/draco_decoder.wasm +0 -0
  303. package/lib/draco/draco_wasm_wrapper.js +0 -117
  304. package/shaders.d.ts +0 -5
  305. package/shaders.js +0 -93
package/SpriteText.js CHANGED
@@ -1,163 +1,176 @@
1
- /*
2
- * @Author: xiaosihan
3
- * @Date: 2023-05-03 02:42:07
4
- * @Last Modified by: xiaosihan
5
- * @Last Modified time: 2023-05-03 02:53:00
6
- */
7
- import { Sprite, SpriteMaterial, Texture, LinearFilter } from "three";
8
- export default class SpriteText extends Sprite {
9
- constructor(text = '', textHeight = 10, color = 'rgba(255, 255, 255, 1)') {
10
- super(new SpriteMaterial());
11
- this.material.alphaTest = 0.1;
12
- this._text = `${text}`;
13
- this._textHeight = textHeight;
14
- this._color = color;
15
- this._genCanvas();
16
- }
17
- _text = "";
18
- _textHeight = 10;
19
- _color = "#fffff";
20
- _backgroundColor = false; // no background color
21
- _padding = 0;
22
- _borderWidth = 0;
23
- _borderRadius = 0;
24
- _borderColor = "#fffff";
25
- _strokeWidth = 0;
26
- _strokeColor = "#fffff";
27
- _fontFace = 'Arial';
28
- _fontSize = 90; // defines text resolution
29
- _fontWeight = 'normal';
30
- _canvas = document.createElement('canvas');
31
- get text() { return this._text; }
32
- set text(text) { this._text = text; this._genCanvas(); }
33
- get textHeight() { return this._textHeight; }
34
- set textHeight(textHeight) { this._textHeight = textHeight; this._genCanvas(); }
35
- get color() { return this._color; }
36
- set color(color) { this._color = color; this._genCanvas(); }
37
- get backgroundColor() { return this._backgroundColor; }
38
- set backgroundColor(color) { this._backgroundColor = color; this._genCanvas(); }
39
- get padding() { return this._padding; }
40
- set padding(padding) { this._padding = padding; this._genCanvas(); }
41
- get borderWidth() { return this._borderWidth; }
42
- set borderWidth(borderWidth) { this._borderWidth = borderWidth; this._genCanvas(); }
43
- get borderRadius() { return this._borderRadius; }
44
- set borderRadius(borderRadius) { this._borderRadius = borderRadius; this._genCanvas(); }
45
- get borderColor() { return this._borderColor; }
46
- set borderColor(borderColor) { this._borderColor = borderColor; this._genCanvas(); }
47
- get fontFace() { return this._fontFace; }
48
- set fontFace(fontFace) { this._fontFace = fontFace; this._genCanvas(); }
49
- get fontSize() { return this._fontSize; }
50
- set fontSize(fontSize) { this._fontSize = fontSize; this._genCanvas(); }
51
- get fontWeight() { return this._fontWeight; }
52
- set fontWeight(fontWeight) { this._fontWeight = fontWeight; this._genCanvas(); }
53
- get strokeWidth() { return this._strokeWidth; }
54
- set strokeWidth(strokeWidth) { this._strokeWidth = strokeWidth; this._genCanvas(); }
55
- get strokeColor() { return this._strokeColor; }
56
- set strokeColor(strokeColor) { this._strokeColor = strokeColor; this._genCanvas(); }
57
- _genCanvas() {
58
- const canvas = this._canvas;
59
- const ctx = canvas.getContext('2d');
60
- const border = Array.isArray(this.borderWidth) ? this.borderWidth : [this.borderWidth, this.borderWidth]; // x,y border
61
- const relBorder = border.map(b => b * this.fontSize * 0.1); // border in canvas units
62
- const borderRadius = Array.isArray(this.borderRadius) ? this.borderRadius : [this.borderRadius, this.borderRadius, this.borderRadius, this.borderRadius]; // tl tr br bl corners
63
- const relBorderRadius = borderRadius.map(b => b * this.fontSize * 0.1); // border radius in canvas units
64
- const padding = Array.isArray(this.padding) ? this.padding : [this.padding, this.padding]; // x,y padding
65
- const relPadding = padding.map(p => p * this.fontSize * 0.1);
66
- ; // padding in canvas units
67
- const lines = this.text.split('\n');
68
- const font = `${this.fontWeight} ${this.fontSize}px ${this.fontFace}`;
69
- ctx.font = font; // measure canvas with appropriate font
70
- const innerWidth = Math.max(...lines.map(line => ctx.measureText(line).width));
71
- const innerHeight = this.fontSize * lines.length;
72
- canvas.width = innerWidth + relBorder[0] * 2 + relPadding[0] * 2;
73
- canvas.height = innerHeight + relBorder[1] * 2 + relPadding[1] * 2;
74
- // paint border
75
- if (this.borderWidth) {
76
- ctx.strokeStyle = this.borderColor;
77
- if (relBorder[0]) { // left + right borders
78
- const hb = relBorder[0] / 2;
79
- ctx.lineWidth = relBorder[0];
80
- ctx.beginPath();
81
- ctx.moveTo(hb, relBorderRadius[0]);
82
- ctx.lineTo(hb, canvas.height - relBorderRadius[3]);
83
- ctx.moveTo(canvas.width - hb, relBorderRadius[1]);
84
- ctx.lineTo(canvas.width - hb, canvas.height - relBorderRadius[2]);
85
- ctx.stroke();
86
- }
87
- if (relBorder[1]) { // top + bottom borders
88
- const hb = relBorder[1] / 2;
89
- ctx.lineWidth = relBorder[1];
90
- ctx.beginPath();
91
- ctx.moveTo(Math.max(relBorder[0], relBorderRadius[0]), hb);
92
- ctx.lineTo(canvas.width - Math.max(relBorder[0], relBorderRadius[1]), hb);
93
- ctx.moveTo(Math.max(relBorder[0], relBorderRadius[3]), canvas.height - hb);
94
- ctx.lineTo(canvas.width - Math.max(relBorder[0], relBorderRadius[2]), canvas.height - hb);
95
- ctx.stroke();
96
- }
97
- if (this.borderRadius) { // strike rounded corners
98
- const cornerWidth = Math.max(...relBorder);
99
- const hb = cornerWidth / 2;
100
- ctx.lineWidth = cornerWidth;
101
- ctx.beginPath();
102
- [
103
- !!relBorderRadius[0] && [relBorderRadius[0], hb, hb, relBorderRadius[0]],
104
- !!relBorderRadius[1] && [canvas.width - relBorderRadius[1], canvas.width - hb, hb, relBorderRadius[1]],
105
- !!relBorderRadius[2] && [canvas.width - relBorderRadius[2], canvas.width - hb, canvas.height - hb, canvas.height - relBorderRadius[2]],
106
- !!relBorderRadius[3] && [relBorderRadius[3], hb, canvas.height - hb, canvas.height - relBorderRadius[3]]
107
- ].filter(d => d).forEach(([x0, x1, y0, y1]) => {
108
- ctx.moveTo(x0, y0);
109
- ctx.quadraticCurveTo(x1, y0, x1, y1);
110
- });
111
- ctx.stroke();
112
- }
113
- }
114
- // paint background
115
- if (this.backgroundColor) {
116
- //@ts-ignore
117
- ctx.fillStyle = this.backgroundColor;
118
- if (!this.borderRadius) {
119
- ctx.fillRect(relBorder[0], relBorder[1], canvas.width - relBorder[0] * 2, canvas.height - relBorder[1] * 2);
120
- }
121
- else { // fill with rounded corners
122
- ctx.beginPath();
123
- ctx.moveTo(relBorder[0], relBorderRadius[0]);
124
- [
125
- [relBorder[0], relBorderRadius[0], canvas.width - relBorderRadius[1], relBorder[1], relBorder[1], relBorder[1]], // t
126
- [canvas.width - relBorder[0], canvas.width - relBorder[0], canvas.width - relBorder[0], relBorder[1], relBorderRadius[1], canvas.height - relBorderRadius[2]], // r
127
- [canvas.width - relBorder[0], canvas.width - relBorderRadius[2], relBorderRadius[3], canvas.height - relBorder[1], canvas.height - relBorder[1], canvas.height - relBorder[1]], // b
128
- [relBorder[0], relBorder[0], relBorder[0], canvas.height - relBorder[1], canvas.height - relBorderRadius[3], relBorderRadius[0]], // t
129
- ].forEach(([x0, x1, x2, y0, y1, y2]) => {
130
- ctx.quadraticCurveTo(x0, y0, x1, y1);
131
- ctx.lineTo(x2, y2);
132
- });
133
- ctx.closePath();
134
- ctx.fill();
135
- }
136
- }
137
- ctx.translate(...relBorder);
138
- ctx.translate(...relPadding);
139
- // paint text
140
- ctx.font = font; // Set font again after canvas is resized, as context properties are reset
141
- ctx.fillStyle = this.color;
142
- ctx.textBaseline = 'bottom';
143
- const drawTextStroke = this.strokeWidth > 0;
144
- if (drawTextStroke) {
145
- ctx.lineWidth = this.strokeWidth * this.fontSize / 10;
146
- ctx.strokeStyle = this.strokeColor;
147
- }
148
- lines.forEach((line, index) => {
149
- const lineX = (innerWidth - ctx.measureText(line).width) / 2;
150
- const lineY = (index + 1) * this.fontSize;
151
- drawTextStroke && ctx.strokeText(line, lineX, lineY);
152
- ctx.fillText(line, lineX, lineY);
153
- });
154
- // Inject canvas into sprite
155
- if (this.material.map)
156
- this.material.map.dispose(); // gc previous texture
157
- const texture = this.material.map = new Texture(canvas);
158
- texture.minFilter = LinearFilter;
159
- texture.needsUpdate = true;
160
- const yScale = this.textHeight * lines.length + border[1] * 2 + padding[1] * 2;
161
- this.scale.set(yScale * canvas.width / canvas.height, yScale, 0);
162
- }
163
- }
1
+ /*
2
+ * @Author: xiaosihan
3
+ * @Date: 2023-05-03 02:42:07
4
+ * @Last Modified by: xiaosihan
5
+ * @Last Modified time: 2023-05-03 02:53:00
6
+ */
7
+ import { Sprite, SpriteMaterial, Texture, LinearFilter } from "three";
8
+ export default class SpriteText extends Sprite {
9
+ constructor(text = '', textHeight = 10, color = 'rgba(255, 255, 255, 1)') {
10
+ super(new SpriteMaterial());
11
+ this.material.alphaTest = 0.1;
12
+ this._text = `${text}`;
13
+ this._textHeight = textHeight;
14
+ this._color = color;
15
+ this._genCanvas();
16
+ }
17
+ _text = "";
18
+ _textHeight = 10;
19
+ _color = "#ffffff";
20
+ _backgroundColor = false; // no background color
21
+ _padding = 0;
22
+ _borderWidth = 0;
23
+ _borderRadius = 0;
24
+ _borderColor = "#fffff";
25
+ _strokeWidth = 0;
26
+ _strokeColor = "#fffff";
27
+ _fontFace = 'Arial';
28
+ _fontSize = 90; // defines text resolution
29
+ _fontWeight = 'normal';
30
+ _canvas = document.createElement('canvas');
31
+ get text() { return this._text; }
32
+ set text(text) { this._text = text; this._genCanvas(); }
33
+ get textHeight() { return this._textHeight; }
34
+ set textHeight(textHeight) { this._textHeight = textHeight; this._genCanvas(); }
35
+ get color() { return this._color; }
36
+ set color(color) { this._color = color; this._genCanvas(); }
37
+ get backgroundColor() { return this._backgroundColor; }
38
+ set backgroundColor(color) { this._backgroundColor = color; this._genCanvas(); }
39
+ get padding() { return this._padding; }
40
+ set padding(padding) { this._padding = padding; this._genCanvas(); }
41
+ get borderWidth() { return this._borderWidth; }
42
+ set borderWidth(borderWidth) { this._borderWidth = borderWidth; this._genCanvas(); }
43
+ get borderRadius() { return this._borderRadius; }
44
+ set borderRadius(borderRadius) { this._borderRadius = borderRadius; this._genCanvas(); }
45
+ get borderColor() { return this._borderColor; }
46
+ set borderColor(borderColor) { this._borderColor = borderColor; this._genCanvas(); }
47
+ get fontFace() { return this._fontFace; }
48
+ set fontFace(fontFace) { this._fontFace = fontFace; this._genCanvas(); }
49
+ get fontSize() { return this._fontSize; }
50
+ set fontSize(fontSize) { this._fontSize = fontSize; this._genCanvas(); }
51
+ get fontWeight() { return this._fontWeight; }
52
+ set fontWeight(fontWeight) { this._fontWeight = fontWeight; this._genCanvas(); }
53
+ get strokeWidth() { return this._strokeWidth; }
54
+ set strokeWidth(strokeWidth) { this._strokeWidth = strokeWidth; this._genCanvas(); }
55
+ get strokeColor() { return this._strokeColor; }
56
+ set strokeColor(strokeColor) { this._strokeColor = strokeColor; this._genCanvas(); }
57
+ _genCanvas() {
58
+ const canvas = this._canvas;
59
+ const ctx = canvas.getContext('2d');
60
+ if (!ctx)
61
+ return;
62
+ const border = Array.isArray(this.borderWidth) ? this.borderWidth : [this.borderWidth, this.borderWidth]; // x,y border
63
+ const relBorder = border.map(b => b * this.fontSize * 0.1); // border in canvas units
64
+ const borderRadius = Array.isArray(this.borderRadius) ? this.borderRadius : [this.borderRadius, this.borderRadius, this.borderRadius, this.borderRadius]; // tl tr br bl corners
65
+ const relBorderRadius = borderRadius.map(b => b * this.fontSize * 0.1); // border radius in canvas units
66
+ const padding = Array.isArray(this.padding) ? this.padding : [this.padding, this.padding]; // x,y padding
67
+ const relPadding = padding.map(p => p * this.fontSize * 0.1);
68
+ ; // padding in canvas units
69
+ const lines = this.text.split('\n');
70
+ const font = `${this.fontWeight} ${this.fontSize}px ${this.fontFace}`;
71
+ ctx.font = font; // measure canvas with appropriate font
72
+ const innerWidth = Math.max(...lines.map(line => ctx.measureText(line).width));
73
+ const innerHeight = this.fontSize * lines.length;
74
+ canvas.width = innerWidth + relBorder[0] * 2 + relPadding[0] * 2;
75
+ canvas.height = innerHeight + relBorder[1] * 2 + relPadding[1] * 2;
76
+ // paint border
77
+ if (this.borderWidth) {
78
+ ctx.strokeStyle = this.borderColor;
79
+ if (relBorder[0]) { // left + right borders
80
+ const hb = relBorder[0] / 2;
81
+ ctx.lineWidth = relBorder[0];
82
+ ctx.beginPath();
83
+ ctx.moveTo(hb, relBorderRadius[0]);
84
+ ctx.lineTo(hb, canvas.height - relBorderRadius[3]);
85
+ ctx.moveTo(canvas.width - hb, relBorderRadius[1]);
86
+ ctx.lineTo(canvas.width - hb, canvas.height - relBorderRadius[2]);
87
+ ctx.stroke();
88
+ }
89
+ if (relBorder[1]) { // top + bottom borders
90
+ const hb = relBorder[1] / 2;
91
+ ctx.lineWidth = relBorder[1];
92
+ ctx.beginPath();
93
+ ctx.moveTo(Math.max(relBorder[0], relBorderRadius[0]), hb);
94
+ ctx.lineTo(canvas.width - Math.max(relBorder[0], relBorderRadius[1]), hb);
95
+ ctx.moveTo(Math.max(relBorder[0], relBorderRadius[3]), canvas.height - hb);
96
+ ctx.lineTo(canvas.width - Math.max(relBorder[0], relBorderRadius[2]), canvas.height - hb);
97
+ ctx.stroke();
98
+ }
99
+ if (this.borderRadius) { // strike rounded corners
100
+ const cornerWidth = Math.max(...relBorder);
101
+ const hb = cornerWidth / 2;
102
+ ctx.lineWidth = cornerWidth;
103
+ ctx.beginPath();
104
+ [
105
+ !!relBorderRadius[0] && [relBorderRadius[0], hb, hb, relBorderRadius[0]],
106
+ !!relBorderRadius[1] && [canvas.width - relBorderRadius[1], canvas.width - hb, hb, relBorderRadius[1]],
107
+ !!relBorderRadius[2] && [canvas.width - relBorderRadius[2], canvas.width - hb, canvas.height - hb, canvas.height - relBorderRadius[2]],
108
+ !!relBorderRadius[3] && [relBorderRadius[3], hb, canvas.height - hb, canvas.height - relBorderRadius[3]]
109
+ ].filter((d) => !!d).forEach(([x0, x1, y0, y1]) => {
110
+ ctx.moveTo(x0, y0);
111
+ ctx.quadraticCurveTo(x1, y0, x1, y1);
112
+ });
113
+ ctx.stroke();
114
+ }
115
+ }
116
+ // paint background
117
+ if (this.backgroundColor && typeof this.backgroundColor === 'string') {
118
+ ctx.fillStyle = this.backgroundColor;
119
+ if (!this.borderRadius) {
120
+ ctx.fillRect(relBorder[0], relBorder[1], canvas.width - relBorder[0] * 2, canvas.height - relBorder[1] * 2);
121
+ }
122
+ else { // fill with rounded corners
123
+ ctx.beginPath();
124
+ ctx.moveTo(relBorder[0], relBorderRadius[0]);
125
+ [
126
+ [relBorder[0], relBorderRadius[0], canvas.width - relBorderRadius[1], relBorder[1], relBorder[1], relBorder[1]],
127
+ [canvas.width - relBorder[0], canvas.width - relBorder[0], canvas.width - relBorder[0], relBorder[1], relBorderRadius[1], canvas.height - relBorderRadius[2]],
128
+ [canvas.width - relBorder[0], canvas.width - relBorderRadius[2], relBorderRadius[3], canvas.height - relBorder[1], canvas.height - relBorder[1], canvas.height - relBorder[1]],
129
+ [relBorder[0], relBorder[0], relBorder[0], canvas.height - relBorder[1], canvas.height - relBorderRadius[3], relBorderRadius[0]], // t
130
+ ].forEach(([x0, x1, x2, y0, y1, y2]) => {
131
+ ctx.quadraticCurveTo(x0, y0, x1, y1);
132
+ ctx.lineTo(x2, y2);
133
+ });
134
+ ctx.closePath();
135
+ ctx.fill();
136
+ }
137
+ }
138
+ ctx.translate(...relBorder);
139
+ ctx.translate(...relPadding);
140
+ // paint text
141
+ ctx.font = font; // Set font again after canvas is resized, as context properties are reset
142
+ ctx.fillStyle = this.color;
143
+ // 精确垂直居中:用 measureText 的 actualBoundingBox 实测字形上下沿,
144
+ // 不再依赖 textBaseline='middle'(middle 是 em 盒中线,与真实字形视觉中线常偏差,
145
+ // 导致整行文字偏上/偏下、看着不居中)。改为 alphabetic 基线 + 实测字形高度,
146
+ // 把每行字形放进其 fontSize 高的槽中心。
147
+ ctx.textAlign = 'center';
148
+ ctx.textBaseline = 'alphabetic';
149
+ const drawTextStroke = this.strokeWidth > 0;
150
+ if (drawTextStroke) {
151
+ ctx.lineWidth = this.strokeWidth * this.fontSize / 10;
152
+ ctx.strokeStyle = this.strokeColor;
153
+ }
154
+ const slotH = this.fontSize; // 每行槽高
155
+ lines.forEach((line, index) => {
156
+ const metrics = ctx.measureText(line);
157
+ const ascent = metrics.actualBoundingBoxAscent; // 字形顶部到基线
158
+ const descent = metrics.actualBoundingBoxDescent; // 基线到字形底部
159
+ const glyphH = (ascent || 0) + (descent || 0);
160
+ const slotTop = index * slotH; // 本行槽顶(内容框坐标系,已平移)
161
+ // 让字形在槽中垂直居中:先平移到槽中线,再上移 ascent 回到基线
162
+ const baselineY = slotTop + (slotH - glyphH) / 2 + (ascent || slotH / 2);
163
+ const lineX = innerWidth / 2;
164
+ drawTextStroke && ctx.strokeText(line, lineX, baselineY);
165
+ ctx.fillText(line, lineX, baselineY);
166
+ });
167
+ // Inject canvas into sprite
168
+ if (this.material.map)
169
+ this.material.map.dispose(); // gc previous texture
170
+ const texture = this.material.map = new Texture(canvas);
171
+ texture.minFilter = LinearFilter;
172
+ texture.needsUpdate = true;
173
+ const yScale = this.textHeight * lines.length + border[1] * 2 + padding[1] * 2;
174
+ this.scale.set(yScale * canvas.width / canvas.height, yScale, 0);
175
+ }
176
+ }
package/SpriteText.ts ADDED
@@ -0,0 +1,205 @@
1
+ /*
2
+ * @Author: xiaosihan
3
+ * @Date: 2023-05-03 02:42:07
4
+ * @Last Modified by: xiaosihan
5
+ * @Last Modified time: 2023-05-03 02:53:00
6
+ */
7
+ import { Sprite, SpriteMaterial, Texture, LinearFilter } from "three";
8
+ import type { ColorString } from "./types";
9
+
10
+ export default class SpriteText extends Sprite {
11
+ constructor(text: string = '', textHeight: number = 10, color: ColorString = 'rgba(255, 255, 255, 1)') {
12
+ super(new SpriteMaterial());
13
+ this.material.alphaTest = 0.1;
14
+ this._text = `${text}`;
15
+ this._textHeight = textHeight;
16
+ this._color = color;
17
+ this._genCanvas();
18
+ }
19
+
20
+ _text: string = "";
21
+ _textHeight: number = 10;
22
+ _color: ColorString = "#ffffff";
23
+ _backgroundColor: boolean | ColorString = false; // no background color
24
+ _padding: number = 0;
25
+ _borderWidth: number = 0;
26
+ _borderRadius: number = 0;
27
+ _borderColor: ColorString = "#fffff";
28
+ _strokeWidth: number = 0;
29
+ _strokeColor: ColorString = "#fffff";
30
+ _fontFace: string = 'Arial';
31
+ _fontSize: number = 90; // defines text resolution
32
+ _fontWeight: string = 'normal';
33
+ _canvas: HTMLCanvasElement = document.createElement('canvas');
34
+
35
+ get text(): string { return this._text; }
36
+ set text(text: string) { this._text = text; this._genCanvas(); }
37
+
38
+ get textHeight(): number { return this._textHeight; }
39
+ set textHeight(textHeight: number) { this._textHeight = textHeight; this._genCanvas(); }
40
+
41
+ get color(): ColorString { return this._color; }
42
+ set color(color: ColorString) { this._color = color; this._genCanvas(); }
43
+
44
+ get backgroundColor(): boolean | ColorString { return this._backgroundColor; }
45
+ set backgroundColor(color: boolean | ColorString) { this._backgroundColor = color; this._genCanvas(); }
46
+
47
+ get padding(): number { return this._padding; }
48
+ set padding(padding: number) { this._padding = padding; this._genCanvas(); }
49
+
50
+ get borderWidth(): number { return this._borderWidth; }
51
+ set borderWidth(borderWidth: number) { this._borderWidth = borderWidth; this._genCanvas(); }
52
+
53
+ get borderRadius(): number { return this._borderRadius; }
54
+ set borderRadius(borderRadius: number) { this._borderRadius = borderRadius; this._genCanvas(); }
55
+
56
+ get borderColor(): ColorString { return this._borderColor; }
57
+ set borderColor(borderColor: ColorString) { this._borderColor = borderColor; this._genCanvas(); }
58
+
59
+ get fontFace(): string { return this._fontFace; }
60
+ set fontFace(fontFace: string) { this._fontFace = fontFace; this._genCanvas(); }
61
+
62
+ get fontSize(): number { return this._fontSize; }
63
+ set fontSize(fontSize: number) { this._fontSize = fontSize; this._genCanvas(); }
64
+
65
+ get fontWeight(): string { return this._fontWeight; }
66
+ set fontWeight(fontWeight: string) { this._fontWeight = fontWeight; this._genCanvas(); }
67
+
68
+ get strokeWidth(): number { return this._strokeWidth; }
69
+ set strokeWidth(strokeWidth: number) { this._strokeWidth = strokeWidth; this._genCanvas(); }
70
+
71
+ get strokeColor(): ColorString { return this._strokeColor; }
72
+ set strokeColor(strokeColor: ColorString) { this._strokeColor = strokeColor; this._genCanvas(); }
73
+
74
+ _genCanvas(): void {
75
+ const canvas = this._canvas;
76
+ const ctx = canvas.getContext('2d');
77
+ if (!ctx) return;
78
+
79
+ const border = Array.isArray(this.borderWidth) ? this.borderWidth : [this.borderWidth, this.borderWidth]; // x,y border
80
+ const relBorder = border.map(b => b * this.fontSize * 0.1); // border in canvas units
81
+ const borderRadius = Array.isArray(this.borderRadius) ? this.borderRadius : [this.borderRadius, this.borderRadius, this.borderRadius, this.borderRadius]; // tl tr br bl corners
82
+ const relBorderRadius = borderRadius.map(b => b * this.fontSize * 0.1); // border radius in canvas units
83
+ const padding = Array.isArray(this.padding) ? this.padding : [this.padding, this.padding]; // x,y padding
84
+ const relPadding = padding.map(p => p * this.fontSize * 0.1);
85
+ ; // padding in canvas units
86
+ const lines = this.text.split('\n');
87
+ const font = `${this.fontWeight} ${this.fontSize}px ${this.fontFace}`;
88
+
89
+ ctx.font = font; // measure canvas with appropriate font
90
+ const innerWidth = Math.max(...lines.map(line => ctx.measureText(line).width));
91
+ const innerHeight = this.fontSize * lines.length;
92
+ canvas.width = innerWidth + relBorder[0] * 2 + relPadding[0] * 2;
93
+ canvas.height = innerHeight + relBorder[1] * 2 + relPadding[1] * 2;
94
+
95
+ // paint border
96
+ if (this.borderWidth) {
97
+ ctx.strokeStyle = this.borderColor;
98
+
99
+ if (relBorder[0]) { // left + right borders
100
+ const hb = relBorder[0] / 2;
101
+ ctx.lineWidth = relBorder[0];
102
+ ctx.beginPath();
103
+ ctx.moveTo(hb, relBorderRadius[0]);
104
+ ctx.lineTo(hb, canvas.height - relBorderRadius[3]);
105
+ ctx.moveTo(canvas.width - hb, relBorderRadius[1]);
106
+ ctx.lineTo(canvas.width - hb, canvas.height - relBorderRadius[2]);
107
+ ctx.stroke();
108
+ }
109
+
110
+ if (relBorder[1]) { // top + bottom borders
111
+ const hb = relBorder[1] / 2;
112
+ ctx.lineWidth = relBorder[1];
113
+ ctx.beginPath();
114
+ ctx.moveTo(Math.max(relBorder[0], relBorderRadius[0]), hb);
115
+ ctx.lineTo(canvas.width - Math.max(relBorder[0], relBorderRadius[1]), hb);
116
+ ctx.moveTo(Math.max(relBorder[0], relBorderRadius[3]), canvas.height - hb);
117
+ ctx.lineTo(canvas.width - Math.max(relBorder[0], relBorderRadius[2]), canvas.height - hb);
118
+ ctx.stroke();
119
+ }
120
+
121
+ if (this.borderRadius) { // strike rounded corners
122
+ const cornerWidth = Math.max(...relBorder);
123
+ const hb = cornerWidth / 2;
124
+ ctx.lineWidth = cornerWidth;
125
+ ctx.beginPath();
126
+ [
127
+ !!relBorderRadius[0] && [relBorderRadius[0], hb, hb, relBorderRadius[0]],
128
+ !!relBorderRadius[1] && [canvas.width - relBorderRadius[1], canvas.width - hb, hb, relBorderRadius[1]],
129
+ !!relBorderRadius[2] && [canvas.width - relBorderRadius[2], canvas.width - hb, canvas.height - hb, canvas.height - relBorderRadius[2]],
130
+ !!relBorderRadius[3] && [relBorderRadius[3], hb, canvas.height - hb, canvas.height - relBorderRadius[3]]
131
+ ].filter((d): d is number[] => !!d).forEach(([x0, x1, y0, y1]) => {
132
+ ctx.moveTo(x0, y0);
133
+ ctx.quadraticCurveTo(x1, y0, x1, y1);
134
+ });
135
+ ctx.stroke();
136
+ }
137
+ }
138
+
139
+ // paint background
140
+ if (this.backgroundColor && typeof this.backgroundColor === 'string') {
141
+ ctx.fillStyle = this.backgroundColor;
142
+ if (!this.borderRadius) {
143
+ ctx.fillRect(relBorder[0], relBorder[1], canvas.width - relBorder[0] * 2, canvas.height - relBorder[1] * 2);
144
+ }
145
+ else { // fill with rounded corners
146
+ ctx.beginPath();
147
+ ctx.moveTo(relBorder[0], relBorderRadius[0]);
148
+ [
149
+ [relBorder[0], relBorderRadius[0], canvas.width - relBorderRadius[1], relBorder[1], relBorder[1], relBorder[1]], // t
150
+ [canvas.width - relBorder[0], canvas.width - relBorder[0], canvas.width - relBorder[0], relBorder[1], relBorderRadius[1], canvas.height - relBorderRadius[2]], // r
151
+ [canvas.width - relBorder[0], canvas.width - relBorderRadius[2], relBorderRadius[3], canvas.height - relBorder[1], canvas.height - relBorder[1], canvas.height - relBorder[1]], // b
152
+ [relBorder[0], relBorder[0], relBorder[0], canvas.height - relBorder[1], canvas.height - relBorderRadius[3], relBorderRadius[0]], // t
153
+ ].forEach(([x0, x1, x2, y0, y1, y2]) => {
154
+ ctx.quadraticCurveTo(x0, y0, x1, y1);
155
+ ctx.lineTo(x2, y2);
156
+ });
157
+ ctx.closePath();
158
+ ctx.fill();
159
+ }
160
+ }
161
+
162
+ ctx.translate(...relBorder as [number, number]);
163
+ ctx.translate(...relPadding as [number, number]);
164
+
165
+ // paint text
166
+ ctx.font = font; // Set font again after canvas is resized, as context properties are reset
167
+ ctx.fillStyle = this.color;
168
+ // 精确垂直居中:用 measureText 的 actualBoundingBox 实测字形上下沿,
169
+ // 不再依赖 textBaseline='middle'(middle 是 em 盒中线,与真实字形视觉中线常偏差,
170
+ // 导致整行文字偏上/偏下、看着不居中)。改为 alphabetic 基线 + 实测字形高度,
171
+ // 把每行字形放进其 fontSize 高的槽中心。
172
+ ctx.textAlign = 'center';
173
+ ctx.textBaseline = 'alphabetic';
174
+
175
+ const drawTextStroke = this.strokeWidth > 0;
176
+ if (drawTextStroke) {
177
+ ctx.lineWidth = this.strokeWidth * this.fontSize / 10;
178
+ ctx.strokeStyle = this.strokeColor;
179
+ }
180
+
181
+ const slotH = this.fontSize; // 每行槽高
182
+ lines.forEach((line, index) => {
183
+ const metrics = ctx.measureText(line);
184
+ const ascent = metrics.actualBoundingBoxAscent; // 字形顶部到基线
185
+ const descent = metrics.actualBoundingBoxDescent; // 基线到字形底部
186
+ const glyphH = (ascent || 0) + (descent || 0);
187
+ const slotTop = index * slotH; // 本行槽顶(内容框坐标系,已平移)
188
+ // 让字形在槽中垂直居中:先平移到槽中线,再上移 ascent 回到基线
189
+ const baselineY = slotTop + (slotH - glyphH) / 2 + (ascent || slotH / 2);
190
+ const lineX = innerWidth / 2;
191
+ drawTextStroke && ctx.strokeText(line, lineX, baselineY);
192
+ ctx.fillText(line, lineX, baselineY);
193
+ });
194
+
195
+ // Inject canvas into sprite
196
+ if (this.material.map)
197
+ this.material.map.dispose(); // gc previous texture
198
+ const texture = this.material.map = new Texture(canvas);
199
+ texture.minFilter = LinearFilter;
200
+ texture.needsUpdate = true;
201
+
202
+ const yScale = this.textHeight * lines.length + border[1] * 2 + padding[1] * 2;
203
+ this.scale.set(yScale * canvas.width / canvas.height, yScale, 0);
204
+ }
205
+ }