@onerjs/serializers 8.45.9 → 8.46.2

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 (117) hide show
  1. package/3MF/3mfSerializer.js.map +1 -1
  2. package/3MF/core/model/3mf.builder.d.ts +4 -7
  3. package/3MF/core/model/3mf.builder.js +2 -1
  4. package/3MF/core/model/3mf.builder.js.map +1 -1
  5. package/3MF/core/model/3mf.d.ts +1 -2
  6. package/3MF/core/model/3mf.js +1 -1
  7. package/3MF/core/model/3mf.js.map +1 -1
  8. package/3MF/core/model/3mf.opc.d.ts +2 -2
  9. package/3MF/core/model/3mf.opc.interfaces.d.ts +1 -1
  10. package/3MF/core/model/3mf.opc.interfaces.js.map +1 -1
  11. package/3MF/core/model/3mf.opc.js +1 -1
  12. package/3MF/core/model/3mf.opc.js.map +1 -1
  13. package/3MF/core/model/3mf.serializer.d.ts +1 -2
  14. package/3MF/core/model/3mf.serializer.js.map +1 -1
  15. package/3MF/core/xml/xml.builder.bytes.d.ts +1 -1
  16. package/3MF/core/xml/xml.builder.bytes.js.map +1 -1
  17. package/3MF/core/xml/xml.builder.d.ts +1 -1
  18. package/3MF/core/xml/xml.builder.js.map +1 -1
  19. package/3MF/core/xml/xml.builder.string.d.ts +1 -1
  20. package/3MF/core/xml/xml.builder.string.js.map +1 -1
  21. package/3MF/core/xml/xml.interfaces.d.ts +1 -1
  22. package/3MF/core/xml/xml.interfaces.js.map +1 -1
  23. package/3MF/core/xml/xml.serializer.format.d.ts +1 -1
  24. package/3MF/core/xml/xml.serializer.format.js.map +1 -1
  25. package/BVH/bvhSerializer.d.ts +1 -1
  26. package/BVH/bvhSerializer.js.map +1 -1
  27. package/OBJ/objSerializer.d.ts +1 -1
  28. package/OBJ/objSerializer.js.map +1 -1
  29. package/USDZ/usdzExporter.d.ts +2 -2
  30. package/USDZ/usdzExporter.js.map +1 -1
  31. package/exportUtils.d.ts +1 -1
  32. package/exportUtils.js.map +1 -1
  33. package/glTF/2.0/Extensions/EXT_lights_area.d.ts +4 -4
  34. package/glTF/2.0/Extensions/EXT_lights_area.js.map +1 -1
  35. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +5 -5
  36. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
  37. package/glTF/2.0/Extensions/EXT_texture_avif.d.ts +1 -1
  38. package/glTF/2.0/Extensions/EXT_texture_avif.js.map +1 -1
  39. package/glTF/2.0/Extensions/EXT_texture_webp.d.ts +1 -1
  40. package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
  41. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.d.ts +3 -3
  42. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
  43. package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +4 -4
  44. package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
  45. package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +4 -4
  46. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -1
  47. package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +4 -4
  48. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
  49. package/glTF/2.0/Extensions/KHR_materials_coat.d.ts +4 -4
  50. package/glTF/2.0/Extensions/KHR_materials_coat.js.map +1 -1
  51. package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.d.ts +4 -4
  52. package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.js.map +1 -1
  53. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.d.ts +4 -4
  54. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -1
  55. package/glTF/2.0/Extensions/KHR_materials_dispersion.d.ts +3 -3
  56. package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -1
  57. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +3 -3
  58. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
  59. package/glTF/2.0/Extensions/KHR_materials_fuzz.d.ts +4 -4
  60. package/glTF/2.0/Extensions/KHR_materials_fuzz.js.map +1 -1
  61. package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +3 -3
  62. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
  63. package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +4 -4
  64. package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
  65. package/glTF/2.0/Extensions/KHR_materials_openpbr.d.ts +3 -3
  66. package/glTF/2.0/Extensions/KHR_materials_openpbr.js.map +1 -1
  67. package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +4 -4
  68. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
  69. package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +4 -4
  70. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
  71. package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +4 -4
  72. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
  73. package/glTF/2.0/Extensions/KHR_materials_unlit.d.ts +3 -3
  74. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
  75. package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +4 -4
  76. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
  77. package/glTF/2.0/Extensions/KHR_materials_volume_scatter.d.ts +4 -4
  78. package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js.map +1 -1
  79. package/glTF/2.0/Extensions/KHR_texture_basisu.d.ts +1 -1
  80. package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
  81. package/glTF/2.0/Extensions/KHR_texture_transform.d.ts +3 -3
  82. package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
  83. package/glTF/2.0/bufferManager.d.ts +2 -2
  84. package/glTF/2.0/bufferManager.js.map +1 -1
  85. package/glTF/2.0/dataWriter.d.ts +1 -1
  86. package/glTF/2.0/dataWriter.js.map +1 -1
  87. package/glTF/2.0/glTFAnimation.d.ts +5 -6
  88. package/glTF/2.0/glTFAnimation.js.map +1 -1
  89. package/glTF/2.0/glTFData.js.map +1 -1
  90. package/glTF/2.0/glTFExporter.d.ts +7 -7
  91. package/glTF/2.0/glTFExporter.js.map +1 -1
  92. package/glTF/2.0/glTFExporterExtension.d.ts +8 -8
  93. package/glTF/2.0/glTFExporterExtension.js.map +1 -1
  94. package/glTF/2.0/glTFMaterialExporter.d.ts +5 -5
  95. package/glTF/2.0/glTFMaterialExporter.js.map +1 -1
  96. package/glTF/2.0/glTFMorphTargetsUtilities.d.ts +4 -4
  97. package/glTF/2.0/glTFMorphTargetsUtilities.js.map +1 -1
  98. package/glTF/2.0/glTFSerializer.d.ts +4 -4
  99. package/glTF/2.0/glTFSerializer.js.map +1 -1
  100. package/glTF/2.0/glTFUtilities.d.ts +7 -9
  101. package/glTF/2.0/glTFUtilities.js.map +1 -1
  102. package/legacy/legacy-3mfSerializer.js +3 -3
  103. package/legacy/legacy-3mfSerializer.js.map +1 -1
  104. package/legacy/legacy-bvhSerializer.js +3 -3
  105. package/legacy/legacy-bvhSerializer.js.map +1 -1
  106. package/legacy/legacy-glTF2Serializer.js +5 -4
  107. package/legacy/legacy-glTF2Serializer.js.map +1 -1
  108. package/legacy/legacy-objSerializer.js +3 -3
  109. package/legacy/legacy-objSerializer.js.map +1 -1
  110. package/legacy/legacy-stlSerializer.js +3 -3
  111. package/legacy/legacy-stlSerializer.js.map +1 -1
  112. package/legacy/legacy-usdzSerializer.js +3 -3
  113. package/legacy/legacy-usdzSerializer.js.map +1 -1
  114. package/legacy/legacy.js +0 -1
  115. package/legacy/legacy.js.map +1 -1
  116. package/package.json +4 -4
  117. package/stl/stlSerializer.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"xml.builder.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IXmlBuilder } from \"./xml.interfaces\";\r\n\r\n/**\r\n */\r\nexport interface IXmlWriter {\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter;\r\n /** */\r\n count: number;\r\n /** */\r\n clear(): void;\r\n}\r\n\r\n/** */\r\nclass XmlSyntax {\r\n /** */\r\n public static OpenTag: string = \"<\";\r\n /** */\r\n public static CloseTag: string = \">\";\r\n /** */\r\n public static Slash: string = \"/\";\r\n /** */\r\n public static Question: string = \"?\";\r\n /** */\r\n public static Quote: string = '\"';\r\n /** */\r\n public static Equal: string = \"=\";\r\n /** */\r\n public static Space: string = \" \";\r\n /** */\r\n public static Semicolon: string = \":\";\r\n\r\n /** */\r\n public static Dec = \"<?xml\";\r\n /** */\r\n public static Xml = \"xml\";\r\n /** */\r\n public static Xmlns = \"xmlns\";\r\n /** */\r\n public static Xsi = \"xsi\";\r\n\r\n /** */\r\n public static VersionKeyword = \"version\";\r\n /** */\r\n public static EncodingKeyword = \"encoding\";\r\n /** */\r\n public static StandaloneKeyword = \"standalone\";\r\n}\r\n\r\n/** */\r\nexport enum TokenType {\r\n Declaration,\r\n Tag,\r\n Attribute,\r\n Text,\r\n}\r\n\r\n/** */\r\nexport class XmlBuilder implements IXmlBuilder {\r\n /** */\r\n static Context = class {\r\n /** */\r\n name: string = \"\";\r\n /** */\r\n closed: boolean = false;\r\n /** */\r\n lastToken: TokenType | null = null;\r\n /** */\r\n depth: number;\r\n\r\n // uri -> prefix\r\n ns2prefix: Map<string, string> = new Map();\r\n\r\n // prefix -> uri (for conflict checks)\r\n prefix2ns: Map<string, string> = new Map();\r\n\r\n // optional: default namespace uri\r\n defaultNs: string | null = null;\r\n\r\n /**\r\n *\r\n *@param name\r\n *@param depth\r\n */\r\n constructor(name: string, depth: number) {\r\n this.name = name;\r\n this.depth = depth;\r\n }\r\n };\r\n\r\n /** */\r\n private _w: IXmlWriter;\r\n /** */\r\n private _ctxStack: Array<InstanceType<typeof XmlBuilder.Context>> = [];\r\n /** */\r\n private _d: number = 0;\r\n\r\n public constructor(w: IXmlWriter) {\r\n this._w = w;\r\n }\r\n\r\n /**\r\n *\r\n * @param version\r\n * @param encoding\r\n * @param standalone\r\n * @returns\r\n */\r\n public dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder {\r\n this._w.write(XmlSyntax.Dec);\r\n this._writeAttStr(XmlSyntax.VersionKeyword, version);\r\n if (encoding) {\r\n this._writeAttStr(XmlSyntax.EncodingKeyword, encoding);\r\n }\r\n if (standalone !== undefined) {\r\n this._writeAttStr(XmlSyntax.StandaloneKeyword, standalone ? \"yes\" : \"no\");\r\n }\r\n this._w.write(XmlSyntax.Question, XmlSyntax.CloseTag);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param ns\r\n * @param n\r\n * @param v\r\n * @returns\r\n */\r\n public att(ns: string | null, n: string, v: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (!ctx) {\r\n throw new Error(\"att() without open element\");\r\n }\r\n if (ctx.closed) {\r\n throw new Error(`att() after start tag closed for <${ctx.name}>`);\r\n }\r\n\r\n // explicit namespace declaration: xmlns or xmlns:prefix\r\n if (this._isXmlnsDecl(ns, n)) {\r\n if (n === XmlSyntax.Xmlns) {\r\n // default namespace\r\n ctx.defaultNs = v;\r\n // you can store default as empty prefix if you want\r\n this._registerNamespace(ctx, \"\", v);\r\n this._writeAttStr(XmlSyntax.Xmlns, v);\r\n } else {\r\n if (!ns) {\r\n const prefix = n.slice(6); // \"xmlns:\"\r\n this._registerNamespace(ctx, prefix, v);\r\n this._writeAttStr(n, v);\r\n } else {\r\n this._registerNamespace(ctx, n, v);\r\n this._writeAttStr(`${ns}:${n}`, v);\r\n }\r\n }\r\n ctx.lastToken = TokenType.Attribute;\r\n return this;\r\n }\r\n\r\n // normal attribute\r\n let qn = n;\r\n\r\n if (ns) {\r\n // treat ns as a namespace URI, not a prefix\r\n const p = this._ensurePrefixDeclared(ctx, ns);\r\n qn = `${p}:${n}`;\r\n }\r\n\r\n ctx.lastToken = TokenType.Attribute;\r\n this._writeAttStr(qn, v);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param ns\r\n * @param n\r\n * @returns\r\n */\r\n public ele(ns: string | null, n: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (ctx) {\r\n this._closeOpenTagIfNeeded(ctx);\r\n }\r\n let qns = n;\r\n if (ns) {\r\n const p = this._lookupPrefix(ns) ?? ns;\r\n qns = `${p}:${n}`;\r\n }\r\n this._pushContext(qns, ++this._d);\r\n this._w.write(XmlSyntax.OpenTag, qns);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param txt\r\n * @returns\r\n */\r\n public text(txt: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (!ctx) {\r\n throw new Error(\"text() without open element\");\r\n }\r\n this._closeOpenTagIfNeeded(ctx);\r\n ctx.lastToken = TokenType.Text;\r\n this._w.write(this._escText(txt));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public end(): IXmlBuilder {\r\n const ctx = this._popContext();\r\n if (ctx) {\r\n this._d--;\r\n if (!ctx.closed) {\r\n this._w.write(XmlSyntax.Slash, XmlSyntax.CloseTag);\r\n } else {\r\n this._w.write(XmlSyntax.OpenTag, XmlSyntax.Slash, ctx.name, XmlSyntax.CloseTag);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n protected _pushContext(name: string, depth: number): InstanceType<typeof XmlBuilder.Context> {\r\n const ctx = new XmlBuilder.Context(name, depth);\r\n this._ctxStack.push(ctx);\r\n return ctx;\r\n }\r\n\r\n protected _popContext(): InstanceType<typeof XmlBuilder.Context> | undefined {\r\n return this._ctxStack.pop();\r\n }\r\n\r\n protected _peekContext(): InstanceType<typeof XmlBuilder.Context> | undefined {\r\n return this._ctxStack[this._ctxStack.length - 1];\r\n }\r\n\r\n protected get _contextDepth(): number {\r\n return this._ctxStack.length;\r\n }\r\n\r\n private _writeAttStr(name: string, value: string) {\r\n this._w.write(XmlSyntax.Space, name, XmlSyntax.Equal, XmlSyntax.Quote, this._escAttr(value), XmlSyntax.Quote);\r\n }\r\n\r\n private _lookupPrefix(ns: string): string | undefined {\r\n let i = this._ctxStack.length - 1;\r\n if (i >= 0) {\r\n do {\r\n const ctx = this._ctxStack[i--];\r\n const p = ctx.ns2prefix?.get(ns);\r\n if (p) {\r\n return p;\r\n }\r\n } while (i >= 0);\r\n }\r\n return undefined;\r\n }\r\n\r\n private _escText(s: string): string {\r\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\r\n }\r\n\r\n private _escAttr(s: string): string {\r\n return this._escText(s).replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\r\n }\r\n\r\n private _isXmlnsDecl(ns: string | null, n: string): boolean {\r\n if (ns) {\r\n return ns === XmlSyntax.Xmlns;\r\n }\r\n const l = n.length;\r\n const s = XmlSyntax.Xmlns.length;\r\n if (l >= s) {\r\n return n.startsWith(XmlSyntax.Xmlns) && (n.length == s || n[s] == XmlSyntax.Semicolon);\r\n }\r\n return false;\r\n }\r\n\r\n private _registerNamespace(ctx: InstanceType<typeof XmlBuilder.Context>, prefix: string, uri: string) {\r\n if (prefix === XmlSyntax.Xml || prefix === XmlSyntax.Xmlns) {\r\n throw new Error(`reserved prefix '${prefix}'`);\r\n }\r\n\r\n const existingUri = ctx.prefix2ns.get(prefix);\r\n if (existingUri && existingUri !== uri) {\r\n throw new Error(`prefix '${prefix}' already bound to a different namespace`);\r\n }\r\n\r\n const existingPrefix = ctx.ns2prefix.get(uri);\r\n if (!existingPrefix) {\r\n ctx.ns2prefix.set(uri, prefix);\r\n }\r\n\r\n ctx.prefix2ns.set(prefix, uri);\r\n }\r\n\r\n private _allocPrefix(ctx: InstanceType<typeof XmlBuilder.Context>): string {\r\n let i = 1;\r\n while (true) {\r\n const p = `ns${i++}`;\r\n if (!ctx.prefix2ns.has(p)) {\r\n return p;\r\n }\r\n }\r\n }\r\n\r\n private _ensurePrefixDeclared(ctx: InstanceType<typeof XmlBuilder.Context>, uri: string): string {\r\n const existing = this._lookupPrefix(uri);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n if (ctx.closed) {\r\n throw new Error(`can not declare namespace after start tag closed for <${ctx.name}>`);\r\n }\r\n\r\n const prefix = this._allocPrefix(ctx);\r\n\r\n // write xmlns:prefix=\"uri\" and register it\r\n this._writeAttStr(`${XmlSyntax.Xmlns}:${prefix}`, uri);\r\n this._registerNamespace(ctx, prefix, uri);\r\n\r\n return prefix;\r\n }\r\n\r\n private _closeOpenTagIfNeeded(ctx: InstanceType<typeof XmlBuilder.Context>) {\r\n if (!ctx.closed) {\r\n this._w.write(XmlSyntax.CloseTag);\r\n ctx.closed = true;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"xml.builder.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IXmlBuilder } from \"./xml.interfaces\";\r\n\r\n/**\r\n */\r\nexport interface IXmlWriter {\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter;\r\n /** */\r\n count: number;\r\n /** */\r\n clear(): void;\r\n}\r\n\r\n/** */\r\nclass XmlSyntax {\r\n /** */\r\n public static OpenTag: string = \"<\";\r\n /** */\r\n public static CloseTag: string = \">\";\r\n /** */\r\n public static Slash: string = \"/\";\r\n /** */\r\n public static Question: string = \"?\";\r\n /** */\r\n public static Quote: string = '\"';\r\n /** */\r\n public static Equal: string = \"=\";\r\n /** */\r\n public static Space: string = \" \";\r\n /** */\r\n public static Semicolon: string = \":\";\r\n\r\n /** */\r\n public static Dec = \"<?xml\";\r\n /** */\r\n public static Xml = \"xml\";\r\n /** */\r\n public static Xmlns = \"xmlns\";\r\n /** */\r\n public static Xsi = \"xsi\";\r\n\r\n /** */\r\n public static VersionKeyword = \"version\";\r\n /** */\r\n public static EncodingKeyword = \"encoding\";\r\n /** */\r\n public static StandaloneKeyword = \"standalone\";\r\n}\r\n\r\n/** */\r\nexport enum TokenType {\r\n Declaration,\r\n Tag,\r\n Attribute,\r\n Text,\r\n}\r\n\r\n/** */\r\nexport class XmlBuilder implements IXmlBuilder {\r\n /** */\r\n static Context = class {\r\n /** */\r\n name: string = \"\";\r\n /** */\r\n closed: boolean = false;\r\n /** */\r\n lastToken: TokenType | null = null;\r\n /** */\r\n depth: number;\r\n\r\n // uri -> prefix\r\n ns2prefix: Map<string, string> = new Map();\r\n\r\n // prefix -> uri (for conflict checks)\r\n prefix2ns: Map<string, string> = new Map();\r\n\r\n // optional: default namespace uri\r\n defaultNs: string | null = null;\r\n\r\n /**\r\n *\r\n *@param name\r\n *@param depth\r\n */\r\n constructor(name: string, depth: number) {\r\n this.name = name;\r\n this.depth = depth;\r\n }\r\n };\r\n\r\n /** */\r\n private _w: IXmlWriter;\r\n /** */\r\n private _ctxStack: Array<InstanceType<typeof XmlBuilder.Context>> = [];\r\n /** */\r\n private _d: number = 0;\r\n\r\n public constructor(w: IXmlWriter) {\r\n this._w = w;\r\n }\r\n\r\n /**\r\n *\r\n * @param version\r\n * @param encoding\r\n * @param standalone\r\n * @returns\r\n */\r\n public dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder {\r\n this._w.write(XmlSyntax.Dec);\r\n this._writeAttStr(XmlSyntax.VersionKeyword, version);\r\n if (encoding) {\r\n this._writeAttStr(XmlSyntax.EncodingKeyword, encoding);\r\n }\r\n if (standalone !== undefined) {\r\n this._writeAttStr(XmlSyntax.StandaloneKeyword, standalone ? \"yes\" : \"no\");\r\n }\r\n this._w.write(XmlSyntax.Question, XmlSyntax.CloseTag);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param ns\r\n * @param n\r\n * @param v\r\n * @returns\r\n */\r\n public att(ns: string | null, n: string, v: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (!ctx) {\r\n throw new Error(\"att() without open element\");\r\n }\r\n if (ctx.closed) {\r\n throw new Error(`att() after start tag closed for <${ctx.name}>`);\r\n }\r\n\r\n // explicit namespace declaration: xmlns or xmlns:prefix\r\n if (this._isXmlnsDecl(ns, n)) {\r\n if (n === XmlSyntax.Xmlns) {\r\n // default namespace\r\n ctx.defaultNs = v;\r\n // you can store default as empty prefix if you want\r\n this._registerNamespace(ctx, \"\", v);\r\n this._writeAttStr(XmlSyntax.Xmlns, v);\r\n } else {\r\n if (!ns) {\r\n const prefix = n.slice(6); // \"xmlns:\"\r\n this._registerNamespace(ctx, prefix, v);\r\n this._writeAttStr(n, v);\r\n } else {\r\n this._registerNamespace(ctx, n, v);\r\n this._writeAttStr(`${ns}:${n}`, v);\r\n }\r\n }\r\n ctx.lastToken = TokenType.Attribute;\r\n return this;\r\n }\r\n\r\n // normal attribute\r\n let qn = n;\r\n\r\n if (ns) {\r\n // treat ns as a namespace URI, not a prefix\r\n const p = this._ensurePrefixDeclared(ctx, ns);\r\n qn = `${p}:${n}`;\r\n }\r\n\r\n ctx.lastToken = TokenType.Attribute;\r\n this._writeAttStr(qn, v);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param ns\r\n * @param n\r\n * @returns\r\n */\r\n public ele(ns: string | null, n: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (ctx) {\r\n this._closeOpenTagIfNeeded(ctx);\r\n }\r\n let qns = n;\r\n if (ns) {\r\n const p = this._lookupPrefix(ns) ?? ns;\r\n qns = `${p}:${n}`;\r\n }\r\n this._pushContext(qns, ++this._d);\r\n this._w.write(XmlSyntax.OpenTag, qns);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param txt\r\n * @returns\r\n */\r\n public text(txt: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (!ctx) {\r\n throw new Error(\"text() without open element\");\r\n }\r\n this._closeOpenTagIfNeeded(ctx);\r\n ctx.lastToken = TokenType.Text;\r\n this._w.write(this._escText(txt));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public end(): IXmlBuilder {\r\n const ctx = this._popContext();\r\n if (ctx) {\r\n this._d--;\r\n if (!ctx.closed) {\r\n this._w.write(XmlSyntax.Slash, XmlSyntax.CloseTag);\r\n } else {\r\n this._w.write(XmlSyntax.OpenTag, XmlSyntax.Slash, ctx.name, XmlSyntax.CloseTag);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n protected _pushContext(name: string, depth: number): InstanceType<typeof XmlBuilder.Context> {\r\n const ctx = new XmlBuilder.Context(name, depth);\r\n this._ctxStack.push(ctx);\r\n return ctx;\r\n }\r\n\r\n protected _popContext(): InstanceType<typeof XmlBuilder.Context> | undefined {\r\n return this._ctxStack.pop();\r\n }\r\n\r\n protected _peekContext(): InstanceType<typeof XmlBuilder.Context> | undefined {\r\n return this._ctxStack[this._ctxStack.length - 1];\r\n }\r\n\r\n protected get _contextDepth(): number {\r\n return this._ctxStack.length;\r\n }\r\n\r\n private _writeAttStr(name: string, value: string) {\r\n this._w.write(XmlSyntax.Space, name, XmlSyntax.Equal, XmlSyntax.Quote, this._escAttr(value), XmlSyntax.Quote);\r\n }\r\n\r\n private _lookupPrefix(ns: string): string | undefined {\r\n let i = this._ctxStack.length - 1;\r\n if (i >= 0) {\r\n do {\r\n const ctx = this._ctxStack[i--];\r\n const p = ctx.ns2prefix?.get(ns);\r\n if (p) {\r\n return p;\r\n }\r\n } while (i >= 0);\r\n }\r\n return undefined;\r\n }\r\n\r\n private _escText(s: string): string {\r\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\r\n }\r\n\r\n private _escAttr(s: string): string {\r\n return this._escText(s).replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\r\n }\r\n\r\n private _isXmlnsDecl(ns: string | null, n: string): boolean {\r\n if (ns) {\r\n return ns === XmlSyntax.Xmlns;\r\n }\r\n const l = n.length;\r\n const s = XmlSyntax.Xmlns.length;\r\n if (l >= s) {\r\n return n.startsWith(XmlSyntax.Xmlns) && (n.length == s || n[s] == XmlSyntax.Semicolon);\r\n }\r\n return false;\r\n }\r\n\r\n private _registerNamespace(ctx: InstanceType<typeof XmlBuilder.Context>, prefix: string, uri: string) {\r\n if (prefix === XmlSyntax.Xml || prefix === XmlSyntax.Xmlns) {\r\n throw new Error(`reserved prefix '${prefix}'`);\r\n }\r\n\r\n const existingUri = ctx.prefix2ns.get(prefix);\r\n if (existingUri && existingUri !== uri) {\r\n throw new Error(`prefix '${prefix}' already bound to a different namespace`);\r\n }\r\n\r\n const existingPrefix = ctx.ns2prefix.get(uri);\r\n if (!existingPrefix) {\r\n ctx.ns2prefix.set(uri, prefix);\r\n }\r\n\r\n ctx.prefix2ns.set(prefix, uri);\r\n }\r\n\r\n private _allocPrefix(ctx: InstanceType<typeof XmlBuilder.Context>): string {\r\n let i = 1;\r\n while (true) {\r\n const p = `ns${i++}`;\r\n if (!ctx.prefix2ns.has(p)) {\r\n return p;\r\n }\r\n }\r\n }\r\n\r\n private _ensurePrefixDeclared(ctx: InstanceType<typeof XmlBuilder.Context>, uri: string): string {\r\n const existing = this._lookupPrefix(uri);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n if (ctx.closed) {\r\n throw new Error(`can not declare namespace after start tag closed for <${ctx.name}>`);\r\n }\r\n\r\n const prefix = this._allocPrefix(ctx);\r\n\r\n // write xmlns:prefix=\"uri\" and register it\r\n this._writeAttStr(`${XmlSyntax.Xmlns}:${prefix}`, uri);\r\n this._registerNamespace(ctx, prefix, uri);\r\n\r\n return prefix;\r\n }\r\n\r\n private _closeOpenTagIfNeeded(ctx: InstanceType<typeof XmlBuilder.Context>) {\r\n if (!ctx.closed) {\r\n this._w.write(XmlSyntax.CloseTag);\r\n ctx.closed = true;\r\n }\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import type { IXmlWriter } from "./xml.builder.js";
