@mlightcad/mtext-renderer 0.4.4 → 0.4.6

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 (44) hide show
  1. package/README.md +249 -0
  2. package/dist/assets/mtextWorker-BlkfNPdt.js +7 -0
  3. package/dist/index.js +1811 -1420
  4. package/dist/index.umd.cjs +3 -3
  5. package/{dist → lib}/font/baseFont.d.ts +12 -0
  6. package/lib/font/charGeometryCache.d.ts +43 -0
  7. package/{dist → lib}/font/fontManager.d.ts +16 -0
  8. package/{dist → lib}/font/meshFont.d.ts +6 -0
  9. package/{dist → lib}/font/shxFont.d.ts +6 -0
  10. package/{dist → lib}/font/shxTextShape.d.ts +4 -1
  11. package/{dist → lib}/index.d.ts +1 -0
  12. package/lib/worker/base-renderer.d.ts +50 -0
  13. package/lib/worker/baseRenderer.d.ts +64 -0
  14. package/lib/worker/index.d.ts +6 -0
  15. package/lib/worker/main-thread-renderer.d.ts +30 -0
  16. package/lib/worker/mainThreadRenderer.d.ts +32 -0
  17. package/lib/worker/mtext-worker.d.ts +1 -0
  18. package/lib/worker/mtextWorker.d.ts +1 -0
  19. package/lib/worker/unified-renderer.d.ts +41 -0
  20. package/lib/worker/unifiedRenderer.d.ts +44 -0
  21. package/lib/worker/web-worker-renderer.d.ts +115 -0
  22. package/lib/worker/webWorkerRenderer.d.ts +124 -0
  23. package/lib/worker/worker-manager.d.ts +113 -0
  24. package/package.json +4 -3
  25. /package/{dist → lib}/cache/fontCacheManager.d.ts +0 -0
  26. /package/{dist → lib}/cache/index.d.ts +0 -0
  27. /package/{dist → lib}/cache/schema.d.ts +0 -0
  28. /package/{dist → lib}/common/eventManager.d.ts +0 -0
  29. /package/{dist → lib}/common/index.d.ts +0 -0
  30. /package/{dist → lib}/common/utils.d.ts +0 -0
  31. /package/{dist → lib}/font/baseTextShape.d.ts +0 -0
  32. /package/{dist → lib}/font/defaultFontLoader.d.ts +0 -0
  33. /package/{dist → lib}/font/font.d.ts +0 -0
  34. /package/{dist → lib}/font/fontFactory.d.ts +0 -0
  35. /package/{dist → lib}/font/fontLoader.d.ts +0 -0
  36. /package/{dist → lib}/font/index.d.ts +0 -0
  37. /package/{dist → lib}/font/meshFontParser.d.ts +0 -0
  38. /package/{dist → lib}/font/meshTextShape.d.ts +0 -0
  39. /package/{dist → lib}/font/normalComputationToggle.d.ts +0 -0
  40. /package/{dist → lib}/renderer/index.d.ts +0 -0
  41. /package/{dist → lib}/renderer/mtext.d.ts +0 -0
  42. /package/{dist → lib}/renderer/mtextProcessor.d.ts +0 -0
  43. /package/{dist → lib}/renderer/styleManager.d.ts +0 -0
  44. /package/{dist → lib}/renderer/types.d.ts +0 -0
package/README.md CHANGED
@@ -85,6 +85,83 @@ Manages font data caching using IndexedDB. Provides persistent storage for font
85
85
  - `getAll()`: Retrieves all cached font data
86
86
  - `clear()`: Clears all cached font data
87
87
 
