meshwriter-cudu 3.0.2 → 3.0.4

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 (33) hide show
  1. package/dist/meshwriter.cjs.js +112 -39
  2. package/dist/meshwriter.cjs.js.map +1 -1
  3. package/dist/meshwriter.esm.js +112 -39
  4. package/dist/meshwriter.esm.js.map +1 -1
  5. package/dist/meshwriter.min.js +1 -1
  6. package/dist/meshwriter.min.js.map +1 -1
  7. package/dist/meshwriter.umd.js +112 -39
  8. package/dist/meshwriter.umd.js.map +1 -1
  9. package/dist/src/fogPlugin.d.ts +35 -4
  10. package/fonts/baked/atkinson-hyperlegible-next-200.js +1973 -0
  11. package/fonts/baked/atkinson-hyperlegible-next-200.json +1 -1
  12. package/fonts/baked/atkinson-hyperlegible-next-300.js +1995 -0
  13. package/fonts/baked/atkinson-hyperlegible-next-300.json +1 -1
  14. package/fonts/baked/atkinson-hyperlegible-next-400.js +1949 -0
  15. package/fonts/baked/atkinson-hyperlegible-next-400.json +1 -1
  16. package/fonts/baked/atkinson-hyperlegible-next-500.js +1981 -0
  17. package/fonts/baked/atkinson-hyperlegible-next-500.json +1 -1
  18. package/fonts/baked/atkinson-hyperlegible-next-600.js +1982 -0
  19. package/fonts/baked/atkinson-hyperlegible-next-600.json +1 -1
  20. package/fonts/baked/atkinson-hyperlegible-next-700.js +1974 -0
  21. package/fonts/baked/atkinson-hyperlegible-next-700.json +1 -1
  22. package/fonts/baked/atkinson-hyperlegible-next-800.js +1977 -0
  23. package/fonts/baked/atkinson-hyperlegible-next-800.json +1 -1
  24. package/fonts/baked/manifest.json +10 -28
  25. package/package.json +3 -2
  26. package/src/fogPlugin.js +100 -30
  27. package/src/material.js +12 -9
  28. package/fonts/baked/atkinson-hyperlegible-next-250.json +0 -1
  29. package/fonts/baked/atkinson-hyperlegible-next-350.json +0 -1
  30. package/fonts/baked/atkinson-hyperlegible-next-450.json +0 -1
  31. package/fonts/baked/atkinson-hyperlegible-next-550.json +0 -1
  32. package/fonts/baked/atkinson-hyperlegible-next-650.json +0 -1
  33. package/fonts/baked/atkinson-hyperlegible-next-750.json +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"meshwriter.esm.js","sources":["../src/utils.js","../src/fontCompression.js","../src/fontRegistry.js","../src/csg.js","../src/fogPlugin.js","../src/material.js","../src/sps.js","../src/meshSplitter.js","../src/letterMesh.js","../src/curves.js","../src/meshwriter.js","../src/bakedFontLoader.js","../src/colorContrast.js","../src/index.js"],"sourcesContent":["/**\n * MeshWriter Utility Functions\n * Pure helper functions with no external dependencies\n */\n\nconst floor = Math.floor;\n\n// Type checking functions\nexport function isPositiveNumber(mn) {\n return typeof mn === \"number\" && !isNaN(mn) ? 0 < mn : false;\n}\n\nexport function isNumber(mn) {\n return typeof mn === \"number\";\n}\n\nexport function isBoolean(mn) {\n return typeof mn === \"boolean\";\n}\n\nexport function isAmplitude(ma) {\n return typeof ma === \"number\" && !isNaN(ma) ? 0 <= ma && ma <= 1 : false;\n}\n\nexport function isObject(mo) {\n return mo != null && typeof mo === \"object\" || typeof mo === \"function\";\n}\n\nexport function isPromiseLike(mo) {\n return isObject(mo) && typeof mo.then === \"function\";\n}\n\nexport function isArray(ma) {\n return ma != null && typeof ma === \"object\" && ma.constructor === Array;\n}\n\nexport function isString(ms) {\n return typeof ms === \"string\" ? ms.length > 0 : false;\n}\n\nexport function isRelativeLength(l) {\n return l === 3 || l === 5 || l === 7;\n}\n\n// Math utilities\nexport function round(n) {\n return floor(0.3 + n * 1000000) / 1000000;\n}\n\nexport function weeid() {\n return Math.floor(Math.random() * 1000000);\n}\n\n// Option handling\nexport function setOption(opts, field, tst, defalt) {\n return tst(opts[field]) ? opts[field] : defalt;\n}\n","/**\n * MeshWriter Font Compression/Decompression\n * Base-128 encoding for font data compression (~50% size reduction)\n */\n\nimport { isArray } from './utils.js';\n\nconst floor = Math.floor;\n\n// Encoding arrays (initialized once at module load)\nlet b128back;\nlet b128digits;\n\n/**\n * Initialize encoding arrays for base-128 conversion\n * Called once when module loads\n */\nfunction prepArray() {\n let pntr = -1;\n let n;\n b128back = new Uint8Array(256);\n b128digits = new Array(128);\n\n while (160 > pntr++) {\n if (pntr < 128) {\n n = fr128to256(pntr);\n b128digits[pntr] = String.fromCharCode(n);\n b128back[n] = pntr;\n } else {\n if (pntr === 128) {\n b128back[32] = pntr;\n } else {\n b128back[pntr + 71] = pntr;\n }\n }\n }\n\n function fr128to256(n) {\n if (n < 92) {\n return n < 58 ? n < 6 ? n + 33 : n + 34 : n + 35;\n } else {\n return n + 69;\n }\n }\n}\n\n// Initialize on module load\nprepArray();\n\n/**\n * Convert base-128 encoded string to number\n */\nfunction frB128(s) {\n let result = 0;\n let i = -1;\n const l = s.length - 1;\n while (i++ < l) {\n result = result * 128 + b128back[s.charCodeAt(i)];\n }\n return result;\n}\n\n/**\n * Convert number to base-128 encoded string\n */\nfunction toB128(i) {\n let s = b128digits[(i % 128)];\n i = floor(i / 128);\n while (i > 0) {\n s = b128digits[(i % 128)] + s;\n i = floor(i / 128);\n }\n return s;\n}\n\n/**\n * Decode a compressed command list string\n * @param {string} str - Compressed string (space-separated encoded commands)\n * @returns {Array} - Array of decoded command arrays\n */\nexport function decodeList(str) {\n const split = str.split(\" \");\n const list = [];\n\n split.forEach(function(cmds) {\n if (cmds.length === 12) { list.push(decode6(cmds)); }\n if (cmds.length === 8) { list.push(decode4(cmds)); }\n if (cmds.length === 4) { list.push(decode2(cmds)); }\n });\n\n return list;\n\n function decode6(s) {\n return [\n decode1(s, 0, 2), decode1(s, 2, 4), decode1(s, 4, 6),\n decode1(s, 6, 8), decode1(s, 8, 10), decode1(s, 10, 12)\n ];\n }\n function decode4(s) {\n return [decode1(s, 0, 2), decode1(s, 2, 4), decode1(s, 4, 6), decode1(s, 6, 8)];\n }\n function decode2(s) {\n return [decode1(s, 0, 2), decode1(s, 2, 4)];\n }\n function decode1(s, start, end) {\n return (frB128(s.substring(start, end)) - 4000) / 2;\n }\n}\n\n/**\n * Encode a command list to compressed string\n * @param {Array} list - Array of command arrays\n * @returns {string} - Compressed string\n */\nexport function codeList(list) {\n let str = \"\";\n let xtra = \"\";\n\n if (isArray(list)) {\n list.forEach(function(cmds) {\n if (cmds.length === 6) { str += xtra + code6(cmds); xtra = \" \"; }\n if (cmds.length === 4) { str += xtra + code4(cmds); xtra = \" \"; }\n if (cmds.length === 2) { str += xtra + code2(cmds); xtra = \" \"; }\n });\n }\n\n return str;\n\n function code6(a) {\n return code1(a[0]) + code1(a[1]) + code1(a[2]) + code1(a[3]) + code1(a[4]) + code1(a[5]);\n }\n function code4(a) {\n return code1(a[0]) + code1(a[1]) + code1(a[2]) + code1(a[3]);\n }\n function code2(a) {\n return code1(a[0]) + code1(a[1]);\n }\n function code1(n) {\n return toB128((n + n) + 4000);\n }\n}\n","/**\n * MeshWriter Font Registry\n * Manages font registration and lookup\n */\n\nimport { isObject } from './utils.js';\nimport { codeList, decodeList } from './fontCompression.js';\n\n// Private font storage\nconst FONTS = {};\n\n/**\n * Register a font for use with MeshWriter\n * @param {string} name - Font name (case-sensitive, used in \"font-family\" option)\n * @param {Function|Object} fontData - Font factory function or pre-initialized font object\n *\n * @example\n * // Register a font factory (receives codeList for encoding)\n * import helvetica from 'meshwriter/fonts/helvetica';\n * registerFont('Helvetica', helvetica);\n *\n * // Register with aliases\n * registerFont('Arial', helvetica);\n * registerFont('sans-serif', helvetica);\n */\nexport function registerFont(name, fontData) {\n if (typeof fontData === 'function') {\n // Font is a factory function expecting codeList\n FONTS[name] = fontData(codeList);\n } else if (isObject(fontData)) {\n // Font is already initialized\n FONTS[name] = fontData;\n } else {\n throw new Error(`MeshWriter: Invalid font data for \"${name}\"`);\n }\n}\n\n/**\n * Register multiple font aliases pointing to the same font\n * @param {string} targetName - Name of already-registered font\n * @param {...string} aliases - Alias names to register\n *\n * @example\n * registerFont('Helvetica', helveticaData);\n * registerFontAliases('Helvetica', 'Arial', 'sans-serif');\n */\nexport function registerFontAliases(targetName, ...aliases) {\n if (!FONTS[targetName]) {\n throw new Error(`MeshWriter: Cannot create aliases: font \"${targetName}\" not registered`);\n }\n aliases.forEach(alias => {\n FONTS[alias] = FONTS[targetName];\n });\n}\n\n/**\n * Get a registered font by name\n * @param {string} name - Font name\n * @returns {Object|undefined} - Font object or undefined if not found\n */\nexport function getFont(name) {\n return FONTS[name];\n}\n\n/**\n * Check if a font is registered\n * @param {string} name - Font name\n * @returns {boolean}\n */\nexport function isFontRegistered(name) {\n return isObject(FONTS[name]);\n}\n\n/**\n * Get list of all registered font names\n * @returns {string[]}\n */\nexport function getRegisteredFonts() {\n return Object.keys(FONTS);\n}\n\n/**\n * Unregister a font (mainly for testing)\n * @param {string} name - Font name to remove\n */\nexport function unregisterFont(name) {\n delete FONTS[name];\n}\n\n/**\n * Clear all registered fonts (mainly for testing)\n */\nexport function clearFonts() {\n Object.keys(FONTS).forEach(key => delete FONTS[key]);\n}\n\n// Re-export compression utilities for font authors\nexport { codeList, decodeList };\n","/**\n * MeshWriter CSG Module\n * Handles CSG version detection, async initialization, and ready state management\n */\n\nimport { isObject, isPromiseLike } from './utils.js';\nimport {\n CSG as BabylonCSG,\n CSG2 as BabylonCSG2,\n InitializeCSG2Async as BabylonInitializeCSG2Async,\n IsCSG2Ready as BabylonIsCSG2Ready\n} from './babylonImports.js';\n\n// CSG libraries - initialized from Babylon imports or external source\nlet CSG = BabylonCSG;\nlet CSG2 = BabylonCSG2;\nlet InitializeCSG2Async = BabylonInitializeCSG2Async;\nlet IsCSG2Ready = BabylonIsCSG2Ready;\n\n// State\nlet csgVersion = null; // 'CSG2', 'CSG', or null\nlet csgReady = false;\nconst csgReadyListeners = [];\nlet externalCSGInitializer = null;\nlet externalCSGReadyCheck = null;\n\n/**\n * Initialize CSG module with Babylon.js CSG classes\n * Must be called before using any CSG functionality\n * @param {Object} babylon - Object containing CSG, CSG2, InitializeCSG2Async, IsCSG2Ready\n */\nexport function initCSGModule(babylon) {\n if (isObject(babylon)) {\n CSG = babylon.CSG || null;\n CSG2 = babylon.CSG2 || null;\n InitializeCSG2Async = babylon.InitializeCSG2Async || null;\n IsCSG2Ready = babylon.IsCSG2Ready || null;\n }\n csgVersion = detectCSGVersion();\n\n // Legacy CSG is immediately ready\n if (csgVersion === 'CSG') {\n markCSGInitialized();\n } else if (csgVersion === 'CSG2') {\n // Check if CSG2 is already initialized\n csgReady = false;\n if (runCSGReadyCheck()) {\n markCSGInitialized();\n }\n }\n}\n\n/**\n * Detect which CSG implementation is available\n * @returns {'CSG2'|'CSG'|null}\n */\nexport function detectCSGVersion() {\n // Prefer CSG2 (Babylon 7.31+)\n if (isObject(CSG2) && typeof InitializeCSG2Async === 'function') {\n return 'CSG2';\n }\n // Fall back to legacy CSG\n if (isObject(CSG) && typeof CSG.FromMesh === 'function') {\n return 'CSG';\n }\n return null;\n}\n\n/**\n * Mark CSG as ready and notify all listeners\n */\nexport function markCSGInitialized() {\n if (csgReady) {\n return;\n }\n csgReady = true;\n\n // Notify all waiting listeners\n if (csgReadyListeners.length) {\n csgReadyListeners.splice(0).forEach(function(listener) {\n try {\n listener();\n } catch (err) {\n console.error(\"MeshWriter: onCSGReady listener failed\", err);\n }\n });\n }\n}\n\n/**\n * Check if CSG is ready for use\n * @returns {boolean}\n */\nexport function isCSGReady() {\n if (csgVersion === 'CSG2') {\n refreshCSGReadyState();\n return csgReady;\n }\n return csgVersion === 'CSG';\n}\n\n/**\n * Refresh CSG2 ready state from external checks\n */\nfunction refreshCSGReadyState() {\n if (csgVersion !== 'CSG2' || csgReady) {\n return;\n }\n if (runCSGReadyCheck()) {\n markCSGInitialized();\n }\n}\n\n/**\n * Run CSG ready check (external or native)\n */\nfunction runCSGReadyCheck() {\n // Try external ready check first\n if (typeof externalCSGReadyCheck === \"function\") {\n try {\n if (externalCSGReadyCheck()) {\n return true;\n }\n } catch (err) {\n console.warn(\"MeshWriter: external CSG ready check failed\", err);\n }\n }\n\n // Check native IsCSG2Ready\n if (typeof IsCSG2Ready === \"function\" && IsCSG2Ready()) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Initialize CSG2 asynchronously\n * @returns {Promise<void>}\n */\nexport async function initializeCSG2() {\n if (csgVersion !== 'CSG2') {\n return;\n }\n if (csgReady) {\n return;\n }\n\n const initializer = externalCSGInitializer || InitializeCSG2Async;\n if (typeof initializer !== \"function\") {\n throw new Error(\n \"MeshWriter: No CSG2 initializer available. \" +\n \"Use MeshWriter.setCSGInitializer() or ensure BABYLON.InitializeCSG2Async is available.\"\n );\n }\n\n const result = initializer();\n if (isPromiseLike(result)) {\n await result;\n }\n markCSGInitialized();\n}\n\n// Public API\n\n/**\n * Get the current CSG version being used\n * @returns {'CSG2'|'CSG'|null}\n */\nexport function getCSGVersion() {\n return csgVersion;\n}\n\n/**\n * Set an external CSG2 initializer function\n * @param {Function} fn - Async function that initializes CSG2\n */\nexport function setCSGInitializer(fn) {\n if (typeof fn === \"function\") {\n externalCSGInitializer = fn;\n }\n}\n\n/**\n * Set an external CSG2 ready check function\n * @param {Function} fn - Function that returns true when CSG2 is ready\n */\nexport function setCSGReadyCheck(fn) {\n if (typeof fn === \"function\") {\n externalCSGReadyCheck = fn;\n refreshCSGReadyState();\n }\n}\n\n/**\n * Register a callback to be called when CSG is ready\n * If CSG is already ready, callback is called immediately\n * @param {Function} listener\n */\nexport function onCSGReady(listener) {\n if (typeof listener !== \"function\") {\n return;\n }\n if (isCSGReady()) {\n listener();\n } else {\n csgReadyListeners.push(listener);\n }\n}\n\n/**\n * Get the CSG library to use for operations\n * @returns {Object} - CSG or CSG2 class\n */\nexport function getCSGLib() {\n return csgVersion === 'CSG2' ? CSG2 : CSG;\n}\n\n// Export for direct access when needed\nexport { CSG, CSG2 };\n","/**\n * TextFogPlugin - MaterialPluginBase that applies fog to emissive color\n *\n * Babylon's standard fog only affects diffuse/ambient channels.\n * This plugin recalculates fog blending for the final color output,\n * ensuring emissive text fades properly with distance fog.\n */\n\nimport { MaterialPluginBase } from './babylonImports.js';\n\n/**\n * Plugin that applies scene fog to text materials by modifying\n * the final fragment color before output.\n */\nexport class TextFogPlugin extends MaterialPluginBase {\n /**\n * @param {import('@babylonjs/core/Materials/material').Material} material\n */\n constructor(material) {\n var priority = 300; // Run after standard material processing\n var defines = { 'MESHWRITER_TEXT_FOG': false };\n super(material, 'TextFogPlugin', priority, defines);\n this._enable(true);\n }\n\n /**\n * Set the define based on whether scene fog is enabled\n * @param {object} defines\n * @param {import('@babylonjs/core/scene').Scene} scene\n * @param {import('@babylonjs/core/Meshes/mesh').Mesh} mesh\n */\n prepareDefines(defines, scene, mesh) {\n // Enable when scene has any fog mode set (1=LINEAR, 2=EXP, 3=EXP2)\n defines['MESHWRITER_TEXT_FOG'] = scene.fogMode !== 0;\n }\n\n getClassName() {\n return 'TextFogPlugin';\n }\n\n getUniforms() {\n // We use Babylon's built-in fog uniforms (vFogInfos, vFogColor)\n // which are already available in the standard material\n return { ubo: [] };\n }\n\n /**\n * Clean up the plugin\n */\n dispose() {\n super.dispose();\n }\n\n /**\n * Inject shader code to apply fog to emissive color\n * @param {string} shaderType - 'vertex' or 'fragment'\n */\n getCustomCode(shaderType) {\n if (shaderType === 'fragment') {\n return {\n // This injection point runs just before gl_FragColor is finalized\n // At this point, standard fog has been applied to diffuse/ambient\n // but emissive contribution bypasses fog, so we re-apply fog\n // to the entire output to properly fade text into fog\n 'CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR': `\n #ifdef MESHWRITER_TEXT_FOG\n #ifdef FOG\n // Recalculate fog for the full fragment color including emissive\n // vFogInfos: x=fogMode, y=fogStart, z=fogEnd, w=fogDensity\n // vFogColor: fog RGB color\n // vFogDistance: vec3 distance from camera (set by vertex shader)\n\n float textFogFactor = 1.0;\n float textFogDist = length(vFogDistance);\n\n if (FOGMODE_LINEAR == vFogInfos.x) {\n // Linear fog: factor = (end - dist) / (end - start)\n textFogFactor = clamp((vFogInfos.z - textFogDist) / (vFogInfos.z - vFogInfos.y), 0.0, 1.0);\n } else if (FOGMODE_EXP == vFogInfos.x) {\n // Exponential fog: factor = exp(-dist * density)\n textFogFactor = clamp(exp(-textFogDist * vFogInfos.w), 0.0, 1.0);\n } else if (FOGMODE_EXP2 == vFogInfos.x) {\n // Exponential squared fog: factor = exp(-(dist * density)^2)\n float fogDistDensity = textFogDist * vFogInfos.w;\n textFogFactor = clamp(exp(-fogDistDensity * fogDistDensity), 0.0, 1.0);\n }\n\n // Blend the entire fragment (including emissive) toward fog color\n // textFogFactor: 1.0 = no fog (full color), 0.0 = full fog\n color.rgb = mix(vFogColor, color.rgb, textFogFactor);\n #endif\n #endif\n `,\n };\n }\n return null;\n }\n}\n","/**\n * MeshWriter Material Creation\n * Creates StandardMaterial for text rendering\n */\n\nimport { StandardMaterial, Color3 } from './babylonImports.js';\nimport { weeid } from './utils.js';\nimport { TextFogPlugin } from './fogPlugin.js';\n\n/** @typedef {import('@babylonjs/core/scene').Scene} Scene */\n\nconst floor = Math.floor;\n\n/**\n * Convert hex color string to Babylon Color3\n * @param {string} rgb - Hex color string (e.g., \"#FF0000\" or \"FF0000\")\n * @returns {Color3}\n */\nexport function rgb2Color3(rgb) {\n rgb = rgb.replace(\"#\", \"\");\n return new Color3(\n convert(rgb.substring(0, 2)),\n convert(rgb.substring(2, 4)),\n convert(rgb.substring(4, 6))\n );\n\n function convert(x) {\n const parsed = parseInt(x, 16);\n const val = isNaN(parsed) ? 0 : parsed;\n return floor(1000 * Math.max(0, Math.min(val / 255, 1))) / 1000;\n }\n}\n\n/**\n * Create a StandardMaterial for text\n * @param {Scene} scene - Babylon scene\n * @param {string} letters - Text string (used for material naming)\n * @param {string} emissive - Hex color for emissive\n * @param {string} ambient - Hex color for ambient\n * @param {string} specular - Hex color for specular\n * @param {string} diffuse - Hex color for diffuse\n * @param {number} opac - Opacity (0-1)\n * @param {boolean} [emissiveOnly=false] - If true, disables lighting (only emissive color shows)\n * @param {boolean} [fogEnabled=true] - If true, the material is affected by scene fog\n * @returns {StandardMaterial}\n */\nexport function makeMaterial(scene, letters, emissive, ambient, specular, diffuse, opac, emissiveOnly = false, fogEnabled = true) {\n const material = new StandardMaterial(\"mw-matl-\" + letters + \"-\" + weeid(), scene);\n material.diffuseColor = rgb2Color3(diffuse);\n material.specularColor = rgb2Color3(specular);\n material.ambientColor = rgb2Color3(ambient);\n material.emissiveColor = rgb2Color3(emissive);\n material.alpha = opac;\n\n // When emissiveOnly is true, disable lighting so only emissive color shows\n // This gives a \"self-lit\" appearance that ignores scene lights\n if (emissiveOnly) {\n material.disableLighting = true;\n }\n\n // Emissive-only materials should be self-lit and not affected by fog\n if (emissiveOnly) {\n material.fogEnabled = false;\n } else {\n material.fogEnabled = fogEnabled;\n // Attach fog plugin to properly blend emissive color with fog\n // Babylon's standard fog only affects diffuse/ambient, not emissive.\n // The plugin re-fogs the entire fragment output so emissive fades properly.\n // (The slight double-fog on diffuse/ambient is negligible since text is primarily emissive)\n if (fogEnabled) {\n material._textFogPlugin = new TextFogPlugin(material);\n }\n }\n\n return material;\n}\n\n/**\n * Create a dedicated emissive material for front faces.\n * This keeps the face self-lit while still respecting fog settings.\n * @param {Scene} scene\n * @param {string} letters\n * @param {string} emissive\n * @param {number} opac\n * @param {boolean} fogEnabled\n * @returns {StandardMaterial}\n */\nexport function makeFaceMaterial(scene, letters, emissive, opac, fogEnabled = true) {\n const material = new StandardMaterial(\"mw-face-matl-\" + letters + \"-\" + weeid(), scene);\n const black = rgb2Color3(\"#000000\");\n material.diffuseColor = black;\n material.specularColor = black;\n material.ambientColor = black;\n material.emissiveColor = rgb2Color3(emissive);\n material.disableLighting = true;\n material.alpha = opac;\n material.backFaceCulling = false;\n material.fogEnabled = fogEnabled;\n if (fogEnabled) {\n material._textFogPlugin = new TextFogPlugin(material);\n }\n return material;\n}\n","/**\n * MeshWriter SPS (Solid Particle System) Helpers\n * Converts letter meshes into an efficient SPS\n */\n\nimport { SolidParticleSystem, Mesh } from './babylonImports.js';\n\n/** @typedef {import('@babylonjs/core/scene').Scene} Scene */\n/** @typedef {import('@babylonjs/core/Materials/material').Material} Material */\n/** @typedef {import('@babylonjs/core/Meshes/mesh').Mesh} BabylonMesh */\n/** @typedef {(any[] & { faceMeshes?: BabylonMesh[] })} MeshCollection */\n/**\n * @typedef {[SolidParticleSystem | undefined, BabylonMesh | undefined] & {\n * face: [SolidParticleSystem | undefined, BabylonMesh | undefined];\n * }} SPSCombo\n */\n\n/**\n * Create an SPS from letter meshes\n * @param {Scene} scene - Babylon scene\n * @param {MeshCollection} meshesAndBoxes - [meshes, boxes, origins] with optional face geometry\n * @param {Material} material - Material to apply to SPS mesh\n * @returns {SPSCombo} - Combined SPS + emissive face SPS\n */\nexport function makeSPS(scene, meshesAndBoxes, material) {\n const rimMeshes = meshesAndBoxes[0] || [];\n const faceMeshes = meshesAndBoxes.faceMeshes || [];\n const lettersOrigins = meshesAndBoxes[2] || [];\n\n const rim = buildSystem(\"sps_rim\", rimMeshes, lettersOrigins, scene, material);\n\n // Use Mesh.MergeMeshes for face instead of SPS - SPS has issues with face geometry\n const face = buildFaceMesh(\"sps_face\", faceMeshes, lettersOrigins, scene);\n\n /** @type {SPSCombo} */\n const combo = /** @type {any} */ ([rim.sps, rim.mesh]);\n combo.face = [undefined, face.mesh]; // No SPS for face, just merged mesh\n return combo;\n}\n\n/**\n * Build face mesh using Mesh.MergeMeshes instead of SPS\n * @param {string} name - Mesh name\n * @param {BabylonMesh[]} meshes - Face meshes to merge\n * @param {Array} lettersOrigins - Letter origin positions\n * @param {Scene} scene - Babylon scene\n * @returns {{ mesh: BabylonMesh | undefined }}\n */\nfunction buildFaceMesh(name, meshes, lettersOrigins, scene) {\n const validMeshes = meshes.filter(m => m != null);\n if (!validMeshes.length) {\n return { mesh: undefined };\n }\n\n // Position each mesh according to letter origins before merging\n validMeshes.forEach((mesh, ix) => {\n if (lettersOrigins[ix]) {\n mesh.position.x = lettersOrigins[ix][0] + lettersOrigins[ix][1];\n mesh.position.z = lettersOrigins[ix][2];\n }\n });\n\n // Merge all face meshes into one\n const merged = Mesh.MergeMeshes(validMeshes, true, true, undefined, false, true);\n if (merged) {\n merged.name = name;\n }\n\n return { mesh: merged };\n}\n\nfunction buildSystem(name, meshes, lettersOrigins, scene, material) {\n // Pre-filter null meshes to avoid repeated null checks in hot loop\n const validMeshes = meshes\n .map((mesh, ix) => mesh ? { mesh, origins: lettersOrigins[ix] } : null)\n .filter(item => item !== null);\n\n if (!validMeshes.length) {\n return { sps: undefined, mesh: undefined };\n }\n\n const sps = new SolidParticleSystem(name, scene, {});\n validMeshes.forEach(function(item) {\n sps.addShape(item.mesh, 1, {\n positionFunction: makePositionParticle(item.origins)\n });\n item.mesh.dispose();\n });\n\n const spsMesh = sps.buildMesh();\n\n if (spsMesh && material) {\n spsMesh.material = material;\n }\n sps.setParticles();\n\n return { sps, mesh: spsMesh };\n}\n\nfunction makePositionParticle(letterOrigins) {\n return function positionParticle(particle) {\n if (!letterOrigins) return;\n particle.position.x = letterOrigins[0] + letterOrigins[1];\n particle.position.z = letterOrigins[2];\n };\n}\n","import { Mesh, VertexData } from './babylonImports.js'\n\n/**\n * Split a mesh into two meshes: emissive face geometry and lit rim geometry.\n * @param {import('@babylonjs/core').Mesh} mesh\n * @param {import('@babylonjs/core').Scene} scene\n * @returns {{ rimMesh: import('@babylonjs/core').Mesh, faceMesh: import('@babylonjs/core').Mesh | null }}\n */\nexport function splitMeshByFaceNormals(mesh, scene) {\n var geometry = mesh.geometry\n if (!geometry) {\n return { rimMesh: mesh, faceMesh: null }\n }\n\n var positions = geometry.getVerticesData('position')\n var normals = geometry.getVerticesData('normal')\n var uvs = geometry.getVerticesData('uv')\n var indices = geometry.getIndices()\n\n if (!positions || !normals || !indices || positions.length === 0) {\n return { rimMesh: mesh, faceMesh: null }\n }\n\n var faceData = createEmptyData()\n var rimData = createEmptyData()\n\n var axisInfo = detectFaceAxisFromGeometry(positions, normals, indices)\n if (!axisInfo) {\n axisInfo = detectFaceAxis(normals)\n }\n if (!axisInfo) {\n axisInfo = detectExtrudeAxisFromPositions(positions)\n }\n\n for (var i = 0; i < indices.length; i += 3) {\n var i0 = indices[i]\n var i1 = indices[i + 1]\n var i2 = indices[i + 2]\n var isFace = triangleIsFrontFace(i0, i1, i2, positions, normals, axisInfo)\n var target = isFace ? faceData : rimData\n var v0 = appendVertex(target, i0, positions, normals, uvs)\n var v1 = appendVertex(target, i1, positions, normals, uvs)\n var v2 = appendVertex(target, i2, positions, normals, uvs)\n target.indices.push(v0, v1, v2)\n }\n\n mesh.dispose()\n\n var rimMesh = buildMesh(mesh.name + '_rim', rimData, scene)\n var faceMesh = buildMesh(mesh.name + '_face', faceData, scene)\n\n if (!faceMesh) {\n return { rimMesh: rimMesh || mesh, faceMesh: null }\n }\n if (!rimMesh) {\n return { rimMesh: faceMesh, faceMesh: null }\n }\n return { rimMesh, faceMesh }\n}\n\nfunction detectFaceAxisFromGeometry(positions, normals, indices) {\n if (!positions || !indices) return null\n\n var min = [Infinity, Infinity, Infinity]\n var max = [-Infinity, -Infinity, -Infinity]\n for (var i = 0; i < positions.length; i += 3) {\n var x = positions[i]\n var y = positions[i + 1]\n var z = positions[i + 2]\n if (x < min[0]) min[0] = x\n if (x > max[0]) max[0] = x\n if (y < min[1]) min[1] = y\n if (y > max[1]) max[1] = y\n if (z < min[2]) min[2] = z\n if (z > max[2]) max[2] = z\n }\n\n var epsilons = [\n Math.max((max[0] - min[0]) * 0.15, 0.001),\n Math.max((max[1] - min[1]) * 0.15, 0.001),\n Math.max((max[2] - min[2]) * 0.15, 0.001)\n ]\n\n var counts = [\n { min: 0, max: 0, sumMin: 0, sumMax: 0 },\n { min: 0, max: 0, sumMin: 0, sumMax: 0 },\n { min: 0, max: 0, sumMin: 0, sumMax: 0 }\n ]\n\n for (var idx = 0; idx < indices.length; idx += 3) {\n var i0 = indices[idx]\n var i1 = indices[idx + 1]\n var i2 = indices[idx + 2]\n\n for (var axis = 0; axis < 3; axis++) {\n var epsilon = epsilons[axis]\n if (epsilon <= 0) continue\n var minVal = min[axis]\n var maxVal = max[axis]\n\n var c0 = positions[i0 * 3 + axis]\n var c1 = positions[i1 * 3 + axis]\n var c2 = positions[i2 * 3 + axis]\n\n var nearMin = Math.abs(c0 - minVal) < epsilon &&\n Math.abs(c1 - minVal) < epsilon &&\n Math.abs(c2 - minVal) < epsilon\n var nearMax = Math.abs(c0 - maxVal) < epsilon &&\n Math.abs(c1 - maxVal) < epsilon &&\n Math.abs(c2 - maxVal) < epsilon\n\n if (nearMin) {\n counts[axis].min++\n if (normals) {\n counts[axis].sumMin += normals[i0 * 3 + axis] + normals[i1 * 3 + axis] + normals[i2 * 3 + axis]\n }\n } else if (nearMax) {\n counts[axis].max++\n if (normals) {\n counts[axis].sumMax += normals[i0 * 3 + axis] + normals[i1 * 3 + axis] + normals[i2 * 3 + axis]\n }\n }\n }\n }\n\n var bestAxis = -1\n var bestCount = 0\n for (var axisIdx = 0; axisIdx < 3; axisIdx++) {\n var total = counts[axisIdx].min + counts[axisIdx].max\n if (total > bestCount) {\n bestCount = total\n bestAxis = axisIdx\n }\n }\n\n if (bestAxis === -1 || bestCount === 0) {\n return null\n }\n\n // For 3D text, extrusion is typically along Y axis (axis=1).\n // If Y axis has any face triangles and the detected axis is different,\n // prefer Y unless the detected axis has significantly more triangles.\n var yTotal = counts[1].min + counts[1].max\n if (bestAxis !== 1 && yTotal > 0) {\n // Only switch away from Y if another axis has 2x more triangles\n if (bestCount < yTotal * 2) {\n bestAxis = 1\n bestCount = yTotal\n }\n }\n\n var chosen = counts[bestAxis]\n var frontSide\n // For PolygonMeshBuilder extrusions: geometry goes from Y=0 (base) to Y=-depth (extruded end)\n // After rotation -PI/2 around X: Y=0 → Z=0 (front, facing camera), Y=-depth → Z=+depth (back)\n // So Y=max (Y=0) is the FRONT face, Y=min (Y=-depth) is the BACK face\n var maxHasOutwardNormals = chosen.sumMax > 0\n var minHasOutwardNormals = chosen.sumMin < 0\n\n // Select MAX as front (the base at Y=0 which faces camera after rotation)\n if (maxHasOutwardNormals) {\n frontSide = 'max'\n } else if (minHasOutwardNormals) {\n frontSide = 'min'\n } else {\n // Fallback to max (the base)\n frontSide = 'max'\n }\n\n return {\n axis: bestAxis,\n strategy: 'positions',\n min: min[bestAxis],\n max: max[bestAxis],\n epsilon: epsilons[bestAxis],\n frontSide\n }\n}\n\nfunction detectFaceAxis(normals) {\n if (!normals || normals.length === 0) {\n return null\n }\n var sumsAbs = [0, 0, 0]\n var sumsSigned = [0, 0, 0]\n for (var i = 0; i < normals.length; i += 3) {\n var nx = normals[i]\n var ny = normals[i + 1]\n var nz = normals[i + 2]\n sumsAbs[0] += Math.abs(nx)\n sumsAbs[1] += Math.abs(ny)\n sumsAbs[2] += Math.abs(nz)\n sumsSigned[0] += nx\n sumsSigned[1] += ny\n sumsSigned[2] += nz\n }\n var axis = 0\n var maxSum = sumsAbs[0]\n for (var j = 1; j < 3; j++) {\n if (sumsAbs[j] > maxSum) {\n maxSum = sumsAbs[j]\n axis = j\n }\n }\n if (maxSum === 0) {\n return null\n }\n var frontSign = sumsSigned[axis] >= 0 ? 1 : -1\n return {\n axis,\n frontSign,\n strategy: 'normals',\n min: 0,\n max: 0,\n epsilon: 0,\n frontSide: 'max'\n }\n}\n\nfunction detectExtrudeAxisFromPositions(positions) {\n if (!positions || positions.length === 0) {\n return null\n }\n var min = [Infinity, Infinity, Infinity]\n var max = [-Infinity, -Infinity, -Infinity]\n for (var i = 0; i < positions.length; i += 3) {\n var x = positions[i]\n var y = positions[i + 1]\n var z = positions[i + 2]\n if (x < min[0]) min[0] = x\n if (x > max[0]) max[0] = x\n if (y < min[1]) min[1] = y\n if (y > max[1]) max[1] = y\n if (z < min[2]) min[2] = z\n if (z > max[2]) max[2] = z\n }\n var ranges = [\n max[0] - min[0],\n max[1] - min[1],\n max[2] - min[2]\n ]\n var axis = 0\n var minRange = ranges[0]\n for (var j = 1; j < 3; j++) {\n if (ranges[j] < minRange) {\n minRange = ranges[j]\n axis = j\n }\n }\n var epsilon = Math.max(minRange * 0.05, 0.0001)\n return {\n axis,\n strategy: 'positions',\n min: min[axis],\n max: max[axis],\n epsilon,\n frontSide: 'max'\n }\n}\n\nfunction triangleIsFrontFace(i0, i1, i2, positions, normals, axisInfo) {\n if (!axisInfo) return false\n var axis = axisInfo.axis || 1\n\n if (axisInfo.strategy === 'normals' && normals) {\n var frontSign = axisInfo.frontSign || 1\n var threshold = 0.5\n var n0 = normals[i0 * 3 + axis] * frontSign\n var n1 = normals[i1 * 3 + axis] * frontSign\n var n2 = normals[i2 * 3 + axis] * frontSign\n return (n0 > threshold && n1 > threshold && n2 > threshold)\n }\n\n if (axisInfo.strategy === 'positions' && positions) {\n var epsilon = axisInfo.epsilon\n var limitVal = axisInfo.frontSide === 'min' ? axisInfo.min : axisInfo.max\n var c0 = positions[i0 * 3 + axis]\n var c1 = positions[i1 * 3 + axis]\n var c2 = positions[i2 * 3 + axis]\n return (\n Math.abs(c0 - limitVal) < epsilon &&\n Math.abs(c1 - limitVal) < epsilon &&\n Math.abs(c2 - limitVal) < epsilon\n )\n }\n\n return false\n}\n\nfunction createEmptyData() {\n return {\n positions: [],\n normals: [],\n uvs: [],\n indices: [],\n nextIndex: 0\n }\n}\n\nfunction appendVertex(target, originalIndex, positions, normals, uvs) {\n var posOffset = originalIndex * 3\n var uvOffset = originalIndex * 2\n\n target.positions.push(\n positions[posOffset],\n positions[posOffset + 1],\n positions[posOffset + 2]\n )\n target.normals.push(\n normals[posOffset],\n normals[posOffset + 1],\n normals[posOffset + 2]\n )\n\n if (uvs && uvs.length) {\n target.uvs.push(uvs[uvOffset], uvs[uvOffset + 1])\n } else {\n target.uvs.push(0, 0)\n }\n\n var newIndex = target.nextIndex\n target.nextIndex += 1\n return newIndex\n}\n\nfunction buildMesh(name, data, scene) {\n if (!data.positions.length) return null\n var newMesh = new Mesh(name, scene)\n var vertexData = new VertexData()\n vertexData.positions = data.positions\n vertexData.normals = data.normals\n vertexData.indices = data.indices\n vertexData.uvs = data.uvs\n vertexData.applyToMesh(newMesh, true)\n newMesh.refreshBoundingInfo()\n return newMesh\n}\n","/**\n * MeshWriter Letter Mesh Construction\n * Builds 3D letter meshes from font specifications\n */\n\nimport { Path2, Vector2, Mesh, PolygonMeshBuilder } from './babylonImports.js';\nimport { splitMeshByFaceNormals } from './meshSplitter.js';\nimport { getCSGLib, getCSGVersion, isCSGReady } from './csg.js';\nimport { decodeList } from './fontCompression.js';\nimport {\n isObject, isArray, isNumber, isBoolean,\n isRelativeLength, round, weeid\n} from './utils.js';\nimport earcutModule from 'earcut';\n\n/** @typedef {import('@babylonjs/core/scene').Scene} Scene */\n/** @typedef {import('@babylonjs/core/Materials/material').Material} Material */\n\n// Handle both CJS default export and ESM module export\nconst earcut = earcutModule.default || earcutModule;\n\n// Constants\nconst naturalLetterHeight = 1000;\n\n/**\n * Get kerning value between two characters\n * @param {Object} fontSpec - Font specification object\n * @param {string} left - Left character\n * @param {string} right - Right character\n * @returns {number} - Kerning adjustment value (0 if none)\n */\nfunction getKerning(fontSpec, left, right) {\n if (!fontSpec.kern) return 0;\n const key = `${left},${right}`;\n return fontSpec.kern[key] || 0;\n}\n\n/**\n * Decompress font letter on first use (lazy decompression)\n * @param {Object} fontSpec - Font specification object\n * @param {string} letter - Character to get spec for\n * @returns {Object|undefined} - Letter specification\n */\nfunction makeLetterSpec(fontSpec, letter) {\n const letterSpec = fontSpec[letter];\n\n if (isObject(letterSpec)) {\n // Decompress shape commands if compressed\n if (!isArray(letterSpec.shapeCmds) && isArray(letterSpec.sC)) {\n letterSpec.shapeCmds = letterSpec.sC.map(cmds => decodeList(cmds));\n letterSpec.sC = null;\n }\n // Decompress hole commands if compressed\n if (!isArray(letterSpec.holeCmds) && isArray(letterSpec.hC)) {\n letterSpec.holeCmds = letterSpec.hC.map(cmdslists =>\n isArray(cmdslists) ? cmdslists.map(cmds => decodeList(cmds)) : cmdslists\n );\n letterSpec.hC = null;\n }\n }\n return letterSpec;\n}\n\n/**\n * Convert point to Vector2\n */\nfunction point2Vector(point) {\n return new Vector2(round(point.x), round(point.y));\n}\n\n/**\n * Merge array of meshes\n */\nfunction merge(arrayOfMeshes) {\n return arrayOfMeshes.length === 1\n ? arrayOfMeshes[0]\n : Mesh.MergeMeshes(arrayOfMeshes, true);\n}\n\n/**\n * @typedef {Object} LetterPolygonsResult\n * @property {number} xWidth - Total width of all letters\n * @property {number} count - Number of valid letter meshes\n */\n/**\n * @typedef {(any[] & LetterPolygonsResult) & { faceMeshes: Mesh[] }} LetterPolygonsCollection\n */\n\n/**\n * Construct meshes for all letters in a string\n * @param {string} letters - Text string\n * @param {Object} fontSpec - Font specification\n * @param {number} xOffset - X offset\n * @param {number} yOffset - Y offset (unused, kept for API compatibility)\n * @param {number} zOffset - Z offset\n * @param {number} letterScale - Scale factor for letters\n * @param {number} thickness - Letter thickness (depth)\n * @param {Material} material - Material (unused in this function)\n * @param {string} meshOrigin - \"letterCenter\" or \"fontOrigin\"\n * @param {Scene} scene - Babylon scene\n * @param {Object} [spacingOpts] - Optional spacing options\n * @param {number} [spacingOpts.letterSpacing=0] - Extra spacing between letters (world units, added after kerning)\n * @param {number} [spacingOpts.wordSpacing=0] - Extra spacing for spaces (world units, added to space width)\n * @returns {any[] & LetterPolygonsResult} - [meshes, boxes, origins] with xWidth and count properties\n */\nexport function constructLetterPolygons(\n letters, fontSpec, xOffset, yOffset, zOffset,\n letterScale, thickness, material, meshOrigin, scene, spacingOpts = {}\n) {\n // Extract spacing options (already in world units)\n const letterSpacing = isNumber(spacingOpts.letterSpacing) ? spacingOpts.letterSpacing : 0;\n const wordSpacing = isNumber(spacingOpts.wordSpacing) ? spacingOpts.wordSpacing : 0;\n\n let letterOffsetX = 0;\n const lettersOrigins = new Array(letters.length);\n const lettersBoxes = new Array(letters.length);\n const lettersMeshes = new Array(letters.length);\n const faceMeshes = new Array(letters.length);\n let ix = 0;\n\n for (let i = 0; i < letters.length; i++) {\n const letter = letters[i];\n const letterSpec = makeLetterSpec(fontSpec, letter);\n\n if (isObject(letterSpec)) {\n const lists = buildLetterMeshes(\n letter, i, letterSpec, fontSpec.reverseShapes, fontSpec.reverseHoles,\n meshOrigin, letterScale, xOffset, zOffset, letterOffsetX, thickness, scene\n );\n\n const shapesList = lists[0];\n const holesList = lists[1];\n const letterBox = lists[2];\n const letterOrigins = lists[3];\n let newOffsetX = lists[4];\n\n // Apply kerning with next letter (if any)\n if (i < letters.length - 1) {\n const nextLetter = letters[i + 1];\n const kernValue = getKerning(fontSpec, letter, nextLetter);\n if (kernValue !== 0) {\n newOffsetX += kernValue * letterScale;\n }\n // Apply letter spacing after kerning (not after last letter)\n if (letterSpacing !== 0) {\n newOffsetX += letterSpacing;\n }\n }\n\n // Apply extra word spacing for space characters\n if (letter === ' ' && wordSpacing !== 0) {\n newOffsetX += wordSpacing;\n }\n\n letterOffsetX = newOffsetX;\n\n const letterMeshes = punchHolesInShapes(shapesList, holesList, letter, i, scene);\n\n if (letterMeshes.length) {\n const merged = merge(letterMeshes);\n const split = splitMeshByFaceNormals(merged, scene);\n\n lettersMeshes[ix] = split.rimMesh;\n faceMeshes[ix] = split.faceMesh;\n lettersOrigins[ix] = letterOrigins;\n lettersBoxes[ix] = letterBox;\n ix++;\n }\n }\n }\n\n /** @type {LetterPolygonsCollection} */\n const meshesAndBoxes = /** @type {any} */ ([lettersMeshes, lettersBoxes, lettersOrigins]);\n meshesAndBoxes.faceMeshes = faceMeshes;\n meshesAndBoxes.xWidth = round(letterOffsetX);\n meshesAndBoxes.count = ix;\n return meshesAndBoxes;\n}\n\n/**\n * Build meshes for a single letter\n * @returns {Array} - [shapesList, holesList, letterBox, letterOrigins, newOffsetX]\n */\nfunction buildLetterMeshes(\n letter, index, spec, reverseShapes, reverseHoles,\n meshOrigin, letterScale, xOffset, zOffset, letterOffsetX, thickness, scene\n) {\n // Offset calculations\n const balanced = meshOrigin === \"letterCenter\";\n const centerX = (spec.xMin + spec.xMax) / 2;\n const centerZ = (spec.yMin + spec.yMax) / 2;\n const xFactor = isNumber(spec.xFactor) ? spec.xFactor : 1;\n const zFactor = isNumber(spec.yFactor) ? spec.yFactor : 1;\n const xShift = isNumber(spec.xShift) ? spec.xShift : 0;\n const zShift = isNumber(spec.yShift) ? spec.yShift : 0;\n const reverseShape = isBoolean(spec.reverseShape) ? spec.reverseShape : reverseShapes;\n const reverseHole = isBoolean(spec.reverseHole) ? spec.reverseHole : reverseHoles;\n const offX = xOffset - (balanced ? centerX : 0);\n const offZ = zOffset - (balanced ? centerZ : 0);\n const shapeCmdsLists = isArray(spec.shapeCmds) ? spec.shapeCmds : [];\n const holeCmdsListsArray = isArray(spec.holeCmds) ? spec.holeCmds : [];\n\n // Tracking for relative coordinates\n let thisX, lastX, thisZ, lastZ;\n\n // Scaling functions\n const adjX = makeAdjust(letterScale, xFactor, offX, 0, false, true);\n const adjZ = makeAdjust(letterScale, zFactor, offZ, 0, false, false);\n const adjXfix = makeAdjust(letterScale, xFactor, offX, xShift, false, true);\n const adjZfix = makeAdjust(letterScale, zFactor, offZ, zShift, false, false);\n const adjXrel = makeAdjust(letterScale, xFactor, offX, xShift, true, true);\n const adjZrel = makeAdjust(letterScale, zFactor, offZ, zShift, true, false);\n\n const letterBox = [adjX(spec.xMin), adjX(spec.xMax), adjZ(spec.yMin), adjZ(spec.yMax)];\n const letterOrigins = [round(letterOffsetX), -1 * adjX(0), -1 * adjZ(0)];\n\n // Update letterOffsetX for next letter\n const newOffsetX = letterOffsetX + spec.wdth * letterScale;\n\n const shapesList = shapeCmdsLists.map(makeCmdsToMesh(reverseShape));\n const holesList = holeCmdsListsArray.map(meshesFromCmdsListArray);\n\n return [shapesList, holesList, letterBox, letterOrigins, newOffsetX];\n\n function meshesFromCmdsListArray(cmdsListArray) {\n return cmdsListArray.map(makeCmdsToMesh(reverseHole));\n }\n\n function makeCmdsToMesh(reverse) {\n return function cmdsToMesh(cmdsList) {\n let cmd = getCmd(cmdsList, 0);\n /** @type {any} */\n const path = new Path2(adjXfix(cmd[0]), adjZfix(cmd[1]));\n\n // Process path commands\n for (let j = 1; j < cmdsList.length; j++) {\n cmd = getCmd(cmdsList, j);\n\n // Line (2 coords = absolute, 3 = relative)\n if (cmd.length === 2) {\n path.addLineTo(adjXfix(cmd[0]), adjZfix(cmd[1]));\n }\n if (cmd.length === 3) {\n path.addLineTo(adjXrel(cmd[1]), adjZrel(cmd[2]));\n }\n\n // Quadratic curve (4 = absolute, 5 = relative)\n if (cmd.length === 4) {\n path.addQuadraticCurveTo(\n adjXfix(cmd[0]), adjZfix(cmd[1]),\n adjXfix(cmd[2]), adjZfix(cmd[3])\n );\n }\n if (cmd.length === 5) {\n path.addQuadraticCurveTo(\n adjXrel(cmd[1]), adjZrel(cmd[2]),\n adjXrel(cmd[3]), adjZrel(cmd[4])\n );\n }\n\n // Cubic curve (6 = absolute, 7 = relative)\n if (cmd.length === 6) {\n path.addCubicCurveTo(\n adjXfix(cmd[0]), adjZfix(cmd[1]),\n adjXfix(cmd[2]), adjZfix(cmd[3]),\n adjXfix(cmd[4]), adjZfix(cmd[5])\n );\n }\n if (cmd.length === 7) {\n path.addCubicCurveTo(\n adjXrel(cmd[1]), adjZrel(cmd[2]),\n adjXrel(cmd[3]), adjZrel(cmd[4]),\n adjXrel(cmd[5]), adjZrel(cmd[6])\n );\n }\n }\n\n // Convert path to array and process\n let array = path.getPoints().map(point2Vector);\n\n // Remove redundant start/end points\n const first = 0;\n const last = array.length - 1;\n if (array[first].x === array[last].x && array[first].y === array[last].y) {\n array = array.slice(1);\n }\n if (reverse) {\n array.reverse();\n }\n\n const meshBuilder = new PolygonMeshBuilder(\n \"MeshWriter-\" + letter + index + \"-\" + weeid(),\n array,\n scene,\n earcut\n );\n return meshBuilder.build(true, thickness);\n };\n }\n\n function getCmd(list, ix) {\n lastX = thisX;\n lastZ = thisZ;\n const cmd = list[ix];\n const len = cmd.length;\n thisX = isRelativeLength(len)\n ? round((cmd[len - 2] * xFactor) + thisX)\n : round(cmd[len - 2] * xFactor);\n thisZ = isRelativeLength(len)\n ? round((cmd[len - 1] * zFactor) + thisZ)\n : round(cmd[len - 1] * zFactor);\n return cmd;\n }\n\n function makeAdjust(letterScale, factor, off, shift, relative, xAxis) {\n if (relative) {\n if (xAxis) {\n return val => round(letterScale * ((val * factor) + shift + lastX + off));\n } else {\n return val => round(letterScale * ((val * factor) + shift + lastZ + off));\n }\n } else {\n return val => round(letterScale * ((val * factor) + shift + off));\n }\n }\n}\n\n/**\n * Punch holes in letter shapes using CSG operations\n * @param {Array} shapesList - Array of shape meshes\n * @param {Array} holesList - Array of arrays of hole meshes\n * @param {string} letter - Letter character (for naming)\n * @param {number} letterIndex - Index of letter (for naming)\n * @param {Scene} scene - Babylon scene\n * @returns {Array} - Array of final letter meshes\n */\nfunction punchHolesInShapes(shapesList, holesList, letter, letterIndex, scene) {\n const csgVersion = getCSGVersion();\n\n // Validate CSG is available and initialized\n if (csgVersion === 'CSG2' && !isCSGReady()) {\n throw new Error(\n \"MeshWriter: CSG2 not initialized. \" +\n \"Use 'await MeshWriter.createAsync(scene, prefs)', call \" +\n \"'await BABYLON.InitializeCSG2Async()', or configure \" +\n \"MeshWriter.setCSGInitializer before creating MeshWriter.\"\n );\n }\n if (csgVersion === null) {\n throw new Error(\n \"MeshWriter: No CSG implementation found. \" +\n \"Ensure BABYLON.CSG or BABYLON.CSG2 is available.\"\n );\n }\n\n const letterMeshes = [];\n const csgLib = getCSGLib();\n\n // Handle special case: single shape with multiple hole arrays\n // (e.g., \"B\" has 1 shape but 2 holes - top and bottom)\n // In this case, all holes should be punched into the single shape\n if (shapesList.length === 1 && holesList.length > 1) {\n const shape = shapesList[0];\n // Flatten all hole arrays into a single array\n const allHoles = holesList.flat();\n\n if (allHoles.length > 0) {\n letterMeshes.push(punchHolesInShape(shape, allHoles, letter, letterIndex, csgLib, csgVersion, scene));\n } else {\n letterMeshes.push(shape);\n }\n return letterMeshes;\n }\n\n // Standard case: 1:1 correspondence between shapes and hole arrays\n for (let j = 0; j < shapesList.length; j++) {\n const shape = shapesList[j];\n const holes = holesList[j];\n\n if (isArray(holes) && holes.length) {\n letterMeshes.push(punchHolesInShape(shape, holes, letter, letterIndex, csgLib, csgVersion, scene));\n } else {\n // PolygonMeshBuilder creates meshes with correct normals by default\n // No flipFaces needed for shapes without holes\n letterMeshes.push(shape);\n }\n }\n\n return letterMeshes;\n}\n\n/**\n * Punch holes in a single shape\n */\nfunction punchHolesInShape(shape, holes, letter, letterIndex, csgLib, csgVersion, scene) {\n const meshName = \"Net-\" + letter + letterIndex + \"-\" + weeid();\n\n let csgShape = csgLib.FromMesh(shape);\n for (let k = 0; k < holes.length; k++) {\n csgShape = csgShape.subtract(csgLib.FromMesh(holes[k]));\n }\n\n const resultMesh = csgVersion === 'CSG2'\n ? csgShape.toMesh(meshName, scene, { centerMesh: false, rebuildNormals: true })\n : csgShape.toMesh(meshName, null, scene);\n\n // CSG2 with rebuildNormals: true produces correct normals\n // No flipFaces needed\n\n // Cleanup\n holes.forEach(h => h.dispose());\n shape.dispose();\n\n return resultMesh;\n}\n\nexport { naturalLetterHeight };\n","/**\n * MeshWriter Curve Extensions\n * Optimized Path2 curve methods for better performance\n */\n\nimport { Path2, Curve3, Vector3 } from './babylonImports.js';\n\n/**\n * Extended Path2 interface with MeshWriter curve methods\n * @typedef {Object} Path2Extensions\n * @property {(redX: number, redY: number, blueX: number, blueY: number) => Path2} addQuadraticCurveTo\n * @property {(redX: number, redY: number, greenX: number, greenY: number, blueX: number, blueY: number) => Path2} addCubicCurveTo\n */\n\n// Optimized segment count for curves\n// Native Babylon 6+ uses 36 segments which causes slowdown\n// MeshWriter uses 6 for better performance\nexport const curveSampleSize = 6;\n\n/**\n * Install optimized curve methods on Path2 prototype\n * Must be called after Babylon.js is loaded\n */\nexport function installCurveExtensions() {\n if (!Path2 || !Path2.prototype) {\n return;\n }\n\n /** @type {any} */\n const proto = Path2.prototype;\n\n // Quadratic Bezier with optimized segment count\n proto.addQuadraticCurveTo = function(redX, redY, blueX, blueY) {\n const points = this.getPoints();\n const lastPoint = points[points.length - 1];\n const origin = new Vector3(lastPoint.x, lastPoint.y, 0);\n const control = new Vector3(redX, redY, 0);\n const destination = new Vector3(blueX, blueY, 0);\n\n const curve = Curve3.CreateQuadraticBezier(origin, control, destination, curveSampleSize);\n const curvePoints = curve.getPoints();\n\n for (let i = 1; i < curvePoints.length; i++) {\n this.addLineTo(curvePoints[i].x, curvePoints[i].y);\n }\n return this; // Return this for method chaining\n };\n\n // Cubic Bezier with optimized segment count\n proto.addCubicCurveTo = function(redX, redY, greenX, greenY, blueX, blueY) {\n const points = this.getPoints();\n const lastPoint = points[points.length - 1];\n const origin = new Vector3(lastPoint.x, lastPoint.y, 0);\n const control1 = new Vector3(redX, redY, 0);\n const control2 = new Vector3(greenX, greenY, 0);\n const destination = new Vector3(blueX, blueY, 0);\n\n const nbPoints = Math.floor(0.3 + curveSampleSize * 1.5);\n const curve = Curve3.CreateCubicBezier(origin, control1, control2, destination, nbPoints);\n const curvePoints = curve.getPoints();\n\n for (let i = 1; i < curvePoints.length; i++) {\n this.addLineTo(curvePoints[i].x, curvePoints[i].y);\n }\n return this; // Return this for method chaining\n };\n}\n","/**\n * MeshWriter Core Class\n * Main MeshWriter implementation for 3D text rendering in Babylon.js\n */\n\nimport { Vector2 } from './babylonImports.js';\nimport { getFont, isFontRegistered } from './fontRegistry.js';\nimport {\n initCSGModule, isCSGReady, getCSGVersion, initializeCSG2,\n setCSGInitializer, setCSGReadyCheck, onCSGReady, markCSGInitialized\n} from './csg.js';\nimport { makeMaterial, makeFaceMaterial, rgb2Color3 } from './material.js';\nimport { makeSPS } from './sps.js';\nimport { constructLetterPolygons, naturalLetterHeight } from './letterMesh.js';\nimport { installCurveExtensions } from './curves.js';\nimport {\n isObject, isNumber, isBoolean, isString, isAmplitude,\n isPositiveNumber, round, setOption\n} from './utils.js';\n\n/** @typedef {import('@babylonjs/core/scene').Scene} Scene */\n\n/**\n * @typedef {Object} MeshWriterPreferences\n * @property {string} [defaultFont] - Default font family\n * @property {number} [scale=1] - Scale factor\n * @property {string} [meshOrigin=\"letterCenter\"] - \"letterCenter\" or \"fontOrigin\"\n * @property {boolean} [debug=false] - Enable debug logging\n * @property {Object} [babylon] - Babylon.js namespace object with CSG classes (for ES module builds)\n */\n\n// Constants\nconst defaultColor = \"#808080\";\nconst defaultOpac = 1;\n\n/**\n * Create a MeshWriter factory configured for a scene\n * @param {Scene} scene - Babylon.js scene\n * @param {MeshWriterPreferences} [preferences={}] - Configuration options\n * @returns {Function} - MeshWriter constructor\n */\nexport function createMeshWriter(scene, preferences = {}) {\n // Install curve extensions for Path2\n installCurveExtensions();\n\n const defaultFont = isFontRegistered(preferences.defaultFont)\n ? preferences.defaultFont\n : (isFontRegistered(\"Helvetica\") ? \"Helvetica\" : \"HelveticaNeue-Medium\");\n const meshOrigin = preferences.meshOrigin === \"fontOrigin\"\n ? \"fontOrigin\"\n : \"letterCenter\";\n const scale = isNumber(preferences.scale) ? preferences.scale : 1;\n const debug = isBoolean(preferences.debug) ? preferences.debug : false;\n\n /**\n * MeshWriter constructor - creates 3D text\n * @param {string} lttrs - Text to render\n * @param {Object} opt - Options\n */\n function MeshWriter(lttrs, opt) {\n const options = isObject(opt) ? opt : {};\n const position = setOption(options, \"position\", isObject, {});\n const colors = setOption(options, \"colors\", isObject, {});\n const fontFamily = setOption(options, \"font-family\", isSupportedFont, defaultFont);\n const anchor = setOption(options, \"anchor\", isSupportedAnchor, \"left\");\n const rawheight = setOption(options, \"letter-height\", isPositiveNumber, 100);\n const rawThickness = setOption(options, \"letter-thickness\", isPositiveNumber, 1);\n const basicColor = setOption(options, \"color\", isString, defaultColor);\n const opac = setOption(options, \"alpha\", isAmplitude, defaultOpac);\n const y = setOption(position, \"y\", isNumber, 0);\n const x = setOption(position, \"x\", isNumber, 0);\n const z = setOption(position, \"z\", isNumber, 0);\n const diffuse = setOption(colors, \"diffuse\", isString, \"#404040\"); // Dark gray - lets emissive show\n const specular = setOption(colors, \"specular\", isString, \"#000000\");\n const ambient = setOption(colors, \"ambient\", isString, \"#202020\"); // Very dark - minimal ambient response\n const emissive = setOption(colors, \"emissive\", isString, basicColor);\n const emissiveOnly = setOption(options, \"emissive-only\", isBoolean, false);\n const fogEnabled = setOption(options, \"fog-enabled\", isBoolean, true);\n const letterSpacingRaw = setOption(options, \"letter-spacing\", isNumber, 0);\n const wordSpacingRaw = setOption(options, \"word-spacing\", isNumber, 0);\n const fontSpec = getFont(fontFamily);\n const letterScale = round(scale * rawheight / naturalLetterHeight);\n const thickness = round(scale * rawThickness);\n const letters = isString(lttrs) ? lttrs : \"\";\n // Scale spacing values to match letter scale\n const letterSpacing = letterSpacingRaw * scale;\n const wordSpacing = wordSpacingRaw * scale;\n\n // Create material\n const material = makeMaterial(scene, letters, emissive, ambient, specular, diffuse, opac, emissiveOnly, fogEnabled);\n\n // Create letter meshes\n const meshesAndBoxes = constructLetterPolygons(\n letters, fontSpec, 0, 0, 0, letterScale, thickness, material, meshOrigin, scene,\n { letterSpacing, wordSpacing }\n );\n const meshes = meshesAndBoxes[0];\n const lettersBoxes = meshesAndBoxes[1];\n const lettersOrigins = meshesAndBoxes[2];\n const xWidth = meshesAndBoxes.xWidth;\n\n // Convert to SPS\n const combo = makeSPS(scene, meshesAndBoxes, material);\n const sps = combo[0];\n const mesh = combo[1];\n const faceCombo = combo.face || [];\n const faceSps = faceCombo[0];\n const faceMesh = faceCombo[1];\n let faceMaterial;\n\n if (faceMesh) {\n faceMaterial = makeFaceMaterial(scene, letters, emissive, opac, fogEnabled);\n faceMesh.material = faceMaterial;\n if (mesh) {\n faceMesh.parent = mesh;\n faceMesh.layerMask = mesh.layerMask;\n faceMesh.renderingGroupId = mesh.renderingGroupId;\n }\n // Tiny offset to prevent z-fighting without leaving a visible gap\n // rotation.x=-PI/2 maps: +Y → -Z (toward camera), -Y → +Z (away)\n // We want face IN FRONT of rim, so use POSITIVE Y\n faceMesh.position.y = 0.001;\n faceMesh.isPickable = false;\n }\n\n // Position mesh based on anchor\n const offsetX = anchor === \"right\"\n ? (0 - xWidth)\n : (anchor === \"center\" ? (0 - xWidth / 2) : 0);\n\n if (mesh) {\n mesh.position.x = scale * x + offsetX;\n mesh.position.y = scale * y;\n mesh.position.z = scale * z;\n }\n\n // Instance methods\n let color = basicColor;\n this.getSPS = () => sps;\n this.getMesh = () => mesh;\n this.getMaterial = () => material;\n this.getFaceMesh = () => faceMesh;\n this.getFaceMaterial = () => faceMaterial;\n this.getFaceSPS = () => faceSps;\n this.getOffsetX = () => offsetX;\n this.getLettersBoxes = () => lettersBoxes;\n this.getLettersOrigins = () => lettersOrigins;\n this.color = c => isString(c) ? color = c : color;\n this.alpha = o => isAmplitude(o) ? opac : opac;\n // Track disposed state to prevent double-disposal\n let _disposed = false;\n\n this.clearall = function() {\n // Mark as disposed - getters will return null after this\n _disposed = true;\n };\n\n this.isDisposed = function() {\n return _disposed;\n };\n }\n\n // Prototype methods\n MeshWriter.prototype.setColor = function(color) {\n const material = this.getMaterial();\n if (material && isString(color)) {\n const next = rgb2Color3(this.color(color));\n material.emissiveColor = next;\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n faceMaterial.emissiveColor = next;\n }\n }\n };\n\n MeshWriter.prototype.setAlpha = function(alpha) {\n const material = this.getMaterial();\n if (material && isAmplitude(alpha)) {\n const next = this.alpha(alpha);\n material.alpha = next;\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n faceMaterial.alpha = next;\n }\n }\n };\n\n MeshWriter.prototype.overrideAlpha = function(alpha) {\n const material = this.getMaterial();\n if (material && isAmplitude(alpha)) {\n material.alpha = alpha;\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n faceMaterial.alpha = alpha;\n }\n }\n };\n\n MeshWriter.prototype.resetAlpha = function() {\n const material = this.getMaterial();\n const alpha = this.alpha();\n if (material) {\n material.alpha = alpha;\n }\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n faceMaterial.alpha = alpha;\n }\n };\n\n MeshWriter.prototype.getLetterCenter = function(ix) {\n return new Vector2(0, 0);\n };\n\n MeshWriter.prototype.dispose = function() {\n // Prevent double-disposal\n if (this.isDisposed && this.isDisposed()) {\n return;\n }\n\n // Dispose TextFogPlugin before materials to break circular references\n const material = this.getMaterial();\n if (material) {\n if (material._textFogPlugin && typeof material._textFogPlugin.dispose === 'function') {\n material._textFogPlugin.dispose();\n }\n material.dispose();\n }\n\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n if (faceMaterial._textFogPlugin && typeof faceMaterial._textFogPlugin.dispose === 'function') {\n faceMaterial._textFogPlugin.dispose();\n }\n faceMaterial.dispose();\n }\n\n // Dispose SolidParticleSystem (which also disposes its mesh)\n const sps = this.getSPS();\n if (sps) {\n sps.dispose();\n }\n\n // Dispose face mesh (merged mesh, not SPS-based)\n const faceMesh = this.getFaceMesh && this.getFaceMesh();\n if (faceMesh && typeof faceMesh.dispose === 'function') {\n faceMesh.dispose();\n }\n\n // Mark as disposed\n this.clearall();\n };\n\n return MeshWriter;\n\n // Helper functions\n function isSupportedFont(ff) {\n return isFontRegistered(ff);\n }\n\n function isSupportedAnchor(a) {\n return a === \"left\" || a === \"right\" || a === \"center\";\n }\n}\n\n/**\n * Async factory for Babylon 8+ with CSG2\n * Handles CSG2 initialization automatically\n * @param {Scene} scene - Babylon.js scene\n * @param {MeshWriterPreferences} [preferences={}] - Configuration options\n * @returns {Promise<Function>} - MeshWriter constructor\n */\nexport async function createMeshWriterAsync(scene, preferences = {}) {\n // Initialize CSG module with Babylon methods\n if (preferences.babylon) {\n initCSGModule(preferences.babylon);\n } else {\n // Check for BABYLON global (UMD bundle usage)\n /** @type {any} */\n const globalBabylon = typeof globalThis !== 'undefined' ? globalThis.BABYLON : undefined;\n if (globalBabylon) {\n initCSGModule(globalBabylon);\n }\n }\n\n // Initialize CSG2 if needed\n if (getCSGVersion() === 'CSG2' && !isCSGReady()) {\n await initializeCSG2();\n }\n\n return createMeshWriter(scene, preferences);\n}\n\n// Re-export CSG control functions for static API\nexport {\n isCSGReady,\n getCSGVersion,\n setCSGInitializer,\n setCSGReadyCheck,\n onCSGReady,\n markCSGInitialized as markCSGReady,\n initCSGModule\n};\n","/**\n * MeshWriter Baked Font Loader\n * Loads pre-baked FontSpec JSON files at runtime.\n * Zero dependencies - just fetch and use.\n */\n\n/**\n * Load a pre-baked font from a JSON file\n * @param {string} url - URL to the baked FontSpec JSON file\n * @returns {Promise<object>} - FontSpec object ready for use with MeshWriter\n *\n * @example\n * const fontSpec = await loadBakedFont('/fonts/baked/atkinson-hyperlegible-next-400.json');\n * registerFont('Atkinson400', fontSpec);\n */\nexport async function loadBakedFont(url) {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`MeshWriter: Failed to load baked font from ${url} (HTTP ${response.status})`);\n }\n\n const fontSpec = await response.json();\n\n // Validate it looks like a FontSpec\n if (typeof fontSpec !== 'object' || fontSpec === null) {\n throw new Error(`MeshWriter: Invalid baked font data from ${url}`);\n }\n\n return fontSpec;\n}\n\n/**\n * Load multiple pre-baked weights from a manifest\n * @param {string} manifestUrl - URL to the manifest.json file\n * @param {number[]} [weights] - Specific weights to load (loads all if omitted)\n * @returns {Promise<Map<number, object>>} - Map of weight -> FontSpec\n *\n * @example\n * const fonts = await loadBakedFontsFromManifest('/fonts/baked/manifest.json', [400, 450]);\n * const fontSpec = fonts.get(400);\n */\nexport async function loadBakedFontsFromManifest(manifestUrl, weights) {\n const response = await fetch(manifestUrl);\n\n if (!response.ok) {\n throw new Error(`MeshWriter: Failed to load manifest from ${manifestUrl} (HTTP ${response.status})`);\n }\n\n const manifest = await response.json();\n const baseUrl = manifestUrl.substring(0, manifestUrl.lastIndexOf('/') + 1);\n\n // Determine which weights to load\n const weightsToLoad = weights\n ? weights.filter(w => manifest.weights.includes(w))\n : manifest.weights;\n\n if (weights && weightsToLoad.length !== weights.length) {\n const missing = weights.filter(w => !manifest.weights.includes(w));\n console.warn(`MeshWriter: Requested weights not available: ${missing.join(', ')}`);\n console.warn(`MeshWriter: Available weights: ${manifest.weights.join(', ')}`);\n }\n\n // Load all requested weights in parallel\n const results = await Promise.all(\n weightsToLoad.map(async (weight) => {\n const idx = manifest.weights.indexOf(weight);\n const file = manifest.files[idx];\n const fontSpec = await loadBakedFont(baseUrl + file);\n return { weight, fontSpec };\n })\n );\n\n // Build map\n const fontMap = new Map();\n for (const { weight, fontSpec } of results) {\n fontMap.set(weight, fontSpec);\n }\n\n return fontMap;\n}\n\n/**\n * Find the nearest available weight from a set of baked weights\n * @param {number} targetWeight - Desired weight\n * @param {number[]} availableWeights - Array of available weights\n * @returns {number} - Nearest available weight\n *\n * @example\n * const nearest = findNearestWeight(425, [400, 450, 500]);\n * // Returns 450 (closest to 425)\n */\nexport function findNearestWeight(targetWeight, availableWeights) {\n if (!availableWeights || availableWeights.length === 0) {\n throw new Error('MeshWriter: No available weights provided');\n }\n\n let nearest = availableWeights[0];\n let minDiff = Math.abs(targetWeight - nearest);\n\n for (const weight of availableWeights) {\n const diff = Math.abs(targetWeight - weight);\n if (diff < minDiff) {\n minDiff = diff;\n nearest = weight;\n }\n }\n\n return nearest;\n}\n\n/**\n * Get manifest info without loading fonts\n * @param {string} manifestUrl - URL to the manifest.json file\n * @returns {Promise<object>} - Manifest object with fontName, weights, etc.\n */\nexport async function getBakedFontManifest(manifestUrl) {\n const response = await fetch(manifestUrl);\n\n if (!response.ok) {\n throw new Error(`MeshWriter: Failed to load manifest from ${manifestUrl} (HTTP ${response.status})`);\n }\n\n return response.json();\n}\n","/**\n * Color Contrast Utilities for WCAG Compliance\n * Provides color manipulation for dyslexia accessibility\n */\n\n// ============================================\n// Color Conversion Utilities\n// ============================================\n\n/**\n * Convert hex color string to RGB object (0-1 range)\n * @param {string} hex - Hex color string (e.g., \"#FF0000\" or \"FF0000\")\n * @returns {{r: number, g: number, b: number}}\n */\nexport function hexToRgb(hex) {\n hex = hex.replace(\"#\", \"\");\n return {\n r: parseInt(hex.substring(0, 2), 16) / 255,\n g: parseInt(hex.substring(2, 4), 16) / 255,\n b: parseInt(hex.substring(4, 6), 16) / 255\n };\n}\n\n/**\n * Convert RGB object (0-1 range) to hex color string\n * @param {{r: number, g: number, b: number}} rgb\n * @returns {string}\n */\nexport function rgbToHex(rgb) {\n var r = Math.round(Math.max(0, Math.min(1, rgb.r)) * 255);\n var g = Math.round(Math.max(0, Math.min(1, rgb.g)) * 255);\n var b = Math.round(Math.max(0, Math.min(1, rgb.b)) * 255);\n return \"#\" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase();\n}\n\n/**\n * Convert RGB to HSL\n * @param {number} r - Red (0-1)\n * @param {number} g - Green (0-1)\n * @param {number} b - Blue (0-1)\n * @returns {{h: number, s: number, l: number}} - h in degrees (0-360), s and l in 0-1\n */\nexport function rgbToHsl(r, g, b) {\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var l = (max + min) / 2;\n var h, s;\n\n if (max === min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n h *= 360;\n }\n\n return { h: h, s: s, l: l };\n}\n\n/**\n * Convert HSL to RGB\n * @param {number} h - Hue in degrees (0-360)\n * @param {number} s - Saturation (0-1)\n * @param {number} l - Lightness (0-1)\n * @returns {{r: number, g: number, b: number}}\n */\nexport function hslToRgb(h, s, l) {\n var r, g, b;\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n var hNorm = h / 360;\n\n r = hue2rgb(p, q, hNorm + 1 / 3);\n g = hue2rgb(p, q, hNorm);\n b = hue2rgb(p, q, hNorm - 1 / 3);\n }\n\n return { r: r, g: g, b: b };\n}\n\n// ============================================\n// WCAG Luminance Calculations\n// ============================================\n\n/**\n * Linearize an sRGB channel value\n * @param {number} c - Channel value (0-1)\n * @returns {number} - Linearized value\n */\nfunction linearize(c) {\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\n/**\n * Calculate relative luminance per WCAG 2.1\n * @param {number} r - Red (0-1)\n * @param {number} g - Green (0-1)\n * @param {number} b - Blue (0-1)\n * @returns {number} - Relative luminance (0-1)\n */\nexport function relativeLuminance(r, g, b) {\n var rLin = linearize(r);\n var gLin = linearize(g);\n var bLin = linearize(b);\n return 0.2126 * rLin + 0.7152 * gLin + 0.0722 * bLin;\n}\n\n/**\n * Calculate WCAG contrast ratio between two luminance values\n * @param {number} L1 - Luminance of first color (0-1)\n * @param {number} L2 - Luminance of second color (0-1)\n * @returns {number} - Contrast ratio (1-21)\n */\nexport function contrastRatio(L1, L2) {\n var lighter = Math.max(L1, L2);\n var darker = Math.min(L1, L2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Check if a color is essentially gray (no saturation)\n * @param {{r: number, g: number, b: number}} rgb\n * @param {number} [tolerance=0.02]\n * @returns {boolean}\n */\nfunction isGray(rgb, tolerance) {\n tolerance = tolerance || 0.02;\n var max = Math.max(rgb.r, rgb.g, rgb.b);\n var min = Math.min(rgb.r, rgb.g, rgb.b);\n return (max - min) < tolerance;\n}\n\n// ============================================\n// Luminance Adjustment\n// ============================================\n\n/**\n * Adjust color to target luminance while preserving hue\n * Uses binary search in HSL space\n * Desaturates significantly at low lightness for better visual contrast\n * @param {{r: number, g: number, b: number}} rgb\n * @param {number} targetLum - Target relative luminance (0-1)\n * @returns {{r: number, g: number, b: number}}\n */\nfunction adjustToLuminance(rgb, targetLum) {\n var hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n\n // Binary search to find lightness that achieves target luminance\n var minL = 0;\n var maxL = 1;\n var iterations = 20;\n var finalL;\n\n for (var i = 0; i < iterations; i++) {\n var midL = (minL + maxL) / 2;\n var testRgb = hslToRgb(hsl.h, hsl.s, midL);\n var testLum = relativeLuminance(testRgb.r, testRgb.g, testRgb.b);\n\n if (testLum < targetLum) {\n minL = midL;\n } else {\n maxL = midL;\n }\n }\n\n finalL = (minL + maxL) / 2;\n\n // Desaturate significantly at low lightness for better visual contrast\n // Dark saturated colors (e.g., dark yellow) don't look distinct enough\n // Scale saturation based on lightness: below 0.3 lightness, reduce saturation\n var finalS = hsl.s;\n if (finalL < 0.3) {\n // Linear ramp: at L=0.3, keep 100% saturation; at L=0, keep 20% saturation\n var saturationScale = 0.2 + (finalL / 0.3) * 0.8;\n finalS = hsl.s * saturationScale;\n }\n\n return hslToRgb(hsl.h, finalS, finalL);\n}\n\n// ============================================\n// Auto-Derive Edge Colors\n// ============================================\n\n/**\n * Auto-derive edge colors (diffuse/ambient) from emissive color\n * Creates high-contrast edges for text legibility\n *\n * INVERTED APPROACH: Since emissive adds to all surfaces equally,\n * we flip the strategy - put bright color in diffuse (shows on lit surfaces)\n * and dark color in emissive (base for unlit surfaces).\n * Returns modified emissive along with diffuse/ambient.\n *\n * @param {string} emissiveHex - Hex color string for desired face color\n * @param {number} [targetContrast=4.5] - Target WCAG contrast ratio\n * @returns {{diffuse: string, ambient: string, emissive: string}}\n */\nexport function deriveEdgeColors(emissiveHex, targetContrast) {\n targetContrast = targetContrast || 4.5;\n\n var rgb = hexToRgb(emissiveHex);\n var faceLum = relativeLuminance(rgb.r, rgb.g, rgb.b);\n\n // Calculate target luminance for dark areas to achieve contrast\n var darkLum;\n if (faceLum > 0.5) {\n // Bright face needs dark edges\n darkLum = (faceLum + 0.05) / targetContrast - 0.05;\n darkLum = Math.max(darkLum, 0.0);\n } else {\n // Dark face needs light edges (invert the logic)\n darkLum = targetContrast * (faceLum + 0.05) - 0.05;\n darkLum = Math.min(darkLum, 1.0);\n }\n\n // Handle edge cases\n if (faceLum > 0.95) {\n darkLum = Math.min(0.1, darkLum);\n } else if (faceLum < 0.05) {\n darkLum = Math.max(0.5, darkLum);\n }\n\n // Generate dark color (desaturated at low lightness)\n var darkRgb = adjustToLuminance(rgb, darkLum);\n\n // INVERTED APPROACH:\n // - diffuse = bright (the user's desired face color) - shows on lit surfaces\n // - emissive = dark - base color for all surfaces (unlit areas show this)\n // - ambient = very dark - shadowed areas\n var ambientLum = darkLum * 0.5;\n var ambientRgb = adjustToLuminance(rgb, Math.max(0, ambientLum));\n\n return {\n diffuse: emissiveHex, // Bright color for lit surfaces\n ambient: rgbToHex(ambientRgb), // Very dark for shadows\n emissive: rgbToHex(darkRgb) // Dark base for unlit areas\n };\n}\n\n// ============================================\n// High-Contrast Adjustment Algorithm\n// ============================================\n\n/**\n * Adjust color by a factor (lightness change with optional hue shift)\n * @param {{r: number, g: number, b: number}} rgb\n * @param {number} factor - Adjustment factor (-1 to 1, negative = darken)\n * @param {boolean} allowHueShift\n * @returns {{r: number, g: number, b: number}}\n */\nfunction adjustColorByFactor(rgb, factor, allowHueShift) {\n var hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n\n // Adjust lightness\n var newL = hsl.l + factor;\n newL = Math.max(0, Math.min(1, newL));\n\n // Optionally shift hue for extreme adjustments\n var newH = hsl.h;\n if (allowHueShift && Math.abs(factor) > 0.2) {\n // Slight hue shift toward yellow (high luminance) or blue (low luminance)\n var hueTarget = factor > 0 ? 60 : 240;\n newH = hsl.h + (hueTarget - hsl.h) * Math.abs(factor) * 0.1;\n newH = ((newH % 360) + 360) % 360;\n }\n\n // Reduce saturation at extreme lightness for natural look\n var newS = hsl.s;\n if (newL > 0.9 || newL < 0.1) {\n newS *= 0.5;\n }\n\n return hslToRgb(newH, newS, newL);\n}\n\n/**\n * Oscillate edge colors to find best contrast\n * @param {{r: number, g: number, b: number}} emissive\n * @param {{r: number, g: number, b: number}} diffuse\n * @param {{r: number, g: number, b: number}} ambient\n * @param {object} options\n * @returns {{diffuse: object, ambient: object, achieved: number}}\n */\nfunction oscillateEdges(emissive, diffuse, ambient, options) {\n var emissiveLum = relativeLuminance(emissive.r, emissive.g, emissive.b);\n var diffuseLum = relativeLuminance(diffuse.r, diffuse.g, diffuse.b);\n var currentContrast = contrastRatio(emissiveLum, diffuseLum);\n\n var bestResult = { diffuse: diffuse, ambient: ambient, achieved: currentContrast };\n\n // Determine direction: edges should go opposite to emissive luminance\n var direction = emissiveLum > 0.5 ? -1 : 1;\n\n var steps = 10;\n for (var i = 1; i <= steps; i++) {\n var factor = (i / steps) * options.range;\n\n // Primary direction\n var testDiffuse = adjustColorByFactor(diffuse, direction * factor, options.allowHueShift);\n var testAmbient = adjustColorByFactor(ambient, direction * factor * 0.8, options.allowHueShift);\n\n var testLum = relativeLuminance(testDiffuse.r, testDiffuse.g, testDiffuse.b);\n var contrast = contrastRatio(emissiveLum, testLum);\n\n if (contrast > bestResult.achieved) {\n bestResult = { diffuse: testDiffuse, ambient: testAmbient, achieved: contrast };\n }\n\n if (contrast >= options.targetContrast) break;\n\n // Try opposite direction for edge cases\n testDiffuse = adjustColorByFactor(diffuse, -direction * factor, options.allowHueShift);\n testAmbient = adjustColorByFactor(ambient, -direction * factor * 0.8, options.allowHueShift);\n\n testLum = relativeLuminance(testDiffuse.r, testDiffuse.g, testDiffuse.b);\n contrast = contrastRatio(emissiveLum, testLum);\n\n if (contrast > bestResult.achieved) {\n bestResult = { diffuse: testDiffuse, ambient: testAmbient, achieved: contrast };\n }\n }\n\n return bestResult;\n}\n\n/**\n * Oscillate face color to find better contrast\n * @param {{r: number, g: number, b: number}} emissive\n * @param {{r: number, g: number, b: number}} diffuse\n * @param {object} options\n * @returns {{emissive: object, achieved: number}}\n */\nfunction oscillateFace(emissive, diffuse, options) {\n var diffuseLum = relativeLuminance(diffuse.r, diffuse.g, diffuse.b);\n var emissiveLum = relativeLuminance(emissive.r, emissive.g, emissive.b);\n var currentContrast = contrastRatio(emissiveLum, diffuseLum);\n\n var bestResult = { emissive: emissive, achieved: currentContrast };\n\n // Face should move opposite to edges\n var direction = diffuseLum > 0.5 ? -1 : 1;\n\n var steps = 10;\n for (var i = 1; i <= steps; i++) {\n var factor = (i / steps) * options.range;\n\n var testEmissive = adjustColorByFactor(emissive, direction * factor, options.allowHueShift);\n var testLum = relativeLuminance(testEmissive.r, testEmissive.g, testEmissive.b);\n var contrast = contrastRatio(testLum, diffuseLum);\n\n if (contrast > bestResult.achieved) {\n bestResult = { emissive: testEmissive, achieved: contrast };\n }\n\n if (contrast >= options.targetContrast) break;\n }\n\n return bestResult;\n}\n\n/**\n * Adjust colors to achieve WCAG contrast while preserving user intent\n * Priority: prefer edge modifications over face modifications\n *\n * @param {object} colors - User-provided colors\n * @param {string} colors.emissive - Face color (hex)\n * @param {string} colors.diffuse - Edge lit color (hex)\n * @param {string} [colors.ambient] - Edge shadow color (hex)\n * @param {object} [options]\n * @param {number} [options.targetContrast=4.5] - Target contrast ratio\n * @param {number} [options.edgeRange=0.4] - Max edge modification (0-1)\n * @param {number} [options.faceRange=0.1] - Max face modification (0-1)\n * @param {boolean} [options.allowHueShift=true] - Allow hue modifications\n * @returns {{emissive: string, diffuse: string, ambient: string, achieved: number}}\n */\nexport function adjustForContrast(colors, options) {\n options = options || {};\n var targetContrast = options.targetContrast || 4.5;\n var edgeRange = options.edgeRange || 0.4;\n var faceRange = options.faceRange || 0.1;\n var allowHueShift = options.allowHueShift !== false;\n\n var emissive = hexToRgb(colors.emissive);\n var diffuse = hexToRgb(colors.diffuse);\n var ambient = colors.ambient ? hexToRgb(colors.ambient) : { r: diffuse.r * 0.5, g: diffuse.g * 0.5, b: diffuse.b * 0.5 };\n\n var emissiveLum = relativeLuminance(emissive.r, emissive.g, emissive.b);\n var diffuseLum = relativeLuminance(diffuse.r, diffuse.g, diffuse.b);\n var currentContrast = contrastRatio(emissiveLum, diffuseLum);\n\n // Already meets target?\n if (currentContrast >= targetContrast) {\n return {\n emissive: colors.emissive,\n diffuse: colors.diffuse,\n ambient: colors.ambient || rgbToHex(ambient),\n achieved: currentContrast\n };\n }\n\n // Phase 1: Try edge modification only\n var edgeResult = oscillateEdges(emissive, diffuse, ambient, {\n targetContrast: targetContrast,\n range: edgeRange,\n allowHueShift: allowHueShift\n });\n\n if (edgeResult.achieved >= targetContrast) {\n return {\n emissive: colors.emissive,\n diffuse: rgbToHex(edgeResult.diffuse),\n ambient: rgbToHex(edgeResult.ambient),\n achieved: edgeResult.achieved\n };\n }\n\n // Phase 2: Try face modification\n var faceResult = oscillateFace(emissive, edgeResult.diffuse, {\n targetContrast: targetContrast,\n range: faceRange,\n allowHueShift: allowHueShift\n });\n\n if (faceResult.achieved >= targetContrast) {\n return {\n emissive: rgbToHex(faceResult.emissive),\n diffuse: rgbToHex(edgeResult.diffuse),\n ambient: rgbToHex(edgeResult.ambient),\n achieved: faceResult.achieved\n };\n }\n\n // Phase 3: Oscillate both until convergence\n var maxIterations = 5;\n var currentEmissive = faceResult.emissive;\n var currentDiffuse = edgeResult.diffuse;\n var currentAmbient = edgeResult.ambient;\n var bestAchieved = faceResult.achieved;\n\n for (var iter = 0; iter < maxIterations; iter++) {\n // Try more edge adjustment\n var newEdgeResult = oscillateEdges(currentEmissive, currentDiffuse, currentAmbient, {\n targetContrast: targetContrast,\n range: edgeRange * 0.5,\n allowHueShift: allowHueShift\n });\n\n if (newEdgeResult.achieved >= targetContrast) {\n return {\n emissive: rgbToHex(currentEmissive),\n diffuse: rgbToHex(newEdgeResult.diffuse),\n ambient: rgbToHex(newEdgeResult.ambient),\n achieved: newEdgeResult.achieved\n };\n }\n\n // Try more face adjustment\n var newFaceResult = oscillateFace(currentEmissive, newEdgeResult.diffuse, {\n targetContrast: targetContrast,\n range: faceRange * 0.5,\n allowHueShift: allowHueShift\n });\n\n if (newFaceResult.achieved >= targetContrast) {\n return {\n emissive: rgbToHex(newFaceResult.emissive),\n diffuse: rgbToHex(newEdgeResult.diffuse),\n ambient: rgbToHex(newEdgeResult.ambient),\n achieved: newFaceResult.achieved\n };\n }\n\n // Update for next iteration\n if (newFaceResult.achieved > bestAchieved) {\n bestAchieved = newFaceResult.achieved;\n currentEmissive = newFaceResult.emissive;\n currentDiffuse = newEdgeResult.diffuse;\n currentAmbient = newEdgeResult.ambient;\n } else {\n // No improvement, stop\n break;\n }\n }\n\n // Return best result even if target not achieved\n return {\n emissive: rgbToHex(currentEmissive),\n diffuse: rgbToHex(currentDiffuse),\n ambient: rgbToHex(currentAmbient),\n achieved: bestAchieved\n };\n}\n\n// ============================================\n// Constants\n// ============================================\n\nexport var CONTRAST_LEVELS = {\n AA_NORMAL: 4.5,\n AA_LARGE: 3.0,\n AAA_NORMAL: 7.0,\n AAA_LARGE: 4.5\n};\n","/**\n * MeshWriter - 3D Text Rendering for Babylon.js\n *\n * @example\n * // ES Module usage\n * import { MeshWriter, registerFont } from 'meshwriter';\n * import helvetica from 'meshwriter/fonts/helvetica';\n *\n * registerFont('Helvetica', helvetica);\n * const Writer = await MeshWriter.createAsync(scene);\n * const text = new Writer(\"Hello World\", { \"letter-height\": 20 });\n */\n\n// Core MeshWriter factory functions\nexport {\n createMeshWriter,\n createMeshWriterAsync,\n isCSGReady,\n getCSGVersion,\n setCSGInitializer,\n setCSGReadyCheck,\n onCSGReady,\n markCSGReady,\n initCSGModule\n} from './meshwriter.js';\n\n// Font registry\nexport {\n registerFont,\n registerFontAliases,\n getFont,\n isFontRegistered,\n getRegisteredFonts,\n unregisterFont,\n clearFonts,\n codeList,\n decodeList\n} from './fontRegistry.js';\n\n// Baked font loader (lightweight, no dependencies)\nexport {\n loadBakedFont,\n loadBakedFontsFromManifest,\n findNearestWeight,\n getBakedFontManifest\n} from './bakedFontLoader.js';\n\n// Utility exports (for advanced usage / font creation)\nexport { codeList as encodeFontData, decodeList as decodeFontData } from './fontCompression.js';\n\n// Material plugins (for advanced usage)\nexport { TextFogPlugin } from './fogPlugin.js';\n\n// Color contrast utilities (for accessibility)\nexport {\n deriveEdgeColors,\n adjustForContrast,\n relativeLuminance,\n contrastRatio,\n hexToRgb,\n rgbToHex,\n rgbToHsl,\n hslToRgb,\n CONTRAST_LEVELS\n} from './colorContrast.js';\n\n/**\n * MeshWriter namespace object (for convenience and backward compatibility patterns)\n */\nimport {\n createMeshWriter,\n createMeshWriterAsync,\n isCSGReady,\n getCSGVersion,\n setCSGInitializer,\n setCSGReadyCheck,\n onCSGReady,\n markCSGReady,\n initCSGModule\n} from './meshwriter.js';\n\nimport {\n registerFont,\n registerFontAliases,\n getFont,\n isFontRegistered\n} from './fontRegistry.js';\n\nimport { codeList, decodeList } from './fontCompression.js';\n\nimport {\n loadBakedFont,\n loadBakedFontsFromManifest,\n findNearestWeight,\n getBakedFontManifest\n} from './bakedFontLoader.js';\n\nexport const MeshWriter = {\n /**\n * Create MeshWriter async (recommended for Babylon 8+)\n */\n createAsync: createMeshWriterAsync,\n\n /**\n * Create MeshWriter sync (for Babylon < 8 or when CSG2 is pre-initialized)\n */\n create: createMeshWriter,\n\n // Static CSG methods\n isReady: isCSGReady,\n getCSGVersion,\n setCSGInitializer,\n setCSGReadyCheck,\n onCSGReady,\n markCSGReady,\n initCSGModule,\n\n // Font methods\n registerFont,\n registerFontAliases,\n getFont,\n isFontRegistered,\n\n // Encoding utilities\n codeList,\n decodeList,\n\n // Baked font methods (lightweight alternative to variable fonts)\n loadBakedFont,\n loadBakedFontsFromManifest,\n findNearestWeight,\n getBakedFontManifest\n};\n\n// Default export\nexport default MeshWriter;\n"],"names":["floor","BabylonCSG","BabylonCSG2","BabylonInitializeCSG2Async","BabylonIsCSG2Ready","markCSGReady"],"mappings":"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"}