1
+ import { type IXmlWriter } from "./xml.builder.js";
2
2
  /** */
3
3
  export declare class StringXmlWriter implements IXmlWriter {
4
4
  /** */
@@ -1 +1 @@
1
- {"version":3,"file":"xml.builder.string.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.string.ts"],"names":[],"mappings":"AAEA,MAAM;AACN,MAAM,OAAO,eAAe;IAA5B;QACI,MAAM;QACC,UAAK,GAAG,CAAC,CAAC;QACT,YAAO,GAAa,EAAE,CAAC;IA+BnC,CAAC;IA7BG;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAc;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,+CAA+C;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED;OACG;IACH,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ","sourcesContent":["import type { IXmlWriter } from \"./xml.builder\";\r\n\r\n/** */\r\nexport class StringXmlWriter implements IXmlWriter {\r\n /** */\r\n public count = 0;\r\n private _chunks: string[] = [];\r\n\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter {\r\n if (data.length === 0) {\r\n return this;\r\n }\r\n\r\n // join once per call, keeps DOM out, very fast\r\n const s = data.join(\"\");\r\n this._chunks.push(s);\r\n this.count += s.length;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns\r\n */\r\n toString(): string {\r\n return this._chunks.join(\"\");\r\n }\r\n\r\n /**\r\n */\r\n clear(): void {\r\n this._chunks = [];\r\n this.count = 0;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"xml.builder.string.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.string.ts"],"names":[],"mappings":"AAEA,MAAM;AACN,MAAM,OAAO,eAAe;IAA5B;QACI,MAAM;QACC,UAAK,GAAG,CAAC,CAAC;QACT,YAAO,GAAa,EAAE,CAAC;IA+BnC,CAAC;IA7BG;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAc;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,+CAA+C;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED;OACG;IACH,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ","sourcesContent":["import { type IXmlWriter } from \"./xml.builder\";\r\n\r\n/** */\r\nexport class StringXmlWriter implements IXmlWriter {\r\n /** */\r\n public count = 0;\r\n private _chunks: string[] = [];\r\n\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter {\r\n if (data.length === 0) {\r\n return this;\r\n }\r\n\r\n // join once per call, keeps DOM out, very fast\r\n const s = data.join(\"\");\r\n this._chunks.push(s);\r\n this.count += s.length;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns\r\n */\r\n toString(): string {\r\n return this._chunks.join(\"\");\r\n }\r\n\r\n /**\r\n */\r\n clear(): void {\r\n this._chunks = [];\r\n this.count = 0;\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import type { IXmlSerializerFormatOptions } from "./xml.serializer.format.js";
1
+ import { type IXmlSerializerFormatOptions } from "./xml.serializer.format.js";
2
2
  /** */
3
3
  export interface IQualifiedName {
4
4
  /** */
@@ -1 +1 @@
1
- {"version":3,"file":"xml.interfaces.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.interfaces.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IXmlSerializerFormatOptions } from \"./xml.serializer.format\";\r\n\r\n/** */\r\nexport interface IQualifiedName {\r\n /** */\r\n ns?: string;\r\n /** */\r\n name: string;\r\n}\r\n\r\n/** */\r\nexport interface IXmlBuilder {\r\n dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder;\r\n att(ns: string | null, n: string, v: string): IXmlBuilder;\r\n ele(ns: string | null, n: string): IXmlBuilder;\r\n text(txt: string): IXmlBuilder;\r\n end(): IXmlBuilder;\r\n}\r\n\r\n/**\r\n * @param x\r\n * @returns\r\n */\r\nexport function IsQualifiedName(x: unknown): x is { name: string } {\r\n return typeof (x as any)?.name === \"string\";\r\n}\r\n\r\nexport type XmlName = string | IQualifiedName;\r\n\r\ntype FieldKind = \"attr\" | \"elem\" | \"none\";\r\n\r\n/**\r\n *\r\n */\r\nexport interface IFormatter<T = any> {\r\n toString(value: T): string;\r\n}\r\n\r\nexport type FormatterCtor<T> = new (args: IXmlSerializerFormatOptions) => IFormatter<T>;\r\n\r\ntype FieldMeta = {\r\n kind: FieldKind;\r\n prop: string;\r\n name?: XmlName;\r\n ignore?: boolean;\r\n formatter?: FormatterCtor<any>;\r\n};\r\n\r\nconst XML_CLASS_META = Symbol(\"__xml:meta$__\");\r\nconst XML_CLASS_NAME = Symbol(\"__xml:name$__\");\r\n\r\nfunction AddXmlMeta(target: any, meta: FieldMeta) {\r\n const ctor = target.constructor;\r\n (ctor[XML_CLASS_META] ??= []).push(meta);\r\n}\r\n\r\n/**\r\n * @param name\r\n * @returns\r\n */\r\nexport function XmlName(name: XmlName) {\r\n return (ctor: Function) => {\r\n (ctor as any)[XML_CLASS_NAME] = name;\r\n };\r\n}\r\n\r\n/**\r\n * tell the serializer to ignore the property\r\n * @returns\r\n */\r\nexport function XmlIgnore() {\r\n return (target: any, prop: string) => AddXmlMeta(target, { kind: \"none\", prop, ignore: true });\r\n}\r\n\r\n/**\r\n * tell the serializer to serialize the property as attribute\r\n * @returns\r\n */\r\nexport function XmlAttr(opts?: { name: XmlName; formatter?: FormatterCtor<any> }) {\r\n return (target: any, prop: string) => AddXmlMeta(target, { kind: \"attr\", prop, ...opts });\r\n}\r\n\r\n/**\r\n * tell the serializer to serialize the property as element - this is the default behavior but shoud be\r\n * specified when wanted to update the default name of the classe or if the class is not decorated (without \\@XmlName)\r\n * @returns\r\n */\r\nexport function XmlElem(opts?: { name: XmlName }) {\r\n return (target: any, prop: string) => AddXmlMeta(target, { kind: \"elem\", prop, ...opts });\r\n}\r\n\r\n/**\r\n *\r\n * @param obj\r\n * @returns\r\n */\r\nexport function GetXmlFieldMeta(obj: any): FieldMeta[] {\r\n return (obj?.constructor?.[XML_CLASS_META] ?? []) as FieldMeta[];\r\n}\r\n\r\n/**\r\n *\r\n * @param obj\r\n * @returns\r\n */\r\nexport function GetXmlName(obj: any): XmlName | undefined {\r\n const n = obj?.constructor?.[XML_CLASS_NAME];\r\n return n ? (n as XmlName) : undefined;\r\n}\r\n\r\n/**\r\n *\r\n * @param s\r\n * @returns\r\n */\r\nfunction LooksLikeXmlNcName(s: string): boolean {\r\n // Approximation ASCII de NCName: pas de \":\" et demarre par lettre ou underscore\r\n // Puis lettres/chiffres/underscore/point/tiret.\r\n return /^[A-Za-z_][A-Za-z0-9._-]*$/.test(s);\r\n}\r\n\r\n/**\r\n *\r\n * @param qn\r\n * @returns\r\n */\r\nexport function XmlNameToParts(qn: XmlName): IQualifiedName {\r\n if (IsQualifiedName(qn)) {\r\n return qn;\r\n }\r\n const s = (qn ?? \"\").trim();\r\n if (!s) {\r\n return { name: \"\" };\r\n }\r\n const i = s.indexOf(\":\");\r\n if (i === -1) {\r\n return { name: s };\r\n }\r\n\r\n // Un QName XML ne doit contenir qu un seul \":\".\r\n // Si il y en a plusieurs, on considere que ce n est pas un QName.\r\n if (s.indexOf(\":\", i + 1) !== -1) {\r\n return { name: s };\r\n }\r\n\r\n const prefix = s.slice(0, i);\r\n const local = s.slice(i + 1);\r\n\r\n if (LooksLikeXmlNcName(prefix) && LooksLikeXmlNcName(local)) {\r\n return { ns: prefix, name: local };\r\n }\r\n return { name: s };\r\n}\r\n\r\n/**\r\n *\r\n * @param name\r\n * @param prefix\r\n * @returns\r\n */\r\nexport function ToQualifiedString(name: string, prefix?: string): string {\r\n return prefix ? `${prefix}:${name}` : name;\r\n}\r\n"]}
1
+ {"version":3,"file":"xml.interfaces.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.interfaces.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IXmlSerializerFormatOptions } from \"./xml.serializer.format\";\r\n\r\n/** */\r\nexport interface IQualifiedName {\r\n /** */\r\n ns?: string;\r\n /** */\r\n name: string;\r\n}\r\n\r\n/** */\r\nexport interface IXmlBuilder {\r\n dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder;\r\n att(ns: string | null, n: string, v: string): IXmlBuilder;\r\n ele(ns: string | null, n: string): IXmlBuilder;\r\n text(txt: string): IXmlBuilder;\r\n end(): IXmlBuilder;\r\n}\r\n\r\n/**\r\n * @param x\r\n * @returns\r\n */\r\nexport function IsQualifiedName(x: unknown): x is { name: string } {\r\n return typeof (x as any)?.name === \"string\";\r\n}\r\n\r\nexport type XmlName = string | IQualifiedName;\r\n\r\ntype FieldKind = \"attr\" | \"elem\" | \"none\";\r\n\r\n/**\r\n *\r\n */\r\nexport interface IFormatter<T = any> {\r\n toString(value: T): string;\r\n}\r\n\r\nexport type FormatterCtor<T> = new (args: IXmlSerializerFormatOptions) => IFormatter<T>;\r\n\r\ntype FieldMeta = {\r\n kind: FieldKind;\r\n prop: string;\r\n name?: XmlName;\r\n ignore?: boolean;\r\n formatter?: FormatterCtor<any>;\r\n};\r\n\r\nconst XML_CLASS_META = Symbol(\"__xml:meta$__\");\r\nconst XML_CLASS_NAME = Symbol(\"__xml:name$__\");\r\n\r\nfunction AddXmlMeta(target: any, meta: FieldMeta) {\r\n const ctor = target.constructor;\r\n (ctor[XML_CLASS_META] ??= []).push(meta);\r\n}\r\n\r\n/**\r\n * @param name\r\n * @returns\r\n */\r\nexport function XmlName(name: XmlName) {\r\n return (ctor: Function) => {\r\n (ctor as any)[XML_CLASS_NAME] = name;\r\n };\r\n}\r\n\r\n/**\r\n * tell the serializer to ignore the property\r\n * @returns\r\n */\r\nexport function XmlIgnore() {\r\n return (target: any, prop: string) => AddXmlMeta(target, { kind: \"none\", prop, ignore: true });\r\n}\r\n\r\n/**\r\n * tell the serializer to serialize the property as attribute\r\n * @returns\r\n */\r\nexport function XmlAttr(opts?: { name: XmlName; formatter?: FormatterCtor<any> }) {\r\n return (target: any, prop: string) => AddXmlMeta(target, { kind: \"attr\", prop, ...opts });\r\n}\r\n\r\n/**\r\n * tell the serializer to serialize the property as element - this is the default behavior but shoud be\r\n * specified when wanted to update the default name of the classe or if the class is not decorated (without \\@XmlName)\r\n * @returns\r\n */\r\nexport function XmlElem(opts?: { name: XmlName }) {\r\n return (target: any, prop: string) => AddXmlMeta(target, { kind: \"elem\", prop, ...opts });\r\n}\r\n\r\n/**\r\n *\r\n * @param obj\r\n * @returns\r\n */\r\nexport function GetXmlFieldMeta(obj: any): FieldMeta[] {\r\n return (obj?.constructor?.[XML_CLASS_META] ?? []) as FieldMeta[];\r\n}\r\n\r\n/**\r\n *\r\n * @param obj\r\n * @returns\r\n */\r\nexport function GetXmlName(obj: any): XmlName | undefined {\r\n const n = obj?.constructor?.[XML_CLASS_NAME];\r\n return n ? (n as XmlName) : undefined;\r\n}\r\n\r\n/**\r\n *\r\n * @param s\r\n * @returns\r\n */\r\nfunction LooksLikeXmlNcName(s: string): boolean {\r\n // Approximation ASCII de NCName: pas de \":\" et demarre par lettre ou underscore\r\n // Puis lettres/chiffres/underscore/point/tiret.\r\n return /^[A-Za-z_][A-Za-z0-9._-]*$/.test(s);\r\n}\r\n\r\n/**\r\n *\r\n * @param qn\r\n * @returns\r\n */\r\nexport function XmlNameToParts(qn: XmlName): IQualifiedName {\r\n if (IsQualifiedName(qn)) {\r\n return qn;\r\n }\r\n const s = (qn ?? \"\").trim();\r\n if (!s) {\r\n return { name: \"\" };\r\n }\r\n const i = s.indexOf(\":\");\r\n if (i === -1) {\r\n return { name: s };\r\n }\r\n\r\n // Un QName XML ne doit contenir qu un seul \":\".\r\n // Si il y en a plusieurs, on considere que ce n est pas un QName.\r\n if (s.indexOf(\":\", i + 1) !== -1) {\r\n return { name: s };\r\n }\r\n\r\n const prefix = s.slice(0, i);\r\n const local = s.slice(i + 1);\r\n\r\n if (LooksLikeXmlNcName(prefix) && LooksLikeXmlNcName(local)) {\r\n return { ns: prefix, name: local };\r\n }\r\n return { name: s };\r\n}\r\n\r\n/**\r\n *\r\n * @param name\r\n * @param prefix\r\n * @returns\r\n */\r\nexport function ToQualifiedString(name: string, prefix?: string): string {\r\n return prefix ? `${prefix}:${name}` : name;\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import type { IFormatter } from "./xml.interfaces.js";
1
+ import { type IFormatter } from "./xml.interfaces.js";
2
2
  /**
3
3
  *
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"xml.serializer.format.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.serializer.format.ts"],"names":[],"mappings":"AAkDA,MAAM,CAAC,MAAM,iCAAiC,GAA0C,MAAM,CAAC,MAAM,CAAC;IAClG,GAAG,EAAE,IAAI;IACT,cAAc,EAAE,EAAE;IAClB,iBAAiB,EAAE,IAAI;IACvB,4BAA4B;IAC5B,eAAe,EAAE,KAAK;IACtB,YAAY,EAAE,IAAI;IAClB,gDAAgD;IAChD,8BAA8B;CACjC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iCAAiC,GAA0C,MAAM,CAAC,MAAM,CAAC;IAClG,MAAM,EAAE,iCAAiC;CAC5C,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAkC;IAUnE,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,iCAAiC,CAAC,GAAG,CAAC;IAE/D,OAAO;QACH,GAAG;QACH,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,iCAAiC,CAAC,cAAe;QACzF,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,IAAI,iCAAiC,CAAC,iBAAkB;QAClG,aAAa,EAAE,IAAI,EAAE,aAAa;QAClC,eAAe,EAAE,IAAI,EAAE,eAAe,IAAI,iCAAiC,CAAC,eAAgB;QAC5F,YAAY,EAAE,IAAI,EAAE,YAAY,IAAI,iCAAiC,CAAC,YAAa;QACnF,aAAa,EAAE,IAAI,EAAE,aAAa,IAAI,GAAG;QACzC,eAAe,EAAE,IAAI,EAAE,eAAe;KACzC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAkC;IACnE,OAAO;QACH,MAAM,EAAE,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC;KAC7C,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,eAAe;IAGxB;;;OAGG;IACH,YAA0B,CAA8B;QAA9B,MAAC,GAAD,CAAC,CAA6B;QACpD,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,MAAO,CAAC;QAEpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;IAED;;;;OAIG;IAEI,QAAQ,CAAC,CAAS;QACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC;QAErD,uBAAuB;QACvB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;QACzB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAElC,oBAAoB;QACpB,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnB,CAAC,GAAG,CAAC,CAAC;QACV,CAAC;QAED,iDAAiD;QACjD,IAAI,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;YAC/C,CAAC,GAAG,CAAC,CAAC;QACV,CAAC;QAED,yBAAyB;QACzB,IAAI,QAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACnC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACJ,gCAAgC;YAChC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;QACnF,CAAC;QAED,sEAAsE;QACtE,wEAAwE;QACxE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,gEAAgE;YAChE,8DAA8D;QAClE,CAAC;QAED,8BAA8B;QAC9B,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE5B,IAAI,iBAAiB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACxD,gDAAgD;YAChD,CAAC,GAAG,CAAC;iBACA,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;iBACjC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;iBACpB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,CAAC;QAED,yEAAyE;QACzE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,CAAC,CAAC;IACb,CAAC;IAEO,SAAS,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW;QACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC;QACf,CAAC;QACD,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;CACJ","sourcesContent":["import type { IFormatter } from \"./xml.interfaces\";\r\n\r\n/**\r\n *\r\n */\r\nexport interface IXmlSerializerNumberOptions {\r\n /**\r\n *\r\n */\r\n eps: number;\r\n /**\r\n *\r\n */\r\n maxDecimalsCap?: number; // default 15\r\n /**\r\n *\r\n */\r\n trimTrailingZeros?: boolean; // default true\r\n /**\r\n *\r\n */\r\n fixedDecimals?: number; // optional, overrides trim\r\n /**\r\n *\r\n */\r\n allowScientific?: boolean; // default false\r\n /**\r\n *\r\n */\r\n snapNearZero?: boolean; // default true\r\n /**\r\n *\r\n */\r\n zeroThreshold?: number; // default eps\r\n /**\r\n *\r\n */\r\n perAttributeEps?: Record<string, number>;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport interface IXmlSerializerFormatOptions {\r\n /**\r\n *\r\n */\r\n number?: IXmlSerializerNumberOptions;\r\n}\r\n\r\nexport const DefaultXmlSerializerNumberOptions: Readonly<IXmlSerializerNumberOptions> = Object.freeze({\r\n eps: 1e-6,\r\n maxDecimalsCap: 15,\r\n trimTrailingZeros: true,\r\n // fixedDecimals: undefined,\r\n allowScientific: false,\r\n snapNearZero: true,\r\n // zeroThreshold defaults to eps if not provided\r\n // perAttributeEps: undefined,\r\n});\r\n\r\nexport const DefaultXmlSerializerFormatOptions: Readonly<IXmlSerializerFormatOptions> = Object.freeze({\r\n number: DefaultXmlSerializerNumberOptions,\r\n});\r\n\r\n/**\r\n *@param opts\r\n *@returns\r\n */\r\nexport function ResolveNumberOptions(opts?: IXmlSerializerNumberOptions): Required<\r\n Omit<IXmlSerializerNumberOptions, \"perAttributeEps\" | \"fixedDecimals\" | \"maxDecimalsCap\" | \"trimTrailingZeros\" | \"allowScientific\" | \"snapNearZero\" | \"zeroThreshold\">\r\n> &\r\n Pick<IXmlSerializerNumberOptions, \"perAttributeEps\" | \"fixedDecimals\"> & {\r\n maxDecimalsCap: number;\r\n trimTrailingZeros: boolean;\r\n allowScientific: boolean;\r\n snapNearZero: boolean;\r\n zeroThreshold: number;\r\n } {\r\n const eps = opts?.eps ?? DefaultXmlSerializerNumberOptions.eps;\r\n\r\n return {\r\n eps,\r\n maxDecimalsCap: opts?.maxDecimalsCap ?? DefaultXmlSerializerNumberOptions.maxDecimalsCap!,\r\n trimTrailingZeros: opts?.trimTrailingZeros ?? DefaultXmlSerializerNumberOptions.trimTrailingZeros!,\r\n fixedDecimals: opts?.fixedDecimals,\r\n allowScientific: opts?.allowScientific ?? DefaultXmlSerializerNumberOptions.allowScientific!,\r\n snapNearZero: opts?.snapNearZero ?? DefaultXmlSerializerNumberOptions.snapNearZero!,\r\n zeroThreshold: opts?.zeroThreshold ?? eps,\r\n perAttributeEps: opts?.perAttributeEps,\r\n };\r\n}\r\n\r\n/**\r\n *@param opts\r\n *@returns\r\n */\r\nexport function ResolveFormatOptions(opts?: IXmlSerializerFormatOptions) {\r\n return {\r\n number: ResolveNumberOptions(opts?.number),\r\n };\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class NumberFormatter implements IFormatter<number> {\r\n private _o: IXmlSerializerNumberOptions;\r\n\r\n /**\r\n *\r\n * @param o\r\n */\r\n public constructor(public o: IXmlSerializerFormatOptions) {\r\n this._o = o.number!;\r\n\r\n if (!Number.isFinite(this._o.eps) || this._o.eps <= 0) {\r\n throw new Error(\"opts.eps must be a finite, positive number\");\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param x\r\n * @returns\r\n */\r\n\r\n public toString(x: number): string {\r\n if (!Number.isFinite(x)) {\r\n throw new Error(`Cannot format non-finite number: ${x}`);\r\n }\r\n\r\n const opts = this._o;\r\n const maxDecimalsCap = this._clampInt(opts.maxDecimalsCap ?? 15, 0, 20);\r\n const trimTrailingZeros = opts.trimTrailingZeros ?? true;\r\n const snapNearZero = opts.snapNearZero ?? true;\r\n const zeroThreshold = opts.zeroThreshold ?? opts.eps;\r\n\r\n // Quantize to eps grid\r\n const inv = 1 / opts.eps;\r\n let q = Math.round(x * inv) / inv;\r\n\r\n // Normalize -0 to 0\r\n if (Object.is(q, -0)) {\r\n q = 0;\r\n }\r\n\r\n // Snap tiny values to 0 (helps size + stability)\r\n if (snapNearZero && Math.abs(q) <= zeroThreshold) {\r\n q = 0;\r\n }\r\n\r\n // Choose decimals policy\r\n let decimals: number;\r\n if (opts.fixedDecimals !== undefined) {\r\n decimals = this._clampInt(opts.fixedDecimals, 0, maxDecimalsCap);\r\n } else {\r\n // decimals needed for eps steps\r\n decimals = this._clampInt(Math.ceil(-Math.log10(opts.eps)), 0, maxDecimalsCap);\r\n }\r\n\r\n // Note: this implementation intentionally avoids scientific notation.\r\n // If allowScientific=true, you may want a different path (toPrecision).\r\n if (opts.allowScientific) {\r\n // Still avoid scientific here; keep deterministic fixed output.\r\n // If you really want scientific, implement a separate branch.\r\n }\r\n\r\n // Fast path when decimals = 0\r\n if (decimals === 0) {\r\n return String(Math.trunc(q));\r\n }\r\n\r\n // Start fixed, then optionally trim\r\n let s = q.toFixed(decimals);\r\n\r\n if (trimTrailingZeros && opts.fixedDecimals === undefined) {\r\n // Trim trailing zeros and optional trailing dot\r\n s = s\r\n .replace(/(\\.\\d*?[1-9])0+$/, \"$1\")\r\n .replace(/\\.0+$/, \"\")\r\n .replace(/\\.$/, \"\");\r\n }\r\n\r\n // Safety: ensure no scientific notation (should not happen with toFixed)\r\n if (/[eE]/.test(s)) {\r\n throw new Error(`Scientific notation not allowed in XML output: ${s}`);\r\n }\r\n\r\n return s;\r\n }\r\n\r\n private _clampInt(n: number, min: number, max: number): number {\r\n if (!Number.isFinite(n)) {\r\n return min;\r\n }\r\n n = Math.trunc(n);\r\n return Math.max(min, Math.min(max, n));\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"xml.serializer.format.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.serializer.format.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IFormatter } from \"./xml.interfaces\";\r\n\r\n/**\r\n *\r\n */\r\nexport interface IXmlSerializerNumberOptions {\r\n /**\r\n *\r\n */\r\n eps: number;\r\n /**\r\n *\r\n */\r\n maxDecimalsCap?: number; // default 15\r\n /**\r\n *\r\n */\r\n trimTrailingZeros?: boolean; // default true\r\n /**\r\n *\r\n */\r\n fixedDecimals?: number; // optional, overrides trim\r\n /**\r\n *\r\n */\r\n allowScientific?: boolean; // default false\r\n /**\r\n *\r\n */\r\n snapNearZero?: boolean; // default true\r\n /**\r\n *\r\n */\r\n zeroThreshold?: number; // default eps\r\n /**\r\n *\r\n */\r\n perAttributeEps?: Record<string, number>;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport interface IXmlSerializerFormatOptions {\r\n /**\r\n *\r\n */\r\n number?: IXmlSerializerNumberOptions;\r\n}\r\n\r\nexport const DefaultXmlSerializerNumberOptions: Readonly<IXmlSerializerNumberOptions> = Object.freeze({\r\n eps: 1e-6,\r\n maxDecimalsCap: 15,\r\n trimTrailingZeros: true,\r\n // fixedDecimals: undefined,\r\n allowScientific: false,\r\n snapNearZero: true,\r\n // zeroThreshold defaults to eps if not provided\r\n // perAttributeEps: undefined,\r\n});\r\n\r\nexport const DefaultXmlSerializerFormatOptions: Readonly<IXmlSerializerFormatOptions> = Object.freeze({\r\n number: DefaultXmlSerializerNumberOptions,\r\n});\r\n\r\n/**\r\n *@param opts\r\n *@returns\r\n */\r\nexport function ResolveNumberOptions(opts?: IXmlSerializerNumberOptions): Required<\r\n Omit<IXmlSerializerNumberOptions, \"perAttributeEps\" | \"fixedDecimals\" | \"maxDecimalsCap\" | \"trimTrailingZeros\" | \"allowScientific\" | \"snapNearZero\" | \"zeroThreshold\">\r\n> &\r\n Pick<IXmlSerializerNumberOptions, \"perAttributeEps\" | \"fixedDecimals\"> & {\r\n maxDecimalsCap: number;\r\n trimTrailingZeros: boolean;\r\n allowScientific: boolean;\r\n snapNearZero: boolean;\r\n zeroThreshold: number;\r\n } {\r\n const eps = opts?.eps ?? DefaultXmlSerializerNumberOptions.eps;\r\n\r\n return {\r\n eps,\r\n maxDecimalsCap: opts?.maxDecimalsCap ?? DefaultXmlSerializerNumberOptions.maxDecimalsCap!,\r\n trimTrailingZeros: opts?.trimTrailingZeros ?? DefaultXmlSerializerNumberOptions.trimTrailingZeros!,\r\n fixedDecimals: opts?.fixedDecimals,\r\n allowScientific: opts?.allowScientific ?? DefaultXmlSerializerNumberOptions.allowScientific!,\r\n snapNearZero: opts?.snapNearZero ?? DefaultXmlSerializerNumberOptions.snapNearZero!,\r\n zeroThreshold: opts?.zeroThreshold ?? eps,\r\n perAttributeEps: opts?.perAttributeEps,\r\n };\r\n}\r\n\r\n/**\r\n *@param opts\r\n *@returns\r\n */\r\nexport function ResolveFormatOptions(opts?: IXmlSerializerFormatOptions) {\r\n return {\r\n number: ResolveNumberOptions(opts?.number),\r\n };\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class NumberFormatter implements IFormatter<number> {\r\n private _o: IXmlSerializerNumberOptions;\r\n\r\n /**\r\n *\r\n * @param o\r\n */\r\n public constructor(public o: IXmlSerializerFormatOptions) {\r\n this._o = o.number!;\r\n\r\n if (!Number.isFinite(this._o.eps) || this._o.eps <= 0) {\r\n throw new Error(\"opts.eps must be a finite, positive number\");\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param x\r\n * @returns\r\n */\r\n\r\n public toString(x: number): string {\r\n if (!Number.isFinite(x)) {\r\n throw new Error(`Cannot format non-finite number: ${x}`);\r\n }\r\n\r\n const opts = this._o;\r\n const maxDecimalsCap = this._clampInt(opts.maxDecimalsCap ?? 15, 0, 20);\r\n const trimTrailingZeros = opts.trimTrailingZeros ?? true;\r\n const snapNearZero = opts.snapNearZero ?? true;\r\n const zeroThreshold = opts.zeroThreshold ?? opts.eps;\r\n\r\n // Quantize to eps grid\r\n const inv = 1 / opts.eps;\r\n let q = Math.round(x * inv) / inv;\r\n\r\n // Normalize -0 to 0\r\n if (Object.is(q, -0)) {\r\n q = 0;\r\n }\r\n\r\n // Snap tiny values to 0 (helps size + stability)\r\n if (snapNearZero && Math.abs(q) <= zeroThreshold) {\r\n q = 0;\r\n }\r\n\r\n // Choose decimals policy\r\n let decimals: number;\r\n if (opts.fixedDecimals !== undefined) {\r\n decimals = this._clampInt(opts.fixedDecimals, 0, maxDecimalsCap);\r\n } else {\r\n // decimals needed for eps steps\r\n decimals = this._clampInt(Math.ceil(-Math.log10(opts.eps)), 0, maxDecimalsCap);\r\n }\r\n\r\n // Note: this implementation intentionally avoids scientific notation.\r\n // If allowScientific=true, you may want a different path (toPrecision).\r\n if (opts.allowScientific) {\r\n // Still avoid scientific here; keep deterministic fixed output.\r\n // If you really want scientific, implement a separate branch.\r\n }\r\n\r\n // Fast path when decimals = 0\r\n if (decimals === 0) {\r\n return String(Math.trunc(q));\r\n }\r\n\r\n // Start fixed, then optionally trim\r\n let s = q.toFixed(decimals);\r\n\r\n if (trimTrailingZeros && opts.fixedDecimals === undefined) {\r\n // Trim trailing zeros and optional trailing dot\r\n s = s\r\n .replace(/(\\.\\d*?[1-9])0+$/, \"$1\")\r\n .replace(/\\.0+$/, \"\")\r\n .replace(/\\.$/, \"\");\r\n }\r\n\r\n // Safety: ensure no scientific notation (should not happen with toFixed)\r\n if (/[eE]/.test(s)) {\r\n throw new Error(`Scientific notation not allowed in XML output: ${s}`);\r\n }\r\n\r\n return s;\r\n }\r\n\r\n private _clampInt(n: number, min: number, max: number): number {\r\n if (!Number.isFinite(n)) {\r\n return min;\r\n }\r\n n = Math.trunc(n);\r\n return Math.max(min, Math.min(max, n));\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import type { Skeleton } from "@onerjs/core/Bones/skeleton.js";
1
+ import { type Skeleton } from "@onerjs/core/Bones/skeleton.js";
2
2
  export declare class BVHExporter {
3
3
  static Export(skeleton: Skeleton, animationNames?: string[], frameRate?: number): string;
4
4
  private static _BuildBoneHierarchy;
@@ -1 +1 @@
1
- {"version":3,"file":"bvhSerializer.js","sourceRoot":"","sources":["../../../../dev/serializers/src/BVH/bvhSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Skeleton } from \"core/Bones/skeleton\";\nimport type { Bone } from \"core/Bones/bone\";\nimport type { IAnimationKey } from \"core/Animations/animationKey\";\nimport { AnimationRange } from \"core/Animations/animationRange\";\nimport { Vector3, Quaternion, Matrix } from \"core/Maths/math.vector\";\nimport { Tools } from \"core/Misc/tools\";\nimport { Epsilon } from \"core/Maths/math.constants\";\nimport type { Nullable } from \"core/types\";\n\ninterface IBVHBoneData {\n bone: Bone;\n children: IBVHBoneData[];\n hasPositionChannels: boolean;\n hasRotationChannels: boolean;\n positionKeys: IAnimationKey[];\n rotationKeys: IAnimationKey[];\n}\n\nexport class BVHExporter {\n public static Export(skeleton: Skeleton, animationNames: string[] = [], frameRate?: number): string {\n // Validate skeleton\n if (!skeleton || skeleton.bones.length === 0) {\n throw new Error(\"Invalid or empty skeleton provided\");\n }\n\n // If no animation names provided, use all available animations\n let animationsToExport = animationNames;\n if (!animationNames || animationNames.length === 0) {\n animationsToExport = skeleton.animations.map((anim) => anim.name);\n }\n\n // Calculate overall animation range from all specified animations\n let overallRange: Nullable<AnimationRange> = null;\n for (const animName of animationsToExport) {\n const range = skeleton.getAnimationRange(animName);\n if (range) {\n overallRange = overallRange ? new AnimationRange(\"animation-range\", Math.min(overallRange.from, range.from), Math.max(overallRange.to, range.to)) : range;\n }\n }\n\n if (!overallRange) {\n // If no animation range found, try to get from any animation\n if (skeleton.animations.length > 0) {\n overallRange = skeleton.getAnimationRange(skeleton.animations[0].name);\n }\n\n if (!overallRange) {\n throw new Error(\"No animation range found in skeleton\");\n }\n }\n\n // Calculate frame rate from animation data if not provided\n const actualFrameRate = frameRate || 1 / (skeleton.animations[0]?.framePerSecond || 30);\n\n // Build bone hierarchy and collect animation data\n const boneHierarchy = this._BuildBoneHierarchy(skeleton, animationsToExport);\n\n // Calculate frame count from actual animation keyframes\n let frameCount = 0;\n for (const boneData of boneHierarchy) {\n if (boneData.positionKeys.length > 0) {\n frameCount = Math.max(frameCount, boneData.positionKeys.length);\n }\n if (boneData.rotationKeys.length > 0) {\n frameCount = Math.max(frameCount, boneData.rotationKeys.length);\n }\n }\n\n // Fallback: if no keyframes found, calculate from time range\n if (frameCount === 0) {\n frameCount = Math.floor((overallRange.to - overallRange.from) / actualFrameRate) + 1;\n }\n\n let exportString = \"\";\n exportString += `HIERARCHY\\n`;\n\n // Export hierarchy recursively\n exportString += this._ExportHierarchy(boneHierarchy, 0);\n\n // Export motion data\n exportString += `MOTION\\n`;\n exportString += `Frames: ${frameCount}\\n`;\n exportString += `Frame Time: ${actualFrameRate.toFixed(6)}\\n`;\n\n // Export frame data\n exportString += this._ExportMotionData(boneHierarchy, frameCount, 0, animationsToExport);\n\n return exportString;\n }\n\n private static _BuildBoneHierarchy(skeleton: Skeleton, animationNames: string[]): IBVHBoneData[] {\n const boneMap = new Map<Bone, IBVHBoneData>();\n const rootBones: IBVHBoneData[] = [];\n\n // First pass: create bone data objects\n for (const bone of skeleton.bones) {\n const boneData: IBVHBoneData = {\n bone,\n children: [],\n hasPositionChannels: false,\n hasRotationChannels: false,\n positionKeys: [],\n rotationKeys: [],\n };\n boneMap.set(bone, boneData);\n }\n\n // Second pass: build hierarchy and collect animation data\n for (const bone of skeleton.bones) {\n const boneData = boneMap.get(bone)!;\n\n // Check if bone has animations from the specified animation names\n if (bone.animations.length > 0) {\n for (const animation of bone.animations) {\n // Only include animations that are in the specified animation names\n if (animationNames.includes(animation.name)) {\n if (animation.targetProperty === \"position\") {\n boneData.hasPositionChannels = true;\n boneData.positionKeys.push(...animation.getKeys());\n } else if (animation.targetProperty === \"rotationQuaternion\") {\n boneData.hasRotationChannels = true;\n boneData.rotationKeys.push(...animation.getKeys());\n }\n }\n }\n }\n\n // Build hierarchy\n if (bone.getParent()) {\n const parentData = boneMap.get(bone.getParent()!);\n if (parentData) {\n parentData.children.push(boneData);\n }\n } else {\n rootBones.push(boneData);\n }\n }\n\n return rootBones;\n }\n\n private static _ExportHierarchy(boneData: IBVHBoneData[], indentLevel: number): string {\n let result = \"\";\n const indent = \" \".repeat(indentLevel);\n\n for (const data of boneData) {\n const bone = data.bone;\n const isEndSite = this._IsEndSite(data);\n\n if (isEndSite) {\n result += `${indent}End Site\\n`;\n result += `${indent}{\\n`;\n const offset = this._GetBoneOffset(bone);\n result += `${indent} OFFSET ${offset.x.toFixed(6)} ${offset.y.toFixed(6)} ${offset.z.toFixed(6)}\\n`;\n result += `${indent}}\\n`;\n } else {\n result += `${indentLevel === 0 ? \"ROOT\" : `${indent}JOINT`} ${bone.name}\\n`;\n result += `${indent}{\\n`;\n const offset = this._GetBoneOffset(bone);\n result += `${indent} OFFSET ${offset.x.toFixed(6)} ${offset.y.toFixed(6)} ${offset.z.toFixed(6)}\\n`;\n\n // Determine channels\n const channels: string[] = [];\n if (data.hasPositionChannels) {\n channels.push(\"Xposition\", \"Yposition\", \"Zposition\");\n }\n if (data.hasRotationChannels) {\n // BVH typically uses ZXY rotation order\n channels.push(\"Zrotation\", \"Xrotation\", \"Yrotation\");\n }\n\n if (channels.length > 0) {\n result += `${indent} CHANNELS ${channels.length} ${channels.join(\" \")}\\n`;\n }\n\n // Export children recursively\n if (data.children.length > 0) {\n result += this._ExportHierarchy(data.children, indentLevel + 1);\n }\n\n result += `${indent}}\\n`;\n }\n }\n\n return result;\n }\n\n private static _IsEndSite(data: IBVHBoneData): boolean {\n // An end site is a bone with no children (regardless of animation channels)\n return data.children.length === 0;\n }\n\n private static _GetBoneOffset(bone: Bone): Vector3 {\n // Use the bone's rest matrix or local matrix for correct offset\n try {\n if (!bone.getParent()) {\n // Root bone - use rest matrix translation\n return bone.getRestMatrix().getTranslation();\n }\n\n // For child bones, use local matrix translation\n const localMatrix = bone.getLocalMatrix();\n return localMatrix.getTranslation();\n } catch (error) {\n // Fallback to zero offset if matrix operations fail\n return Vector3.Zero();\n }\n }\n\n private static _ExportMotionData(boneData: IBVHBoneData[], frameCount: number, startFrame: number, animationNames: string[]): string {\n let result = \"\";\n\n for (let frame = 0; frame < frameCount; frame++) {\n const frameValues: number[] = [];\n\n // Collect values for all bones in hierarchy order\n this._CollectFrameValues(boneData, frame + startFrame, frameValues, animationNames);\n\n result += frameValues.map((v) => v.toFixed(6)).join(\" \") + \"\\n\";\n }\n\n return result;\n }\n\n private static _CollectFrameValues(boneData: IBVHBoneData[], frameIndex: number, values: number[], animationNames: string[]): void {\n for (const data of boneData) {\n // Skip end sites\n if (this._IsEndSite(data)) {\n continue;\n }\n\n // Add position values if available\n if (data.hasPositionChannels) {\n const position = this._GetPositionAtFrameIndex(data.positionKeys, frameIndex);\n values.push(position.x, position.y, position.z);\n }\n\n // Add rotation values if available\n if (data.hasRotationChannels) {\n const rotation = this._GetRotationAtFrameIndex(data.rotationKeys, frameIndex);\n // Convert to Euler angles in ZXY order\n const euler = this._QuaternionToEuler(rotation);\n values.push(euler.z, euler.x, euler.y);\n }\n\n // Process children recursively\n if (data.children.length > 0) {\n this._CollectFrameValues(data.children, frameIndex, values, animationNames);\n }\n }\n }\n\n private static _GetPositionAtFrameIndex(keys: IAnimationKey[], frameIndex: number): Vector3 {\n if (keys.length === 0) {\n return Vector3.Zero();\n }\n\n // Clamp frame index to valid range\n const clampedIndex = Math.max(0, Math.min(frameIndex, keys.length - 1));\n return keys[clampedIndex].value.clone();\n }\n\n private static _GetRotationAtFrameIndex(keys: IAnimationKey[], frameIndex: number): Quaternion {\n if (keys.length === 0) {\n return Quaternion.Identity();\n }\n\n // Clamp frame index to valid range\n const clampedIndex = Math.max(0, Math.min(frameIndex, keys.length - 1));\n return keys[clampedIndex].value.clone();\n }\n\n private static _QuaternionToEuler(quaternion: Quaternion): Vector3 {\n // Convert quaternion to Euler angles in ZXY order for BVH\n const matrix = new Matrix();\n quaternion.toRotationMatrix(matrix);\n\n const m = matrix.m;\n let x, y, z;\n\n // ZXY rotation order extraction\n const sy = Math.sqrt(m[0] * m[0] + m[1] * m[1]);\n\n if (sy > Epsilon) {\n x = Math.atan2(m[6], m[10]);\n y = Math.atan2(-m[2], sy);\n z = Math.atan2(m[1], m[0]);\n } else {\n x = Math.atan2(-m[9], m[5]);\n y = Math.atan2(-m[2], sy);\n z = 0;\n }\n\n return new Vector3(Tools.ToDegrees(x), Tools.ToDegrees(y), Tools.ToDegrees(z));\n }\n}\n"]}
1
+ {"version":3,"file":"bvhSerializer.js","sourceRoot":"","sources":["../../../../dev/serializers/src/BVH/bvhSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Skeleton } from \"core/Bones/skeleton\";\nimport { type Bone } from \"core/Bones/bone\";\nimport { type IAnimationKey } from \"core/Animations/animationKey\";\nimport { AnimationRange } from \"core/Animations/animationRange\";\nimport { Vector3, Quaternion, Matrix } from \"core/Maths/math.vector\";\nimport { Tools } from \"core/Misc/tools\";\nimport { Epsilon } from \"core/Maths/math.constants\";\nimport { type Nullable } from \"core/types\";\n\ninterface IBVHBoneData {\n bone: Bone;\n children: IBVHBoneData[];\n hasPositionChannels: boolean;\n hasRotationChannels: boolean;\n positionKeys: IAnimationKey[];\n rotationKeys: IAnimationKey[];\n}\n\nexport class BVHExporter {\n public static Export(skeleton: Skeleton, animationNames: string[] = [], frameRate?: number): string {\n // Validate skeleton\n if (!skeleton || skeleton.bones.length === 0) {\n throw new Error(\"Invalid or empty skeleton provided\");\n }\n\n // If no animation names provided, use all available animations\n let animationsToExport = animationNames;\n if (!animationNames || animationNames.length === 0) {\n animationsToExport = skeleton.animations.map((anim) => anim.name);\n }\n\n // Calculate overall animation range from all specified animations\n let overallRange: Nullable<AnimationRange> = null;\n for (const animName of animationsToExport) {\n const range = skeleton.getAnimationRange(animName);\n if (range) {\n overallRange = overallRange ? new AnimationRange(\"animation-range\", Math.min(overallRange.from, range.from), Math.max(overallRange.to, range.to)) : range;\n }\n }\n\n if (!overallRange) {\n // If no animation range found, try to get from any animation\n if (skeleton.animations.length > 0) {\n overallRange = skeleton.getAnimationRange(skeleton.animations[0].name);\n }\n\n if (!overallRange) {\n throw new Error(\"No animation range found in skeleton\");\n }\n }\n\n // Calculate frame rate from animation data if not provided\n const actualFrameRate = frameRate || 1 / (skeleton.animations[0]?.framePerSecond || 30);\n\n // Build bone hierarchy and collect animation data\n const boneHierarchy = this._BuildBoneHierarchy(skeleton, animationsToExport);\n\n // Calculate frame count from actual animation keyframes\n let frameCount = 0;\n for (const boneData of boneHierarchy) {\n if (boneData.positionKeys.length > 0) {\n frameCount = Math.max(frameCount, boneData.positionKeys.length);\n }\n if (boneData.rotationKeys.length > 0) {\n frameCount = Math.max(frameCount, boneData.rotationKeys.length);\n }\n }\n\n // Fallback: if no keyframes found, calculate from time range\n if (frameCount === 0) {\n frameCount = Math.floor((overallRange.to - overallRange.from) / actualFrameRate) + 1;\n }\n\n let exportString = \"\";\n exportString += `HIERARCHY\\n`;\n\n // Export hierarchy recursively\n exportString += this._ExportHierarchy(boneHierarchy, 0);\n\n // Export motion data\n exportString += `MOTION\\n`;\n exportString += `Frames: ${frameCount}\\n`;\n exportString += `Frame Time: ${actualFrameRate.toFixed(6)}\\n`;\n\n // Export frame data\n exportString += this._ExportMotionData(boneHierarchy, frameCount, 0, animationsToExport);\n\n return exportString;\n }\n\n private static _BuildBoneHierarchy(skeleton: Skeleton, animationNames: string[]): IBVHBoneData[] {\n const boneMap = new Map<Bone, IBVHBoneData>();\n const rootBones: IBVHBoneData[] = [];\n\n // First pass: create bone data objects\n for (const bone of skeleton.bones) {\n const boneData: IBVHBoneData = {\n bone,\n children: [],\n hasPositionChannels: false,\n hasRotationChannels: false,\n positionKeys: [],\n rotationKeys: [],\n };\n boneMap.set(bone, boneData);\n }\n\n // Second pass: build hierarchy and collect animation data\n for (const bone of skeleton.bones) {\n const boneData = boneMap.get(bone)!;\n\n // Check if bone has animations from the specified animation names\n if (bone.animations.length > 0) {\n for (const animation of bone.animations) {\n // Only include animations that are in the specified animation names\n if (animationNames.includes(animation.name)) {\n if (animation.targetProperty === \"position\") {\n boneData.hasPositionChannels = true;\n boneData.positionKeys.push(...animation.getKeys());\n } else if (animation.targetProperty === \"rotationQuaternion\") {\n boneData.hasRotationChannels = true;\n boneData.rotationKeys.push(...animation.getKeys());\n }\n }\n }\n }\n\n // Build hierarchy\n if (bone.getParent()) {\n const parentData = boneMap.get(bone.getParent()!);\n if (parentData) {\n parentData.children.push(boneData);\n }\n } else {\n rootBones.push(boneData);\n }\n }\n\n return rootBones;\n }\n\n private static _ExportHierarchy(boneData: IBVHBoneData[], indentLevel: number): string {\n let result = \"\";\n const indent = \" \".repeat(indentLevel);\n\n for (const data of boneData) {\n const bone = data.bone;\n const isEndSite = this._IsEndSite(data);\n\n if (isEndSite) {\n result += `${indent}End Site\\n`;\n result += `${indent}{\\n`;\n const offset = this._GetBoneOffset(bone);\n result += `${indent} OFFSET ${offset.x.toFixed(6)} ${offset.y.toFixed(6)} ${offset.z.toFixed(6)}\\n`;\n result += `${indent}}\\n`;\n } else {\n result += `${indentLevel === 0 ? \"ROOT\" : `${indent}JOINT`} ${bone.name}\\n`;\n result += `${indent}{\\n`;\n const offset = this._GetBoneOffset(bone);\n result += `${indent} OFFSET ${offset.x.toFixed(6)} ${offset.y.toFixed(6)} ${offset.z.toFixed(6)}\\n`;\n\n // Determine channels\n const channels: string[] = [];\n if (data.hasPositionChannels) {\n channels.push(\"Xposition\", \"Yposition\", \"Zposition\");\n }\n if (data.hasRotationChannels) {\n // BVH typically uses ZXY rotation order\n channels.push(\"Zrotation\", \"Xrotation\", \"Yrotation\");\n }\n\n if (channels.length > 0) {\n result += `${indent} CHANNELS ${channels.length} ${channels.join(\" \")}\\n`;\n }\n\n // Export children recursively\n if (data.children.length > 0) {\n result += this._ExportHierarchy(data.children, indentLevel + 1);\n }\n\n result += `${indent}}\\n`;\n }\n }\n\n return result;\n }\n\n private static _IsEndSite(data: IBVHBoneData): boolean {\n // An end site is a bone with no children (regardless of animation channels)\n return data.children.length === 0;\n }\n\n private static _GetBoneOffset(bone: Bone): Vector3 {\n // Use the bone's rest matrix or local matrix for correct offset\n try {\n if (!bone.getParent()) {\n // Root bone - use rest matrix translation\n return bone.getRestMatrix().getTranslation();\n }\n\n // For child bones, use local matrix translation\n const localMatrix = bone.getLocalMatrix();\n return localMatrix.getTranslation();\n } catch (error) {\n // Fallback to zero offset if matrix operations fail\n return Vector3.Zero();\n }\n }\n\n private static _ExportMotionData(boneData: IBVHBoneData[], frameCount: number, startFrame: number, animationNames: string[]): string {\n let result = \"\";\n\n for (let frame = 0; frame < frameCount; frame++) {\n const frameValues: number[] = [];\n\n // Collect values for all bones in hierarchy order\n this._CollectFrameValues(boneData, frame + startFrame, frameValues, animationNames);\n\n result += frameValues.map((v) => v.toFixed(6)).join(\" \") + \"\\n\";\n }\n\n return result;\n }\n\n private static _CollectFrameValues(boneData: IBVHBoneData[], frameIndex: number, values: number[], animationNames: string[]): void {\n for (const data of boneData) {\n // Skip end sites\n if (this._IsEndSite(data)) {\n continue;\n }\n\n // Add position values if available\n if (data.hasPositionChannels) {\n const position = this._GetPositionAtFrameIndex(data.positionKeys, frameIndex);\n values.push(position.x, position.y, position.z);\n }\n\n // Add rotation values if available\n if (data.hasRotationChannels) {\n const rotation = this._GetRotationAtFrameIndex(data.rotationKeys, frameIndex);\n // Convert to Euler angles in ZXY order\n const euler = this._QuaternionToEuler(rotation);\n values.push(euler.z, euler.x, euler.y);\n }\n\n // Process children recursively\n if (data.children.length > 0) {\n this._CollectFrameValues(data.children, frameIndex, values, animationNames);\n }\n }\n }\n\n private static _GetPositionAtFrameIndex(keys: IAnimationKey[], frameIndex: number): Vector3 {\n if (keys.length === 0) {\n return Vector3.Zero();\n }\n\n // Clamp frame index to valid range\n const clampedIndex = Math.max(0, Math.min(frameIndex, keys.length - 1));\n return keys[clampedIndex].value.clone();\n }\n\n private static _GetRotationAtFrameIndex(keys: IAnimationKey[], frameIndex: number): Quaternion {\n if (keys.length === 0) {\n return Quaternion.Identity();\n }\n\n // Clamp frame index to valid range\n const clampedIndex = Math.max(0, Math.min(frameIndex, keys.length - 1));\n return keys[clampedIndex].value.clone();\n }\n\n private static _QuaternionToEuler(quaternion: Quaternion): Vector3 {\n // Convert quaternion to Euler angles in ZXY order for BVH\n const matrix = new Matrix();\n quaternion.toRotationMatrix(matrix);\n\n const m = matrix.m;\n let x, y, z;\n\n // ZXY rotation order extraction\n const sy = Math.sqrt(m[0] * m[0] + m[1] * m[1]);\n\n if (sy > Epsilon) {\n x = Math.atan2(m[6], m[10]);\n y = Math.atan2(-m[2], sy);\n z = Math.atan2(m[1], m[0]);\n } else {\n x = Math.atan2(-m[9], m[5]);\n y = Math.atan2(-m[2], sy);\n z = 0;\n }\n\n return new Vector3(Tools.ToDegrees(x), Tools.ToDegrees(y), Tools.ToDegrees(z));\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Mesh } from "@onerjs/core/Meshes/mesh.js";
1
+ import { type Mesh } from "@onerjs/core/Meshes/mesh.js";
2
2
  /**
3
3
  * Class for generating OBJ data from a Babylon scene.
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"objSerializer.js","sourceRoot":"","sources":["../../../../dev/serializers/src/OBJ/objSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { Geometry } from \"core/Meshes/geometry\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { Material } from \"core/Materials/material\";\r\n\r\n/**\r\n * Class for generating OBJ data from a Babylon scene.\r\n */\r\nexport class OBJExport {\r\n /**\r\n * Exports the geometry of a Mesh array in .OBJ file format (text)\r\n * @param meshes defines the list of meshes to serialize\r\n * @param materials defines if materials should be exported\r\n * @param matlibname defines the name of the associated mtl file\r\n * @param globalposition defines if the exported positions are globals or local to the exported mesh\r\n * @returns the OBJ content\r\n */\r\n public static OBJ(meshes: Mesh[], materials?: boolean, matlibname?: string, globalposition?: boolean): string {\r\n const output: string[] = [];\r\n let v = 1;\r\n // keep track of uv index in case mixed meshes are passed in\r\n let textureV = 1;\r\n\r\n if (materials) {\r\n if (!matlibname) {\r\n matlibname = \"mat\";\r\n }\r\n output.push(\"mtllib \" + matlibname + \".mtl\");\r\n }\r\n for (let j = 0; j < meshes.length; j++) {\r\n const mesh = meshes[j];\r\n const objectName = mesh.name || `mesh${j}}`;\r\n output.push(`o ${objectName}`);\r\n\r\n //Uses the position of the item in the scene, to the file (this back to normal in the end)\r\n let inverseTransform: Nullable<Matrix> = null;\r\n if (globalposition) {\r\n const transform = mesh.computeWorldMatrix(true);\r\n inverseTransform = new Matrix();\r\n transform.invertToRef(inverseTransform);\r\n\r\n mesh.bakeTransformIntoVertices(transform);\r\n }\r\n\r\n //TODO: submeshes (groups)\r\n //TODO: smoothing groups (s 1, s off);\r\n if (materials) {\r\n const mat = mesh.material;\r\n\r\n if (mat) {\r\n output.push(\"usemtl \" + mat.id);\r\n }\r\n }\r\n const g: Nullable<Geometry> = mesh.geometry;\r\n\r\n if (!g) {\r\n Tools.Warn(\"No geometry is present on the mesh\");\r\n continue;\r\n }\r\n\r\n const trunkVerts = g.getVerticesData(\"position\");\r\n const trunkNormals = g.getVerticesData(\"normal\");\r\n const trunkUV = g.getVerticesData(\"uv\");\r\n const trunkFaces = g.getIndices();\r\n let currentV = 0;\r\n let currentTextureV = 0;\r\n\r\n if (!trunkVerts || !trunkFaces) {\r\n Tools.Warn(\"There are no position vertices or indices on the mesh!\");\r\n continue;\r\n }\r\n\r\n const useRightHandedSystem = meshes[0].getScene().useRightHandedSystem;\r\n const handednessSign = useRightHandedSystem ? 1 : -1;\r\n\r\n for (let i = 0; i < trunkVerts.length; i += 3) {\r\n output.push(\"v \" + trunkVerts[i] * handednessSign + \" \" + trunkVerts[i + 1] + \" \" + trunkVerts[i + 2]);\r\n currentV++;\r\n }\r\n\r\n if (trunkNormals != null) {\r\n for (let i = 0; i < trunkNormals.length; i += 3) {\r\n output.push(\"vn \" + trunkNormals[i] * handednessSign + \" \" + trunkNormals[i + 1] + \" \" + trunkNormals[i + 2]);\r\n }\r\n }\r\n if (trunkUV != null) {\r\n for (let i = 0; i < trunkUV.length; i += 2) {\r\n output.push(\"vt \" + trunkUV[i] + \" \" + trunkUV[i + 1]);\r\n currentTextureV++;\r\n }\r\n }\r\n\r\n const blanks: string[] = [\"\", \"\", \"\"];\r\n const material = mesh.material || mesh.getScene().defaultMaterial;\r\n\r\n const sideOrientation = material._getEffectiveOrientation(mesh);\r\n const [offset1, offset2] = sideOrientation === Material.ClockWiseSideOrientation ? [2, 1] : [1, 2];\r\n\r\n for (let i = 0; i < trunkFaces.length; i += 3) {\r\n const indices = [String(trunkFaces[i] + v), String(trunkFaces[i + offset1] + v), String(trunkFaces[i + offset2] + v)];\r\n const textureIndices = [String(trunkFaces[i] + textureV), String(trunkFaces[i + offset1] + textureV), String(trunkFaces[i + offset2] + textureV)];\r\n\r\n const facePositions = indices;\r\n const faceUVs = trunkUV != null ? textureIndices : blanks;\r\n const faceNormals = trunkNormals != null ? indices : blanks;\r\n\r\n output.push(\r\n \"f \" +\r\n facePositions[0] +\r\n \"/\" +\r\n faceUVs[0] +\r\n \"/\" +\r\n faceNormals[0] +\r\n \" \" +\r\n facePositions[1] +\r\n \"/\" +\r\n faceUVs[1] +\r\n \"/\" +\r\n faceNormals[1] +\r\n \" \" +\r\n facePositions[2] +\r\n \"/\" +\r\n faceUVs[2] +\r\n \"/\" +\r\n faceNormals[2]\r\n );\r\n }\r\n //back de previous matrix, to not change the original mesh in the scene\r\n if (globalposition && inverseTransform) {\r\n mesh.bakeTransformIntoVertices(inverseTransform);\r\n }\r\n v += currentV;\r\n textureV += currentTextureV;\r\n }\r\n const text: string = output.join(\"\\n\");\r\n return text;\r\n }\r\n\r\n /**\r\n * Exports the material(s) of a mesh in .MTL file format (text)\r\n * @param mesh defines the mesh to extract the material from\r\n * @returns the mtl content\r\n */\r\n //TODO: Export the materials of mesh array\r\n public static MTL(mesh: Mesh): string {\r\n const output = [];\r\n const m = <StandardMaterial>mesh.material;\r\n output.push(\"newmtl mat1\");\r\n output.push(\" Ns \" + m.specularPower.toFixed(4));\r\n output.push(\" Ni 1.5000\");\r\n output.push(\" d \" + m.alpha.toFixed(4));\r\n output.push(\" Tr 0.0000\");\r\n output.push(\" Tf 1.0000 1.0000 1.0000\");\r\n output.push(\" illum 2\");\r\n output.push(\" Ka \" + m.ambientColor.r.toFixed(4) + \" \" + m.ambientColor.g.toFixed(4) + \" \" + m.ambientColor.b.toFixed(4));\r\n output.push(\" Kd \" + m.diffuseColor.r.toFixed(4) + \" \" + m.diffuseColor.g.toFixed(4) + \" \" + m.diffuseColor.b.toFixed(4));\r\n output.push(\" Ks \" + m.specularColor.r.toFixed(4) + \" \" + m.specularColor.g.toFixed(4) + \" \" + m.specularColor.b.toFixed(4));\r\n output.push(\" Ke \" + m.emissiveColor.r.toFixed(4) + \" \" + m.emissiveColor.g.toFixed(4) + \" \" + m.emissiveColor.b.toFixed(4));\r\n\r\n //TODO: uv scale, offset, wrap\r\n //TODO: UV mirrored in Blender? second UV channel? lightMap? reflection textures?\r\n const uvscale = \"\";\r\n\r\n if (m.ambientTexture) {\r\n output.push(\" map_Ka \" + uvscale + m.ambientTexture.name);\r\n }\r\n\r\n if (m.diffuseTexture) {\r\n output.push(\" map_Kd \" + uvscale + m.diffuseTexture.name);\r\n //TODO: alpha testing, opacity in diffuse texture alpha channel (diffuseTexture.hasAlpha -> map_d)\r\n }\r\n\r\n if (m.specularTexture) {\r\n output.push(\" map_Ks \" + uvscale + m.specularTexture.name);\r\n /* TODO: glossiness = specular highlight component is in alpha channel of specularTexture. (???)\r\n if (m.useGlossinessFromSpecularMapAlpha) {\r\n output.push(\" map_Ns \"+uvscale + m.specularTexture.name);\r\n }\r\n */\r\n }\r\n\r\n /* TODO: emissive texture not in .MAT format (???)\r\n if (m.emissiveTexture) {\r\n output.push(\" map_d \"+uvscale+m.emissiveTexture.name);\r\n }\r\n */\r\n\r\n if (m.bumpTexture) {\r\n output.push(\" map_bump -imfchan z \" + uvscale + m.bumpTexture.name);\r\n }\r\n\r\n if (m.opacityTexture) {\r\n output.push(\" map_d \" + uvscale + m.opacityTexture.name);\r\n }\r\n\r\n const text = output.join(\"\\n\");\r\n return text;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"objSerializer.js","sourceRoot":"","sources":["../../../../dev/serializers/src/OBJ/objSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { type Geometry } from \"core/Meshes/geometry\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { Material } from \"core/Materials/material\";\r\n\r\n/**\r\n * Class for generating OBJ data from a Babylon scene.\r\n */\r\nexport class OBJExport {\r\n /**\r\n * Exports the geometry of a Mesh array in .OBJ file format (text)\r\n * @param meshes defines the list of meshes to serialize\r\n * @param materials defines if materials should be exported\r\n * @param matlibname defines the name of the associated mtl file\r\n * @param globalposition defines if the exported positions are globals or local to the exported mesh\r\n * @returns the OBJ content\r\n */\r\n public static OBJ(meshes: Mesh[], materials?: boolean, matlibname?: string, globalposition?: boolean): string {\r\n const output: string[] = [];\r\n let v = 1;\r\n // keep track of uv index in case mixed meshes are passed in\r\n let textureV = 1;\r\n\r\n if (materials) {\r\n if (!matlibname) {\r\n matlibname = \"mat\";\r\n }\r\n output.push(\"mtllib \" + matlibname + \".mtl\");\r\n }\r\n for (let j = 0; j < meshes.length; j++) {\r\n const mesh = meshes[j];\r\n const objectName = mesh.name || `mesh${j}}`;\r\n output.push(`o ${objectName}`);\r\n\r\n //Uses the position of the item in the scene, to the file (this back to normal in the end)\r\n let inverseTransform: Nullable<Matrix> = null;\r\n if (globalposition) {\r\n const transform = mesh.computeWorldMatrix(true);\r\n inverseTransform = new Matrix();\r\n transform.invertToRef(inverseTransform);\r\n\r\n mesh.bakeTransformIntoVertices(transform);\r\n }\r\n\r\n //TODO: submeshes (groups)\r\n //TODO: smoothing groups (s 1, s off);\r\n if (materials) {\r\n const mat = mesh.material;\r\n\r\n if (mat) {\r\n output.push(\"usemtl \" + mat.id);\r\n }\r\n }\r\n const g: Nullable<Geometry> = mesh.geometry;\r\n\r\n if (!g) {\r\n Tools.Warn(\"No geometry is present on the mesh\");\r\n continue;\r\n }\r\n\r\n const trunkVerts = g.getVerticesData(\"position\");\r\n const trunkNormals = g.getVerticesData(\"normal\");\r\n const trunkUV = g.getVerticesData(\"uv\");\r\n const trunkFaces = g.getIndices();\r\n let currentV = 0;\r\n let currentTextureV = 0;\r\n\r\n if (!trunkVerts || !trunkFaces) {\r\n Tools.Warn(\"There are no position vertices or indices on the mesh!\");\r\n continue;\r\n }\r\n\r\n const useRightHandedSystem = meshes[0].getScene().useRightHandedSystem;\r\n const handednessSign = useRightHandedSystem ? 1 : -1;\r\n\r\n for (let i = 0; i < trunkVerts.length; i += 3) {\r\n output.push(\"v \" + trunkVerts[i] * handednessSign + \" \" + trunkVerts[i + 1] + \" \" + trunkVerts[i + 2]);\r\n currentV++;\r\n }\r\n\r\n if (trunkNormals != null) {\r\n for (let i = 0; i < trunkNormals.length; i += 3) {\r\n output.push(\"vn \" + trunkNormals[i] * handednessSign + \" \" + trunkNormals[i + 1] + \" \" + trunkNormals[i + 2]);\r\n }\r\n }\r\n if (trunkUV != null) {\r\n for (let i = 0; i < trunkUV.length; i += 2) {\r\n output.push(\"vt \" + trunkUV[i] + \" \" + trunkUV[i + 1]);\r\n currentTextureV++;\r\n }\r\n }\r\n\r\n const blanks: string[] = [\"\", \"\", \"\"];\r\n const material = mesh.material || mesh.getScene().defaultMaterial;\r\n\r\n const sideOrientation = material._getEffectiveOrientation(mesh);\r\n const [offset1, offset2] = sideOrientation === Material.ClockWiseSideOrientation ? [2, 1] : [1, 2];\r\n\r\n for (let i = 0; i < trunkFaces.length; i += 3) {\r\n const indices = [String(trunkFaces[i] + v), String(trunkFaces[i + offset1] + v), String(trunkFaces[i + offset2] + v)];\r\n const textureIndices = [String(trunkFaces[i] + textureV), String(trunkFaces[i + offset1] + textureV), String(trunkFaces[i + offset2] + textureV)];\r\n\r\n const facePositions = indices;\r\n const faceUVs = trunkUV != null ? textureIndices : blanks;\r\n const faceNormals = trunkNormals != null ? indices : blanks;\r\n\r\n output.push(\r\n \"f \" +\r\n facePositions[0] +\r\n \"/\" +\r\n faceUVs[0] +\r\n \"/\" +\r\n faceNormals[0] +\r\n \" \" +\r\n facePositions[1] +\r\n \"/\" +\r\n faceUVs[1] +\r\n \"/\" +\r\n faceNormals[1] +\r\n \" \" +\r\n facePositions[2] +\r\n \"/\" +\r\n faceUVs[2] +\r\n \"/\" +\r\n faceNormals[2]\r\n );\r\n }\r\n //back de previous matrix, to not change the original mesh in the scene\r\n if (globalposition && inverseTransform) {\r\n mesh.bakeTransformIntoVertices(inverseTransform);\r\n }\r\n v += currentV;\r\n textureV += currentTextureV;\r\n }\r\n const text: string = output.join(\"\\n\");\r\n return text;\r\n }\r\n\r\n /**\r\n * Exports the material(s) of a mesh in .MTL file format (text)\r\n * @param mesh defines the mesh to extract the material from\r\n * @returns the mtl content\r\n */\r\n //TODO: Export the materials of mesh array\r\n public static MTL(mesh: Mesh): string {\r\n const output = [];\r\n const m = <StandardMaterial>mesh.material;\r\n output.push(\"newmtl mat1\");\r\n output.push(\" Ns \" + m.specularPower.toFixed(4));\r\n output.push(\" Ni 1.5000\");\r\n output.push(\" d \" + m.alpha.toFixed(4));\r\n output.push(\" Tr 0.0000\");\r\n output.push(\" Tf 1.0000 1.0000 1.0000\");\r\n output.push(\" illum 2\");\r\n output.push(\" Ka \" + m.ambientColor.r.toFixed(4) + \" \" + m.ambientColor.g.toFixed(4) + \" \" + m.ambientColor.b.toFixed(4));\r\n output.push(\" Kd \" + m.diffuseColor.r.toFixed(4) + \" \" + m.diffuseColor.g.toFixed(4) + \" \" + m.diffuseColor.b.toFixed(4));\r\n output.push(\" Ks \" + m.specularColor.r.toFixed(4) + \" \" + m.specularColor.g.toFixed(4) + \" \" + m.specularColor.b.toFixed(4));\r\n output.push(\" Ke \" + m.emissiveColor.r.toFixed(4) + \" \" + m.emissiveColor.g.toFixed(4) + \" \" + m.emissiveColor.b.toFixed(4));\r\n\r\n //TODO: uv scale, offset, wrap\r\n //TODO: UV mirrored in Blender? second UV channel? lightMap? reflection textures?\r\n const uvscale = \"\";\r\n\r\n if (m.ambientTexture) {\r\n output.push(\" map_Ka \" + uvscale + m.ambientTexture.name);\r\n }\r\n\r\n if (m.diffuseTexture) {\r\n output.push(\" map_Kd \" + uvscale + m.diffuseTexture.name);\r\n //TODO: alpha testing, opacity in diffuse texture alpha channel (diffuseTexture.hasAlpha -> map_d)\r\n }\r\n\r\n if (m.specularTexture) {\r\n output.push(\" map_Ks \" + uvscale + m.specularTexture.name);\r\n /* TODO: glossiness = specular highlight component is in alpha channel of specularTexture. (???)\r\n if (m.useGlossinessFromSpecularMapAlpha) {\r\n output.push(\" map_Ns \"+uvscale + m.specularTexture.name);\r\n }\r\n */\r\n }\r\n\r\n /* TODO: emissive texture not in .MAT format (???)\r\n if (m.emissiveTexture) {\r\n output.push(\" map_d \"+uvscale+m.emissiveTexture.name);\r\n }\r\n */\r\n\r\n if (m.bumpTexture) {\r\n output.push(\" map_bump -imfchan z \" + uvscale + m.bumpTexture.name);\r\n }\r\n\r\n if (m.opacityTexture) {\r\n output.push(\" map_d \" + uvscale + m.opacityTexture.name);\r\n }\r\n\r\n const text = output.join(\"\\n\");\r\n return text;\r\n }\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
- import type { Mesh } from "@onerjs/core/Meshes/mesh.js";
2
- import type { Scene } from "@onerjs/core/scene.js";
1
+ import { type Mesh } from "@onerjs/core/Meshes/mesh.js";
2
+ import { type Scene } from "@onerjs/core/scene.js";
3
3
  /**
4
4
  * Options for the USDZ export
5
5
  */