/* ============================================================================= * ui_template_contour3d.ts * 3D 등고선 선 재질 — 평면 그림(노선 편집)과 같은 갈래 · 같은 색 토큰(353-3). * * 주곡선 = 5 m 배수 고정(간격 무관 · 평면 `B05_Profile_UI_RouteEdit_Render` 와 같음) · * 색 `--map-contour-major` 진하게 · 나머지(1 m) = `--map-contour-minor` 옅게 · 낮은 불투명. * B05 3D(`B05_Profile_UI_Viewer`) · B04 3D(`B04_PreProcess_UI_TerrainViewer_Contours`) 가 함께 씀. * ========================================================================== */ import * as THREE from "three"; import { themeColor } from "./ui_template_palette"; /** 주곡선 간격(m) — 평면 그림과 같은 5 m. */ export const CONTOUR_MAJOR_STEP_M = 5; /** 5 m 배수 높이면 주곡선. */ export function isMajorContour(level: number): boolean { return Math.abs(level - Math.round(level / CONTOUR_MAJOR_STEP_M) * CONTOUR_MAJOR_STEP_M) < 1e-6; } /** CSS 색(#rrggbb · rgba(...)) → 색 + 불투명(알파 없으면 1). */ function parseColor(value: string): { color: THREE.Color; alpha: number } { const rgba = value.match(/rgba?\(([^)]+)\)/); if (!rgba) return { color: new THREE.Color(value), alpha: 1 }; const [r, g, b, a] = rgba[1].split(",").map((part) => Number(part.trim())); return { color: new THREE.Color(r / 255, g / 255, b / 255), alpha: Number.isFinite(a) ? a : 1 }; } /** 주곡선 · 1 m 선 재질 — 1 m 는 주곡선보다 옅게. */ export function contourMaterials(): { major: THREE.LineBasicMaterial; minor: THREE.LineBasicMaterial; } { const major = parseColor(themeColor("--map-contour-major", "#818cf8")); const minor = parseColor(themeColor("--map-contour-minor", "rgba(165, 180, 252, 0.45)")); return { major: new THREE.LineBasicMaterial({ color: major.color, transparent: true, opacity: 0.95 * major.alpha, }), minor: new THREE.LineBasicMaterial({ color: minor.color, transparent: true, opacity: minor.alpha, depthWrite: false, }), }; }