88
+ ## Worker-Based Rendering System
89
+
90
+ The package provides a sophisticated worker-based rendering system that allows MText rendering to be performed in Web Workers, preventing blocking of the main UI thread. This is particularly beneficial for rendering large amounts of text or complex MText content.
91
+
92
+ ### MTextBaseRenderer Interface
93
+
94
+ Defines the common rendering contract for producing Three.js objects from MText content. All renderer implementations must conform to this interface.
95
+
96
+ **Public Methods:**
97
+ - `renderMText(mtextContent, textStyle, colorSettings?)`: Render MText content into a Three.js object hierarchy
98
+ - `loadFonts(fonts)`: Ensure specified fonts are available to the renderer
99
+ - `getAvailableFonts()`: Retrieve list of fonts that can be used by the renderer
100
+ - `destroy()`: Release any resources owned by the renderer
101
+
102
+ ### MTextObject Interface
103
+
104
+ Represents a rendered MText object that extends THREE.Object3D with additional MText-specific properties.
105
+
106
+ **Public Properties:**
107
+ - `box`: The bounding box of the MText object in local coordinates
108
+
109
+ ### MainThreadRenderer
110
+
111
+ Renders MText content directly in the main thread. This is the simplest renderer implementation that provides the same interface as worker-based renderers but runs synchronously in the main thread.
112
+
113
+ **Public Methods:**
114
+ - `renderMText(mtextContent, textStyle, colorSettings?)`: Render MText directly in the main thread
115
+ - `loadFonts(fonts)`: Load fonts in the main thread
116
+ - `getAvailableFonts()`: Get available fonts from the main thread
117
+ - `destroy()`: Cleanup resources
118
+
119
+ ### WebWorkerRenderer (MTextWorkerManager)
120
+
121
+ Manages communication with MText Web Workers for parallel text rendering. This renderer uses a pool of Web Workers to distribute rendering tasks, improving performance for large text content.
122
+
123
+ **Public Properties:**
124
+ - `poolSize`: Number of workers in the pool (defaults to optimal size based on hardware concurrency)
125
+
126
+ **Public Methods:**
127
+ - `renderMText(mtextContent, textStyle, colorSettings?)`: Render MText using worker pool
128
+ - `loadFonts(fonts)`: Load fonts in all workers
129
+ - `getAvailableFonts()`: Get available fonts from workers
130
+ - `terminate()`: Terminate all workers
131
+ - `destroy()`: Cleanup all resources
132
+
133
+ **Features:**
134
+ - Automatic worker pool management
135
+ - Load balancing across workers
136
+ - Efficient serialization/deserialization of Three.js objects
137
+ - Transferable object support for optimal performance
138
+ - Error handling and timeout management
139
+
140
+ ### UnifiedRenderer
141
+
142
+ A flexible renderer that can switch between main thread and Web Worker rendering modes at runtime. This allows applications to dynamically choose the best rendering strategy based on current conditions.
143
+
144
+ **Public Properties:**
145
+ - `currentMode`: Current rendering mode ('main' or 'worker')
146
+
147
+ **Public Methods:**
148
+ - `switchMode(mode)`: Switch between main thread and worker rendering modes
149
+ - `getMode()`: Get current rendering mode
150
+ - `renderMText(mtextContent, textStyle, colorSettings?)`: Render using current mode
151
+ - `loadFonts(fonts)`: Load fonts using current mode
152
+ - `getAvailableFonts()`: Get available fonts using current mode
153
+ - `destroy()`: Clean up all resources
154
+
155
+ ### MTextWorker
156
+
157
+ The actual Web Worker implementation that handles MText rendering tasks. This worker contains its own FontManager, StyleManager, and FontLoader instances, allowing it to work independently from the main thread.
158
+
159
+ **Features:**
160
+ - Independent font and style management
161
+ - Efficient object serialization for transfer to main thread
162
+ - Support for transferable objects to minimize memory copying
163
+ - Error handling and response management
164
+
88
165
  ### MText
89
166
  Main class for rendering AutoCAD MText content. Extends THREE.Object3D to integrate with Three.js scene graph.
90
167
 
@@ -175,6 +252,62 @@ classDiagram
175
252
  +clear()
176
253
  }
177
254
 
255
+ class MTextBaseRenderer {
256
+ <<interface>>
257
+ +renderMText(mtextContent, textStyle, colorSettings?)
258
+ +loadFonts(fonts)
259
+ +getAvailableFonts()
260
+ +destroy()
261
+ }
262
+
263
+ class MTextObject {
264
+ <<interface>>
265
+ +box: Box3
266
+ }
267
+
268
+ class MainThreadRenderer {
269
+ -fontManager: FontManager
270
+ -styleManager: StyleManager
271
+ -fontLoader: DefaultFontLoader
272
+ +renderMText(mtextContent, textStyle, colorSettings?)
273
+ +loadFonts(fonts)
274
+ +getAvailableFonts()
275
+ +destroy()
276
+ }
277
+
278
+ class WebWorkerRenderer {
279
+ -workers: Worker[]
280
+ -inFlightPerWorker: number[]
281
+ -pendingRequests: Map
282
+ -poolSize: number
283
+ +renderMText(mtextContent, textStyle, colorSettings?)
284
+ +loadFonts(fonts)
285
+ +getAvailableFonts()
286
+ +terminate()
287
+ +destroy()
288
+ }
289
+
290
+ class UnifiedRenderer {
291
+ -workerManager: WebWorkerRenderer
292
+ -mainThreadRenderer: MainThreadRenderer
293
+ -adapter: MTextBaseRenderer
294
+ -currentMode: RenderMode
295
+ +switchMode(mode)
296
+ +getMode()
297
+ +renderMText(mtextContent, textStyle, colorSettings?)
298
+ +loadFonts(fonts)
299
+ +getAvailableFonts()
300
+ +destroy()
301
+ }
302
+
303
+ class MTextWorker {
304
+ +fontManager: FontManager
305
+ +styleManager: StyleManager
306
+ +fontLoader: DefaultFontLoader
307
+ +serializeMText(mtext)
308
+ +serializeChildren(mtext)
309
+ }
310
+
178
311
  MText --> FontManager
179
312
  MText --> StyleManager
180
313
  FontManager --> FontFactory
@@ -185,6 +318,16 @@ classDiagram
185
318
  BaseFont <|-- ShxFont
