@hatiolab/figure-model 0.1.76 → 0.1.77

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 (135) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +60 -138
  3. package/dist/index.d.ts +1 -13
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +3 -26
  6. package/dist/index.js.map +1 -1
  7. package/dist/v3-asset-types.d.ts +1 -2
  8. package/dist/v3-asset-types.d.ts.map +1 -1
  9. package/dist/v3-asset.js +1 -1
  10. package/dist/v3-asset.js.map +1 -1
  11. package/dist/v3-authoring-actions.d.ts +9 -12
  12. package/dist/v3-authoring-actions.d.ts.map +1 -1
  13. package/dist/v3-authoring-actions.js +4 -5
  14. package/dist/v3-authoring-actions.js.map +1 -1
  15. package/dist/v3-capabilities.js +4 -1
  16. package/dist/v3-capabilities.js.map +1 -1
  17. package/dist/v3-cost.d.ts.map +1 -1
  18. package/dist/v3-cost.js +3 -5
  19. package/dist/v3-cost.js.map +1 -1
  20. package/dist/v3-create.d.ts +1 -1
  21. package/dist/v3-create.d.ts.map +1 -1
  22. package/dist/v3-examples.js +1 -1
  23. package/dist/v3-gate.d.ts +7 -8
  24. package/dist/v3-gate.d.ts.map +1 -1
  25. package/dist/v3-gate.js +11 -14
  26. package/dist/v3-gate.js.map +1 -1
  27. package/dist/v3-graph.d.ts +1 -2
  28. package/dist/v3-graph.d.ts.map +1 -1
  29. package/dist/v3-graph.js +5 -7
  30. package/dist/v3-graph.js.map +1 -1
  31. package/dist/v3-instance-size.d.ts +3 -5
  32. package/dist/v3-instance-size.d.ts.map +1 -1
  33. package/dist/v3-instance-size.js +2 -4
  34. package/dist/v3-instance-size.js.map +1 -1
  35. package/dist/v3-kernel-version.d.ts +1 -1
  36. package/dist/v3-kernel-version.js +1 -1
  37. package/dist/v3-part-edit.d.ts +4 -5
  38. package/dist/v3-part-edit.d.ts.map +1 -1
  39. package/dist/v3-part-edit.js +2 -2
  40. package/dist/v3-part-edit.js.map +1 -1
  41. package/dist/v3-proposal.js +1 -1
  42. package/dist/v3-proposal.js.map +1 -1
  43. package/dist/v3-release-contract.js +1 -1
  44. package/dist/v3-release-contract.js.map +1 -1
  45. package/dist/v3-score.d.ts +4 -5
  46. package/dist/v3-score.d.ts.map +1 -1
  47. package/dist/v3-score.js +7 -8
  48. package/dist/v3-score.js.map +1 -1
  49. package/dist/v3-words.d.ts +87 -0
  50. package/dist/v3-words.d.ts.map +1 -0
  51. package/dist/v3-words.js +87 -0
  52. package/dist/v3-words.js.map +1 -0
  53. package/docs/assembly-constraints-v3.md +13 -23
  54. package/docs/v3-asset-persistence.md +4 -4
  55. package/docs/v3-common-kernel-experiment.md +1 -1
  56. package/docs/v3-core-semantics.md +3 -3
  57. package/docs/v3-cutover.md +5 -3
  58. package/docs/v3-design.md +13 -26
  59. package/docs/v3-editor-integration.md +2 -2
  60. package/docs/v3-full-conveyor-validation.md +3 -3
  61. package/docs/v3-layout-system.md +1 -1
  62. package/docs/v3-minimal-model.md +0 -1
  63. package/docs/v3-motion-contract.md +21 -56
  64. package/docs/v3-runtime-extraction.md +7 -7
  65. package/docs/v3-sample-validation-expanded.md +1 -1
  66. package/docs/v3-sample-validation.md +1 -1
  67. package/docs/v3-shape-dimension-contract.md +23 -57
  68. package/docs/v3-status.md +5 -5
  69. package/docs/v3-storage-integration.md +4 -4
  70. package/package.json +2 -20
  71. package/dist/blueprint-shape.d.ts +0 -10
  72. package/dist/blueprint-shape.d.ts.map +0 -1
  73. package/dist/blueprint-shape.js +0 -194
  74. package/dist/blueprint-shape.js.map +0 -1
  75. package/dist/blueprint.d.ts +0 -73
  76. package/dist/blueprint.d.ts.map +0 -1
  77. package/dist/blueprint.js +0 -388
  78. package/dist/blueprint.js.map +0 -1
  79. package/dist/cost-chart.d.ts +0 -35
  80. package/dist/cost-chart.d.ts.map +0 -1
  81. package/dist/cost-chart.js +0 -150
  82. package/dist/cost-chart.js.map +0 -1
  83. package/dist/cost.d.ts +0 -162
  84. package/dist/cost.d.ts.map +0 -1
  85. package/dist/cost.js +0 -194
  86. package/dist/cost.js.map +0 -1
  87. package/dist/gate.d.ts +0 -65
  88. package/dist/gate.d.ts.map +0 -1
  89. package/dist/gate.js +0 -284
  90. package/dist/gate.js.map +0 -1
  91. package/dist/grouping.d.ts +0 -121
  92. package/dist/grouping.d.ts.map +0 -1
  93. package/dist/grouping.js +0 -224
  94. package/dist/grouping.js.map +0 -1
  95. package/dist/keys.d.ts +0 -45
  96. package/dist/keys.d.ts.map +0 -1
  97. package/dist/keys.js +0 -84
  98. package/dist/keys.js.map +0 -1
  99. package/dist/origin.d.ts +0 -33
  100. package/dist/origin.d.ts.map +0 -1
  101. package/dist/origin.js +0 -46
  102. package/dist/origin.js.map +0 -1
  103. package/dist/release-contract.d.ts +0 -38
  104. package/dist/release-contract.d.ts.map +0 -1
  105. package/dist/release-contract.js +0 -246
  106. package/dist/release-contract.js.map +0 -1
  107. package/dist/sizing.d.ts +0 -231
  108. package/dist/sizing.d.ts.map +0 -1
  109. package/dist/sizing.js +0 -550
  110. package/dist/sizing.js.map +0 -1
  111. package/dist/types.d.ts +0 -1233
  112. package/dist/types.d.ts.map +0 -1
  113. package/dist/types.js +0 -547
  114. package/dist/types.js.map +0 -1
  115. package/dist/v3-from-v2.d.ts +0 -203
  116. package/dist/v3-from-v2.d.ts.map +0 -1
  117. package/dist/v3-from-v2.js +0 -2053
  118. package/dist/v3-from-v2.js.map +0 -1
  119. package/dist/v3-mesh-compare.d.ts +0 -24
  120. package/dist/v3-mesh-compare.d.ts.map +0 -1
  121. package/dist/v3-mesh-compare.js +0 -55
  122. package/dist/v3-mesh-compare.js.map +0 -1
  123. package/dist/validate.d.ts +0 -7
  124. package/dist/validate.d.ts.map +0 -1
  125. package/dist/validate.js +0 -1119
  126. package/dist/validate.js.map +0 -1
  127. package/dist/visual-evidence.d.ts +0 -21
  128. package/dist/visual-evidence.d.ts.map +0 -1
  129. package/dist/visual-evidence.js +0 -52
  130. package/dist/visual-evidence.js.map +0 -1
  131. package/docs/design.md +0 -193
  132. package/docs/format-survey.md +0 -108
  133. package/docs/format.md +0 -704
  134. package/docs/sizing.md +0 -183
  135. package/docs/validation.md +0 -357
