toolpathRenderer.d.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Types for ./toolpathRenderer.js -- see that file for provenance and licence.
  2. // three-slicer/viewer/toolpath — 커널 레이어 → GPU 인스턴싱 툴패스.
  3. // three 를 import 하지 않는다: makeToolpath 가 THREE 네임스페이스를 인자로 받는다(단일 인스턴스 보장).
  4. /** 8정점 다이아몬드 단면의 24 삼각형 인덱스 (SegmentTemplate.cpp:18 원본) */
  5. export const VERTEX_DATA: number[]
  6. /** 툴패스 타입 → 색. 0=travel, 1=wall … 11=prime */
  7. export const TYPE_COLOR: Record<number, number[]>
  8. export const TYPE_LABEL: Record<number, string>
  9. /** 파랑→빨강 11색 히트맵 (libvgcode ColorRange.hpp:14) */
  10. export const DEFAULT_RANGES_COLORS: number[][]
  11. export interface ViewTypeDef {
  12. key: 'feature' | 'speed' | 'height' | 'width' | 'fan' | 'temp'
  13. label: string
  14. /** 연속값(히트맵)인가. false 면 고정색. */
  15. cont: boolean
  16. unit: string
  17. }
  18. export const VIEW_TYPES: ViewTypeDef[]
  19. /** per-vertex 부가 정보 */
  20. export interface SegmentMeta {
  21. vType: Uint8Array
  22. vWidth: Float32Array
  23. vHeight: Float32Array
  24. vLayer: Int32Array
  25. }
  26. export interface SegmentData {
  27. position: Float32Array
  28. hwa: Float32Array
  29. segIndex: Uint32Array
  30. nV: number
  31. nSeg: number
  32. layerSegPrefix: Uint32Array
  33. travelPos: Float32Array
  34. travelPrefix: Uint32Array
  35. nTrav: number
  36. layerCount: number
  37. maxAbs: number
  38. hasNaN: boolean
  39. meta: SegmentMeta
  40. /** 타입별 총 압출 길이 (index = 툴패스 타입, 길이 16) */
  41. typeLengths: Float64Array
  42. /** 정점이 하나도 없으면 null */
  43. bbox: { min: [number, number, number]; max: [number, number, number] } | null
  44. }
  45. /** 커널 layers[{z, paths(stride8), widths[]}] → GPU 스트림. */
  46. export function buildSegmentData(layers: unknown[], defaultLineWidth: number): SegmentData
  47. /** 타입별 길이 비율(%), pct 내림차순. 시간은 커널이 role 별로 노출하지 않아 길이로 근사한다. */
  48. export function roleRatios(typeLengths: Float64Array | number[]): Array<{
  49. type: number
  50. label: string
  51. pct: number
  52. color: number[]
  53. }>
  54. /**
  55. * speed/fan/temp 는 커널 툴패스에 없어 설정값에서 유도한다 — 그 유도에 쓰는 값들.
  56. */
  57. export interface ColorContext {
  58. speedByType?: Record<number, number>
  59. firstLayerSpeed?: number
  60. fanByType?: Record<number, number>
  61. fanFirstLayers?: number
  62. tempNormal?: number
  63. tempFirst?: number
  64. closeFanLayers?: number
  65. }
  66. export interface ColorResult {
  67. /** per-vertex RGBA (nV*4). `.r` 에 색이 packed 돼 있다. */
  68. color: Float32Array
  69. min: number
  70. max: number
  71. viewType: ViewTypeDef['key']
  72. label: string
  73. unit: string
  74. /** false 면 고정색 — min/max 는 0 이고 범례를 그리면 안 된다. */
  75. cont: boolean
  76. }
  77. export function computeColors(data: SegmentData, viewType: ViewTypeDef['key'], ctx: ColorContext): ColorResult
  78. export interface ToolpathHandle {
  79. /** THREE.Mesh — 인자로 넘긴 THREE 네임스페이스의 타입 */
  80. mesh: any
  81. /** THREE.LineSegments (travel) */
  82. travLines: any
  83. setLayerRange(lo: number, hi: number): void
  84. /** 하위호환 — setLayerRange(0, n-1) 과 같다. */
  85. setVisibleLayers(n: number): void
  86. setTravelVisible(visible: boolean): void
  87. setColors(color: Float32Array): void
  88. dispose(): void
  89. nSeg: number
  90. layerCount: number
  91. }
  92. /** @param THREE - `import * as THREE from 'three'` 네임스페이스. 소비자 인스턴스를 그대로 쓴다. */
  93. export function makeToolpath(THREE: any, data: SegmentData): ToolpathHandle