186
319
  BaseTextShape <|-- MeshTextShape
187
320
  BaseTextShape <|-- ShxTextShape
321
+ MainThreadRenderer ..|> MTextBaseRenderer
322
+ WebWorkerRenderer ..|> MTextBaseRenderer
323
+ UnifiedRenderer --> WebWorkerRenderer
324
+ UnifiedRenderer --> MainThreadRenderer
325
+ UnifiedRenderer ..|> MTextBaseRenderer
326
+ MTextWorker --> FontManager
327
+ MTextWorker --> StyleManager
328
+ MTextWorker --> DefaultFontLoader
329
+ WebWorkerRenderer --> MTextWorker
330
+ MTextBaseRenderer --> MTextObject
188
331
  ```
189
332
 
190
333
  ## Usage
@@ -232,6 +375,112 @@ const mtext = new MText(
232
375
  scene.add(mtext);
233
376
  ```
234
377
 
378
+ ## Worker-Based Rendering Usage
379
+
380
+ ### Using MainThreadRenderer
381
+
382
+ ```typescript
383
+ import { MainThreadRenderer } from '@mlightcad/mtext-renderer';
384
+
385
+ // Create main thread renderer
386
+ const renderer = new MainThreadRenderer();
387
+
388
+ // Load required fonts
389
+ await renderer.loadFonts(['simsun', 'arial']);
390
+
391
+ // Render MText content
392
+ const mtextObject = await renderer.renderMText(
393
+ mtextContent,
394
+ textStyle,
395
+ { byLayerColor: 0xffffff, byBlockColor: 0xffffff }
396
+ );
397
+
398
+ // Add to scene
399
+ scene.add(mtextObject);
400
+ ```
401
+
402
+ ### Using WebWorkerRenderer
403
+
404
+ ```typescript
405
+ import { WebWorkerRenderer } from '@mlightcad/mtext-renderer';
406
+
407
+ // Create worker renderer with custom pool size
408
+ const workerRenderer = new WebWorkerRenderer(4); // 4 workers
409
+
410
+ // Load fonts in all workers
411
+ await workerRenderer.loadFonts(['simsun', 'arial']);
412
+
413
+ // Render MText content using workers
414
+ const mtextObject = await workerRenderer.renderMText(
415
+ mtextContent,
416
+ textStyle,
417
+ { byLayerColor: 0xffffff, byBlockColor: 0xffffff }
418
+ );
419
+
420
+ // Add to scene
421
+ scene.add(mtextObject);
422
+
423
+ // Clean up when done
424
+ workerRenderer.destroy();
425
+ ```
426
+
427
+ ### Using UnifiedRenderer
428
+
429
+ ```typescript
430
+ import { UnifiedRenderer } from '@mlightcad/mtext-renderer';
431
+
432
+ // Create unified renderer starting in main thread mode
433
+ const unifiedRenderer = new UnifiedRenderer('main');
434
+
435
+ // Load fonts
436
+ await unifiedRenderer.loadFonts(['simsun', 'arial']);
437
+
438
+ // Render using main thread
439
+ let mtextObject = await unifiedRenderer.renderMText(
440
+ mtextContent,
441
+ textStyle,
442
+ { byLayerColor: 0xffffff, byBlockColor: 0xffffff }
443
+ );
444
+
445
+ scene.add(mtextObject);
446
+
447
+ // Switch to worker mode for heavy rendering tasks
448
+ unifiedRenderer.switchMode('worker');
449
+
450
+ // Re-load fonts in workers
451
+ await unifiedRenderer.loadFonts(['simsun', 'arial']);
452
+
453
+ // Render using workers
454
+ mtextObject = await unifiedRenderer.renderMText(
455
+ heavyMtextContent,
456
+ textStyle,
457
+ { byLayerColor: 0xffffff, byBlockColor: 0xffffff }
458
+ );
459
+
460
+ scene.add(mtextObject);
461
+
462
+ // Clean up
463
+ unifiedRenderer.destroy();
464
+ ```
465
+
466
+ ### Performance Considerations
467
+
468
+ **When to use MainThreadRenderer:**
469
+ - Simple MText content with few characters
470
+ - When you need immediate synchronous results
471
+ - When worker overhead would be greater than rendering time
472
+
473
+ **When to use WebWorkerRenderer:**
474
+ - Large amounts of MText content
475
+ - Complex text with many formatting codes
476
+ - When you want to keep the main thread responsive
477
+ - Batch processing of multiple MText objects
478
+
479
+ **When to use UnifiedRenderer:**
480
+ - Applications that need to switch rendering strategies dynamically
481
+ - When rendering requirements vary based on content complexity
482
+ - Development environments where you want to test both approaches
483
+
235
484
  If all of fonts or certain fonts are not needed any more after rendering, you can call method `release` of class `FontManager` to free memory occupied by them. Based on testing, one Chinese mesh font file may take 40M memory.
236
485
 
237
486
  ```typescript