@@ -1 +0,0 @@
1
- {"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../src/blueprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEjF,oDAAoD;AACpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACrF,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,eAAe,EAkBhB,MAAM,YAAY,CAAA;AAEnB,+CAA+C;AAC/C,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,MAAM,CAA0B;IAEzC,YAAY,MAAgC;QAC1C,MAAM,IAAI,GAAG,MAAM;aAChB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/C,IAAI,CAAC,KAAK,CAAC,CAAA;QACd,KAAK,CAAC,mBAAmB,MAAM,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAA;QACnD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAA;IAE/B,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,EAAE,CAAA;QACX,KAAK,UAAU;YACb,OAAO,CAAC,GAAG,GAAG,CAAA;QAChB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YAC1C,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1B,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAA;YACjC,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAE7B,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;YAC7B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YACxB,sCAAsC;YACtC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/D,OAAO,IAAI,GAAG,KAAK,CAAA;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,IAAgB;IACvC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAA;IACtE,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,yDAAyD;AACzD,SAAS,aAAa,CAAC,IAAgB;IACrC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAA;IAEtE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,CAAA;IACxE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACpD,CAAC;AAED,kDAAkD;AAElD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAkC;IAChE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;IACzC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAA;IAEjC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAA;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IAE5C,iBAAiB;IACjB,MAAM,CAAC,GAAG;QACR,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QACvB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;QAC3D,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;KAC3D,CAAA;IAED,MAAM,KAAK,GAAG,CAAC,GAAa,EAAE,EAAE,CAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAEtF,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAA;AAC9D,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAAC,IAAkC;IAC9D,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,CAAA;IAChC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,CAAA;IACtB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAAC,IAAyB;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAW,CAAA;IAC7B,gFAAgF;IAChF,MAAM,EAAE,GAAG;QACT,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACtB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,cAAc;KACnB,CAAA;IACpB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IACtD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IACtD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IACzD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAC5D,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;IAC/D,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,QAAQ,CAAC,IAAyB;IACzC,gFAAgF;IAChF,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC;QAChC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,cAAc;QACrC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;KACV,CAAA;IACpB,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAChG,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;IACnE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1D,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACvD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CAAC,GAAkB,EAAE,MAAmC;IACvE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAO,CAAC,CAAC,CAAC,CAAA;IACpH,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnE,MAAM,IAAI,GAAmB;YAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE;YAC3B,IAAI,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE;SACvF,CAAA;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;QAC9F,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;YACpB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACjC,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QAChD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,2EAA2E;IAC3E,MAAM,OAAO,GAAqB,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAChC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1F,kEAAkE;QAClE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1D,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,MAAe;IACrC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAE3D,sGAAsG;IACtG,MAAM,GAAG,GAAG,aAAa,CAAC,MAAsB,CAAC,CAAA;IAEjD,MAAM,MAAM,GAAqB,EAAE,CAAA;IACnC,MAAM,UAAU,GAAoB,GAAG,CAAC,UAAU,IAAI,EAAE,CAAA;IACxD,MAAM,UAAU,GAAyB,GAAG,CAAC,UAAU,IAAI,EAAE,CAAA;IAC7D;;;;;MAKE;IACF,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAA;IACtD,oGAAoG;IACpG,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAqB,EAAE,CAAA;IACnC,MAAM,OAAO,GAAsB,EAAE,CAAA;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAA;IAE/C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/C,CAAC;QAED;;;UAGE;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEnC,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACvC,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;YAC7C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACpB,SAAQ;QACV,CAAC;QAED,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,4CAA4C;YAC5C,MAAM,KAAK,GAAmB;gBAC5B,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC;gBAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aAC1B,CAAA;YACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;YAC3E,IAAI,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,SAAQ;QACV,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YAC9B,oDAAoD;YACpD,MAAM,KAAK,GAAmB;gBAC5B,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC;gBAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aAC1B,CAAA;YACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;YAC3E,IAAI,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,SAAQ;QACV,CAAC;QAED,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;YACrC,SAAQ;QACV,CAAC;QAED,MAAM,KAAK,GAAmB;YAC5B,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC;YAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SAC1B,CAAA;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;YAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;QAC3E,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;QAC5C,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAEpG,MAAM,SAAS,GAAoB;QACjC,OAAO,EAAE,iBAAiB;QAC1B;;;;;;UAME;QACF,aAAa,EAAE,qBAAqB;QACpC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAC5C,MAAM;QACN,OAAO;QACP,UAAU;QACV,UAAU;QACV,MAAM;QACN,yCAAyC;QACzC,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE;QACpC,UAAU;KACX,CAAA;IACD,+CAA+C;IAC/C,YAAY;IACZ,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS;QAAE,SAAS,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAA;IAC1E,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;QAAE,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAA;IACpE,mGAAmG;IACnG,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAE/F,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -1,35 +0,0 @@
1
- /**
2
- * 원가 추이 — 인스턴스가 1 개에서 10,000 개로 갈 때 무엇이 늘고 무엇이 그대로인가.
3
- *
4
- * 표 하나로는 그 대비가 안 보인다. **같은 그림 안에서 오르는 선과 평평한 선을 함께
5
- * 봐야** 「재활용된다」는 말이 눈에 들어온다.
6
- *
7
- * 삼각형 · draw call 인스턴스에 비례해 오른다
8
- * 정점 버퍼 · 재질 10,000 개에서도 그대로다 ← 재활용되는 것
9
- * InstancedMesh 의 draw call 평평하다 ← 아직 얻지 않은 몫
10
- *
11
- * 의존을 만들지 않으려고 SVG 를 문자열로 낸다. 브라우저에서도 node 에서도 그대로 동작한다.
12
- * 색은 다섯 계열만 쓰고 축과 글자는 `currentColor` 라서 밝은 테마·어두운 테마 양쪽에서
13
- * 읽힌다.
14
- */
15
- import type { FigureCostAt } from './cost.ts';
16
- import type { FigureBlueprint } from './types.ts';
17
- /** 추이의 한 점. */
18
- export interface CostCurvePoint extends FigureCostAt {
19
- }
20
- export interface CostCurveOptions {
21
- /** 시작 인스턴스 수. 기본 1 */
22
- from?: number;
23
- /** 끝 인스턴스 수. 기본 10000 */
24
- to?: number;
25
- }
26
- /** 인스턴스 수를 훑으며 원가를 낸다. */
27
- export declare function costCurve(blueprint: FigureBlueprint, options?: CostCurveOptions): CostCurvePoint[];
28
- /**
29
- * 추이를 SVG 문자열로 낸다.
30
- *
31
- * 두 축 모두 로그다. 선형 축으로 그리면 10,000 쪽 값이 화면을 다 먹어 1 개 근처가
32
- * 뭉개지고, 정작 보여 줄 것 — **평평한 선과 오르는 선의 대비** — 가 안 보인다.
33
- */
34
- export declare function costCurveSvg(blueprint: FigureBlueprint, options?: CostCurveOptions): string;
35
- //# sourceMappingURL=cost-chart.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cost-chart.d.ts","sourceRoot":"","sources":["../src/cost-chart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,eAAe;AACf,MAAM,WAAW,cAAe,SAAQ,YAAY;CAAG;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yBAAyB;IACzB,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAsBD,0BAA0B;AAC1B,wBAAgB,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,GAAE,gBAAqB,GAAG,cAAc,EAAE,CAItG;AA6CD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAuG/F"}
@@ -1,150 +0,0 @@
1
- /**
2
- * 원가 추이 — 인스턴스가 1 개에서 10,000 개로 갈 때 무엇이 늘고 무엇이 그대로인가.
3
- *
4
- * 표 하나로는 그 대비가 안 보인다. **같은 그림 안에서 오르는 선과 평평한 선을 함께
5
- * 봐야** 「재활용된다」는 말이 눈에 들어온다.
6
- *
7
- * 삼각형 · draw call 인스턴스에 비례해 오른다
8
- * 정점 버퍼 · 재질 10,000 개에서도 그대로다 ← 재활용되는 것
9
- * InstancedMesh 의 draw call 평평하다 ← 아직 얻지 않은 몫
10
- *
11
- * 의존을 만들지 않으려고 SVG 를 문자열로 낸다. 브라우저에서도 node 에서도 그대로 동작한다.
12
- * 색은 다섯 계열만 쓰고 축과 글자는 `currentColor` 라서 밝은 테마·어두운 테마 양쪽에서
13
- * 읽힌다.
14
- */
15
- import { costOf } from "./cost.js";
16
- /**
17
- * 1-2-5 간격으로 자릿수를 순회한다.
18
- *
19
- * 로그 축에서 눈에 고르게 놓이는 값들이다. 1·2·5·10·20·50·100 … 등비로 늘리면 자릿수
20
- * 하나에 점이 셋씩 놓여 곡선이 매끄럽다.
21
- */
22
- function decadeSteps(from, to) {
23
- const out = [];
24
- let decade = 1;
25
- while (decade <= to) {
26
- for (const m of [1, 2, 5]) {
27
- const v = decade * m;
28
- if (v >= from && v <= to)
29
- out.push(v);
30
- }
31
- decade *= 10;
32
- }
33
- if (out.length === 0 || out[out.length - 1] !== to)
34
- out.push(to);
35
- return [...new Set(out)].sort((a, b) => a - b);
36
- }
37
- /** 인스턴스 수를 훑으며 원가를 낸다. */
38
- export function costCurve(blueprint, options = {}) {
39
- const from = Math.max(1, Math.floor(options.from ?? 1));
40
- const to = Math.max(from, Math.floor(options.to ?? 10000));
41
- return decadeSteps(from, to).map(n => costOf(blueprint, n).at);
42
- }
43
- /**
44
- * 그리는 계열 넷.
45
- *
46
- * `drawCallsIfInstanced` 는 선으로 그리지 않는다 — 구조적으로 `geometries` 와 **항상
47
- * 같은 값**이기 때문이다(둘 다 묶음 수). 절대 갈릴 수 없는 선을 둘 그리면 하나가 다른
48
- * 하나를 덮어 정보가 오히려 준다. 대신 그 뜻을 이름에 담았다.
49
- *
50
- * `materials` 는 `geometries` 와 같을 수도 다를 수도 있다(재질이 슬롯으로 더 갈리면
51
- * 묶음이 더 많다). 겹칠 때 아래 선이 보이도록 점선으로 마지막에 그린다.
52
- */
53
- const SERIES = [
54
- { key: 'triangles', label: '삼각형', color: '#e5534b', flat: false },
55
- { key: 'drawCalls', label: 'draw call', color: '#e09b13', flat: false },
56
- { key: 'geometries', label: '정점 버퍼', color: '#4a9eff', flat: true },
57
- { key: 'materials', label: '재질', color: '#a371f7', flat: true, dashed: true }
58
- ];
59
- const W = 680;
60
- const H = 380;
61
- const PAD = { top: 52, right: 208, bottom: 44, left: 62 };
62
- const log10 = (v) => Math.log(Math.max(v, 1)) / Math.LN10;
63
- function escapeText(s) {
64
- return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
65
- }
66
- /** 1, 10, 100 … 형태로 짧게. */
67
- function shortNumber(v) {
68
- if (v >= 1_000_000)
69
- return `${v / 1_000_000}M`;
70
- if (v >= 1_000)
71
- return `${v / 1_000}k`;
72
- return String(v);
73
- }
74
- /**
75
- * 추이를 SVG 문자열로 낸다.
76
- *
77
- * 두 축 모두 로그다. 선형 축으로 그리면 10,000 쪽 값이 화면을 다 먹어 1 개 근처가
78
- * 뭉개지고, 정작 보여 줄 것 — **평평한 선과 오르는 선의 대비** — 가 안 보인다.
79
- */
80
- export function costCurveSvg(blueprint, options = {}) {
81
- const points = costCurve(blueprint, options);
82
- if (points.length === 0)
83
- return '';
84
- const xs = points.map(p => p.instances);
85
- const minX = xs[0];
86
- const maxX = xs[xs.length - 1];
87
- let maxY = 1;
88
- for (const p of points) {
89
- for (const s of SERIES)
90
- maxY = Math.max(maxY, p[s.key]);
91
- }
92
- const plotW = W - PAD.left - PAD.right;
93
- const plotH = H - PAD.top - PAD.bottom;
94
- const spanX = Math.max(log10(maxX) - log10(minX), 1e-9);
95
- const spanY = Math.max(log10(maxY), 1e-9);
96
- const px = (v) => PAD.left + ((log10(v) - log10(minX)) / spanX) * plotW;
97
- const py = (v) => PAD.top + plotH - (log10(v) / spanY) * plotH;
98
- const parts = [];
99
- parts.push(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${W} ${H}" width="${W}" height="${H}" ` +
100
- `font-family="system-ui, sans-serif" font-size="11" fill="currentColor">`);
101
- parts.push(`<text x="${PAD.left}" y="22" font-size="13" font-weight="600">` +
102
- `${escapeText(blueprint.type)} — 인스턴스가 늘 때의 원가</text>`, `<text x="${PAD.left}" y="38" opacity="0.6">` +
103
- `평평한 선은 인스턴스가 늘어도 그대로다 — 그것이 재활용되는 것이다</text>`);
104
- // 세로 눈금 — 자릿수마다
105
- for (let e = 0; Math.pow(10, e) <= maxY * 1.001; e++) {
106
- const v = Math.pow(10, e);
107
- const y = py(v);
108
- parts.push(`<line x1="${PAD.left}" y1="${y.toFixed(1)}" x2="${(PAD.left + plotW).toFixed(1)}" y2="${y.toFixed(1)}" ` +
109
- `stroke="currentColor" stroke-opacity="0.12"/>`, `<text x="${PAD.left - 8}" y="${(y + 3.5).toFixed(1)}" text-anchor="end" opacity="0.55">${shortNumber(v)}</text>`);
110
- }
111
- // 가로 눈금 — 자릿수마다
112
- for (let e = 0; Math.pow(10, e) <= maxX * 1.001; e++) {
113
- const v = Math.pow(10, e);
114
- if (v < minX)
115
- continue;
116
- const x = px(v);
117
- parts.push(`<line x1="${x.toFixed(1)}" y1="${PAD.top}" x2="${x.toFixed(1)}" y2="${(PAD.top + plotH).toFixed(1)}" ` +
118
- `stroke="currentColor" stroke-opacity="0.12"/>`, `<text x="${x.toFixed(1)}" y="${(PAD.top + plotH + 16).toFixed(1)}" text-anchor="middle" opacity="0.55">` +
119
- `${shortNumber(v)}</text>`);
120
- }
121
- parts.push(`<text x="${(PAD.left + plotW / 2).toFixed(1)}" y="${H - 8}" text-anchor="middle" opacity="0.55">인스턴스 수</text>`);
122
- // 선
123
- for (const s of SERIES) {
124
- const d = points
125
- .map((p, i) => `${i === 0 ? 'M' : 'L'}${px(p.instances).toFixed(1)},${py(p[s.key]).toFixed(1)}`)
126
- .join(' ');
127
- parts.push(`<path d="${d}" fill="none" stroke="${s.color}" stroke-width="2" ` +
128
- `stroke-linejoin="round"${s.dashed ? ' stroke-dasharray="3 7"' : ''}/>`);
129
- }
130
- // 범례 — 끝 값을 함께 보인다. 「10,000 개면 얼마인가」가 바로 읽힌다.
131
- const last = points[points.length - 1];
132
- parts.push(`<g transform="translate(${W - PAD.right + 14}, ${PAD.top - 6})">`);
133
- parts.push(`<text x="0" y="0" font-weight="600">${shortNumber(last.instances)} 개일 때</text>`);
134
- SERIES.forEach((s, i) => {
135
- const y = 24 + i * 34;
136
- parts.push(`<line x1="0" y1="${y - 4}" x2="18" y2="${y - 4}" stroke="${s.color}" stroke-width="2"` +
137
- `${s.dashed ? ' stroke-dasharray="3 7"' : ''}/>`, `<text x="24" y="${y}" opacity="0.85">${escapeText(s.label)}</text>`, `<text x="24" y="${y + 12}" font-weight="600" fill="${s.color}">` +
138
- `${last[s.key].toLocaleString('en-US')}${s.flat ? ' · 그대로' : ''}</text>`);
139
- });
140
- // 겹쳐 보이는 것을 말로 밝힌다 — 값이 같으면 선이 포개진다.
141
- const flatValues = new Set(SERIES.filter(x => x.flat).map(x => last[x.key]));
142
- const note = flatValues.size === 1
143
- ? `평평한 선들이 ${[...flatValues][0]} 에서 포개져 있다`
144
- : 'InstancedMesh 를 쓰면 draw call 이 정점 버퍼 수까지 내려간다';
145
- parts.push(`<text x="0" y="${24 + SERIES.length * 34 + 6}" opacity="0.55">${escapeText(note)}</text>`, `<text x="0" y="${24 + SERIES.length * 34 + 20}" opacity="0.55">InstancedMesh 면 draw call = 정점 버퍼 수</text>`);
146
- parts.push('</g>');
147
- parts.push('</svg>');
148
- return parts.join('\n');
149
- }
150
- //# sourceMappingURL=cost-chart.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cost-chart.js","sourceRoot":"","sources":["../src/cost-chart.ts"],"names":[],"mappings":"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"}
package/dist/cost.d.ts DELETED
@@ -1,162 +0,0 @@
1
- /**
2
- * 원가 — 이 Figure 하나가 얼마나 무거운가, 그리고 **여러 개가 한 화면에 보이면 무엇이 늘어나나.**
3
- *
4
- * 저작자가 알아야 할 것은 삼각형 수 하나가 아니다. 진짜 물음은 이것이다 —
5
- *
6
- * 이걸 100개가 한 화면에 보이면 무엇이 100배가 되고 무엇이 그대로인가.
7
- *
8
- * 그대로인 것이 곧 **재활용되는 것**이다. geometry 와 재질은 타입당 하나라 인스턴스
9
- * 수와 무관하다. 반면 삼각형과 draw call 은 인스턴스에 비례한다. 이 둘을 갈라 보여
10
- * 주면, 저작자가 「부품을 하나 더 넣을까」를 근거를 갖고 정할 수 있다.
11
- */
12
- import type { FigureBlueprint } from './types.ts';
13
- /** 인스턴스를 여럿 놓았을 때. */
14
- export interface FigureCostAt {
15
- /** 몇 개 기준인가. */
16
- instances: number;
17
- /**
18
- * GPU 가 처리하는 삼각형. **인스턴스에 비례한다.**
19
- *
20
- * geometry 를 나눠 써도 이 값은 줄지 않는다 — 공유는 메모리와 업로드를 아끼는 것이지
21
- * 그리는 양을 아끼는 것이 아니다.
22
- */
23
- triangles: number;
24
- /**
25
- * 지금 방식의 draw call. **인스턴스에 비례한다** — 인스턴스마다 묶음 수만큼 mesh 가
26
- * 생기기 때문이다. three.js 에서 한 객체는 부모가 하나뿐이라 Mesh 객체 자체는 나눠
27
- * 쓸 수 없다.
28
- */
29
- drawCalls: number;
30
- /**
31
- * 실제로 만들어지는 정점 버퍼 수. **인스턴스와 무관하다.**
32
- *
33
- * 100개를 놓아도 이 값은 그대로다. 이것이 「재활용되는 것」의 실체다.
34
- */
35
- geometries: number;
36
- /** 실제로 만들어지는 재질 수. **인스턴스와 무관하다.** */
37
- materials: number;
38
- /**
39
- * 올라가는 텍스처 수. **인스턴스와 무관하다** — 이름으로 가리키는 자산이라 같은
40
- * `ref` 는 한 번만 올라간다.
41
- */
42
- textures: number;
43
- /**
44
- * `InstancedMesh` 를 쓰면 도달할 수 있는 draw call.
45
- *
46
- * 지금은 쓰지 않는다 — 인스턴스별 선택·컬링·재질을 다르게 다뤄야 해서 별개
47
- * 결정이다. 이 값과 `drawCalls` 의 차이가 그 결정으로 얻을 수 있는 몫이다.
48
- */
49
- drawCallsIfInstanced: number;
50
- }
51
- export interface FigureCost {
52
- type: string;
53
- /** 부품 자리 수. */
54
- parts: number;
55
- /** 이 Figure 하나의 삼각형 수. */
56
- triangles: number;
57
- /** 묶음 수 = 인스턴스 하나당 draw call. */
58
- groups: number;
59
- /** Draw calls one instance costs. Repeat copies count one each. */
60
- drawCalls: number;
61
- /**
62
- * 서로 다른 **형상**의 수(`geometryKeyOf` 기준).
63
- *
64
- * 부품 자리보다 적으면 그만큼 같은 형상을 되쓰고 있다는 뜻이다. 선반 단이나 롤러처럼
65
- * 같은 것이 여러 번 나오는 형상에서 이 값이 크게 벌어진다.
66
- */
67
- distinctShapes: number;
68
- /** 서로 다른 재질의 수(`materialKeyOf` 기준). */
69
- distinctMaterials: number;
70
- /**
71
- * 팔레트 밖 표면(무늬·그라디언트)의 **종류 수.**
72
- *
73
- * 같은 `ref` 는 한 텍스처이므로 부품 수가 아니라 종류를 센다. 0 이 정상이다.
74
- * 재질은 나눠 쓰지만 텍스처마다 GPU 메모리를 쓴다.
75
- */
76
- surfaceTextures: number;
77
- /**
78
- * 형상 재활용 비 — `distinctShapes / parts`.
79
- *
80
- * 1 이면 부품마다 형상이 다르다(재활용 없음). 낮을수록 같은 형상을 많이 되쓴다.
81
- * 부품이 없으면 0.
82
- */
83
- shapeReuse: number;
84
- /** 여럿 놓았을 때. 기본 100개. */
85
- at: FigureCostAt;
86
- }
87
- /**
88
- * 청사진 하나의 원가를 낸다.
89
- *
90
- * **삼각형 수는 추정치다.** `trianglesOf` 의 식에서 나오며 실제 정점 버퍼의 삼각형
91
- * 수와 다를 수 있다 — 특히 `polygon` 의 cap 삼각분할이 그렇다. 정확한 값은 형상을
92
- * 실제로 만들어 봐야 알 수 있고, 그것은 이 모듈이 아니라 렌더러의 몫이다.
93
- *
94
- * @param blueprint 컴파일된 청사진
95
- * @param instances 몇 개를 놓았을 때로 볼 것인가. 기본 100
96
- */
97
- export declare function costOf(blueprint: FigureBlueprint, instances?: number): FigureCost;
98
- /**
99
- * 사람이 읽는 한 줄들. 저작 화면과 진단 출력에 그대로 쓸 수 있다.
100
- *
101
- * 값을 다시 계산하지 않는다 — `costOf` 가 낸 것을 문장으로 옮기기만 한다.
102
- */
103
- export declare function describeCost(cost: FigureCost): string[];
104
- /**
105
- * 한도 하나를 얼마나 쓰고 있나.
106
- *
107
- * `limit` 은 **이 모듈이 이미 선언해 둔 값**이다(`LIMITS` · `PART_LIMIT`). 점수를
108
- * 내려고 새로 지어낸 수가 아니다 — 지어내면 「왜 그 수인가」에 답할 수 없다.
109
- */
110
- export interface FigureBudgetUse {
111
- key: 'groups' | 'parts' | 'independent' | 'transparent' | 'surface';
112
- label: string;
113
- used: number;
114
- limit: number;
115
- /** `used / limit`. 1 을 넘으면 위반이다. */
116
- ratio: number;
117
- /** 이 한도가 무엇을 지키는가. 저작자에게 그대로 보여 준다. */
118
- why: string;
119
- }
120
- export type FigureGrade = 'A' | 'B' | 'C' | 'D';
121
- export interface FigureScore {
122
- /**
123
- * 0–100. **선언된 한도에 남은 여유**다.
124
- *
125
- * 한도에 가장 가까운 항목 하나로 정한다. 넷 중 하나만 꽉 차 있어도 대량 배치에서는 그것이
126
- * 병목이 되기 때문이다. 평균을 내면 한도에 가까운 하나가 여유 있는 셋에 묻힌다.
127
- */
128
- score: number;
129
- /**
130
- * A 여유 절반 이상 · B 4분의 1 이상 · C 한도 안 · D 한도 초과
131
- *
132
- * D 는 곧 위반이 있다는 뜻이다 — `blueprint.violations` 에 사유가 들어 있다.
133
- */
134
- grade: FigureGrade;
135
- /** 한도에 가장 가까운 항목. **여기부터 고치면 된다.** */
136
- tightest: FigureBudgetUse;
137
- budgets: FigureBudgetUse[];
138
- /**
139
- * 형상 되쓰기 — 한도가 아니라 덤이다. 점수에 넣지 않는다.
140
- *
141
- * 되쓰기는 많을수록 좋지만 **한도가 없다.** 부품마다 형상이 달라도 잘못이 아니다.
142
- * 점수에 섞으면 「형상을 억지로 같게 만들라」는 신호가 되어 저작을 왜곡한다.
143
- */
144
- reuse: {
145
- /** 서로 다른 형상 수. */
146
- distinct: number;
147
- /** 부품 자리 수. */
148
- parts: number;
149
- /** `distinct / parts`. 낮을수록 많이 되쓴다. */
150
- ratio: number;
151
- /** 되써서 아낀 형상 수. */
152
- saved: number;
153
- };
154
- }
155
- /**
156
- * 대량 배치 적합도를 점수로 낸다.
157
- *
158
- * **점수의 근거는 전부 선언된 한도다.** 새로 지어낸 기준은 없다. 등급이 D 면
159
- * `blueprint.violations` 에 그 사유가 들어 있다.
160
- */
161
- export declare function scoreOf(blueprint: FigureBlueprint): FigureScore;
162
- //# sourceMappingURL=cost.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,YAAY,CAAA;AAE7D,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAA;IAEjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IAEZ,eAAe;IACf,KAAK,EAAE,MAAM,CAAA;IAEb,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAA;IAEjB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAA;IAEjB;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAA;IAEtB,uCAAuC;IACvC,iBAAiB,EAAE,MAAM,CAAA;IAEzB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAA;IAEvB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB,yBAAyB;IACzB,EAAE,EAAE,YAAY,CAAA;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,SAAM,GAAG,UAAU,CA+D9E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAwBvD;AAID;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,GAAG,aAAa,GAAG,SAAS,CAAA;IACnE,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAE/C,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;;;OAIG;IACH,KAAK,EAAE,WAAW,CAAA;IAElB,sCAAsC;IACtC,QAAQ,EAAE,eAAe,CAAA;IAEzB,OAAO,EAAE,eAAe,EAAE,CAAA;IAE1B;;;;;OAKG;IACH,KAAK,EAAE;QACL,kBAAkB;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,eAAe;QACf,KAAK,EAAE,MAAM,CAAA;QACb,uCAAuC;QACvC,KAAK,EAAE,MAAM,CAAA;QACb,mBAAmB;QACnB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAaD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,eAAe,GAAG,WAAW,CA6E/D"}
package/dist/cost.js DELETED
@@ -1,194 +0,0 @@
1
- /**
2
- * 원가 — 이 Figure 하나가 얼마나 무거운가, 그리고 **여러 개가 한 화면에 보이면 무엇이 늘어나나.**
3
- *
4
- * 저작자가 알아야 할 것은 삼각형 수 하나가 아니다. 진짜 물음은 이것이다 —
5
- *
6
- * 이걸 100개가 한 화면에 보이면 무엇이 100배가 되고 무엇이 그대로인가.
7
- *
8
- * 그대로인 것이 곧 **재활용되는 것**이다. geometry 와 재질은 타입당 하나라 인스턴스
9
- * 수와 무관하다. 반면 삼각형과 draw call 은 인스턴스에 비례한다. 이 둘을 갈라 보여
10
- * 주면, 저작자가 「부품을 하나 더 넣을까」를 근거를 갖고 정할 수 있다.
11
- */
12
- import { repeatCountOf } from "./grouping.js";
13
- import { LIMITS, PART_LIMIT } from "./types.js";
14
- /**
15
- * 청사진 하나의 원가를 낸다.
16
- *
17
- * **삼각형 수는 추정치다.** `trianglesOf` 의 식에서 나오며 실제 정점 버퍼의 삼각형
18
- * 수와 다를 수 있다 — 특히 `polygon` 의 cap 삼각분할이 그렇다. 정확한 값은 형상을
19
- * 실제로 만들어 봐야 알 수 있고, 그것은 이 모듈이 아니라 렌더러의 몫이다.
20
- *
21
- * @param blueprint 컴파일된 청사진
22
- * @param instances 몇 개를 놓았을 때로 볼 것인가. 기본 100
23
- */
24
- export function costOf(blueprint, instances = 100) {
25
- const n = Math.max(0, Math.floor(instances));
26
- const shapes = new Set();
27
- const materials = new Set();
28
- let parts = 0;
29
- let triangles = 0;
30
- const surfaces = new Set();
31
- for (const group of blueprint.groups) {
32
- materials.add(group.materialKey);
33
- const surface = group.material?.surface;
34
- if (surface)
35
- surfaces.add(`${surface.kind}:${surface.ref}`);
36
- for (const member of group.members) {
37
- parts++;
38
- triangles += member.triangles;
39
- shapes.add(member.geometryKey);
40
- }
41
- }
42
- const groups = blueprint.groups.length;
43
- /*
44
- Draw calls per instance. **Not the same as the group count.**
45
-
46
- A repeat part is one group but many meshes -- the cell tray has two groups
47
- and draws nine times. Reporting groups here made the capacity number 2.3x
48
- too generous, and the author sizing a drawing by it would find the drawing
49
- slow anyway.
50
-
51
- Counted as authored, at scale 1. The row fills whatever box the instance
52
- is given, so a stretched instance draws more.
53
- */
54
- const drawCalls = blueprint.groups.reduce((total, group) => total +
55
- (group.members.length === 1
56
- ? repeatCountOf(group.members[0], blueprint.base)
57
- : 1), 0);
58
- return {
59
- type: blueprint.type,
60
- parts,
61
- triangles,
62
- groups,
63
- drawCalls,
64
- distinctShapes: shapes.size,
65
- distinctMaterials: materials.size,
66
- surfaceTextures: surfaces.size,
67
- shapeReuse: parts === 0 ? 0 : shapes.size / parts,
68
- at: {
69
- instances: n,
70
- triangles: triangles * n,
71
- drawCalls: drawCalls * n,
72
- // 병합된 geometry 는 (타입, 묶음)당 하나다 — 인스턴스가 몇이든 늘지 않는다.
73
- geometries: groups,
74
- materials: materials.size,
75
- textures: surfaces.size,
76
- drawCallsIfInstanced: groups
77
- }
78
- };
79
- }
80
- /**
81
- * 사람이 읽는 한 줄들. 저작 화면과 진단 출력에 그대로 쓸 수 있다.
82
- *
83
- * 값을 다시 계산하지 않는다 — `costOf` 가 낸 것을 문장으로 옮기기만 한다.
84
- */
85
- export function describeCost(cost) {
86
- const { at } = cost;
87
- const lines = [
88
- `${cost.type} — 부품 ${cost.parts} · 삼각형 ${cost.triangles} · 묶음 ${cost.groups}`,
89
- `형상 ${cost.distinctShapes}종 · 재질 ${cost.distinctMaterials}종`
90
- ];
91
- if (cost.distinctShapes < cost.parts) {
92
- lines.push(`부품 ${cost.parts} 자리를 형상 ${cost.distinctShapes}종으로 채운다 — 나머지는 되쓴다`);
93
- }
94
- lines.push(`한 화면에 ${at.instances}개가 보이면 — 삼각형 ${at.triangles} · draw call ${at.drawCalls}`);
95
- lines.push(`그래도 정점 버퍼는 ${at.geometries}개, 재질은 ${at.materials}개 그대로다`);
96
- if (cost.surfaceTextures > 0) {
97
- lines.push(`팔레트 밖 표면이 ${cost.surfaceTextures}종 있다 — 재질은 나눠 쓰지만 텍스처 메모리를 쓴다`);
98
- }
99
- if (at.drawCallsIfInstanced < at.drawCalls) {
100
- lines.push(`InstancedMesh 를 쓰면 draw call 이 ${at.drawCallsIfInstanced}까지 내려간다`);
101
- }
102
- return lines;
103
- }
104
- const GRADE_BOUNDS = [
105
- ['A', 0.5],
106
- ['B', 0.75],
107
- ['C', 1]
108
- ];
109
- function gradeOf(ratio) {
110
- for (const [grade, bound] of GRADE_BOUNDS)
111
- if (ratio <= bound)
112
- return grade;
113
- return 'D';
114
- }
115
- /**
116
- * 대량 배치 적합도를 점수로 낸다.
117
- *
118
- * **점수의 근거는 전부 선언된 한도다.** 새로 지어낸 기준은 없다. 등급이 D 면
119
- * `blueprint.violations` 에 그 사유가 들어 있다.
120
- */
121
- export function scoreOf(blueprint) {
122
- const cost = costOf(blueprint, 1);
123
- /*
124
- 따로 변환되는 묶음을 센다 — 채널이 모는 것과 **관절의 틀에 선 것**을 함께.
125
-
126
- 전에는 `animated` 만 셌다. 관절이 선 뒤로는 그것이 모자란다: 6 축 로봇은 채널이 관절
127
- 이름을 몰고 부품은 관절의 틀에서 도는데, `animated` 로는 손가락 둘만 잡혀 「2」로 보였다.
128
- 묶음은 틀마다 갈리므로(ADR-0066 결정 4) 관절의 틀도 제 변환을 지는 묶음이다.
129
- */
130
- const independent = new Set(blueprint.groups.filter(g => g.animated || g.joint !== undefined).map((g, at) => g.joint ?? `animated:${at}`)).size;
131
- const transparent = new Set(blueprint.groups.filter(g => g.material.transparent).map(g => g.materialKey)).size;
132
- const partLimit = blueprint.detailLevel === undefined ? undefined : PART_LIMIT[blueprint.detailLevel];
133
- const budgets = [
134
- {
135
- key: 'groups',
136
- label: '묶음',
137
- used: cost.drawCalls,
138
- limit: LIMITS.materialGroups,
139
- ratio: cost.drawCalls / LIMITS.materialGroups,
140
- why: '인스턴스 하나마다 이만큼 draw call 이 필요하다'
141
- },
142
- {
143
- key: 'independent',
144
- label: '독립 부품',
145
- used: independent,
146
- limit: LIMITS.independentParts,
147
- ratio: independent / LIMITS.independentParts,
148
- why: '따로 변환되는 부품마다 묶음이 하나 늘고, 그만큼 한 화면에 세울 대수가 준다'
149
- },
150
- {
151
- key: 'transparent',
152
- label: '투명 재질',
153
- used: transparent,
154
- limit: LIMITS.transparentMaterials,
155
- ratio: transparent / LIMITS.transparentMaterials,
156
- why: '투명은 별도 정렬 경로를 탄다'
157
- },
158
- {
159
- key: 'surface',
160
- label: '팔레트 밖 표면',
161
- used: cost.surfaceTextures,
162
- limit: LIMITS.surfaceTextures,
163
- ratio: cost.surfaceTextures / LIMITS.surfaceTextures,
164
- why: '단색 규칙의 예외다. 텍스처마다 GPU 메모리와 샘플러를 쓴다'
165
- }
166
- ];
167
- if (partLimit !== undefined) {
168
- budgets.push({
169
- key: 'parts',
170
- label: '부품 수',
171
- used: cost.parts,
172
- limit: partLimit,
173
- ratio: cost.parts / partLimit,
174
- why: `디테일 등급 ${blueprint.detailLevel} 이 정한 상한이다`
175
- });
176
- }
177
- let tightest = budgets[0];
178
- for (const b of budgets)
179
- if (b.ratio > tightest.ratio)
180
- tightest = b;
181
- return {
182
- score: Math.max(0, Math.round(100 * (1 - tightest.ratio))),
183
- grade: gradeOf(tightest.ratio),
184
- tightest,
185
- budgets,
186
- reuse: {
187
- distinct: cost.distinctShapes,
188
- parts: cost.parts,
189
- ratio: cost.shapeReuse,
190
- saved: cost.parts - cost.distinctShapes
191
- }
192
- };
193
- }
194
- //# sourceMappingURL=cost.js.map
package/dist/cost.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"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"}