1
+ {"version":3,"file":"meshwriter.esm.js","sources":["../src/utils.js","../src/fontCompression.js","../src/fontRegistry.js","../src/csg.js","../src/fogPlugin.js","../src/material.js","../src/sps.js","../src/meshSplitter.js","../src/letterMesh.js","../src/curves.js","../src/meshwriter.js","../src/bakedFontLoader.js","../src/colorContrast.js","../src/index.js"],"sourcesContent":["/**\n * MeshWriter Utility Functions\n * Pure helper functions with no external dependencies\n */\n\nconst floor = Math.floor;\n\n// Type checking functions\nexport function isPositiveNumber(mn) {\n return typeof mn === \"number\" && !isNaN(mn) ? 0 < mn : false;\n}\n\nexport function isNumber(mn) {\n return typeof mn === \"number\";\n}\n\nexport function isBoolean(mn) {\n return typeof mn === \"boolean\";\n}\n\nexport function isAmplitude(ma) {\n return typeof ma === \"number\" && !isNaN(ma) ? 0 <= ma && ma <= 1 : false;\n}\n\nexport function isObject(mo) {\n return mo != null && typeof mo === \"object\" || typeof mo === \"function\";\n}\n\nexport function isPromiseLike(mo) {\n return isObject(mo) && typeof mo.then === \"function\";\n}\n\nexport function isArray(ma) {\n return ma != null && typeof ma === \"object\" && ma.constructor === Array;\n}\n\nexport function isString(ms) {\n return typeof ms === \"string\" ? ms.length > 0 : false;\n}\n\nexport function isRelativeLength(l) {\n return l === 3 || l === 5 || l === 7;\n}\n\n// Math utilities\nexport function round(n) {\n return floor(0.3 + n * 1000000) / 1000000;\n}\n\nexport function weeid() {\n return Math.floor(Math.random() * 1000000);\n}\n\n// Option handling\nexport function setOption(opts, field, tst, defalt) {\n return tst(opts[field]) ? opts[field] : defalt;\n}\n","/**\n * MeshWriter Font Compression/Decompression\n * Base-128 encoding for font data compression (~50% size reduction)\n */\n\nimport { isArray } from './utils.js';\n\nconst floor = Math.floor;\n\n// Encoding arrays (initialized once at module load)\nlet b128back;\nlet b128digits;\n\n/**\n * Initialize encoding arrays for base-128 conversion\n * Called once when module loads\n */\nfunction prepArray() {\n let pntr = -1;\n let n;\n b128back = new Uint8Array(256);\n b128digits = new Array(128);\n\n while (160 > pntr++) {\n if (pntr < 128) {\n n = fr128to256(pntr);\n b128digits[pntr] = String.fromCharCode(n);\n b128back[n] = pntr;\n } else {\n if (pntr === 128) {\n b128back[32] = pntr;\n } else {\n b128back[pntr + 71] = pntr;\n }\n }\n }\n\n function fr128to256(n) {\n if (n < 92) {\n return n < 58 ? n < 6 ? n + 33 : n + 34 : n + 35;\n } else {\n return n + 69;\n }\n }\n}\n\n// Initialize on module load\nprepArray();\n\n/**\n * Convert base-128 encoded string to number\n */\nfunction frB128(s) {\n let result = 0;\n let i = -1;\n const l = s.length - 1;\n while (i++ < l) {\n result = result * 128 + b128back[s.charCodeAt(i)];\n }\n return result;\n}\n\n/**\n * Convert number to base-128 encoded string\n */\nfunction toB128(i) {\n let s = b128digits[(i % 128)];\n i = floor(i / 128);\n while (i > 0) {\n s = b128digits[(i % 128)] + s;\n i = floor(i / 128);\n }\n return s;\n}\n\n/**\n * Decode a compressed command list string\n * @param {string} str - Compressed string (space-separated encoded commands)\n * @returns {Array} - Array of decoded command arrays\n */\nexport function decodeList(str) {\n const split = str.split(\" \");\n const list = [];\n\n split.forEach(function(cmds) {\n if (cmds.length === 12) { list.push(decode6(cmds)); }\n if (cmds.length === 8) { list.push(decode4(cmds)); }\n if (cmds.length === 4) { list.push(decode2(cmds)); }\n });\n\n return list;\n\n function decode6(s) {\n return [\n decode1(s, 0, 2), decode1(s, 2, 4), decode1(s, 4, 6),\n decode1(s, 6, 8), decode1(s, 8, 10), decode1(s, 10, 12)\n ];\n }\n function decode4(s) {\n return [decode1(s, 0, 2), decode1(s, 2, 4), decode1(s, 4, 6), decode1(s, 6, 8)];\n }\n function decode2(s) {\n return [decode1(s, 0, 2), decode1(s, 2, 4)];\n }\n function decode1(s, start, end) {\n return (frB128(s.substring(start, end)) - 4000) / 2;\n }\n}\n\n/**\n * Encode a command list to compressed string\n * @param {Array} list - Array of command arrays\n * @returns {string} - Compressed string\n */\nexport function codeList(list) {\n let str = \"\";\n let xtra = \"\";\n\n if (isArray(list)) {\n list.forEach(function(cmds) {\n if (cmds.length === 6) { str += xtra + code6(cmds); xtra = \" \"; }\n if (cmds.length === 4) { str += xtra + code4(cmds); xtra = \" \"; }\n if (cmds.length === 2) { str += xtra + code2(cmds); xtra = \" \"; }\n });\n }\n\n return str;\n\n function code6(a) {\n return code1(a[0]) + code1(a[1]) + code1(a[2]) + code1(a[3]) + code1(a[4]) + code1(a[5]);\n }\n function code4(a) {\n return code1(a[0]) + code1(a[1]) + code1(a[2]) + code1(a[3]);\n }\n function code2(a) {\n return code1(a[0]) + code1(a[1]);\n }\n function code1(n) {\n return toB128((n + n) + 4000);\n }\n}\n","/**\n * MeshWriter Font Registry\n * Manages font registration and lookup\n */\n\nimport { isObject } from './utils.js';\nimport { codeList, decodeList } from './fontCompression.js';\n\n// Private font storage\nconst FONTS = {};\n\n/**\n * Register a font for use with MeshWriter\n * @param {string} name - Font name (case-sensitive, used in \"font-family\" option)\n * @param {Function|Object} fontData - Font factory function or pre-initialized font object\n *\n * @example\n * // Register a font factory (receives codeList for encoding)\n * import helvetica from 'meshwriter/fonts/helvetica';\n * registerFont('Helvetica', helvetica);\n *\n * // Register with aliases\n * registerFont('Arial', helvetica);\n * registerFont('sans-serif', helvetica);\n */\nexport function registerFont(name, fontData) {\n if (typeof fontData === 'function') {\n // Font is a factory function expecting codeList\n FONTS[name] = fontData(codeList);\n } else if (isObject(fontData)) {\n // Font is already initialized\n FONTS[name] = fontData;\n } else {\n throw new Error(`MeshWriter: Invalid font data for \"${name}\"`);\n }\n}\n\n/**\n * Register multiple font aliases pointing to the same font\n * @param {string} targetName - Name of already-registered font\n * @param {...string} aliases - Alias names to register\n *\n * @example\n * registerFont('Helvetica', helveticaData);\n * registerFontAliases('Helvetica', 'Arial', 'sans-serif');\n */\nexport function registerFontAliases(targetName, ...aliases) {\n if (!FONTS[targetName]) {\n throw new Error(`MeshWriter: Cannot create aliases: font \"${targetName}\" not registered`);\n }\n aliases.forEach(alias => {\n FONTS[alias] = FONTS[targetName];\n });\n}\n\n/**\n * Get a registered font by name\n * @param {string} name - Font name\n * @returns {Object|undefined} - Font object or undefined if not found\n */\nexport function getFont(name) {\n return FONTS[name];\n}\n\n/**\n * Check if a font is registered\n * @param {string} name - Font name\n * @returns {boolean}\n */\nexport function isFontRegistered(name) {\n return isObject(FONTS[name]);\n}\n\n/**\n * Get list of all registered font names\n * @returns {string[]}\n */\nexport function getRegisteredFonts() {\n return Object.keys(FONTS);\n}\n\n/**\n * Unregister a font (mainly for testing)\n * @param {string} name - Font name to remove\n */\nexport function unregisterFont(name) {\n delete FONTS[name];\n}\n\n/**\n * Clear all registered fonts (mainly for testing)\n */\nexport function clearFonts() {\n Object.keys(FONTS).forEach(key => delete FONTS[key]);\n}\n\n// Re-export compression utilities for font authors\nexport { codeList, decodeList };\n","/**\n * MeshWriter CSG Module\n * Handles CSG version detection, async initialization, and ready state management\n */\n\nimport { isObject, isPromiseLike } from './utils.js';\nimport {\n CSG as BabylonCSG,\n CSG2 as BabylonCSG2,\n InitializeCSG2Async as BabylonInitializeCSG2Async,\n IsCSG2Ready as BabylonIsCSG2Ready\n} from './babylonImports.js';\n\n// CSG libraries - initialized from Babylon imports or external source\nlet CSG = BabylonCSG;\nlet CSG2 = BabylonCSG2;\nlet InitializeCSG2Async = BabylonInitializeCSG2Async;\nlet IsCSG2Ready = BabylonIsCSG2Ready;\n\n// State\nlet csgVersion = null; // 'CSG2', 'CSG', or null\nlet csgReady = false;\nconst csgReadyListeners = [];\nlet externalCSGInitializer = null;\nlet externalCSGReadyCheck = null;\n\n/**\n * Initialize CSG module with Babylon.js CSG classes\n * Must be called before using any CSG functionality\n * @param {Object} babylon - Object containing CSG, CSG2, InitializeCSG2Async, IsCSG2Ready\n */\nexport function initCSGModule(babylon) {\n if (isObject(babylon)) {\n CSG = babylon.CSG || null;\n CSG2 = babylon.CSG2 || null;\n InitializeCSG2Async = babylon.InitializeCSG2Async || null;\n IsCSG2Ready = babylon.IsCSG2Ready || null;\n }\n csgVersion = detectCSGVersion();\n\n // Legacy CSG is immediately ready\n if (csgVersion === 'CSG') {\n markCSGInitialized();\n } else if (csgVersion === 'CSG2') {\n // Check if CSG2 is already initialized\n csgReady = false;\n if (runCSGReadyCheck()) {\n markCSGInitialized();\n }\n }\n}\n\n/**\n * Detect which CSG implementation is available\n * @returns {'CSG2'|'CSG'|null}\n */\nexport function detectCSGVersion() {\n // Prefer CSG2 (Babylon 7.31+)\n if (isObject(CSG2) && typeof InitializeCSG2Async === 'function') {\n return 'CSG2';\n }\n // Fall back to legacy CSG\n if (isObject(CSG) && typeof CSG.FromMesh === 'function') {\n return 'CSG';\n }\n return null;\n}\n\n/**\n * Mark CSG as ready and notify all listeners\n */\nexport function markCSGInitialized() {\n if (csgReady) {\n return;\n }\n csgReady = true;\n\n // Notify all waiting listeners\n if (csgReadyListeners.length) {\n csgReadyListeners.splice(0).forEach(function(listener) {\n try {\n listener();\n } catch (err) {\n console.error(\"MeshWriter: onCSGReady listener failed\", err);\n }\n });\n }\n}\n\n/**\n * Check if CSG is ready for use\n * @returns {boolean}\n */\nexport function isCSGReady() {\n if (csgVersion === 'CSG2') {\n refreshCSGReadyState();\n return csgReady;\n }\n return csgVersion === 'CSG';\n}\n\n/**\n * Refresh CSG2 ready state from external checks\n */\nfunction refreshCSGReadyState() {\n if (csgVersion !== 'CSG2' || csgReady) {\n return;\n }\n if (runCSGReadyCheck()) {\n markCSGInitialized();\n }\n}\n\n/**\n * Run CSG ready check (external or native)\n */\nfunction runCSGReadyCheck() {\n // Try external ready check first\n if (typeof externalCSGReadyCheck === \"function\") {\n try {\n if (externalCSGReadyCheck()) {\n return true;\n }\n } catch (err) {\n console.warn(\"MeshWriter: external CSG ready check failed\", err);\n }\n }\n\n // Check native IsCSG2Ready\n if (typeof IsCSG2Ready === \"function\" && IsCSG2Ready()) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Initialize CSG2 asynchronously\n * @returns {Promise<void>}\n */\nexport async function initializeCSG2() {\n if (csgVersion !== 'CSG2') {\n return;\n }\n if (csgReady) {\n return;\n }\n\n const initializer = externalCSGInitializer || InitializeCSG2Async;\n if (typeof initializer !== \"function\") {\n throw new Error(\n \"MeshWriter: No CSG2 initializer available. \" +\n \"Use MeshWriter.setCSGInitializer() or ensure BABYLON.InitializeCSG2Async is available.\"\n );\n }\n\n const result = initializer();\n if (isPromiseLike(result)) {\n await result;\n }\n markCSGInitialized();\n}\n\n// Public API\n\n/**\n * Get the current CSG version being used\n * @returns {'CSG2'|'CSG'|null}\n */\nexport function getCSGVersion() {\n return csgVersion;\n}\n\n/**\n * Set an external CSG2 initializer function\n * @param {Function} fn - Async function that initializes CSG2\n */\nexport function setCSGInitializer(fn) {\n if (typeof fn === \"function\") {\n externalCSGInitializer = fn;\n }\n}\n\n/**\n * Set an external CSG2 ready check function\n * @param {Function} fn - Function that returns true when CSG2 is ready\n */\nexport function setCSGReadyCheck(fn) {\n if (typeof fn === \"function\") {\n externalCSGReadyCheck = fn;\n refreshCSGReadyState();\n }\n}\n\n/**\n * Register a callback to be called when CSG is ready\n * If CSG is already ready, callback is called immediately\n * @param {Function} listener\n */\nexport function onCSGReady(listener) {\n if (typeof listener !== \"function\") {\n return;\n }\n if (isCSGReady()) {\n listener();\n } else {\n csgReadyListeners.push(listener);\n }\n}\n\n/**\n * Get the CSG library to use for operations\n * @returns {Object} - CSG or CSG2 class\n */\nexport function getCSGLib() {\n return csgVersion === 'CSG2' ? CSG2 : CSG;\n}\n\n// Export for direct access when needed\nexport { CSG, CSG2 };\n","/**\n * TextFogPlugin - MaterialPluginBase that applies fog to text materials\n *\n * Since we disable Babylon's built-in fog (material.fogEnabled = false) to avoid\n * double-fogging of diffuse colors, this plugin handles ALL fog application.\n * It supplies its own uniforms and varyings to calculate fog distance and blend.\n *\n * This ensures text (with emissive colors) fades into fog at the same rate as\n * terrain (which uses only diffuse colors with standard fog).\n */\n\nimport { MaterialPluginBase } from './babylonImports.js';\n\n/**\n * Plugin that applies scene fog to text materials uniformly.\n * Handles fog for both diffuse and emissive components in one pass.\n */\nexport class TextFogPlugin extends MaterialPluginBase {\n /**\n * @param {import('@babylonjs/core/Materials/material').Material} material\n */\n constructor(material) {\n var priority = 300; // Run after standard material processing\n var defines = { 'MESHWRITER_TEXT_FOG': false };\n super(material, 'TextFogPlugin', priority, defines);\n this._enable(true);\n }\n\n /**\n * Set the define based on whether scene fog is enabled\n * @param {object} defines\n * @param {import('@babylonjs/core/scene').Scene} scene\n * @param {import('@babylonjs/core/Meshes/mesh').Mesh} mesh\n */\n prepareDefines(defines, scene, mesh) {\n // Enable when scene has any fog mode set (1=LINEAR, 2=EXP, 3=EXP2)\n // This is independent of material.fogEnabled since we handle fog ourselves\n defines['MESHWRITER_TEXT_FOG'] = scene.fogMode !== 0;\n }\n\n getClassName() {\n return 'TextFogPlugin';\n }\n\n /**\n * Define our own fog uniforms since material.fogEnabled = false\n * means Babylon's built-in fog uniforms won't be available.\n *\n * - ubo: Used when Uniform Buffer Objects are enabled (Safari)\n * - fragment: Used when UBOs are disabled (Chrome) - provides standalone declarations\n *\n * Babylon.js chooses between these based on engine capabilities.\n */\n getUniforms() {\n return {\n ubo: [\n { name: 'textFogInfos', size: 4, type: 'vec4' },\n { name: 'textFogColor', size: 3, type: 'vec3' }\n ],\n vertex: '',\n fragment: `\n uniform vec4 textFogInfos;\n uniform vec3 textFogColor;\n `\n };\n }\n\n /**\n * Bind fog values from the scene to our custom uniforms\n * @param {import('@babylonjs/core/Materials/uniformBuffer').UniformBuffer} uniformBuffer\n * @param {import('@babylonjs/core/scene').Scene} scene\n * @param {import('@babylonjs/core/Engines/engine').Engine} engine\n * @param {import('@babylonjs/core/Meshes/subMesh').SubMesh} subMesh\n */\n bindForSubMesh(uniformBuffer, scene, engine, subMesh) {\n if (scene.fogMode === 0) return;\n\n // textFogInfos: x=fogMode, y=fogStart, z=fogEnd, w=fogDensity\n uniformBuffer.updateFloat4(\n 'textFogInfos',\n scene.fogMode,\n scene.fogStart,\n scene.fogEnd,\n scene.fogDensity\n );\n\n // textFogColor: RGB color of the fog\n uniformBuffer.updateColor3(\n 'textFogColor',\n scene.fogColor\n );\n }\n\n /**\n * Clean up the plugin\n */\n dispose() {\n super.dispose();\n }\n\n /**\n * Inject shader code to calculate fog distance and apply fog blending\n * @param {string} shaderType - 'vertex' or 'fragment'\n */\n getCustomCode(shaderType) {\n if (shaderType === 'vertex') {\n return {\n // Declare our varying for fog distance\n 'CUSTOM_VERTEX_DEFINITIONS': `\n #ifdef MESHWRITER_TEXT_FOG\n varying vec3 textFogDistance;\n #endif\n `,\n // Calculate fog distance in view space at end of vertex shader\n // finalWorld and positionUpdated are Babylon's built-in variables\n 'CUSTOM_VERTEX_MAIN_END': `\n #ifdef MESHWRITER_TEXT_FOG\n vec4 textWorldPos = finalWorld * vec4(positionUpdated, 1.0);\n textFogDistance = (view * textWorldPos).xyz;\n #endif\n `\n };\n }\n\n if (shaderType === 'fragment') {\n return {\n // Declare varying in fragment shader\n // Note: textFogInfos and textFogColor uniforms come from the Material UBO\n // (defined in getUniforms). Don't redeclare them here - Safari's strict\n // GLSL compiler rejects duplicate declarations.\n 'CUSTOM_FRAGMENT_DEFINITIONS': `\n #ifdef MESHWRITER_TEXT_FOG\n varying vec3 textFogDistance;\n #endif\n `,\n // Apply fog to the entire fragment color before final output\n // This runs just before gl_FragColor is set\n 'CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR': `\n #ifdef MESHWRITER_TEXT_FOG\n // textFogInfos: x=fogMode, y=fogStart, z=fogEnd, w=fogDensity\n // Fog modes: 1=LINEAR, 2=EXP, 3=EXP2\n\n float textFogFactor = 1.0;\n float textFogDist = length(textFogDistance);\n\n if (textFogInfos.x == 1.0) {\n // Linear fog: factor = (end - dist) / (end - start)\n textFogFactor = clamp((textFogInfos.z - textFogDist) / (textFogInfos.z - textFogInfos.y), 0.0, 1.0);\n } else if (textFogInfos.x == 2.0) {\n // Exponential fog: factor = exp(-dist * density)\n textFogFactor = clamp(exp(-textFogDist * textFogInfos.w), 0.0, 1.0);\n } else if (textFogInfos.x == 3.0) {\n // Exponential squared fog: factor = exp(-(dist * density)^2)\n float fogDistDensity = textFogDist * textFogInfos.w;\n textFogFactor = clamp(exp(-fogDistDensity * fogDistDensity), 0.0, 1.0);\n }\n\n // Blend the entire fragment (diffuse + emissive) toward fog color\n // textFogFactor: 1.0 = no fog (full color), 0.0 = full fog\n color.rgb = mix(textFogColor, color.rgb, textFogFactor);\n #endif\n `\n };\n }\n\n return null;\n }\n}\n","/**\n * MeshWriter Material Creation\n * Creates StandardMaterial for text rendering\n */\n\nimport { StandardMaterial, Color3 } from './babylonImports.js';\nimport { weeid } from './utils.js';\nimport { TextFogPlugin } from './fogPlugin.js';\n\n/** @typedef {import('@babylonjs/core/scene').Scene} Scene */\n\nconst floor = Math.floor;\n\n/**\n * Convert hex color string to Babylon Color3\n * @param {string} rgb - Hex color string (e.g., \"#FF0000\" or \"FF0000\")\n * @returns {Color3}\n */\nexport function rgb2Color3(rgb) {\n rgb = rgb.replace(\"#\", \"\");\n return new Color3(\n convert(rgb.substring(0, 2)),\n convert(rgb.substring(2, 4)),\n convert(rgb.substring(4, 6))\n );\n\n function convert(x) {\n const parsed = parseInt(x, 16);\n const val = isNaN(parsed) ? 0 : parsed;\n return floor(1000 * Math.max(0, Math.min(val / 255, 1))) / 1000;\n }\n}\n\n/**\n * Create a StandardMaterial for text\n * @param {Scene} scene - Babylon scene\n * @param {string} letters - Text string (used for material naming)\n * @param {string} emissive - Hex color for emissive\n * @param {string} ambient - Hex color for ambient\n * @param {string} specular - Hex color for specular\n * @param {string} diffuse - Hex color for diffuse\n * @param {number} opac - Opacity (0-1)\n * @param {boolean} [emissiveOnly=false] - If true, disables lighting (only emissive color shows)\n * @param {boolean} [fogEnabled=true] - If true, the material is affected by scene fog\n * @returns {StandardMaterial}\n */\nexport function makeMaterial(scene, letters, emissive, ambient, specular, diffuse, opac, emissiveOnly = false, fogEnabled = true) {\n const material = new StandardMaterial(\"mw-matl-\" + letters + \"-\" + weeid(), scene);\n material.diffuseColor = rgb2Color3(diffuse);\n material.specularColor = rgb2Color3(specular);\n material.ambientColor = rgb2Color3(ambient);\n material.emissiveColor = rgb2Color3(emissive);\n material.alpha = opac;\n\n // When emissiveOnly is true, disable lighting so only emissive color shows\n // This gives a \"self-lit\" appearance that ignores scene lights\n if (emissiveOnly) {\n material.disableLighting = true;\n }\n\n // Emissive-only materials should be self-lit and not affected by fog\n if (emissiveOnly) {\n material.fogEnabled = false;\n } else if (fogEnabled) {\n // IMPORTANT: Disable Babylon's built-in fog when using TextFogPlugin.\n // Built-in fog only affects diffuse/ambient, not emissive.\n // If we left fogEnabled=true, diffuse would be fogged twice (once by Babylon,\n // once by the plugin), while emissive would only be fogged once by the plugin.\n // By disabling built-in fog and handling ALL fog in the plugin, we get uniform\n // fog application to the entire fragment (matching terrain behavior).\n material.fogEnabled = false;\n material._textFogPlugin = new TextFogPlugin(material);\n } else {\n material.fogEnabled = false;\n }\n\n return material;\n}\n\n/**\n * Create a dedicated emissive material for front faces.\n * This keeps the face self-lit while still respecting fog settings.\n * @param {Scene} scene\n * @param {string} letters\n * @param {string} emissive\n * @param {number} opac\n * @param {boolean} fogEnabled\n * @returns {StandardMaterial}\n */\nexport function makeFaceMaterial(scene, letters, emissive, opac, fogEnabled = true) {\n const material = new StandardMaterial(\"mw-face-matl-\" + letters + \"-\" + weeid(), scene);\n const black = rgb2Color3(\"#000000\");\n material.diffuseColor = black;\n material.specularColor = black;\n material.ambientColor = black;\n material.emissiveColor = rgb2Color3(emissive);\n material.disableLighting = true;\n material.alpha = opac;\n material.backFaceCulling = false;\n // Disable Babylon's built-in fog - TextFogPlugin handles all fog uniformly\n material.fogEnabled = false;\n if (fogEnabled) {\n material._textFogPlugin = new TextFogPlugin(material);\n }\n return material;\n}\n","/**\n * MeshWriter SPS (Solid Particle System) Helpers\n * Converts letter meshes into an efficient SPS\n */\n\nimport { SolidParticleSystem, Mesh } from './babylonImports.js';\n\n/** @typedef {import('@babylonjs/core/scene').Scene} Scene */\n/** @typedef {import('@babylonjs/core/Materials/material').Material} Material */\n/** @typedef {import('@babylonjs/core/Meshes/mesh').Mesh} BabylonMesh */\n/** @typedef {(any[] & { faceMeshes?: BabylonMesh[] })} MeshCollection */\n/**\n * @typedef {[SolidParticleSystem | undefined, BabylonMesh | undefined] & {\n * face: [SolidParticleSystem | undefined, BabylonMesh | undefined];\n * }} SPSCombo\n */\n\n/**\n * Create an SPS from letter meshes\n * @param {Scene} scene - Babylon scene\n * @param {MeshCollection} meshesAndBoxes - [meshes, boxes, origins] with optional face geometry\n * @param {Material} material - Material to apply to SPS mesh\n * @returns {SPSCombo} - Combined SPS + emissive face SPS\n */\nexport function makeSPS(scene, meshesAndBoxes, material) {\n const rimMeshes = meshesAndBoxes[0] || [];\n const faceMeshes = meshesAndBoxes.faceMeshes || [];\n const lettersOrigins = meshesAndBoxes[2] || [];\n\n const rim = buildSystem(\"sps_rim\", rimMeshes, lettersOrigins, scene, material);\n\n // Use Mesh.MergeMeshes for face instead of SPS - SPS has issues with face geometry\n const face = buildFaceMesh(\"sps_face\", faceMeshes, lettersOrigins, scene);\n\n /** @type {SPSCombo} */\n const combo = /** @type {any} */ ([rim.sps, rim.mesh]);\n combo.face = [undefined, face.mesh]; // No SPS for face, just merged mesh\n return combo;\n}\n\n/**\n * Build face mesh using Mesh.MergeMeshes instead of SPS\n * @param {string} name - Mesh name\n * @param {BabylonMesh[]} meshes - Face meshes to merge\n * @param {Array} lettersOrigins - Letter origin positions\n * @param {Scene} scene - Babylon scene\n * @returns {{ mesh: BabylonMesh | undefined }}\n */\nfunction buildFaceMesh(name, meshes, lettersOrigins, scene) {\n const validMeshes = meshes.filter(m => m != null);\n if (!validMeshes.length) {\n return { mesh: undefined };\n }\n\n // Position each mesh according to letter origins before merging\n validMeshes.forEach((mesh, ix) => {\n if (lettersOrigins[ix]) {\n mesh.position.x = lettersOrigins[ix][0] + lettersOrigins[ix][1];\n mesh.position.z = lettersOrigins[ix][2];\n }\n });\n\n // Merge all face meshes into one\n const merged = Mesh.MergeMeshes(validMeshes, true, true, undefined, false, true);\n if (merged) {\n merged.name = name;\n }\n\n return { mesh: merged };\n}\n\nfunction buildSystem(name, meshes, lettersOrigins, scene, material) {\n // Pre-filter null meshes to avoid repeated null checks in hot loop\n const validMeshes = meshes\n .map((mesh, ix) => mesh ? { mesh, origins: lettersOrigins[ix] } : null)\n .filter(item => item !== null);\n\n if (!validMeshes.length) {\n return { sps: undefined, mesh: undefined };\n }\n\n const sps = new SolidParticleSystem(name, scene, {});\n validMeshes.forEach(function(item) {\n sps.addShape(item.mesh, 1, {\n positionFunction: makePositionParticle(item.origins)\n });\n item.mesh.dispose();\n });\n\n const spsMesh = sps.buildMesh();\n\n if (spsMesh && material) {\n spsMesh.material = material;\n }\n sps.setParticles();\n\n return { sps, mesh: spsMesh };\n}\n\nfunction makePositionParticle(letterOrigins) {\n return function positionParticle(particle) {\n if (!letterOrigins) return;\n particle.position.x = letterOrigins[0] + letterOrigins[1];\n particle.position.z = letterOrigins[2];\n };\n}\n","import { Mesh, VertexData } from './babylonImports.js'\n\n/**\n * Split a mesh into two meshes: emissive face geometry and lit rim geometry.\n * @param {import('@babylonjs/core').Mesh} mesh\n * @param {import('@babylonjs/core').Scene} scene\n * @returns {{ rimMesh: import('@babylonjs/core').Mesh, faceMesh: import('@babylonjs/core').Mesh | null }}\n */\nexport function splitMeshByFaceNormals(mesh, scene) {\n var geometry = mesh.geometry\n if (!geometry) {\n return { rimMesh: mesh, faceMesh: null }\n }\n\n var positions = geometry.getVerticesData('position')\n var normals = geometry.getVerticesData('normal')\n var uvs = geometry.getVerticesData('uv')\n var indices = geometry.getIndices()\n\n if (!positions || !normals || !indices || positions.length === 0) {\n return { rimMesh: mesh, faceMesh: null }\n }\n\n var faceData = createEmptyData()\n var rimData = createEmptyData()\n\n var axisInfo = detectFaceAxisFromGeometry(positions, normals, indices)\n if (!axisInfo) {\n axisInfo = detectFaceAxis(normals)\n }\n if (!axisInfo) {\n axisInfo = detectExtrudeAxisFromPositions(positions)\n }\n\n for (var i = 0; i < indices.length; i += 3) {\n var i0 = indices[i]\n var i1 = indices[i + 1]\n var i2 = indices[i + 2]\n var isFace = triangleIsFrontFace(i0, i1, i2, positions, normals, axisInfo)\n var target = isFace ? faceData : rimData\n var v0 = appendVertex(target, i0, positions, normals, uvs)\n var v1 = appendVertex(target, i1, positions, normals, uvs)\n var v2 = appendVertex(target, i2, positions, normals, uvs)\n target.indices.push(v0, v1, v2)\n }\n\n mesh.dispose()\n\n var rimMesh = buildMesh(mesh.name + '_rim', rimData, scene)\n var faceMesh = buildMesh(mesh.name + '_face', faceData, scene)\n\n if (!faceMesh) {\n return { rimMesh: rimMesh || mesh, faceMesh: null }\n }\n if (!rimMesh) {\n return { rimMesh: faceMesh, faceMesh: null }\n }\n return { rimMesh, faceMesh }\n}\n\nfunction detectFaceAxisFromGeometry(positions, normals, indices) {\n if (!positions || !indices) return null\n\n var min = [Infinity, Infinity, Infinity]\n var max = [-Infinity, -Infinity, -Infinity]\n for (var i = 0; i < positions.length; i += 3) {\n var x = positions[i]\n var y = positions[i + 1]\n var z = positions[i + 2]\n if (x < min[0]) min[0] = x\n if (x > max[0]) max[0] = x\n if (y < min[1]) min[1] = y\n if (y > max[1]) max[1] = y\n if (z < min[2]) min[2] = z\n if (z > max[2]) max[2] = z\n }\n\n var epsilons = [\n Math.max((max[0] - min[0]) * 0.15, 0.001),\n Math.max((max[1] - min[1]) * 0.15, 0.001),\n Math.max((max[2] - min[2]) * 0.15, 0.001)\n ]\n\n var counts = [\n { min: 0, max: 0, sumMin: 0, sumMax: 0 },\n { min: 0, max: 0, sumMin: 0, sumMax: 0 },\n { min: 0, max: 0, sumMin: 0, sumMax: 0 }\n ]\n\n for (var idx = 0; idx < indices.length; idx += 3) {\n var i0 = indices[idx]\n var i1 = indices[idx + 1]\n var i2 = indices[idx + 2]\n\n for (var axis = 0; axis < 3; axis++) {\n var epsilon = epsilons[axis]\n if (epsilon <= 0) continue\n var minVal = min[axis]\n var maxVal = max[axis]\n\n var c0 = positions[i0 * 3 + axis]\n var c1 = positions[i1 * 3 + axis]\n var c2 = positions[i2 * 3 + axis]\n\n var nearMin = Math.abs(c0 - minVal) < epsilon &&\n Math.abs(c1 - minVal) < epsilon &&\n Math.abs(c2 - minVal) < epsilon\n var nearMax = Math.abs(c0 - maxVal) < epsilon &&\n Math.abs(c1 - maxVal) < epsilon &&\n Math.abs(c2 - maxVal) < epsilon\n\n if (nearMin) {\n counts[axis].min++\n if (normals) {\n counts[axis].sumMin += normals[i0 * 3 + axis] + normals[i1 * 3 + axis] + normals[i2 * 3 + axis]\n }\n } else if (nearMax) {\n counts[axis].max++\n if (normals) {\n counts[axis].sumMax += normals[i0 * 3 + axis] + normals[i1 * 3 + axis] + normals[i2 * 3 + axis]\n }\n }\n }\n }\n\n var bestAxis = -1\n var bestCount = 0\n for (var axisIdx = 0; axisIdx < 3; axisIdx++) {\n var total = counts[axisIdx].min + counts[axisIdx].max\n if (total > bestCount) {\n bestCount = total\n bestAxis = axisIdx\n }\n }\n\n if (bestAxis === -1 || bestCount === 0) {\n return null\n }\n\n // For 3D text, extrusion is typically along Y axis (axis=1).\n // If Y axis has any face triangles and the detected axis is different,\n // prefer Y unless the detected axis has significantly more triangles.\n var yTotal = counts[1].min + counts[1].max\n if (bestAxis !== 1 && yTotal > 0) {\n // Only switch away from Y if another axis has 2x more triangles\n if (bestCount < yTotal * 2) {\n bestAxis = 1\n bestCount = yTotal\n }\n }\n\n var chosen = counts[bestAxis]\n var frontSide\n // For PolygonMeshBuilder extrusions: geometry goes from Y=0 (base) to Y=-depth (extruded end)\n // After rotation -PI/2 around X: Y=0 → Z=0 (front, facing camera), Y=-depth → Z=+depth (back)\n // So Y=max (Y=0) is the FRONT face, Y=min (Y=-depth) is the BACK face\n var maxHasOutwardNormals = chosen.sumMax > 0\n var minHasOutwardNormals = chosen.sumMin < 0\n\n // Select MAX as front (the base at Y=0 which faces camera after rotation)\n if (maxHasOutwardNormals) {\n frontSide = 'max'\n } else if (minHasOutwardNormals) {\n frontSide = 'min'\n } else {\n // Fallback to max (the base)\n frontSide = 'max'\n }\n\n return {\n axis: bestAxis,\n strategy: 'positions',\n min: min[bestAxis],\n max: max[bestAxis],\n epsilon: epsilons[bestAxis],\n frontSide\n }\n}\n\nfunction detectFaceAxis(normals) {\n if (!normals || normals.length === 0) {\n return null\n }\n var sumsAbs = [0, 0, 0]\n var sumsSigned = [0, 0, 0]\n for (var i = 0; i < normals.length; i += 3) {\n var nx = normals[i]\n var ny = normals[i + 1]\n var nz = normals[i + 2]\n sumsAbs[0] += Math.abs(nx)\n sumsAbs[1] += Math.abs(ny)\n sumsAbs[2] += Math.abs(nz)\n sumsSigned[0] += nx\n sumsSigned[1] += ny\n sumsSigned[2] += nz\n }\n var axis = 0\n var maxSum = sumsAbs[0]\n for (var j = 1; j < 3; j++) {\n if (sumsAbs[j] > maxSum) {\n maxSum = sumsAbs[j]\n axis = j\n }\n }\n if (maxSum === 0) {\n return null\n }\n var frontSign = sumsSigned[axis] >= 0 ? 1 : -1\n return {\n axis,\n frontSign,\n strategy: 'normals',\n min: 0,\n max: 0,\n epsilon: 0,\n frontSide: 'max'\n }\n}\n\nfunction detectExtrudeAxisFromPositions(positions) {\n if (!positions || positions.length === 0) {\n return null\n }\n var min = [Infinity, Infinity, Infinity]\n var max = [-Infinity, -Infinity, -Infinity]\n for (var i = 0; i < positions.length; i += 3) {\n var x = positions[i]\n var y = positions[i + 1]\n var z = positions[i + 2]\n if (x < min[0]) min[0] = x\n if (x > max[0]) max[0] = x\n if (y < min[1]) min[1] = y\n if (y > max[1]) max[1] = y\n if (z < min[2]) min[2] = z\n if (z > max[2]) max[2] = z\n }\n var ranges = [\n max[0] - min[0],\n max[1] - min[1],\n max[2] - min[2]\n ]\n var axis = 0\n var minRange = ranges[0]\n for (var j = 1; j < 3; j++) {\n if (ranges[j] < minRange) {\n minRange = ranges[j]\n axis = j\n }\n }\n var epsilon = Math.max(minRange * 0.05, 0.0001)\n return {\n axis,\n strategy: 'positions',\n min: min[axis],\n max: max[axis],\n epsilon,\n frontSide: 'max'\n }\n}\n\nfunction triangleIsFrontFace(i0, i1, i2, positions, normals, axisInfo) {\n if (!axisInfo) return false\n var axis = axisInfo.axis || 1\n\n if (axisInfo.strategy === 'normals' && normals) {\n var frontSign = axisInfo.frontSign || 1\n var threshold = 0.5\n var n0 = normals[i0 * 3 + axis] * frontSign\n var n1 = normals[i1 * 3 + axis] * frontSign\n var n2 = normals[i2 * 3 + axis] * frontSign\n return (n0 > threshold && n1 > threshold && n2 > threshold)\n }\n\n if (axisInfo.strategy === 'positions' && positions) {\n var epsilon = axisInfo.epsilon\n var limitVal = axisInfo.frontSide === 'min' ? axisInfo.min : axisInfo.max\n var c0 = positions[i0 * 3 + axis]\n var c1 = positions[i1 * 3 + axis]\n var c2 = positions[i2 * 3 + axis]\n return (\n Math.abs(c0 - limitVal) < epsilon &&\n Math.abs(c1 - limitVal) < epsilon &&\n Math.abs(c2 - limitVal) < epsilon\n )\n }\n\n return false\n}\n\nfunction createEmptyData() {\n return {\n positions: [],\n normals: [],\n uvs: [],\n indices: [],\n nextIndex: 0\n }\n}\n\nfunction appendVertex(target, originalIndex, positions, normals, uvs) {\n var posOffset = originalIndex * 3\n var uvOffset = originalIndex * 2\n\n target.positions.push(\n positions[posOffset],\n positions[posOffset + 1],\n positions[posOffset + 2]\n )\n target.normals.push(\n normals[posOffset],\n normals[posOffset + 1],\n normals[posOffset + 2]\n )\n\n if (uvs && uvs.length) {\n target.uvs.push(uvs[uvOffset], uvs[uvOffset + 1])\n } else {\n target.uvs.push(0, 0)\n }\n\n var newIndex = target.nextIndex\n target.nextIndex += 1\n return newIndex\n}\n\nfunction buildMesh(name, data, scene) {\n if (!data.positions.length) return null\n var newMesh = new Mesh(name, scene)\n var vertexData = new VertexData()\n vertexData.positions = data.positions\n vertexData.normals = data.normals\n vertexData.indices = data.indices\n vertexData.uvs = data.uvs\n vertexData.applyToMesh(newMesh, true)\n newMesh.refreshBoundingInfo()\n return newMesh\n}\n","/**\n * MeshWriter Letter Mesh Construction\n * Builds 3D letter meshes from font specifications\n */\n\nimport { Path2, Vector2, Mesh, PolygonMeshBuilder } from './babylonImports.js';\nimport { splitMeshByFaceNormals } from './meshSplitter.js';\nimport { getCSGLib, getCSGVersion, isCSGReady } from './csg.js';\nimport { decodeList } from './fontCompression.js';\nimport {\n isObject, isArray, isNumber, isBoolean,\n isRelativeLength, round, weeid\n} from './utils.js';\nimport earcutModule from 'earcut';\n\n/** @typedef {import('@babylonjs/core/scene').Scene} Scene */\n/** @typedef {import('@babylonjs/core/Materials/material').Material} Material */\n\n// Handle both CJS default export and ESM module export\nconst earcut = earcutModule.default || earcutModule;\n\n// Constants\nconst naturalLetterHeight = 1000;\n\n/**\n * Get kerning value between two characters\n * @param {Object} fontSpec - Font specification object\n * @param {string} left - Left character\n * @param {string} right - Right character\n * @returns {number} - Kerning adjustment value (0 if none)\n */\nfunction getKerning(fontSpec, left, right) {\n if (!fontSpec.kern) return 0;\n const key = `${left},${right}`;\n return fontSpec.kern[key] || 0;\n}\n\n/**\n * Decompress font letter on first use (lazy decompression)\n * @param {Object} fontSpec - Font specification object\n * @param {string} letter - Character to get spec for\n * @returns {Object|undefined} - Letter specification\n */\nfunction makeLetterSpec(fontSpec, letter) {\n const letterSpec = fontSpec[letter];\n\n if (isObject(letterSpec)) {\n // Decompress shape commands if compressed\n if (!isArray(letterSpec.shapeCmds) && isArray(letterSpec.sC)) {\n letterSpec.shapeCmds = letterSpec.sC.map(cmds => decodeList(cmds));\n letterSpec.sC = null;\n }\n // Decompress hole commands if compressed\n if (!isArray(letterSpec.holeCmds) && isArray(letterSpec.hC)) {\n letterSpec.holeCmds = letterSpec.hC.map(cmdslists =>\n isArray(cmdslists) ? cmdslists.map(cmds => decodeList(cmds)) : cmdslists\n );\n letterSpec.hC = null;\n }\n }\n return letterSpec;\n}\n\n/**\n * Convert point to Vector2\n */\nfunction point2Vector(point) {\n return new Vector2(round(point.x), round(point.y));\n}\n\n/**\n * Merge array of meshes\n */\nfunction merge(arrayOfMeshes) {\n return arrayOfMeshes.length === 1\n ? arrayOfMeshes[0]\n : Mesh.MergeMeshes(arrayOfMeshes, true);\n}\n\n/**\n * @typedef {Object} LetterPolygonsResult\n * @property {number} xWidth - Total width of all letters\n * @property {number} count - Number of valid letter meshes\n */\n/**\n * @typedef {(any[] & LetterPolygonsResult) & { faceMeshes: Mesh[] }} LetterPolygonsCollection\n */\n\n/**\n * Construct meshes for all letters in a string\n * @param {string} letters - Text string\n * @param {Object} fontSpec - Font specification\n * @param {number} xOffset - X offset\n * @param {number} yOffset - Y offset (unused, kept for API compatibility)\n * @param {number} zOffset - Z offset\n * @param {number} letterScale - Scale factor for letters\n * @param {number} thickness - Letter thickness (depth)\n * @param {Material} material - Material (unused in this function)\n * @param {string} meshOrigin - \"letterCenter\" or \"fontOrigin\"\n * @param {Scene} scene - Babylon scene\n * @param {Object} [spacingOpts] - Optional spacing options\n * @param {number} [spacingOpts.letterSpacing=0] - Extra spacing between letters (world units, added after kerning)\n * @param {number} [spacingOpts.wordSpacing=0] - Extra spacing for spaces (world units, added to space width)\n * @returns {any[] & LetterPolygonsResult} - [meshes, boxes, origins] with xWidth and count properties\n */\nexport function constructLetterPolygons(\n letters, fontSpec, xOffset, yOffset, zOffset,\n letterScale, thickness, material, meshOrigin, scene, spacingOpts = {}\n) {\n // Extract spacing options (already in world units)\n const letterSpacing = isNumber(spacingOpts.letterSpacing) ? spacingOpts.letterSpacing : 0;\n const wordSpacing = isNumber(spacingOpts.wordSpacing) ? spacingOpts.wordSpacing : 0;\n\n let letterOffsetX = 0;\n const lettersOrigins = new Array(letters.length);\n const lettersBoxes = new Array(letters.length);\n const lettersMeshes = new Array(letters.length);\n const faceMeshes = new Array(letters.length);\n let ix = 0;\n\n for (let i = 0; i < letters.length; i++) {\n const letter = letters[i];\n const letterSpec = makeLetterSpec(fontSpec, letter);\n\n if (isObject(letterSpec)) {\n const lists = buildLetterMeshes(\n letter, i, letterSpec, fontSpec.reverseShapes, fontSpec.reverseHoles,\n meshOrigin, letterScale, xOffset, zOffset, letterOffsetX, thickness, scene\n );\n\n const shapesList = lists[0];\n const holesList = lists[1];\n const letterBox = lists[2];\n const letterOrigins = lists[3];\n let newOffsetX = lists[4];\n\n // Apply kerning with next letter (if any)\n if (i < letters.length - 1) {\n const nextLetter = letters[i + 1];\n const kernValue = getKerning(fontSpec, letter, nextLetter);\n if (kernValue !== 0) {\n newOffsetX += kernValue * letterScale;\n }\n // Apply letter spacing after kerning (not after last letter)\n if (letterSpacing !== 0) {\n newOffsetX += letterSpacing;\n }\n }\n\n // Apply extra word spacing for space characters\n if (letter === ' ' && wordSpacing !== 0) {\n newOffsetX += wordSpacing;\n }\n\n letterOffsetX = newOffsetX;\n\n const letterMeshes = punchHolesInShapes(shapesList, holesList, letter, i, scene);\n\n if (letterMeshes.length) {\n const merged = merge(letterMeshes);\n const split = splitMeshByFaceNormals(merged, scene);\n\n lettersMeshes[ix] = split.rimMesh;\n faceMeshes[ix] = split.faceMesh;\n lettersOrigins[ix] = letterOrigins;\n lettersBoxes[ix] = letterBox;\n ix++;\n }\n }\n }\n\n /** @type {LetterPolygonsCollection} */\n const meshesAndBoxes = /** @type {any} */ ([lettersMeshes, lettersBoxes, lettersOrigins]);\n meshesAndBoxes.faceMeshes = faceMeshes;\n meshesAndBoxes.xWidth = round(letterOffsetX);\n meshesAndBoxes.count = ix;\n return meshesAndBoxes;\n}\n\n/**\n * Build meshes for a single letter\n * @returns {Array} - [shapesList, holesList, letterBox, letterOrigins, newOffsetX]\n */\nfunction buildLetterMeshes(\n letter, index, spec, reverseShapes, reverseHoles,\n meshOrigin, letterScale, xOffset, zOffset, letterOffsetX, thickness, scene\n) {\n // Offset calculations\n const balanced = meshOrigin === \"letterCenter\";\n const centerX = (spec.xMin + spec.xMax) / 2;\n const centerZ = (spec.yMin + spec.yMax) / 2;\n const xFactor = isNumber(spec.xFactor) ? spec.xFactor : 1;\n const zFactor = isNumber(spec.yFactor) ? spec.yFactor : 1;\n const xShift = isNumber(spec.xShift) ? spec.xShift : 0;\n const zShift = isNumber(spec.yShift) ? spec.yShift : 0;\n const reverseShape = isBoolean(spec.reverseShape) ? spec.reverseShape : reverseShapes;\n const reverseHole = isBoolean(spec.reverseHole) ? spec.reverseHole : reverseHoles;\n const offX = xOffset - (balanced ? centerX : 0);\n const offZ = zOffset - (balanced ? centerZ : 0);\n const shapeCmdsLists = isArray(spec.shapeCmds) ? spec.shapeCmds : [];\n const holeCmdsListsArray = isArray(spec.holeCmds) ? spec.holeCmds : [];\n\n // Tracking for relative coordinates\n let thisX, lastX, thisZ, lastZ;\n\n // Scaling functions\n const adjX = makeAdjust(letterScale, xFactor, offX, 0, false, true);\n const adjZ = makeAdjust(letterScale, zFactor, offZ, 0, false, false);\n const adjXfix = makeAdjust(letterScale, xFactor, offX, xShift, false, true);\n const adjZfix = makeAdjust(letterScale, zFactor, offZ, zShift, false, false);\n const adjXrel = makeAdjust(letterScale, xFactor, offX, xShift, true, true);\n const adjZrel = makeAdjust(letterScale, zFactor, offZ, zShift, true, false);\n\n const letterBox = [adjX(spec.xMin), adjX(spec.xMax), adjZ(spec.yMin), adjZ(spec.yMax)];\n const letterOrigins = [round(letterOffsetX), -1 * adjX(0), -1 * adjZ(0)];\n\n // Update letterOffsetX for next letter\n const newOffsetX = letterOffsetX + spec.wdth * letterScale;\n\n const shapesList = shapeCmdsLists.map(makeCmdsToMesh(reverseShape));\n const holesList = holeCmdsListsArray.map(meshesFromCmdsListArray);\n\n return [shapesList, holesList, letterBox, letterOrigins, newOffsetX];\n\n function meshesFromCmdsListArray(cmdsListArray) {\n return cmdsListArray.map(makeCmdsToMesh(reverseHole));\n }\n\n function makeCmdsToMesh(reverse) {\n return function cmdsToMesh(cmdsList) {\n let cmd = getCmd(cmdsList, 0);\n /** @type {any} */\n const path = new Path2(adjXfix(cmd[0]), adjZfix(cmd[1]));\n\n // Process path commands\n for (let j = 1; j < cmdsList.length; j++) {\n cmd = getCmd(cmdsList, j);\n\n // Line (2 coords = absolute, 3 = relative)\n if (cmd.length === 2) {\n path.addLineTo(adjXfix(cmd[0]), adjZfix(cmd[1]));\n }\n if (cmd.length === 3) {\n path.addLineTo(adjXrel(cmd[1]), adjZrel(cmd[2]));\n }\n\n // Quadratic curve (4 = absolute, 5 = relative)\n if (cmd.length === 4) {\n path.addQuadraticCurveTo(\n adjXfix(cmd[0]), adjZfix(cmd[1]),\n adjXfix(cmd[2]), adjZfix(cmd[3])\n );\n }\n if (cmd.length === 5) {\n path.addQuadraticCurveTo(\n adjXrel(cmd[1]), adjZrel(cmd[2]),\n adjXrel(cmd[3]), adjZrel(cmd[4])\n );\n }\n\n // Cubic curve (6 = absolute, 7 = relative)\n if (cmd.length === 6) {\n path.addCubicCurveTo(\n adjXfix(cmd[0]), adjZfix(cmd[1]),\n adjXfix(cmd[2]), adjZfix(cmd[3]),\n adjXfix(cmd[4]), adjZfix(cmd[5])\n );\n }\n if (cmd.length === 7) {\n path.addCubicCurveTo(\n adjXrel(cmd[1]), adjZrel(cmd[2]),\n adjXrel(cmd[3]), adjZrel(cmd[4]),\n adjXrel(cmd[5]), adjZrel(cmd[6])\n );\n }\n }\n\n // Convert path to array and process\n let array = path.getPoints().map(point2Vector);\n\n // Remove redundant start/end points\n const first = 0;\n const last = array.length - 1;\n if (array[first].x === array[last].x && array[first].y === array[last].y) {\n array = array.slice(1);\n }\n if (reverse) {\n array.reverse();\n }\n\n const meshBuilder = new PolygonMeshBuilder(\n \"MeshWriter-\" + letter + index + \"-\" + weeid(),\n array,\n scene,\n earcut\n );\n return meshBuilder.build(true, thickness);\n };\n }\n\n function getCmd(list, ix) {\n lastX = thisX;\n lastZ = thisZ;\n const cmd = list[ix];\n const len = cmd.length;\n thisX = isRelativeLength(len)\n ? round((cmd[len - 2] * xFactor) + thisX)\n : round(cmd[len - 2] * xFactor);\n thisZ = isRelativeLength(len)\n ? round((cmd[len - 1] * zFactor) + thisZ)\n : round(cmd[len - 1] * zFactor);\n return cmd;\n }\n\n function makeAdjust(letterScale, factor, off, shift, relative, xAxis) {\n if (relative) {\n if (xAxis) {\n return val => round(letterScale * ((val * factor) + shift + lastX + off));\n } else {\n return val => round(letterScale * ((val * factor) + shift + lastZ + off));\n }\n } else {\n return val => round(letterScale * ((val * factor) + shift + off));\n }\n }\n}\n\n/**\n * Punch holes in letter shapes using CSG operations\n * @param {Array} shapesList - Array of shape meshes\n * @param {Array} holesList - Array of arrays of hole meshes\n * @param {string} letter - Letter character (for naming)\n * @param {number} letterIndex - Index of letter (for naming)\n * @param {Scene} scene - Babylon scene\n * @returns {Array} - Array of final letter meshes\n */\nfunction punchHolesInShapes(shapesList, holesList, letter, letterIndex, scene) {\n const csgVersion = getCSGVersion();\n\n // Validate CSG is available and initialized\n if (csgVersion === 'CSG2' && !isCSGReady()) {\n throw new Error(\n \"MeshWriter: CSG2 not initialized. \" +\n \"Use 'await MeshWriter.createAsync(scene, prefs)', call \" +\n \"'await BABYLON.InitializeCSG2Async()', or configure \" +\n \"MeshWriter.setCSGInitializer before creating MeshWriter.\"\n );\n }\n if (csgVersion === null) {\n throw new Error(\n \"MeshWriter: No CSG implementation found. \" +\n \"Ensure BABYLON.CSG or BABYLON.CSG2 is available.\"\n );\n }\n\n const letterMeshes = [];\n const csgLib = getCSGLib();\n\n // Handle special case: single shape with multiple hole arrays\n // (e.g., \"B\" has 1 shape but 2 holes - top and bottom)\n // In this case, all holes should be punched into the single shape\n if (shapesList.length === 1 && holesList.length > 1) {\n const shape = shapesList[0];\n // Flatten all hole arrays into a single array\n const allHoles = holesList.flat();\n\n if (allHoles.length > 0) {\n letterMeshes.push(punchHolesInShape(shape, allHoles, letter, letterIndex, csgLib, csgVersion, scene));\n } else {\n letterMeshes.push(shape);\n }\n return letterMeshes;\n }\n\n // Standard case: 1:1 correspondence between shapes and hole arrays\n for (let j = 0; j < shapesList.length; j++) {\n const shape = shapesList[j];\n const holes = holesList[j];\n\n if (isArray(holes) && holes.length) {\n letterMeshes.push(punchHolesInShape(shape, holes, letter, letterIndex, csgLib, csgVersion, scene));\n } else {\n // PolygonMeshBuilder creates meshes with correct normals by default\n // No flipFaces needed for shapes without holes\n letterMeshes.push(shape);\n }\n }\n\n return letterMeshes;\n}\n\n/**\n * Punch holes in a single shape\n */\nfunction punchHolesInShape(shape, holes, letter, letterIndex, csgLib, csgVersion, scene) {\n const meshName = \"Net-\" + letter + letterIndex + \"-\" + weeid();\n\n let csgShape = csgLib.FromMesh(shape);\n for (let k = 0; k < holes.length; k++) {\n csgShape = csgShape.subtract(csgLib.FromMesh(holes[k]));\n }\n\n const resultMesh = csgVersion === 'CSG2'\n ? csgShape.toMesh(meshName, scene, { centerMesh: false, rebuildNormals: true })\n : csgShape.toMesh(meshName, null, scene);\n\n // CSG2 with rebuildNormals: true produces correct normals\n // No flipFaces needed\n\n // Cleanup\n holes.forEach(h => h.dispose());\n shape.dispose();\n\n return resultMesh;\n}\n\nexport { naturalLetterHeight };\n","/**\n * MeshWriter Curve Extensions\n * Optimized Path2 curve methods for better performance\n */\n\nimport { Path2, Curve3, Vector3 } from './babylonImports.js';\n\n/**\n * Extended Path2 interface with MeshWriter curve methods\n * @typedef {Object} Path2Extensions\n * @property {(redX: number, redY: number, blueX: number, blueY: number) => Path2} addQuadraticCurveTo\n * @property {(redX: number, redY: number, greenX: number, greenY: number, blueX: number, blueY: number) => Path2} addCubicCurveTo\n */\n\n// Optimized segment count for curves\n// Native Babylon 6+ uses 36 segments which causes slowdown\n// MeshWriter uses 6 for better performance\nexport const curveSampleSize = 6;\n\n/**\n * Install optimized curve methods on Path2 prototype\n * Must be called after Babylon.js is loaded\n */\nexport function installCurveExtensions() {\n if (!Path2 || !Path2.prototype) {\n return;\n }\n\n /** @type {any} */\n const proto = Path2.prototype;\n\n // Quadratic Bezier with optimized segment count\n proto.addQuadraticCurveTo = function(redX, redY, blueX, blueY) {\n const points = this.getPoints();\n const lastPoint = points[points.length - 1];\n const origin = new Vector3(lastPoint.x, lastPoint.y, 0);\n const control = new Vector3(redX, redY, 0);\n const destination = new Vector3(blueX, blueY, 0);\n\n const curve = Curve3.CreateQuadraticBezier(origin, control, destination, curveSampleSize);\n const curvePoints = curve.getPoints();\n\n for (let i = 1; i < curvePoints.length; i++) {\n this.addLineTo(curvePoints[i].x, curvePoints[i].y);\n }\n return this; // Return this for method chaining\n };\n\n // Cubic Bezier with optimized segment count\n proto.addCubicCurveTo = function(redX, redY, greenX, greenY, blueX, blueY) {\n const points = this.getPoints();\n const lastPoint = points[points.length - 1];\n const origin = new Vector3(lastPoint.x, lastPoint.y, 0);\n const control1 = new Vector3(redX, redY, 0);\n const control2 = new Vector3(greenX, greenY, 0);\n const destination = new Vector3(blueX, blueY, 0);\n\n const nbPoints = Math.floor(0.3 + curveSampleSize * 1.5);\n const curve = Curve3.CreateCubicBezier(origin, control1, control2, destination, nbPoints);\n const curvePoints = curve.getPoints();\n\n for (let i = 1; i < curvePoints.length; i++) {\n this.addLineTo(curvePoints[i].x, curvePoints[i].y);\n }\n return this; // Return this for method chaining\n };\n}\n","/**\n * MeshWriter Core Class\n * Main MeshWriter implementation for 3D text rendering in Babylon.js\n */\n\nimport { Vector2 } from './babylonImports.js';\nimport { getFont, isFontRegistered } from './fontRegistry.js';\nimport {\n initCSGModule, isCSGReady, getCSGVersion, initializeCSG2,\n setCSGInitializer, setCSGReadyCheck, onCSGReady, markCSGInitialized\n} from './csg.js';\nimport { makeMaterial, makeFaceMaterial, rgb2Color3 } from './material.js';\nimport { makeSPS } from './sps.js';\nimport { constructLetterPolygons, naturalLetterHeight } from './letterMesh.js';\nimport { installCurveExtensions } from './curves.js';\nimport {\n isObject, isNumber, isBoolean, isString, isAmplitude,\n isPositiveNumber, round, setOption\n} from './utils.js';\n\n/** @typedef {import('@babylonjs/core/scene').Scene} Scene */\n\n/**\n * @typedef {Object} MeshWriterPreferences\n * @property {string} [defaultFont] - Default font family\n * @property {number} [scale=1] - Scale factor\n * @property {string} [meshOrigin=\"letterCenter\"] - \"letterCenter\" or \"fontOrigin\"\n * @property {boolean} [debug=false] - Enable debug logging\n * @property {Object} [babylon] - Babylon.js namespace object with CSG classes (for ES module builds)\n */\n\n// Constants\nconst defaultColor = \"#808080\";\nconst defaultOpac = 1;\n\n/**\n * Create a MeshWriter factory configured for a scene\n * @param {Scene} scene - Babylon.js scene\n * @param {MeshWriterPreferences} [preferences={}] - Configuration options\n * @returns {Function} - MeshWriter constructor\n */\nexport function createMeshWriter(scene, preferences = {}) {\n // Install curve extensions for Path2\n installCurveExtensions();\n\n const defaultFont = isFontRegistered(preferences.defaultFont)\n ? preferences.defaultFont\n : (isFontRegistered(\"Helvetica\") ? \"Helvetica\" : \"HelveticaNeue-Medium\");\n const meshOrigin = preferences.meshOrigin === \"fontOrigin\"\n ? \"fontOrigin\"\n : \"letterCenter\";\n const scale = isNumber(preferences.scale) ? preferences.scale : 1;\n const debug = isBoolean(preferences.debug) ? preferences.debug : false;\n\n /**\n * MeshWriter constructor - creates 3D text\n * @param {string} lttrs - Text to render\n * @param {Object} opt - Options\n */\n function MeshWriter(lttrs, opt) {\n const options = isObject(opt) ? opt : {};\n const position = setOption(options, \"position\", isObject, {});\n const colors = setOption(options, \"colors\", isObject, {});\n const fontFamily = setOption(options, \"font-family\", isSupportedFont, defaultFont);\n const anchor = setOption(options, \"anchor\", isSupportedAnchor, \"left\");\n const rawheight = setOption(options, \"letter-height\", isPositiveNumber, 100);\n const rawThickness = setOption(options, \"letter-thickness\", isPositiveNumber, 1);\n const basicColor = setOption(options, \"color\", isString, defaultColor);\n const opac = setOption(options, \"alpha\", isAmplitude, defaultOpac);\n const y = setOption(position, \"y\", isNumber, 0);\n const x = setOption(position, \"x\", isNumber, 0);\n const z = setOption(position, \"z\", isNumber, 0);\n const diffuse = setOption(colors, \"diffuse\", isString, \"#404040\"); // Dark gray - lets emissive show\n const specular = setOption(colors, \"specular\", isString, \"#000000\");\n const ambient = setOption(colors, \"ambient\", isString, \"#202020\"); // Very dark - minimal ambient response\n const emissive = setOption(colors, \"emissive\", isString, basicColor);\n const emissiveOnly = setOption(options, \"emissive-only\", isBoolean, false);\n const fogEnabled = setOption(options, \"fog-enabled\", isBoolean, true);\n const letterSpacingRaw = setOption(options, \"letter-spacing\", isNumber, 0);\n const wordSpacingRaw = setOption(options, \"word-spacing\", isNumber, 0);\n const fontSpec = getFont(fontFamily);\n const letterScale = round(scale * rawheight / naturalLetterHeight);\n const thickness = round(scale * rawThickness);\n const letters = isString(lttrs) ? lttrs : \"\";\n // Scale spacing values to match letter scale\n const letterSpacing = letterSpacingRaw * scale;\n const wordSpacing = wordSpacingRaw * scale;\n\n // Create material\n const material = makeMaterial(scene, letters, emissive, ambient, specular, diffuse, opac, emissiveOnly, fogEnabled);\n\n // Create letter meshes\n const meshesAndBoxes = constructLetterPolygons(\n letters, fontSpec, 0, 0, 0, letterScale, thickness, material, meshOrigin, scene,\n { letterSpacing, wordSpacing }\n );\n const meshes = meshesAndBoxes[0];\n const lettersBoxes = meshesAndBoxes[1];\n const lettersOrigins = meshesAndBoxes[2];\n const xWidth = meshesAndBoxes.xWidth;\n\n // Convert to SPS\n const combo = makeSPS(scene, meshesAndBoxes, material);\n const sps = combo[0];\n const mesh = combo[1];\n const faceCombo = combo.face || [];\n const faceSps = faceCombo[0];\n const faceMesh = faceCombo[1];\n let faceMaterial;\n\n if (faceMesh) {\n faceMaterial = makeFaceMaterial(scene, letters, emissive, opac, fogEnabled);\n faceMesh.material = faceMaterial;\n if (mesh) {\n faceMesh.parent = mesh;\n faceMesh.layerMask = mesh.layerMask;\n faceMesh.renderingGroupId = mesh.renderingGroupId;\n }\n // Tiny offset to prevent z-fighting without leaving a visible gap\n // rotation.x=-PI/2 maps: +Y → -Z (toward camera), -Y → +Z (away)\n // We want face IN FRONT of rim, so use POSITIVE Y\n faceMesh.position.y = 0.001;\n faceMesh.isPickable = false;\n }\n\n // Position mesh based on anchor\n const offsetX = anchor === \"right\"\n ? (0 - xWidth)\n : (anchor === \"center\" ? (0 - xWidth / 2) : 0);\n\n if (mesh) {\n mesh.position.x = scale * x + offsetX;\n mesh.position.y = scale * y;\n mesh.position.z = scale * z;\n }\n\n // Instance methods\n let color = basicColor;\n this.getSPS = () => sps;\n this.getMesh = () => mesh;\n this.getMaterial = () => material;\n this.getFaceMesh = () => faceMesh;\n this.getFaceMaterial = () => faceMaterial;\n this.getFaceSPS = () => faceSps;\n this.getOffsetX = () => offsetX;\n this.getLettersBoxes = () => lettersBoxes;\n this.getLettersOrigins = () => lettersOrigins;\n this.color = c => isString(c) ? color = c : color;\n this.alpha = o => isAmplitude(o) ? opac : opac;\n // Track disposed state to prevent double-disposal\n let _disposed = false;\n\n this.clearall = function() {\n // Mark as disposed - getters will return null after this\n _disposed = true;\n };\n\n this.isDisposed = function() {\n return _disposed;\n };\n }\n\n // Prototype methods\n MeshWriter.prototype.setColor = function(color) {\n const material = this.getMaterial();\n if (material && isString(color)) {\n const next = rgb2Color3(this.color(color));\n material.emissiveColor = next;\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n faceMaterial.emissiveColor = next;\n }\n }\n };\n\n MeshWriter.prototype.setAlpha = function(alpha) {\n const material = this.getMaterial();\n if (material && isAmplitude(alpha)) {\n const next = this.alpha(alpha);\n material.alpha = next;\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n faceMaterial.alpha = next;\n }\n }\n };\n\n MeshWriter.prototype.overrideAlpha = function(alpha) {\n const material = this.getMaterial();\n if (material && isAmplitude(alpha)) {\n material.alpha = alpha;\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n faceMaterial.alpha = alpha;\n }\n }\n };\n\n MeshWriter.prototype.resetAlpha = function() {\n const material = this.getMaterial();\n const alpha = this.alpha();\n if (material) {\n material.alpha = alpha;\n }\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n faceMaterial.alpha = alpha;\n }\n };\n\n MeshWriter.prototype.getLetterCenter = function(ix) {\n return new Vector2(0, 0);\n };\n\n MeshWriter.prototype.dispose = function() {\n // Prevent double-disposal\n if (this.isDisposed && this.isDisposed()) {\n return;\n }\n\n // Dispose TextFogPlugin before materials to break circular references\n const material = this.getMaterial();\n if (material) {\n if (material._textFogPlugin && typeof material._textFogPlugin.dispose === 'function') {\n material._textFogPlugin.dispose();\n }\n material.dispose();\n }\n\n const faceMaterial = this.getFaceMaterial && this.getFaceMaterial();\n if (faceMaterial) {\n if (faceMaterial._textFogPlugin && typeof faceMaterial._textFogPlugin.dispose === 'function') {\n faceMaterial._textFogPlugin.dispose();\n }\n faceMaterial.dispose();\n }\n\n // Dispose SolidParticleSystem (which also disposes its mesh)\n const sps = this.getSPS();\n if (sps) {\n sps.dispose();\n }\n\n // Dispose face mesh (merged mesh, not SPS-based)\n const faceMesh = this.getFaceMesh && this.getFaceMesh();\n if (faceMesh && typeof faceMesh.dispose === 'function') {\n faceMesh.dispose();\n }\n\n // Mark as disposed\n this.clearall();\n };\n\n return MeshWriter;\n\n // Helper functions\n function isSupportedFont(ff) {\n return isFontRegistered(ff);\n }\n\n function isSupportedAnchor(a) {\n return a === \"left\" || a === \"right\" || a === \"center\";\n }\n}\n\n/**\n * Async factory for Babylon 8+ with CSG2\n * Handles CSG2 initialization automatically\n * @param {Scene} scene - Babylon.js scene\n * @param {MeshWriterPreferences} [preferences={}] - Configuration options\n * @returns {Promise<Function>} - MeshWriter constructor\n */\nexport async function createMeshWriterAsync(scene, preferences = {}) {\n // Initialize CSG module with Babylon methods\n if (preferences.babylon) {\n initCSGModule(preferences.babylon);\n } else {\n // Check for BABYLON global (UMD bundle usage)\n /** @type {any} */\n const globalBabylon = typeof globalThis !== 'undefined' ? globalThis.BABYLON : undefined;\n if (globalBabylon) {\n initCSGModule(globalBabylon);\n }\n }\n\n // Initialize CSG2 if needed\n if (getCSGVersion() === 'CSG2' && !isCSGReady()) {\n await initializeCSG2();\n }\n\n return createMeshWriter(scene, preferences);\n}\n\n// Re-export CSG control functions for static API\nexport {\n isCSGReady,\n getCSGVersion,\n setCSGInitializer,\n setCSGReadyCheck,\n onCSGReady,\n markCSGInitialized as markCSGReady,\n initCSGModule\n};\n","/**\n * MeshWriter Baked Font Loader\n * Loads pre-baked FontSpec JSON files at runtime.\n * Zero dependencies - just fetch and use.\n */\n\n/**\n * Load a pre-baked font from a JSON file\n * @param {string} url - URL to the baked FontSpec JSON file\n * @returns {Promise<object>} - FontSpec object ready for use with MeshWriter\n *\n * @example\n * const fontSpec = await loadBakedFont('/fonts/baked/atkinson-hyperlegible-next-400.json');\n * registerFont('Atkinson400', fontSpec);\n */\nexport async function loadBakedFont(url) {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`MeshWriter: Failed to load baked font from ${url} (HTTP ${response.status})`);\n }\n\n const fontSpec = await response.json();\n\n // Validate it looks like a FontSpec\n if (typeof fontSpec !== 'object' || fontSpec === null) {\n throw new Error(`MeshWriter: Invalid baked font data from ${url}`);\n }\n\n return fontSpec;\n}\n\n/**\n * Load multiple pre-baked weights from a manifest\n * @param {string} manifestUrl - URL to the manifest.json file\n * @param {number[]} [weights] - Specific weights to load (loads all if omitted)\n * @returns {Promise<Map<number, object>>} - Map of weight -> FontSpec\n *\n * @example\n * const fonts = await loadBakedFontsFromManifest('/fonts/baked/manifest.json', [400, 450]);\n * const fontSpec = fonts.get(400);\n */\nexport async function loadBakedFontsFromManifest(manifestUrl, weights) {\n const response = await fetch(manifestUrl);\n\n if (!response.ok) {\n throw new Error(`MeshWriter: Failed to load manifest from ${manifestUrl} (HTTP ${response.status})`);\n }\n\n const manifest = await response.json();\n const baseUrl = manifestUrl.substring(0, manifestUrl.lastIndexOf('/') + 1);\n\n // Determine which weights to load\n const weightsToLoad = weights\n ? weights.filter(w => manifest.weights.includes(w))\n : manifest.weights;\n\n if (weights && weightsToLoad.length !== weights.length) {\n const missing = weights.filter(w => !manifest.weights.includes(w));\n console.warn(`MeshWriter: Requested weights not available: ${missing.join(', ')}`);\n console.warn(`MeshWriter: Available weights: ${manifest.weights.join(', ')}`);\n }\n\n // Load all requested weights in parallel\n const results = await Promise.all(\n weightsToLoad.map(async (weight) => {\n const idx = manifest.weights.indexOf(weight);\n const file = manifest.files[idx];\n const fontSpec = await loadBakedFont(baseUrl + file);\n return { weight, fontSpec };\n })\n );\n\n // Build map\n const fontMap = new Map();\n for (const { weight, fontSpec } of results) {\n fontMap.set(weight, fontSpec);\n }\n\n return fontMap;\n}\n\n/**\n * Find the nearest available weight from a set of baked weights\n * @param {number} targetWeight - Desired weight\n * @param {number[]} availableWeights - Array of available weights\n * @returns {number} - Nearest available weight\n *\n * @example\n * const nearest = findNearestWeight(425, [400, 450, 500]);\n * // Returns 450 (closest to 425)\n */\nexport function findNearestWeight(targetWeight, availableWeights) {\n if (!availableWeights || availableWeights.length === 0) {\n throw new Error('MeshWriter: No available weights provided');\n }\n\n let nearest = availableWeights[0];\n let minDiff = Math.abs(targetWeight - nearest);\n\n for (const weight of availableWeights) {\n const diff = Math.abs(targetWeight - weight);\n if (diff < minDiff) {\n minDiff = diff;\n nearest = weight;\n }\n }\n\n return nearest;\n}\n\n/**\n * Get manifest info without loading fonts\n * @param {string} manifestUrl - URL to the manifest.json file\n * @returns {Promise<object>} - Manifest object with fontName, weights, etc.\n */\nexport async function getBakedFontManifest(manifestUrl) {\n const response = await fetch(manifestUrl);\n\n if (!response.ok) {\n throw new Error(`MeshWriter: Failed to load manifest from ${manifestUrl} (HTTP ${response.status})`);\n }\n\n return response.json();\n}\n","/**\n * Color Contrast Utilities for WCAG Compliance\n * Provides color manipulation for dyslexia accessibility\n */\n\n// ============================================\n// Color Conversion Utilities\n// ============================================\n\n/**\n * Convert hex color string to RGB object (0-1 range)\n * @param {string} hex - Hex color string (e.g., \"#FF0000\" or \"FF0000\")\n * @returns {{r: number, g: number, b: number}}\n */\nexport function hexToRgb(hex) {\n hex = hex.replace(\"#\", \"\");\n return {\n r: parseInt(hex.substring(0, 2), 16) / 255,\n g: parseInt(hex.substring(2, 4), 16) / 255,\n b: parseInt(hex.substring(4, 6), 16) / 255\n };\n}\n\n/**\n * Convert RGB object (0-1 range) to hex color string\n * @param {{r: number, g: number, b: number}} rgb\n * @returns {string}\n */\nexport function rgbToHex(rgb) {\n var r = Math.round(Math.max(0, Math.min(1, rgb.r)) * 255);\n var g = Math.round(Math.max(0, Math.min(1, rgb.g)) * 255);\n var b = Math.round(Math.max(0, Math.min(1, rgb.b)) * 255);\n return \"#\" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase();\n}\n\n/**\n * Convert RGB to HSL\n * @param {number} r - Red (0-1)\n * @param {number} g - Green (0-1)\n * @param {number} b - Blue (0-1)\n * @returns {{h: number, s: number, l: number}} - h in degrees (0-360), s and l in 0-1\n */\nexport function rgbToHsl(r, g, b) {\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var l = (max + min) / 2;\n var h, s;\n\n if (max === min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n h *= 360;\n }\n\n return { h: h, s: s, l: l };\n}\n\n/**\n * Convert HSL to RGB\n * @param {number} h - Hue in degrees (0-360)\n * @param {number} s - Saturation (0-1)\n * @param {number} l - Lightness (0-1)\n * @returns {{r: number, g: number, b: number}}\n */\nexport function hslToRgb(h, s, l) {\n var r, g, b;\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n var hNorm = h / 360;\n\n r = hue2rgb(p, q, hNorm + 1 / 3);\n g = hue2rgb(p, q, hNorm);\n b = hue2rgb(p, q, hNorm - 1 / 3);\n }\n\n return { r: r, g: g, b: b };\n}\n\n// ============================================\n// WCAG Luminance Calculations\n// ============================================\n\n/**\n * Linearize an sRGB channel value\n * @param {number} c - Channel value (0-1)\n * @returns {number} - Linearized value\n */\nfunction linearize(c) {\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\n/**\n * Calculate relative luminance per WCAG 2.1\n * @param {number} r - Red (0-1)\n * @param {number} g - Green (0-1)\n * @param {number} b - Blue (0-1)\n * @returns {number} - Relative luminance (0-1)\n */\nexport function relativeLuminance(r, g, b) {\n var rLin = linearize(r);\n var gLin = linearize(g);\n var bLin = linearize(b);\n return 0.2126 * rLin + 0.7152 * gLin + 0.0722 * bLin;\n}\n\n/**\n * Calculate WCAG contrast ratio between two luminance values\n * @param {number} L1 - Luminance of first color (0-1)\n * @param {number} L2 - Luminance of second color (0-1)\n * @returns {number} - Contrast ratio (1-21)\n */\nexport function contrastRatio(L1, L2) {\n var lighter = Math.max(L1, L2);\n var darker = Math.min(L1, L2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Check if a color is essentially gray (no saturation)\n * @param {{r: number, g: number, b: number}} rgb\n * @param {number} [tolerance=0.02]\n * @returns {boolean}\n */\nfunction isGray(rgb, tolerance) {\n tolerance = tolerance || 0.02;\n var max = Math.max(rgb.r, rgb.g, rgb.b);\n var min = Math.min(rgb.r, rgb.g, rgb.b);\n return (max - min) < tolerance;\n}\n\n// ============================================\n// Luminance Adjustment\n// ============================================\n\n/**\n * Adjust color to target luminance while preserving hue\n * Uses binary search in HSL space\n * Desaturates significantly at low lightness for better visual contrast\n * @param {{r: number, g: number, b: number}} rgb\n * @param {number} targetLum - Target relative luminance (0-1)\n * @returns {{r: number, g: number, b: number}}\n */\nfunction adjustToLuminance(rgb, targetLum) {\n var hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n\n // Binary search to find lightness that achieves target luminance\n var minL = 0;\n var maxL = 1;\n var iterations = 20;\n var finalL;\n\n for (var i = 0; i < iterations; i++) {\n var midL = (minL + maxL) / 2;\n var testRgb = hslToRgb(hsl.h, hsl.s, midL);\n var testLum = relativeLuminance(testRgb.r, testRgb.g, testRgb.b);\n\n if (testLum < targetLum) {\n minL = midL;\n } else {\n maxL = midL;\n }\n }\n\n finalL = (minL + maxL) / 2;\n\n // Desaturate significantly at low lightness for better visual contrast\n // Dark saturated colors (e.g., dark yellow) don't look distinct enough\n // Scale saturation based on lightness: below 0.3 lightness, reduce saturation\n var finalS = hsl.s;\n if (finalL < 0.3) {\n // Linear ramp: at L=0.3, keep 100% saturation; at L=0, keep 20% saturation\n var saturationScale = 0.2 + (finalL / 0.3) * 0.8;\n finalS = hsl.s * saturationScale;\n }\n\n return hslToRgb(hsl.h, finalS, finalL);\n}\n\n// ============================================\n// Auto-Derive Edge Colors\n// ============================================\n\n/**\n * Auto-derive edge colors (diffuse/ambient) from emissive color\n * Creates high-contrast edges for text legibility\n *\n * INVERTED APPROACH: Since emissive adds to all surfaces equally,\n * we flip the strategy - put bright color in diffuse (shows on lit surfaces)\n * and dark color in emissive (base for unlit surfaces).\n * Returns modified emissive along with diffuse/ambient.\n *\n * @param {string} emissiveHex - Hex color string for desired face color\n * @param {number} [targetContrast=4.5] - Target WCAG contrast ratio\n * @returns {{diffuse: string, ambient: string, emissive: string}}\n */\nexport function deriveEdgeColors(emissiveHex, targetContrast) {\n targetContrast = targetContrast || 4.5;\n\n var rgb = hexToRgb(emissiveHex);\n var faceLum = relativeLuminance(rgb.r, rgb.g, rgb.b);\n\n // Calculate target luminance for dark areas to achieve contrast\n var darkLum;\n if (faceLum > 0.5) {\n // Bright face needs dark edges\n darkLum = (faceLum + 0.05) / targetContrast - 0.05;\n darkLum = Math.max(darkLum, 0.0);\n } else {\n // Dark face needs light edges (invert the logic)\n darkLum = targetContrast * (faceLum + 0.05) - 0.05;\n darkLum = Math.min(darkLum, 1.0);\n }\n\n // Handle edge cases\n if (faceLum > 0.95) {\n darkLum = Math.min(0.1, darkLum);\n } else if (faceLum < 0.05) {\n darkLum = Math.max(0.5, darkLum);\n }\n\n // Generate dark color (desaturated at low lightness)\n var darkRgb = adjustToLuminance(rgb, darkLum);\n\n // INVERTED APPROACH:\n // - diffuse = bright (the user's desired face color) - shows on lit surfaces\n // - emissive = dark - base color for all surfaces (unlit areas show this)\n // - ambient = very dark - shadowed areas\n var ambientLum = darkLum * 0.5;\n var ambientRgb = adjustToLuminance(rgb, Math.max(0, ambientLum));\n\n return {\n diffuse: emissiveHex, // Bright color for lit surfaces\n ambient: rgbToHex(ambientRgb), // Very dark for shadows\n emissive: rgbToHex(darkRgb) // Dark base for unlit areas\n };\n}\n\n// ============================================\n// High-Contrast Adjustment Algorithm\n// ============================================\n\n/**\n * Adjust color by a factor (lightness change with optional hue shift)\n * @param {{r: number, g: number, b: number}} rgb\n * @param {number} factor - Adjustment factor (-1 to 1, negative = darken)\n * @param {boolean} allowHueShift\n * @returns {{r: number, g: number, b: number}}\n */\nfunction adjustColorByFactor(rgb, factor, allowHueShift) {\n var hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n\n // Adjust lightness\n var newL = hsl.l + factor;\n newL = Math.max(0, Math.min(1, newL));\n\n // Optionally shift hue for extreme adjustments\n var newH = hsl.h;\n if (allowHueShift && Math.abs(factor) > 0.2) {\n // Slight hue shift toward yellow (high luminance) or blue (low luminance)\n var hueTarget = factor > 0 ? 60 : 240;\n newH = hsl.h + (hueTarget - hsl.h) * Math.abs(factor) * 0.1;\n newH = ((newH % 360) + 360) % 360;\n }\n\n // Reduce saturation at extreme lightness for natural look\n var newS = hsl.s;\n if (newL > 0.9 || newL < 0.1) {\n newS *= 0.5;\n }\n\n return hslToRgb(newH, newS, newL);\n}\n\n/**\n * Oscillate edge colors to find best contrast\n * @param {{r: number, g: number, b: number}} emissive\n * @param {{r: number, g: number, b: number}} diffuse\n * @param {{r: number, g: number, b: number}} ambient\n * @param {object} options\n * @returns {{diffuse: object, ambient: object, achieved: number}}\n */\nfunction oscillateEdges(emissive, diffuse, ambient, options) {\n var emissiveLum = relativeLuminance(emissive.r, emissive.g, emissive.b);\n var diffuseLum = relativeLuminance(diffuse.r, diffuse.g, diffuse.b);\n var currentContrast = contrastRatio(emissiveLum, diffuseLum);\n\n var bestResult = { diffuse: diffuse, ambient: ambient, achieved: currentContrast };\n\n // Determine direction: edges should go opposite to emissive luminance\n var direction = emissiveLum > 0.5 ? -1 : 1;\n\n var steps = 10;\n for (var i = 1; i <= steps; i++) {\n var factor = (i / steps) * options.range;\n\n // Primary direction\n var testDiffuse = adjustColorByFactor(diffuse, direction * factor, options.allowHueShift);\n var testAmbient = adjustColorByFactor(ambient, direction * factor * 0.8, options.allowHueShift);\n\n var testLum = relativeLuminance(testDiffuse.r, testDiffuse.g, testDiffuse.b);\n var contrast = contrastRatio(emissiveLum, testLum);\n\n if (contrast > bestResult.achieved) {\n bestResult = { diffuse: testDiffuse, ambient: testAmbient, achieved: contrast };\n }\n\n if (contrast >= options.targetContrast) break;\n\n // Try opposite direction for edge cases\n testDiffuse = adjustColorByFactor(diffuse, -direction * factor, options.allowHueShift);\n testAmbient = adjustColorByFactor(ambient, -direction * factor * 0.8, options.allowHueShift);\n\n testLum = relativeLuminance(testDiffuse.r, testDiffuse.g, testDiffuse.b);\n contrast = contrastRatio(emissiveLum, testLum);\n\n if (contrast > bestResult.achieved) {\n bestResult = { diffuse: testDiffuse, ambient: testAmbient, achieved: contrast };\n }\n }\n\n return bestResult;\n}\n\n/**\n * Oscillate face color to find better contrast\n * @param {{r: number, g: number, b: number}} emissive\n * @param {{r: number, g: number, b: number}} diffuse\n * @param {object} options\n * @returns {{emissive: object, achieved: number}}\n */\nfunction oscillateFace(emissive, diffuse, options) {\n var diffuseLum = relativeLuminance(diffuse.r, diffuse.g, diffuse.b);\n var emissiveLum = relativeLuminance(emissive.r, emissive.g, emissive.b);\n var currentContrast = contrastRatio(emissiveLum, diffuseLum);\n\n var bestResult = { emissive: emissive, achieved: currentContrast };\n\n // Face should move opposite to edges\n var direction = diffuseLum > 0.5 ? -1 : 1;\n\n var steps = 10;\n for (var i = 1; i <= steps; i++) {\n var factor = (i / steps) * options.range;\n\n var testEmissive = adjustColorByFactor(emissive, direction * factor, options.allowHueShift);\n var testLum = relativeLuminance(testEmissive.r, testEmissive.g, testEmissive.b);\n var contrast = contrastRatio(testLum, diffuseLum);\n\n if (contrast > bestResult.achieved) {\n bestResult = { emissive: testEmissive, achieved: contrast };\n }\n\n if (contrast >= options.targetContrast) break;\n }\n\n return bestResult;\n}\n\n/**\n * Adjust colors to achieve WCAG contrast while preserving user intent\n * Priority: prefer edge modifications over face modifications\n *\n * @param {object} colors - User-provided colors\n * @param {string} colors.emissive - Face color (hex)\n * @param {string} colors.diffuse - Edge lit color (hex)\n * @param {string} [colors.ambient] - Edge shadow color (hex)\n * @param {object} [options]\n * @param {number} [options.targetContrast=4.5] - Target contrast ratio\n * @param {number} [options.edgeRange=0.4] - Max edge modification (0-1)\n * @param {number} [options.faceRange=0.1] - Max face modification (0-1)\n * @param {boolean} [options.allowHueShift=true] - Allow hue modifications\n * @returns {{emissive: string, diffuse: string, ambient: string, achieved: number}}\n */\nexport function adjustForContrast(colors, options) {\n options = options || {};\n var targetContrast = options.targetContrast || 4.5;\n var edgeRange = options.edgeRange || 0.4;\n var faceRange = options.faceRange || 0.1;\n var allowHueShift = options.allowHueShift !== false;\n\n var emissive = hexToRgb(colors.emissive);\n var diffuse = hexToRgb(colors.diffuse);\n var ambient = colors.ambient ? hexToRgb(colors.ambient) : { r: diffuse.r * 0.5, g: diffuse.g * 0.5, b: diffuse.b * 0.5 };\n\n var emissiveLum = relativeLuminance(emissive.r, emissive.g, emissive.b);\n var diffuseLum = relativeLuminance(diffuse.r, diffuse.g, diffuse.b);\n var currentContrast = contrastRatio(emissiveLum, diffuseLum);\n\n // Already meets target?\n if (currentContrast >= targetContrast) {\n return {\n emissive: colors.emissive,\n diffuse: colors.diffuse,\n ambient: colors.ambient || rgbToHex(ambient),\n achieved: currentContrast\n };\n }\n\n // Phase 1: Try edge modification only\n var edgeResult = oscillateEdges(emissive, diffuse, ambient, {\n targetContrast: targetContrast,\n range: edgeRange,\n allowHueShift: allowHueShift\n });\n\n if (edgeResult.achieved >= targetContrast) {\n return {\n emissive: colors.emissive,\n diffuse: rgbToHex(edgeResult.diffuse),\n ambient: rgbToHex(edgeResult.ambient),\n achieved: edgeResult.achieved\n };\n }\n\n // Phase 2: Try face modification\n var faceResult = oscillateFace(emissive, edgeResult.diffuse, {\n targetContrast: targetContrast,\n range: faceRange,\n allowHueShift: allowHueShift\n });\n\n if (faceResult.achieved >= targetContrast) {\n return {\n emissive: rgbToHex(faceResult.emissive),\n diffuse: rgbToHex(edgeResult.diffuse),\n ambient: rgbToHex(edgeResult.ambient),\n achieved: faceResult.achieved\n };\n }\n\n // Phase 3: Oscillate both until convergence\n var maxIterations = 5;\n var currentEmissive = faceResult.emissive;\n var currentDiffuse = edgeResult.diffuse;\n var currentAmbient = edgeResult.ambient;\n var bestAchieved = faceResult.achieved;\n\n for (var iter = 0; iter < maxIterations; iter++) {\n // Try more edge adjustment\n var newEdgeResult = oscillateEdges(currentEmissive, currentDiffuse, currentAmbient, {\n targetContrast: targetContrast,\n range: edgeRange * 0.5,\n allowHueShift: allowHueShift\n });\n\n if (newEdgeResult.achieved >= targetContrast) {\n return {\n emissive: rgbToHex(currentEmissive),\n diffuse: rgbToHex(newEdgeResult.diffuse),\n ambient: rgbToHex(newEdgeResult.ambient),\n achieved: newEdgeResult.achieved\n };\n }\n\n // Try more face adjustment\n var newFaceResult = oscillateFace(currentEmissive, newEdgeResult.diffuse, {\n targetContrast: targetContrast,\n range: faceRange * 0.5,\n allowHueShift: allowHueShift\n });\n\n if (newFaceResult.achieved >= targetContrast) {\n return {\n emissive: rgbToHex(newFaceResult.emissive),\n diffuse: rgbToHex(newEdgeResult.diffuse),\n ambient: rgbToHex(newEdgeResult.ambient),\n achieved: newFaceResult.achieved\n };\n }\n\n // Update for next iteration\n if (newFaceResult.achieved > bestAchieved) {\n bestAchieved = newFaceResult.achieved;\n currentEmissive = newFaceResult.emissive;\n currentDiffuse = newEdgeResult.diffuse;\n currentAmbient = newEdgeResult.ambient;\n } else {\n // No improvement, stop\n break;\n }\n }\n\n // Return best result even if target not achieved\n return {\n emissive: rgbToHex(currentEmissive),\n diffuse: rgbToHex(currentDiffuse),\n ambient: rgbToHex(currentAmbient),\n achieved: bestAchieved\n };\n}\n\n// ============================================\n// Constants\n// ============================================\n\nexport var CONTRAST_LEVELS = {\n AA_NORMAL: 4.5,\n AA_LARGE: 3.0,\n AAA_NORMAL: 7.0,\n AAA_LARGE: 4.5\n};\n","/**\n * MeshWriter - 3D Text Rendering for Babylon.js\n *\n * @example\n * // ES Module usage\n * import { MeshWriter, registerFont } from 'meshwriter';\n * import helvetica from 'meshwriter/fonts/helvetica';\n *\n * registerFont('Helvetica', helvetica);\n * const Writer = await MeshWriter.createAsync(scene);\n * const text = new Writer(\"Hello World\", { \"letter-height\": 20 });\n */\n\n// Core MeshWriter factory functions\nexport {\n createMeshWriter,\n createMeshWriterAsync,\n isCSGReady,\n getCSGVersion,\n setCSGInitializer,\n setCSGReadyCheck,\n onCSGReady,\n markCSGReady,\n initCSGModule\n} from './meshwriter.js';\n\n// Font registry\nexport {\n registerFont,\n registerFontAliases,\n getFont,\n isFontRegistered,\n getRegisteredFonts,\n unregisterFont,\n clearFonts,\n codeList,\n decodeList\n} from './fontRegistry.js';\n\n// Baked font loader (lightweight, no dependencies)\nexport {\n loadBakedFont,\n loadBakedFontsFromManifest,\n findNearestWeight,\n getBakedFontManifest\n} from './bakedFontLoader.js';\n\n// Utility exports (for advanced usage / font creation)\nexport { codeList as encodeFontData, decodeList as decodeFontData } from './fontCompression.js';\n\n// Material plugins (for advanced usage)\nexport { TextFogPlugin } from './fogPlugin.js';\n\n// Color contrast utilities (for accessibility)\nexport {\n deriveEdgeColors,\n adjustForContrast,\n relativeLuminance,\n contrastRatio,\n hexToRgb,\n rgbToHex,\n rgbToHsl,\n hslToRgb,\n CONTRAST_LEVELS\n} from './colorContrast.js';\n\n/**\n * MeshWriter namespace object (for convenience and backward compatibility patterns)\n */\nimport {\n createMeshWriter,\n createMeshWriterAsync,\n isCSGReady,\n getCSGVersion,\n setCSGInitializer,\n setCSGReadyCheck,\n onCSGReady,\n markCSGReady,\n initCSGModule\n} from './meshwriter.js';\n\nimport {\n registerFont,\n registerFontAliases,\n getFont,\n isFontRegistered\n} from './fontRegistry.js';\n\nimport { codeList, decodeList } from './fontCompression.js';\n\nimport {\n loadBakedFont,\n loadBakedFontsFromManifest,\n findNearestWeight,\n getBakedFontManifest\n} from './bakedFontLoader.js';\n\nexport const MeshWriter = {\n /**\n * Create MeshWriter async (recommended for Babylon 8+)\n */\n createAsync: createMeshWriterAsync,\n\n /**\n * Create MeshWriter sync (for Babylon < 8 or when CSG2 is pre-initialized)\n */\n create: createMeshWriter,\n\n // Static CSG methods\n isReady: isCSGReady,\n getCSGVersion,\n setCSGInitializer,\n setCSGReadyCheck,\n onCSGReady,\n markCSGReady,\n initCSGModule,\n\n // Font methods\n registerFont,\n registerFontAliases,\n getFont,\n isFontRegistered,\n\n // Encoding utilities\n codeList,\n decodeList,\n\n // Baked font methods (lightweight alternative to variable fonts)\n loadBakedFont,\n loadBakedFontsFromManifest,\n findNearestWeight,\n getBakedFontManifest\n};\n\n// Default export\nexport default MeshWriter;\n"],"names":["floor","BabylonCSG","BabylonCSG2","BabylonInitializeCSG2Async","BabylonIsCSG2Ready","markCSGReady"],"mappings":"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"}