@project-skymap/library 0.0.1 → 0.0.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.
- package/dist/index.cjs +5 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -571,7 +571,11 @@ function createEngine({
|
|
|
571
571
|
}
|
|
572
572
|
function buildFromModel(model, cfg) {
|
|
573
573
|
clearRoot();
|
|
574
|
-
if (cfg.background
|
|
574
|
+
if (cfg.background && cfg.background !== "transparent") {
|
|
575
|
+
scene.background = new THREE4__namespace.Color(cfg.background);
|
|
576
|
+
} else {
|
|
577
|
+
scene.background = null;
|
|
578
|
+
}
|
|
575
579
|
camera.fov = cfg.camera?.fov ?? env.defaultFov;
|
|
576
580
|
camera.updateProjectionMatrix();
|
|
577
581
|
const layoutCfg = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/constellations.ts","../src/engine/layout.ts","../src/engine/materials.ts","../src/engine/createEngine.ts","../src/react/StarMap.tsx","../src/adapters/bible.ts"],"names":["THREE2","THREE3","THREE4","OrbitControls","lookAt","start","useRef","useEffect","createEngine","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as THREE from \"three\";\n\nexport type Point3D = { x: number; y: number; z: number };\n\n// Helper to rotate a point in 3D space\nfunction rotatePoint(point: Point3D, euler: THREE.Euler): Point3D {\n const v = new THREE.Vector3(point.x, point.y, point.z);\n v.applyEuler(euler);\n return { x: v.x, y: v.y, z: v.z };\n}\n\n/**\n * Generates a Golden Spiral (Galaxy-like).\n * Good for books with many chapters (Gen, Psalms, etc).\n */\nexport function layoutSpiral(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n const goldenAngle = Math.PI * (3 - Math.sqrt(5)); // ~2.4 radians\n\n for (let i = 0; i < count; i++) {\n // radius grows with sqrt of index to keep area constant\n const r = radius * Math.sqrt((i + 1) / count); \n const theta = i * goldenAngle;\n\n const x = r * Math.cos(theta);\n const z = r * Math.sin(theta);\n \n // slight variation in y for 3D depth, but mostly flat disc\n const y = (Math.random() - 0.5) * (radius * 0.1); \n\n points.push({ x, y, z });\n }\n return points;\n}\n\n/**\n * Generates a Cross shape.\n * Vertical bar is longer, horizontal bar crosses near top.\n */\nexport function layoutCross(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n \n // Split chapters: 70% vertical, 30% horizontal\n const verticalCount = Math.ceil(count * 0.7);\n const horizontalCount = count - verticalCount;\n \n const height = radius * 2.5;\n const width = radius * 1.5;\n\n // Vertical beam (top to bottom)\n for (let i = 0; i < verticalCount; i++) {\n const t = i / (verticalCount - 1 || 1); // 0..1\n // x=0, z=0\n const y = (height / 2) - t * height; \n points.push({ x: 0, y, z: 0 });\n }\n\n // Horizontal beam (left to right)\n // Crosses at roughly 30% from top of vertical\n const crossY = (height / 2) - (height * 0.3);\n\n for (let i = 0; i < horizontalCount; i++) {\n const t = i / (horizontalCount - 1 || 1); // 0..1\n const x = (-width / 2) + t * width;\n points.push({ x, y: crossY, z: 0 });\n }\n\n return points;\n}\n\n/**\n * Generates a Tablet/Grid shape (for Law).\n * Two columns of stars.\n */\nexport function layoutTablet(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n const cols = 2;\n const rows = Math.ceil(count / cols);\n const w = radius * 1.5;\n const h = radius * 2.0;\n\n for (let i = 0; i < count; i++) {\n const col = i % cols;\n const row = Math.floor(i / cols);\n \n // x: -w/2 or +w/2\n const x = (col === 0 ? -1 : 1) * (w * 0.25);\n // y: top to bottom\n const y = (h / 2) - (row / (rows - 1 || 1)) * h;\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Crown shape (for Kings/Chronicles).\n * A semi-circle/circle with \"spikes\".\n */\nexport function layoutCrown(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n // Semi-circle arc (from -PI/2 to PI/2?) or full circle?\n // Let's do a wide arc \"smile\" shape pointing up.\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1); \n const angle = -Math.PI * 0.8 + t * Math.PI * 1.6; // wide arc\n \n // Base arc\n let r = radius;\n // Spikes: every 3rd star is higher?\n if (i % 3 === 1) r *= 1.4;\n\n const x = r * Math.sin(angle);\n const y = r * Math.cos(angle) * 0.5; // flatten height\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Harp shape (for Psalms).\n * A frame with \"strings\".\n */\nexport function layoutHarp(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n // A simple triangle frame\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1);\n \n // Parametric curve for a harp-ish shape\n // x goes left to right\n const x = (-radius) + t * (radius * 2);\n \n // y follows a curve\n // rapid rise on right side\n const y = (-radius) + Math.pow(t, 2) * (radius * 2);\n\n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Flame/Teardrop shape (for Acts).\n */\nexport function layoutFlame(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1) * Math.PI * 2; // 0 to 2PI\n // Spiral tapering up?\n // Let's do a simple parametric teardrop\n \n // Distribute points along the perimeter of a teardrop\n // Parametric eq: x = cos(t), y = sin(t) * sin(t/2)^m\n \n // Actually, just a noisy vertical spiral looks good as fire\n const tNorm = i / count; \n const r = radius * (1 - tNorm) * 0.8; // tapering radius\n const angle = tNorm * Math.PI * 4; // 2 turns\n const y = (tNorm - 0.5) * radius * 3; // tall\n\n const x = r * Math.cos(angle);\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Registry mapping Book Keys (e.g., \"MAT\") to Layout Functions\n */\nconst LAYOUT_REGISTRY: Record<string, (c: number, r: number) => Point3D[]> = {\n // Law -> Tablet\n \"GEN\": layoutTablet,\n \"EXO\": layoutTablet,\n \"LEV\": layoutTablet,\n \"NUM\": layoutTablet,\n \"DEU\": layoutTablet,\n\n // Kings/History -> Crown\n \"1SA\": layoutCrown,\n \"2SA\": layoutCrown,\n \"1KI\": layoutCrown,\n \"2KI\": layoutCrown,\n \"1CH\": layoutCrown,\n \"2CH\": layoutCrown,\n\n // Poetry -> Harp/Spiral\n \"PSA\": layoutHarp,\n \"SNG\": layoutHarp,\n\n // Gospels -> Cross\n \"MAT\": layoutCross,\n \"MRK\": layoutCross,\n \"LUK\": layoutCross,\n \"JHN\": layoutCross,\n \n // Acts -> Flame\n \"ACT\": layoutFlame,\n};\n\nexport function getConstellationLayout(bookKey: string, chapterCount: number, radius: number): Point3D[] {\n const generator = LAYOUT_REGISTRY[bookKey] || layoutSpiral;\n return generator(chapterCount, radius);\n}\n","import * as THREE from \"three\";\nimport type { SceneModel, SceneNode } from \"../types\";\nimport { getConstellationLayout, Point3D } from \"./constellations\";\n\n// Helper: Rotate point P to look at Target T (from 0,0,0)\nfunction lookAt(point: Point3D, target: THREE.Vector3, up: THREE.Vector3): Point3D {\n // We create a rotation matrix that rotates (0,0,1) to 'target'\n // and apply it to 'point' (which is defined in a local XY plane usually)\n \n // For simplicity: We want to place the constellation (defined flat on XY or XZ)\n // tangent to the sphere surface at 'target'.\n \n const zAxis = target.clone().normalize(); // The \"Normal\" of the book center\n const xAxis = new THREE.Vector3().crossVectors(up, zAxis).normalize();\n const yAxis = new THREE.Vector3().crossVectors(zAxis, xAxis).normalize();\n\n const m = new THREE.Matrix4().makeBasis(xAxis, yAxis, zAxis);\n const v = new THREE.Vector3(point.x, point.y, point.z);\n v.applyMatrix4(m); // Rotate\n v.add(target); // Translate\n \n return { x: v.x, y: v.y, z: v.z };\n}\n\nexport function computeLayoutPositions(\n model: SceneModel,\n layout?: { mode?: \"radial\" | \"grid\" | \"force\" | \"spherical\"; radius?: number; chapterRingSpacing?: number }\n): SceneModel {\n const mode = layout?.mode ?? \"spherical\";\n const radius = layout?.radius ?? 2000;\n const ringSpacing = layout?.chapterRingSpacing ?? 15;\n\n const childrenMap = new Map<string, SceneNode[]>();\n const roots: SceneNode[] = [];\n const books: SceneNode[] = [];\n\n // Build hierarchy\n for (const n of model.nodes) {\n if (n.level === 2) books.push(n); // Collect books for spherical layout\n if (n.parent) {\n const children = childrenMap.get(n.parent) ?? [];\n children.push(n);\n childrenMap.set(n.parent, children);\n } else {\n roots.push(n);\n }\n }\n\n const updatedNodes = model.nodes.map((n) => ({ ...n, meta: { ...(n.meta ?? {}) } }));\n const updatedNodeMap = new Map(updatedNodes.map(n => [n.id, n]));\n const leafCounts = new Map<string, number>();\n\n // Helper: Count leaves\n function getLeafCount(node: SceneNode): number {\n const children = childrenMap.get(node.id) ?? [];\n if (children.length === 0) {\n leafCounts.set(node.id, 1);\n return 1;\n }\n let count = 0;\n for (const c of children) count += getLeafCount(c);\n leafCounts.set(node.id, count);\n return count;\n }\n roots.forEach(getLeafCount);\n\n // --- SPHERICAL MODE ---\n if (mode === \"spherical\") {\n const numBooks = books.length;\n const phi = Math.PI * (3 - Math.sqrt(5)); // Golden Angle\n\n // Fibonacci Sphere Distribution for Books (Upper Hemisphere Only)\n for (let i = 0; i < numBooks; i++) {\n const book = books[i];\n const uBook = updatedNodeMap.get(book.id)!;\n const bookKey = (uBook.meta as any).bookKey as string;\n\n // y goes from 1.0 (zenith) to 0.05 (just above horizon)\n const y = 1.0 - (i / (numBooks - 1)) * 0.95; \n const radiusAtY = Math.sqrt(1 - y * y);\n const theta = phi * i;\n\n const x = Math.cos(theta) * radiusAtY;\n const z = Math.sin(theta) * radiusAtY;\n\n const bookPos = new THREE.Vector3(x, y, z).multiplyScalar(radius);\n \n (uBook.meta as any).x = bookPos.x;\n (uBook.meta as any).y = bookPos.y;\n (uBook.meta as any).z = bookPos.z;\n\n // 2. Layout Chapters (Constellation)\n const chapters = childrenMap.get(book.id) ?? [];\n if (chapters.length > 0) {\n // Adjust territory: we have 2x more density now (half sphere)\n const territoryRadius = (radius * 2) / Math.sqrt(numBooks * 2) * 0.7; \n const localPoints = getConstellationLayout(bookKey, chapters.length, territoryRadius);\n const up = new THREE.Vector3(0, 1, 0); \n \n chapters.forEach((chap, idx) => {\n const uChap = updatedNodeMap.get(chap.id)!;\n const lp = localPoints[idx];\n const wp = lookAt(lp, bookPos, up);\n\n (uChap.meta as any).x = wp.x;\n (uChap.meta as any).y = wp.y;\n (uChap.meta as any).z = wp.z;\n });\n }\n }\n\n // 1. Divisions (L1)\n const divisions = model.nodes.filter(n => n.level === 1);\n divisions.forEach(d => {\n const children = childrenMap.get(d.id) ?? [];\n if (children.length === 0) return;\n\n const centroid = new THREE.Vector3();\n children.forEach(c => {\n const u = updatedNodeMap.get(c.id)!;\n centroid.add(new THREE.Vector3((u.meta as any).x, (u.meta as any).y, (u.meta as any).z));\n });\n centroid.divideScalar(children.length);\n\n if (centroid.length() > 0.1) {\n centroid.setLength(radius * 0.85); // Float inside\n const uNode = updatedNodeMap.get(d.id)!;\n (uNode.meta as any).x = centroid.x;\n (uNode.meta as any).y = centroid.y;\n (uNode.meta as any).z = centroid.z;\n }\n });\n\n // 2. Testaments (L0)\n const testaments = model.nodes.filter(n => n.level === 0);\n testaments.forEach(t => {\n const children = childrenMap.get(t.id) ?? [];\n if (children.length === 0) return;\n\n const centroid = new THREE.Vector3();\n children.forEach(c => {\n const u = updatedNodeMap.get(c.id)!;\n centroid.add(new THREE.Vector3((u.meta as any).x, (u.meta as any).y, (u.meta as any).z));\n });\n centroid.divideScalar(children.length);\n\n if (centroid.length() > 0.1) {\n centroid.setLength(radius * 0.75); // Float further inside\n const uNode = updatedNodeMap.get(t.id)!;\n (uNode.meta as any).x = centroid.x;\n (uNode.meta as any).y = centroid.y;\n (uNode.meta as any).z = centroid.z;\n }\n });\n\n return { ...model, nodes: updatedNodes };\n }\n\n // --- RADIAL MODE (Existing) ---\n function layoutRadial(nodes: SceneNode[], startAngle: number, totalAngle: number, level: number) {\n if (nodes.length === 0) return;\n nodes.sort((a, b) => a.id.localeCompare(b.id)); // Deterministic\n\n const totalLeaves = nodes.reduce((sum, n) => sum + (leafCounts.get(n.id) ?? 1), 0);\n let currentAngle = startAngle;\n const currentRadius = level === 0 ? 0 : (radius + (level - 1) * ringSpacing);\n\n for (const node of nodes) {\n const weight = leafCounts.get(node.id) ?? 1;\n const nodeAngleSpan = (weight / totalLeaves) * totalAngle;\n const midAngle = currentAngle + nodeAngleSpan / 2;\n\n const updatedNode = updatedNodeMap.get(node.id)!;\n const r = level === 0 ? 0 : currentRadius;\n \n (updatedNode.meta as any).x = Math.cos(midAngle) * r;\n (updatedNode.meta as any).y = Math.sin(midAngle) * r;\n (updatedNode.meta as any).z = 0;\n (updatedNode.meta as any).angle = midAngle;\n\n const children = childrenMap.get(node.id) ?? [];\n if (children.length > 0) {\n layoutRadial(children, currentAngle, nodeAngleSpan, level + 1);\n }\n currentAngle += nodeAngleSpan;\n }\n }\n\n layoutRadial(roots, 0, Math.PI * 2, 0);\n\n return { ...model, nodes: updatedNodes };\n}","import * as THREE from \"three\";\nimport type { SceneModel, StarMapConfig } from \"../types\";\n\nfunction matches(node: any, when: Record<string, unknown>) {\n for (const [k, v] of Object.entries(when)) {\n // check top level first, then meta\n const val = node[k] !== undefined ? node[k] : node.meta?.[k];\n if (val !== v) return false;\n }\n return true;\n}\n\nexport function applyVisuals({\n model,\n cfg,\n meshById\n }: {\n model: SceneModel;\n cfg: StarMapConfig;\n meshById: Map<string, THREE.Object3D>;\n}) {\n const colorRules = cfg.visuals?.colorBy ?? [];\n const sizeRules = cfg.visuals?.sizeBy ?? [];\n\n // precompute min/max for weight scaling\n const weights = model.nodes.map((n) => n.weight).filter((x): x is number => typeof x === \"number\");\n const minW = weights.length ? Math.min(...weights) : 0;\n const maxW = weights.length ? Math.max(...weights) : 1;\n const range = Math.max(0, maxW - minW);\n\n for (const node of model.nodes) {\n const mesh = meshById.get(node.id) as THREE.Mesh | undefined;\n if (!mesh) continue;\n\n // color\n let color: string | undefined;\n for (const rule of colorRules) {\n if (matches(node, rule.when)) {\n color = rule.value;\n break;\n }\n }\n if (color && (mesh.material as any)?.color) {\n (mesh.material as THREE.MeshBasicMaterial).color = new THREE.Color(color);\n }\n\n // size by weight\n for (const rule of sizeRules) {\n if (!matches(node, rule.when)) continue;\n const w = node[rule.field];\n if (typeof w !== \"number\") continue;\n\n const t = range === 0 ? 0.5 : (w - minW) / range;\n const clamped = Math.min(1, Math.max(0, t));\n const s = rule.scale[0] + t * (rule.scale[1] - rule.scale[0]);\n mesh.scale.setScalar(clamped === t ? s : rule.scale[0] + clamped * (rule.scale[1] - rule.scale[0]));\n break;\n }\n }\n}\n","import * as THREE from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls\";\nimport type { StarMapConfig, SceneModel, SceneNode } from \"../types\";\nimport { computeLayoutPositions } from \"./layout\";\nimport { applyVisuals } from \"./materials\";\n\ntype Handlers = {\n onSelect?: (node: SceneNode) => void;\n onHover?: (node?: SceneNode) => void;\n};\n\ntype EngineConfig = {\n // Stellarium-ish “stand in the middle and look out”\n skyRadius?: number; // radius for procedural backdrop stars\n groundRadius?: number; // radius of the ground hemisphere used to occlude “below horizon”\n horizonGlow?: boolean;\n\n // Zoom behaviour (FOV-based)\n defaultFov?: number;\n minFov?: number;\n maxFov?: number;\n fovWheelSensitivity?: number; // deg per wheel deltaY unit (scaled for ctrlKey pinch)\n resetFovOnDblClick?: boolean;\n\n // Click-to-focus behaviour\n focusOnSelect?: boolean;\n focusZoomFov?: number; // fov to animate to on focus\n focusDurationMs?: number;\n};\n\nexport function createEngine({\n container,\n onSelect,\n onHover,\n }: {\n container: HTMLDivElement;\n onSelect?: Handlers[\"onSelect\"];\n onHover?: Handlers[\"onHover\"];\n}) {\n // ---------------------------\n // Renderer / Scene / Camera\n // ---------------------------\n const renderer = new THREE.WebGLRenderer({ antialias: true });\n renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\n renderer.setClearColor(0x000000, 1);\n container.appendChild(renderer.domElement);\n // Prevent browser gestures from fighting pointer controls\n (renderer.domElement.style as any).touchAction = \"none\";\n\n const scene = new THREE.Scene();\n\n const camera = new THREE.PerspectiveCamera(90, 1, 0.1, 5000);\n // Tiny offset so OrbitControls has a radius to work with (like your Angular app)\n camera.position.set(0, 0, 0.01);\n camera.up.set(0, 1, 0);\n\n // ---------------------------\n // Controls: “look around”\n // ---------------------------\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.target.set(0, 0, 0);\n controls.enableRotate = true;\n controls.enablePan = false;\n controls.enableZoom = false; // wheel controls FOV (not dolly)\n controls.enableDamping = true;\n controls.dampingFactor = 0.07;\n controls.screenSpacePanning = false;\n\n // Free yaw; clamp pitch so we don’t go “under” the horizon.\n const EPS = THREE.MathUtils.degToRad(0.05);\n controls.minAzimuthAngle = -Infinity;\n controls.maxAzimuthAngle = Infinity;\n // OrbitControls: 0=top(looking down), PI=bottom(looking up).\n // We want to look UP at the sky, so we need range [PI/2, PI].\n controls.minPolarAngle = Math.PI / 2 + EPS; \n controls.maxPolarAngle = Math.PI - EPS; \n controls.update();\n\n // ---------------------------\n // Stellarium-ish environment\n // ---------------------------\n const env = {\n skyRadius: 2800,\n groundRadius: 995,\n horizonGlow: true,\n\n defaultFov: 90,\n minFov: 1,\n maxFov: 110,\n fovWheelSensitivity: 0.04,\n resetFovOnDblClick: true,\n\n focusOnSelect: false,\n focusZoomFov: 18,\n focusDurationMs: 650,\n } satisfies EngineConfig;\n\n // Ground group: an inside-facing lower hemisphere that WRITES depth\n // => hides below-horizon stars (very Stellarium)\n const groundGroup = new THREE.Group();\n scene.add(groundGroup);\n\n function buildGroundHemisphere(radius: number) {\n groundGroup.clear();\n\n // inside-facing lower hemisphere\n const hemi = new THREE.SphereGeometry(radius, 64, 32, 0, Math.PI * 2, Math.PI / 2, Math.PI);\n hemi.scale(-1, 1, 1);\n\n // vertex color gradient: darker down, brighter near horizon\n const count = (hemi.attributes.position as THREE.BufferAttribute).count;\n const colors = new Float32Array(count * 3);\n const pos = hemi.attributes.position as THREE.BufferAttribute;\n const c = new THREE.Color();\n\n for (let i = 0; i < count; i++) {\n const y = pos.getY(i); // [-radius, 0]\n const t = THREE.MathUtils.clamp(1 - Math.abs(y) / radius, 0, 1);\n // A simple deep-blue to near-horizon glow-ish ramp\n c.setRGB(\n THREE.MathUtils.lerp(0x06 / 255, 0x15 / 255, t),\n THREE.MathUtils.lerp(0x10 / 255, 0x23 / 255, t),\n THREE.MathUtils.lerp(0x17 / 255, 0x35 / 255, t)\n );\n colors.set([c.r, c.g, c.b], i * 3);\n }\n hemi.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\n const groundMat = new THREE.MeshBasicMaterial({\n vertexColors: true,\n side: THREE.FrontSide,\n depthWrite: true, // important: occlude stars under horizon\n depthTest: true,\n });\n\n const hemiMesh = new THREE.Mesh(hemi, groundMat);\n groundGroup.add(hemiMesh);\n\n if (env.horizonGlow) {\n const inner = radius * 0.985;\n const outer = radius * 1.005;\n const ringGeo = new THREE.RingGeometry(inner, outer, 128);\n ringGeo.rotateX(-Math.PI / 2);\n\n const ringMat = new THREE.ShaderMaterial({\n transparent: true,\n depthWrite: false,\n uniforms: {\n uInner: { value: inner },\n uOuter: { value: outer },\n uColor: { value: new THREE.Color(0x7aa2ff) },\n },\n vertexShader: `\n varying vec2 vXY;\n void main() {\n vXY = position.xz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform float uInner;\n uniform float uOuter;\n uniform vec3 uColor;\n varying vec2 vXY;\n\n void main() {\n float r = length(vXY);\n float t = clamp((r - uInner) / (uOuter - uInner), 0.0, 1.0);\n // peak glow near inner edge, fade outwards\n float a = pow(1.0 - t, 2.2) * 0.35;\n gl_FragColor = vec4(uColor, a);\n }\n `,\n });\n\n const ring = new THREE.Mesh(ringGeo, ringMat);\n ring.position.y = 0.0;\n groundGroup.add(ring);\n }\n }\n\n buildGroundHemisphere(env.groundRadius);\n\n // Backdrop stars (procedural points) far beyond your “model stars”\n const backdropGroup = new THREE.Group();\n scene.add(backdropGroup);\n\n function buildBackdropStars(radius: number, count: number) {\n backdropGroup.clear();\n\n const starGeo = new THREE.BufferGeometry();\n const starPos = new Float32Array(count * 3);\n\n for (let i = 0; i < count; i++) {\n const r = radius + Math.random() * (radius * 0.5);\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n starPos[i * 3] = r * Math.sin(phi) * Math.cos(theta);\n starPos[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta);\n starPos[i * 3 + 2] = r * Math.cos(phi);\n }\n\n starGeo.setAttribute(\"position\", new THREE.BufferAttribute(starPos, 3));\n const starMat = new THREE.PointsMaterial({\n color: 0x9aa6b2,\n size: 0.5,\n transparent: true,\n opacity: 0.55,\n depthWrite: false,\n });\n\n const stars = new THREE.Points(starGeo, starMat);\n backdropGroup.add(stars);\n }\n\n buildBackdropStars(env.skyRadius, 6500);\n\n // ---------------------------\n // Picking / Model content\n // ---------------------------\n const raycaster = new THREE.Raycaster();\n const pointer = new THREE.Vector2();\n\n const root = new THREE.Group();\n scene.add(root);\n\n let raf = 0;\n let running = false;\n let handlers: Handlers = { onSelect, onHover };\n let hoveredId: string | null = null;\n let isDragging = false;\n\n const nodeById = new Map<string, SceneNode>();\n const meshById = new Map<string, THREE.Object3D>();\n const lineByBookId = new Map<string, THREE.Line>();\n const dynamicObjects: { obj: THREE.Object3D; initialScale: THREE.Vector3; type: \"star\" | \"label\" }[] = [];\n\n // ---------------------------\n // Resize\n // ---------------------------\n function resize() {\n const w = container.clientWidth || 1;\n const h = container.clientHeight || 1;\n renderer.setSize(w, h, false);\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n }\n\n // ---------------------------\n // Dispose helpers\n // ---------------------------\n function disposeObject(obj: THREE.Object3D) {\n obj.traverse((o: any) => {\n if (o.geometry) o.geometry.dispose?.();\n if (o.material) {\n const mats = Array.isArray(o.material) ? o.material : [o.material];\n mats.forEach((m: any) => {\n if (m.map) m.map.dispose?.();\n m.dispose?.();\n });\n }\n });\n }\n\n function createTextSprite(text: string, color: string = \"#ffffff\") {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n\n const fontSize = 48;\n const font = `bold ${fontSize}px sans-serif`;\n ctx.font = font;\n\n const metrics = ctx.measureText(text);\n const w = Math.ceil(metrics.width);\n const h = Math.ceil(fontSize * 1.2);\n\n canvas.width = w;\n canvas.height = h;\n\n ctx.font = font;\n ctx.fillStyle = color;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, w / 2, h / 2);\n\n const tex = new THREE.CanvasTexture(canvas);\n tex.minFilter = THREE.LinearFilter;\n\n const mat = new THREE.SpriteMaterial({\n map: tex,\n transparent: true,\n depthWrite: false,\n depthTest: true,\n });\n\n const sprite = new THREE.Sprite(mat);\n\n // World-size label (you can later do Stellarium-style pixel fitting if you want)\n const targetHeight = 2;\n const aspect = w / h;\n sprite.scale.set(targetHeight * aspect, targetHeight, 1);\n\n return sprite;\n }\n\n function createStarTexture() {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 64;\n canvas.height = 64;\n const ctx = canvas.getContext(\"2d\")!;\n\n const gradient = ctx.createRadialGradient(32, 32, 0, 32, 32, 32);\n gradient.addColorStop(0, \"rgba(255, 255, 255, 1)\");\n gradient.addColorStop(0.2, \"rgba(255, 255, 255, 0.8)\");\n gradient.addColorStop(0.5, \"rgba(255, 255, 255, 0.2)\");\n gradient.addColorStop(1, \"rgba(255, 255, 255, 0)\");\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 64, 64);\n\n const tex = new THREE.CanvasTexture(canvas);\n return tex;\n }\n\n const starTexture = createStarTexture();\n\n function clearRoot() {\n for (const child of [...root.children]) {\n root.remove(child);\n disposeObject(child);\n }\n nodeById.clear();\n meshById.clear();\n lineByBookId.clear();\n dynamicObjects.length = 0;\n }\n\n function buildFromModel(model: SceneModel, cfg: StarMapConfig) {\n clearRoot();\n\n // background + camera\n if (cfg.background) scene.background = new THREE.Color(cfg.background);\n\n // Respect config FOV if provided, otherwise use Stellarium-ish default\n camera.fov = cfg.camera?.fov ?? env.defaultFov;\n camera.updateProjectionMatrix();\n\n // Default to placing content at a \"sky-like\" radius if not specified\n const layoutCfg = {\n ...cfg.layout,\n radius: cfg.layout?.radius ?? 2000,\n };\n const laidOut = computeLayoutPositions(model, layoutCfg);\n\n // Create meshes\n for (const n of laidOut.nodes) {\n nodeById.set(n.id, n);\n\n const x = (n.meta?.x as number) ?? 0;\n const y = (n.meta?.y as number) ?? 0;\n const z = (n.meta?.z as number) ?? 0;\n\n // Level 3: Chapters -> Stars (Sprites)\n if (n.level === 3) {\n const mat = new THREE.SpriteMaterial({ \n map: starTexture, \n color: 0xffffff,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false\n });\n const sprite = new THREE.Sprite(mat);\n\n sprite.position.set(x, y, z);\n sprite.userData = { id: n.id, level: n.level };\n \n // Base size for stars\n const baseScale = 2.0;\n sprite.scale.setScalar(baseScale);\n\n // Add to dynamic scaling list\n dynamicObjects.push({ obj: sprite, initialScale: sprite.scale.clone(), type: \"star\" });\n\n // Hidden label for hover\n if (n.label) {\n const labelSprite = createTextSprite(n.label);\n if (labelSprite) {\n labelSprite.position.set(0, 1.2, 0);\n labelSprite.visible = false;\n sprite.add(labelSprite);\n }\n }\n\n root.add(sprite);\n meshById.set(n.id, sprite);\n }\n // Level 1 (Division) or 2 (Book) -> Text Labels on the Sky\n else if (n.level === 1 || n.level === 2) {\n if (n.label) {\n // Level 1 (e.g. \"Gospels\") vs Level 2 (e.g. \"John\")\n const isBook = n.level === 2;\n const color = isBook ? \"#ffffff\" : \"#38bdf8\";\n \n // Division labels: smaller, static\n // Book labels: larger, dynamic\n const baseScale = isBook ? 3.0 : 7.0; \n\n const labelSprite = createTextSprite(n.label, color); \n if (labelSprite) {\n labelSprite.position.set(x, y, z);\n labelSprite.scale.multiplyScalar(baseScale);\n root.add(labelSprite);\n\n // Only add Books to dynamicObjects so they scale/fade.\n // Divisions stay static.\n if (isBook) {\n dynamicObjects.push({ obj: labelSprite, initialScale: labelSprite.scale.clone(), type: \"label\" });\n }\n }\n }\n }\n }\n\n applyVisuals({ model: laidOut, cfg, meshById });\n\n\n // ---------------------------\n // Draw Constellation Lines (Sequential)\n // ---------------------------\n const lineMat = new THREE.LineBasicMaterial({\n color: 0x445566,\n transparent: true,\n opacity: 0.3,\n depthWrite: false,\n blending: THREE.AdditiveBlending\n });\n\n // Group by book\n const bookMap = new Map<string, SceneNode[]>();\n for (const n of laidOut.nodes) {\n if (n.level === 3 && n.parent) {\n const list = bookMap.get(n.parent) ?? [];\n list.push(n);\n bookMap.set(n.parent, list);\n }\n }\n\n for (const [bookId, chapters] of bookMap.entries()) {\n // Sort by chapter number\n chapters.sort((a, b) => {\n const cA = (a.meta?.chapter as number) || 0;\n const cB = (b.meta?.chapter as number) || 0;\n return cA - cB;\n });\n\n if (chapters.length < 2) continue;\n\n const points: THREE.Vector3[] = [];\n for (const c of chapters) {\n const x = (c.meta?.x as number) ?? 0;\n const y = (c.meta?.y as number) ?? 0;\n const z = (c.meta?.z as number) ?? 0;\n points.push(new THREE.Vector3(x, y, z));\n }\n\n const geo = new THREE.BufferGeometry().setFromPoints(points);\n const line = new THREE.Line(geo, lineMat);\n root.add(line);\n lineByBookId.set(bookId, line);\n }\n\n resize();\n }\n\n function setConfig(cfg: StarMapConfig) {\n let model = cfg.model;\n if (!model && cfg.data && cfg.adapter) model = cfg.adapter(cfg.data);\n\n if (!model) {\n clearRoot();\n return;\n }\n\n buildFromModel(model, cfg);\n }\n\n function setHandlers(next: Handlers) {\n handlers = next;\n }\n\n function pick(ev: MouseEvent) {\n const rect = renderer.domElement.getBoundingClientRect();\n pointer.x = ((ev.clientX - rect.left) / rect.width) * 2 - 1;\n pointer.y = -(((ev.clientY - rect.top) / rect.height) * 2 - 1);\n\n raycaster.setFromCamera(pointer, camera);\n const hits = raycaster.intersectObjects(root.children, true);\n // pick meshes or sprites\n const hit = hits.find((h) => h.object.type === \"Mesh\" || h.object.type === \"Sprite\");\n const id = hit?.object?.userData?.id as string | undefined;\n return id ? nodeById.get(id) : undefined;\n }\n\n // ---------------------------\n // Hover logic (labels on L3)\n // ---------------------------\n function onPointerMove(ev: PointerEvent) {\n const node = pick(ev);\n const nextId = node?.id ?? null;\n\n if (nextId !== hoveredId) {\n // hide previous hovered L3 label\n if (hoveredId) {\n const prevMesh = meshById.get(hoveredId);\n const prevNode = nodeById.get(hoveredId);\n if (prevMesh && prevNode && prevNode.level === 3) {\n const label = prevMesh.children.find((c) => c instanceof THREE.Sprite);\n if (label) label.visible = false;\n }\n }\n\n hoveredId = nextId;\n\n // show current hovered L3 label\n if (nextId) {\n const mesh = meshById.get(nextId);\n const n = nodeById.get(nextId);\n if (mesh && n && n.level === 3) {\n const label = mesh.children.find((c) => c instanceof THREE.Sprite);\n if (label) {\n label.visible = true;\n // Since we are using sprites now, they look at camera.\n // We might want to offset the label so it doesn't overlap the star.\n label.position.set(0, 0.8, 0); \n }\n\n // Brighten lines on hover\n if (n.parent) {\n const line = lineByBookId.get(n.parent);\n if (line) (line.material as THREE.LineBasicMaterial).opacity = 0.8;\n }\n }\n }\n\n handlers.onHover?.(node);\n }\n }\n\n function onPointerDown() {\n isDragging = false;\n }\n\n function onChange() {\n // OrbitControls fires change while dragging\n isDragging = true;\n }\n\n // ---------------------------\n // Stellarium-ish zoom (FOV)\n // ---------------------------\n const onWheelFov = (ev: WheelEvent) => {\n ev.preventDefault();\n\n // Trackpad pinch on macOS tends to come through as wheel w/ ctrlKey=true\n const speed = (ev.ctrlKey ? 0.15 : 1) * env.fovWheelSensitivity!;\n const next = THREE.MathUtils.clamp(\n camera.fov + ev.deltaY * speed,\n env.minFov!,\n env.maxFov!\n );\n\n if (next !== camera.fov) {\n camera.fov = next;\n camera.updateProjectionMatrix();\n }\n };\n\n const onDblClick = (ev: MouseEvent) => {\n const node = pick(ev);\n if (node) {\n const mesh = meshById.get(node.id);\n if (mesh) {\n animateFocusTo(mesh);\n return;\n }\n }\n\n if (!env.resetFovOnDblClick) return;\n camera.fov = env.defaultFov!;\n camera.updateProjectionMatrix();\n };\n\n // ---------------------------\n // Click-to-focus (aim + zoom)\n // ---------------------------\n let focusAnimRaf = 0;\n\n function cancelFocusAnim() {\n if (focusAnimRaf) cancelAnimationFrame(focusAnimRaf);\n focusAnimRaf = 0;\n }\n\n function getControlsAnglesSafe() {\n // OrbitControls exposes getAzimuthalAngle/getPolarAngle\n const getAz = (controls as any).getAzimuthalAngle?.bind(controls);\n const getPol = (controls as any).getPolarAngle?.bind(controls);\n return {\n azimuth: typeof getAz === \"function\" ? getAz() : 0,\n polar: typeof getPol === \"function\" ? getPol() : Math.PI / 4,\n };\n }\n\n function setControlsAnglesSafe(azimuth: number, polar: number) {\n // Newer three exposes setAzimuthalAngle / setPolarAngle.\n const setAz = (controls as any).setAzimuthalAngle?.bind(controls);\n const setPol = (controls as any).setPolarAngle?.bind(controls);\n\n if (typeof setAz === \"function\" && typeof setPol === \"function\") {\n setAz(azimuth);\n setPol(polar);\n controls.update();\n return;\n }\n\n // Fallback: rotate camera directly to look at a direction\n // (keeps the “standing in the middle” feel even if controls lacks setters)\n const dir = new THREE.Vector3();\n dir.setFromSphericalCoords(1, polar, azimuth);\n const lookAt = dir.clone().multiplyScalar(10);\n camera.lookAt(lookAt);\n }\n\n function aimAtWorldPoint(worldPoint: THREE.Vector3) {\n // We’re “at the origin”, so direction is point normalized.\n // OrbitControls places camera relative to target. To look AT 'dir', camera must be at '-dir'.\n const dir = worldPoint.clone().normalize().negate();\n // Convert direction -> spherical angles compatible with OrbitControls\n // In three: Spherical(phi=polar from +Y, theta=azimuth around Y from +Z toward +X)\n const spherical = new THREE.Spherical().setFromVector3(dir);\n let targetPolar = spherical.phi;\n let targetAz = spherical.theta;\n\n // Clamp to our allowed range (zenith..horizon)\n targetPolar = THREE.MathUtils.clamp(targetPolar, controls.minPolarAngle, controls.maxPolarAngle);\n\n return { targetAz, targetPolar };\n }\n\n function easeInOutCubic(t: number) {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n }\n\n function animateFocusTo(mesh: THREE.Object3D) {\n cancelFocusAnim();\n\n const { azimuth: startAz, polar: startPolar } = getControlsAnglesSafe();\n const startFov = camera.fov;\n\n const { targetAz, targetPolar } = aimAtWorldPoint(mesh.getWorldPosition(new THREE.Vector3()));\n const endFov = THREE.MathUtils.clamp(env.focusZoomFov!, env.minFov!, env.maxFov!);\n\n const start = performance.now();\n const dur = Math.max(120, env.focusDurationMs || 650);\n\n const tick = (now: number) => {\n const t = THREE.MathUtils.clamp((now - start) / dur, 0, 1);\n const k = easeInOutCubic(t);\n\n // Interpolate angles (shortest path for azimuth)\n let dAz = targetAz - startAz;\n // wrap to [-PI, PI]\n dAz = ((dAz + Math.PI) % (Math.PI * 2)) - Math.PI;\n\n const curAz = startAz + dAz * k;\n const curPolar = THREE.MathUtils.lerp(startPolar, targetPolar, k);\n setControlsAnglesSafe(curAz, curPolar);\n\n camera.fov = THREE.MathUtils.lerp(startFov, endFov, k);\n camera.updateProjectionMatrix();\n\n if (t < 1) {\n focusAnimRaf = requestAnimationFrame(tick);\n } else {\n focusAnimRaf = 0;\n }\n };\n\n focusAnimRaf = requestAnimationFrame(tick);\n }\n\n function onPointerUp(ev: PointerEvent) {\n if (isDragging) return;\n\n const node = pick(ev);\n if (!node) return;\n\n // fire your existing handler\n handlers.onSelect?.(node);\n\n // optional: also do Stellarium-like “aim + zoom” on select\n if (env.focusOnSelect) {\n const mesh = meshById.get(node.id);\n if (mesh) animateFocusTo(mesh);\n }\n }\n\n // ---------------------------\n // Lifecycle\n // ---------------------------\n function start() {\n if (running) return;\n running = true;\n\n resize();\n window.addEventListener(\"resize\", resize);\n\n renderer.domElement.addEventListener(\"pointermove\", onPointerMove);\n renderer.domElement.addEventListener(\"pointerdown\", onPointerDown);\n renderer.domElement.addEventListener(\"pointerup\", onPointerUp);\n\n // wheel FOV zoom (passive:false so preventDefault works)\n renderer.domElement.addEventListener(\"wheel\", onWheelFov, { passive: false });\n\n renderer.domElement.addEventListener(\"dblclick\", onDblClick);\n\n controls.addEventListener(\"change\", onChange);\n\n const tick = () => {\n raf = requestAnimationFrame(tick);\n \n // Damping rotation sensitivity based on zoom level\n controls.rotateSpeed = camera.fov / (env.defaultFov || 90);\n \n // Dynamic scaling based on FOV (Zoomed out = larger stars/labels)\n // Reference: FOV 15 is \"close up\" (scale 1x). FOV 90 is \"wide\" (scale larger).\n // Formula: scale = 1 + (fov - 15) * factor\n const fov = camera.fov;\n const minZoomFov = 15; // The FOV where items should be \"normal size\"\n \n // Factor to control how much they grow. \n // We want stars to stay point-like but be visible.\n const scaleFactor = Math.max(1, 1 + (fov - minZoomFov) * 0.05);\n\n // Gaze-based fading for labels\n const cameraDir = new THREE.Vector3();\n camera.getWorldDirection(cameraDir);\n \n // Re-use vector to avoid GC\n const objPos = new THREE.Vector3();\n const objDir = new THREE.Vector3();\n\n for (let i = 0; i < dynamicObjects.length; i++) {\n const item = dynamicObjects[i];\n // Scale from INITIAL vector to preserve aspect ratio\n item.obj.scale.copy(item.initialScale).multiplyScalar(scaleFactor);\n\n // Gaze check for labels\n if (item.type === \"label\") {\n const sprite = item.obj as THREE.Sprite;\n \n // Get direction to object\n // Since camera is at 0,0,0 (mostly), direction is just position normalized.\n // But our camera might be slightly offset (0,0,0.01).\n // Let's be precise:\n sprite.getWorldPosition(objPos);\n objDir.subVectors(objPos, camera.position).normalize();\n \n // Dot product: 1.0 = direct center, 0.0 = 90 deg off\n const dot = cameraDir.dot(objDir);\n \n // Define \"focus cone\"\n // 1.0 -> 0.95 (approx 18 deg): Full opacity\n // 0.95 -> 0.85 (approx 30 deg): Fade out\n // < 0.85: Invisible\n const fullVisibleDot = 0.96;\n const invisibleDot = 0.88;\n \n let opacity = 0;\n if (dot >= fullVisibleDot) {\n opacity = 1;\n } else if (dot > invisibleDot) {\n opacity = (dot - invisibleDot) / (fullVisibleDot - invisibleDot);\n }\n \n // Smooth transition or direct? Direct is fine for now, standard lerp.\n sprite.material.opacity = opacity;\n sprite.visible = opacity > 0.01;\n\n // Also fade the corresponding constellation lines\n const bookId = nodeById.get(item.obj.userData.id)?.id;\n if (bookId) {\n const line = lineByBookId.get(bookId);\n if (line) {\n (line.material as THREE.LineBasicMaterial).opacity = 0.05 + opacity * 0.45;\n }\n }\n }\n }\n\n controls.update();\n renderer.render(scene, camera);\n };\n tick();\n }\n\n function stop() {\n running = false;\n cancelAnimationFrame(raf);\n cancelFocusAnim();\n\n window.removeEventListener(\"resize\", resize);\n\n renderer.domElement.removeEventListener(\"pointermove\", onPointerMove);\n renderer.domElement.removeEventListener(\"pointerdown\", onPointerDown);\n renderer.domElement.removeEventListener(\"pointerup\", onPointerUp);\n renderer.domElement.removeEventListener(\"wheel\", onWheelFov as any);\n renderer.domElement.removeEventListener(\"dblclick\", onDblClick);\n\n controls.removeEventListener(\"change\", onChange);\n }\n\n function dispose() {\n stop();\n clearRoot();\n\n // env groups\n for (const child of [...groundGroup.children]) {\n groundGroup.remove(child);\n disposeObject(child);\n }\n for (const child of [...backdropGroup.children]) {\n backdropGroup.remove(child);\n disposeObject(child);\n }\n\n controls.dispose();\n renderer.dispose();\n renderer.domElement.remove();\n }\n\n return { setConfig, start, stop, dispose, setHandlers };\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport type { StarMapConfig, SceneNode } from \"../types\";\n\nexport type StarMapProps = {\n config: StarMapConfig;\n className?: string;\n onSelect?: (node: SceneNode) => void;\n onHover?: (node?: SceneNode) => void;\n};\n\nexport function StarMap({ config, className, onSelect, onHover }: StarMapProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const engineRef = useRef<any>(null);\n\n useEffect(() => {\n let disposed = false;\n\n async function init() {\n if (!containerRef.current) return;\n const { createEngine } = await import(\"../engine/createEngine\");\n if (disposed) return;\n\n engineRef.current = createEngine({\n container: containerRef.current,\n onSelect,\n onHover\n });\n\n engineRef.current.setConfig(config);\n engineRef.current.start();\n }\n\n init();\n\n return () => {\n disposed = true;\n engineRef.current?.dispose?.();\n engineRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n engineRef.current?.setConfig?.(config);\n }, [config]);\n\n useEffect(() => {\n engineRef.current?.setHandlers?.({ onSelect, onHover });\n }, [onSelect, onHover]);\n\n return <div ref={containerRef} className={className} style={{ width: \"100%\", height: \"100%\" }} />;\n}\n","import type { SceneModel, SceneNode } from \"../types\";\n\nexport type BibleJSON = {\n testaments: Array<{\n name: string;\n divisions: Array<{\n name: string;\n books: Array<{\n key: string;\n name: string;\n chapters: number;\n verses?: number[];\n icons?: string[];\n }>;\n }>;\n }>;\n};\n\nexport function bibleToSceneModel(data: BibleJSON): SceneModel {\n const nodes: SceneNode[] = [];\n const links: SceneModel[\"links\"] = [];\n\n const id = {\n testament: (t: string) => `T:${t}`,\n division: (t: string, d: string) => `D:${t}:${d}`,\n book: (key: string) => `B:${key}`,\n chapter: (key: string, ch: number) => `C:${key}:${ch}`\n };\n\n for (const t of data.testaments) {\n const tid = id.testament(t.name);\n nodes.push({ id: tid, label: t.name, level: 0, meta: { testament: t.name } });\n\n for (const d of t.divisions) {\n const did = id.division(t.name, d.name);\n nodes.push({\n id: did,\n label: d.name,\n level: 1,\n parent: tid,\n meta: { testament: t.name, division: d.name }\n });\n links.push({ source: did, target: tid });\n\n for (const b of d.books) {\n const bid = id.book(b.key);\n nodes.push({\n id: bid,\n label: b.name,\n level: 2,\n parent: did,\n meta: { testament: t.name, division: d.name, bookKey: b.key, book: b.name }\n });\n links.push({ source: bid, target: did });\n\n const verses = b.verses ?? [];\n for (let i = 0; i < verses.length; i++) {\n const chapterNum = i + 1;\n const cid = id.chapter(b.key, chapterNum);\n nodes.push({\n id: cid,\n label: `${b.name} ${chapterNum}`,\n level: 3,\n parent: bid,\n weight: verses[i],\n icon: b.icons?.[i] ?? b.icons?.[0], \n meta: {\n testament: t.name,\n division: d.name,\n bookKey: b.key,\n book: b.name,\n chapter: chapterNum\n }\n });\n links.push({ source: cid, target: bid });\n }\n }\n }\n }\n\n return { nodes, links };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/engine/constellations.ts","../src/engine/layout.ts","../src/engine/materials.ts","../src/engine/createEngine.ts","../src/react/StarMap.tsx","../src/adapters/bible.ts"],"names":["THREE2","THREE3","THREE4","OrbitControls","lookAt","start","useRef","useEffect","createEngine","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as THREE from \"three\";\n\nexport type Point3D = { x: number; y: number; z: number };\n\n// Helper to rotate a point in 3D space\nfunction rotatePoint(point: Point3D, euler: THREE.Euler): Point3D {\n const v = new THREE.Vector3(point.x, point.y, point.z);\n v.applyEuler(euler);\n return { x: v.x, y: v.y, z: v.z };\n}\n\n/**\n * Generates a Golden Spiral (Galaxy-like).\n * Good for books with many chapters (Gen, Psalms, etc).\n */\nexport function layoutSpiral(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n const goldenAngle = Math.PI * (3 - Math.sqrt(5)); // ~2.4 radians\n\n for (let i = 0; i < count; i++) {\n // radius grows with sqrt of index to keep area constant\n const r = radius * Math.sqrt((i + 1) / count); \n const theta = i * goldenAngle;\n\n const x = r * Math.cos(theta);\n const z = r * Math.sin(theta);\n \n // slight variation in y for 3D depth, but mostly flat disc\n const y = (Math.random() - 0.5) * (radius * 0.1); \n\n points.push({ x, y, z });\n }\n return points;\n}\n\n/**\n * Generates a Cross shape.\n * Vertical bar is longer, horizontal bar crosses near top.\n */\nexport function layoutCross(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n \n // Split chapters: 70% vertical, 30% horizontal\n const verticalCount = Math.ceil(count * 0.7);\n const horizontalCount = count - verticalCount;\n \n const height = radius * 2.5;\n const width = radius * 1.5;\n\n // Vertical beam (top to bottom)\n for (let i = 0; i < verticalCount; i++) {\n const t = i / (verticalCount - 1 || 1); // 0..1\n // x=0, z=0\n const y = (height / 2) - t * height; \n points.push({ x: 0, y, z: 0 });\n }\n\n // Horizontal beam (left to right)\n // Crosses at roughly 30% from top of vertical\n const crossY = (height / 2) - (height * 0.3);\n\n for (let i = 0; i < horizontalCount; i++) {\n const t = i / (horizontalCount - 1 || 1); // 0..1\n const x = (-width / 2) + t * width;\n points.push({ x, y: crossY, z: 0 });\n }\n\n return points;\n}\n\n/**\n * Generates a Tablet/Grid shape (for Law).\n * Two columns of stars.\n */\nexport function layoutTablet(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n const cols = 2;\n const rows = Math.ceil(count / cols);\n const w = radius * 1.5;\n const h = radius * 2.0;\n\n for (let i = 0; i < count; i++) {\n const col = i % cols;\n const row = Math.floor(i / cols);\n \n // x: -w/2 or +w/2\n const x = (col === 0 ? -1 : 1) * (w * 0.25);\n // y: top to bottom\n const y = (h / 2) - (row / (rows - 1 || 1)) * h;\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Crown shape (for Kings/Chronicles).\n * A semi-circle/circle with \"spikes\".\n */\nexport function layoutCrown(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n // Semi-circle arc (from -PI/2 to PI/2?) or full circle?\n // Let's do a wide arc \"smile\" shape pointing up.\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1); \n const angle = -Math.PI * 0.8 + t * Math.PI * 1.6; // wide arc\n \n // Base arc\n let r = radius;\n // Spikes: every 3rd star is higher?\n if (i % 3 === 1) r *= 1.4;\n\n const x = r * Math.sin(angle);\n const y = r * Math.cos(angle) * 0.5; // flatten height\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Harp shape (for Psalms).\n * A frame with \"strings\".\n */\nexport function layoutHarp(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n // A simple triangle frame\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1);\n \n // Parametric curve for a harp-ish shape\n // x goes left to right\n const x = (-radius) + t * (radius * 2);\n \n // y follows a curve\n // rapid rise on right side\n const y = (-radius) + Math.pow(t, 2) * (radius * 2);\n\n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Flame/Teardrop shape (for Acts).\n */\nexport function layoutFlame(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1) * Math.PI * 2; // 0 to 2PI\n // Spiral tapering up?\n // Let's do a simple parametric teardrop\n \n // Distribute points along the perimeter of a teardrop\n // Parametric eq: x = cos(t), y = sin(t) * sin(t/2)^m\n \n // Actually, just a noisy vertical spiral looks good as fire\n const tNorm = i / count; \n const r = radius * (1 - tNorm) * 0.8; // tapering radius\n const angle = tNorm * Math.PI * 4; // 2 turns\n const y = (tNorm - 0.5) * radius * 3; // tall\n\n const x = r * Math.cos(angle);\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Registry mapping Book Keys (e.g., \"MAT\") to Layout Functions\n */\nconst LAYOUT_REGISTRY: Record<string, (c: number, r: number) => Point3D[]> = {\n // Law -> Tablet\n \"GEN\": layoutTablet,\n \"EXO\": layoutTablet,\n \"LEV\": layoutTablet,\n \"NUM\": layoutTablet,\n \"DEU\": layoutTablet,\n\n // Kings/History -> Crown\n \"1SA\": layoutCrown,\n \"2SA\": layoutCrown,\n \"1KI\": layoutCrown,\n \"2KI\": layoutCrown,\n \"1CH\": layoutCrown,\n \"2CH\": layoutCrown,\n\n // Poetry -> Harp/Spiral\n \"PSA\": layoutHarp,\n \"SNG\": layoutHarp,\n\n // Gospels -> Cross\n \"MAT\": layoutCross,\n \"MRK\": layoutCross,\n \"LUK\": layoutCross,\n \"JHN\": layoutCross,\n \n // Acts -> Flame\n \"ACT\": layoutFlame,\n};\n\nexport function getConstellationLayout(bookKey: string, chapterCount: number, radius: number): Point3D[] {\n const generator = LAYOUT_REGISTRY[bookKey] || layoutSpiral;\n return generator(chapterCount, radius);\n}\n","import * as THREE from \"three\";\nimport type { SceneModel, SceneNode } from \"../types\";\nimport { getConstellationLayout, Point3D } from \"./constellations\";\n\n// Helper: Rotate point P to look at Target T (from 0,0,0)\nfunction lookAt(point: Point3D, target: THREE.Vector3, up: THREE.Vector3): Point3D {\n // We create a rotation matrix that rotates (0,0,1) to 'target'\n // and apply it to 'point' (which is defined in a local XY plane usually)\n \n // For simplicity: We want to place the constellation (defined flat on XY or XZ)\n // tangent to the sphere surface at 'target'.\n \n const zAxis = target.clone().normalize(); // The \"Normal\" of the book center\n const xAxis = new THREE.Vector3().crossVectors(up, zAxis).normalize();\n const yAxis = new THREE.Vector3().crossVectors(zAxis, xAxis).normalize();\n\n const m = new THREE.Matrix4().makeBasis(xAxis, yAxis, zAxis);\n const v = new THREE.Vector3(point.x, point.y, point.z);\n v.applyMatrix4(m); // Rotate\n v.add(target); // Translate\n \n return { x: v.x, y: v.y, z: v.z };\n}\n\nexport function computeLayoutPositions(\n model: SceneModel,\n layout?: { mode?: \"radial\" | \"grid\" | \"force\" | \"spherical\"; radius?: number; chapterRingSpacing?: number }\n): SceneModel {\n const mode = layout?.mode ?? \"spherical\";\n const radius = layout?.radius ?? 2000;\n const ringSpacing = layout?.chapterRingSpacing ?? 15;\n\n const childrenMap = new Map<string, SceneNode[]>();\n const roots: SceneNode[] = [];\n const books: SceneNode[] = [];\n\n // Build hierarchy\n for (const n of model.nodes) {\n if (n.level === 2) books.push(n); // Collect books for spherical layout\n if (n.parent) {\n const children = childrenMap.get(n.parent) ?? [];\n children.push(n);\n childrenMap.set(n.parent, children);\n } else {\n roots.push(n);\n }\n }\n\n const updatedNodes = model.nodes.map((n) => ({ ...n, meta: { ...(n.meta ?? {}) } }));\n const updatedNodeMap = new Map(updatedNodes.map(n => [n.id, n]));\n const leafCounts = new Map<string, number>();\n\n // Helper: Count leaves\n function getLeafCount(node: SceneNode): number {\n const children = childrenMap.get(node.id) ?? [];\n if (children.length === 0) {\n leafCounts.set(node.id, 1);\n return 1;\n }\n let count = 0;\n for (const c of children) count += getLeafCount(c);\n leafCounts.set(node.id, count);\n return count;\n }\n roots.forEach(getLeafCount);\n\n // --- SPHERICAL MODE ---\n if (mode === \"spherical\") {\n const numBooks = books.length;\n const phi = Math.PI * (3 - Math.sqrt(5)); // Golden Angle\n\n // Fibonacci Sphere Distribution for Books (Upper Hemisphere Only)\n for (let i = 0; i < numBooks; i++) {\n const book = books[i];\n const uBook = updatedNodeMap.get(book.id)!;\n const bookKey = (uBook.meta as any).bookKey as string;\n\n // y goes from 1.0 (zenith) to 0.05 (just above horizon)\n const y = 1.0 - (i / (numBooks - 1)) * 0.95; \n const radiusAtY = Math.sqrt(1 - y * y);\n const theta = phi * i;\n\n const x = Math.cos(theta) * radiusAtY;\n const z = Math.sin(theta) * radiusAtY;\n\n const bookPos = new THREE.Vector3(x, y, z).multiplyScalar(radius);\n \n (uBook.meta as any).x = bookPos.x;\n (uBook.meta as any).y = bookPos.y;\n (uBook.meta as any).z = bookPos.z;\n\n // 2. Layout Chapters (Constellation)\n const chapters = childrenMap.get(book.id) ?? [];\n if (chapters.length > 0) {\n // Adjust territory: we have 2x more density now (half sphere)\n const territoryRadius = (radius * 2) / Math.sqrt(numBooks * 2) * 0.7; \n const localPoints = getConstellationLayout(bookKey, chapters.length, territoryRadius);\n const up = new THREE.Vector3(0, 1, 0); \n \n chapters.forEach((chap, idx) => {\n const uChap = updatedNodeMap.get(chap.id)!;\n const lp = localPoints[idx];\n const wp = lookAt(lp, bookPos, up);\n\n (uChap.meta as any).x = wp.x;\n (uChap.meta as any).y = wp.y;\n (uChap.meta as any).z = wp.z;\n });\n }\n }\n\n // 1. Divisions (L1)\n const divisions = model.nodes.filter(n => n.level === 1);\n divisions.forEach(d => {\n const children = childrenMap.get(d.id) ?? [];\n if (children.length === 0) return;\n\n const centroid = new THREE.Vector3();\n children.forEach(c => {\n const u = updatedNodeMap.get(c.id)!;\n centroid.add(new THREE.Vector3((u.meta as any).x, (u.meta as any).y, (u.meta as any).z));\n });\n centroid.divideScalar(children.length);\n\n if (centroid.length() > 0.1) {\n centroid.setLength(radius * 0.85); // Float inside\n const uNode = updatedNodeMap.get(d.id)!;\n (uNode.meta as any).x = centroid.x;\n (uNode.meta as any).y = centroid.y;\n (uNode.meta as any).z = centroid.z;\n }\n });\n\n // 2. Testaments (L0)\n const testaments = model.nodes.filter(n => n.level === 0);\n testaments.forEach(t => {\n const children = childrenMap.get(t.id) ?? [];\n if (children.length === 0) return;\n\n const centroid = new THREE.Vector3();\n children.forEach(c => {\n const u = updatedNodeMap.get(c.id)!;\n centroid.add(new THREE.Vector3((u.meta as any).x, (u.meta as any).y, (u.meta as any).z));\n });\n centroid.divideScalar(children.length);\n\n if (centroid.length() > 0.1) {\n centroid.setLength(radius * 0.75); // Float further inside\n const uNode = updatedNodeMap.get(t.id)!;\n (uNode.meta as any).x = centroid.x;\n (uNode.meta as any).y = centroid.y;\n (uNode.meta as any).z = centroid.z;\n }\n });\n\n return { ...model, nodes: updatedNodes };\n }\n\n // --- RADIAL MODE (Existing) ---\n function layoutRadial(nodes: SceneNode[], startAngle: number, totalAngle: number, level: number) {\n if (nodes.length === 0) return;\n nodes.sort((a, b) => a.id.localeCompare(b.id)); // Deterministic\n\n const totalLeaves = nodes.reduce((sum, n) => sum + (leafCounts.get(n.id) ?? 1), 0);\n let currentAngle = startAngle;\n const currentRadius = level === 0 ? 0 : (radius + (level - 1) * ringSpacing);\n\n for (const node of nodes) {\n const weight = leafCounts.get(node.id) ?? 1;\n const nodeAngleSpan = (weight / totalLeaves) * totalAngle;\n const midAngle = currentAngle + nodeAngleSpan / 2;\n\n const updatedNode = updatedNodeMap.get(node.id)!;\n const r = level === 0 ? 0 : currentRadius;\n \n (updatedNode.meta as any).x = Math.cos(midAngle) * r;\n (updatedNode.meta as any).y = Math.sin(midAngle) * r;\n (updatedNode.meta as any).z = 0;\n (updatedNode.meta as any).angle = midAngle;\n\n const children = childrenMap.get(node.id) ?? [];\n if (children.length > 0) {\n layoutRadial(children, currentAngle, nodeAngleSpan, level + 1);\n }\n currentAngle += nodeAngleSpan;\n }\n }\n\n layoutRadial(roots, 0, Math.PI * 2, 0);\n\n return { ...model, nodes: updatedNodes };\n}","import * as THREE from \"three\";\nimport type { SceneModel, StarMapConfig } from \"../types\";\n\nfunction matches(node: any, when: Record<string, unknown>) {\n for (const [k, v] of Object.entries(when)) {\n // check top level first, then meta\n const val = node[k] !== undefined ? node[k] : node.meta?.[k];\n if (val !== v) return false;\n }\n return true;\n}\n\nexport function applyVisuals({\n model,\n cfg,\n meshById\n }: {\n model: SceneModel;\n cfg: StarMapConfig;\n meshById: Map<string, THREE.Object3D>;\n}) {\n const colorRules = cfg.visuals?.colorBy ?? [];\n const sizeRules = cfg.visuals?.sizeBy ?? [];\n\n // precompute min/max for weight scaling\n const weights = model.nodes.map((n) => n.weight).filter((x): x is number => typeof x === \"number\");\n const minW = weights.length ? Math.min(...weights) : 0;\n const maxW = weights.length ? Math.max(...weights) : 1;\n const range = Math.max(0, maxW - minW);\n\n for (const node of model.nodes) {\n const mesh = meshById.get(node.id) as THREE.Mesh | undefined;\n if (!mesh) continue;\n\n // color\n let color: string | undefined;\n for (const rule of colorRules) {\n if (matches(node, rule.when)) {\n color = rule.value;\n break;\n }\n }\n if (color && (mesh.material as any)?.color) {\n (mesh.material as THREE.MeshBasicMaterial).color = new THREE.Color(color);\n }\n\n // size by weight\n for (const rule of sizeRules) {\n if (!matches(node, rule.when)) continue;\n const w = node[rule.field];\n if (typeof w !== \"number\") continue;\n\n const t = range === 0 ? 0.5 : (w - minW) / range;\n const clamped = Math.min(1, Math.max(0, t));\n const s = rule.scale[0] + t * (rule.scale[1] - rule.scale[0]);\n mesh.scale.setScalar(clamped === t ? s : rule.scale[0] + clamped * (rule.scale[1] - rule.scale[0]));\n break;\n }\n }\n}\n","import * as THREE from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls\";\nimport type { StarMapConfig, SceneModel, SceneNode } from \"../types\";\nimport { computeLayoutPositions } from \"./layout\";\nimport { applyVisuals } from \"./materials\";\n\ntype Handlers = {\n onSelect?: (node: SceneNode) => void;\n onHover?: (node?: SceneNode) => void;\n};\n\ntype EngineConfig = {\n // Stellarium-ish “stand in the middle and look out”\n skyRadius?: number; // radius for procedural backdrop stars\n groundRadius?: number; // radius of the ground hemisphere used to occlude “below horizon”\n horizonGlow?: boolean;\n\n // Zoom behaviour (FOV-based)\n defaultFov?: number;\n minFov?: number;\n maxFov?: number;\n fovWheelSensitivity?: number; // deg per wheel deltaY unit (scaled for ctrlKey pinch)\n resetFovOnDblClick?: boolean;\n\n // Click-to-focus behaviour\n focusOnSelect?: boolean;\n focusZoomFov?: number; // fov to animate to on focus\n focusDurationMs?: number;\n};\n\nexport function createEngine({\n container,\n onSelect,\n onHover,\n }: {\n container: HTMLDivElement;\n onSelect?: Handlers[\"onSelect\"];\n onHover?: Handlers[\"onHover\"];\n}) {\n // ---------------------------\n // Renderer / Scene / Camera\n // ---------------------------\n const renderer = new THREE.WebGLRenderer({ antialias: true });\n renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\n renderer.setClearColor(0x000000, 1);\n container.appendChild(renderer.domElement);\n // Prevent browser gestures from fighting pointer controls\n (renderer.domElement.style as any).touchAction = \"none\";\n\n const scene = new THREE.Scene();\n\n const camera = new THREE.PerspectiveCamera(90, 1, 0.1, 5000);\n // Tiny offset so OrbitControls has a radius to work with (like your Angular app)\n camera.position.set(0, 0, 0.01);\n camera.up.set(0, 1, 0);\n\n // ---------------------------\n // Controls: “look around”\n // ---------------------------\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.target.set(0, 0, 0);\n controls.enableRotate = true;\n controls.enablePan = false;\n controls.enableZoom = false; // wheel controls FOV (not dolly)\n controls.enableDamping = true;\n controls.dampingFactor = 0.07;\n controls.screenSpacePanning = false;\n\n // Free yaw; clamp pitch so we don’t go “under” the horizon.\n const EPS = THREE.MathUtils.degToRad(0.05);\n controls.minAzimuthAngle = -Infinity;\n controls.maxAzimuthAngle = Infinity;\n // OrbitControls: 0=top(looking down), PI=bottom(looking up).\n // We want to look UP at the sky, so we need range [PI/2, PI].\n controls.minPolarAngle = Math.PI / 2 + EPS; \n controls.maxPolarAngle = Math.PI - EPS; \n controls.update();\n\n // ---------------------------\n // Stellarium-ish environment\n // ---------------------------\n const env = {\n skyRadius: 2800,\n groundRadius: 995,\n horizonGlow: true,\n\n defaultFov: 90,\n minFov: 1,\n maxFov: 110,\n fovWheelSensitivity: 0.04,\n resetFovOnDblClick: true,\n\n focusOnSelect: false,\n focusZoomFov: 18,\n focusDurationMs: 650,\n } satisfies EngineConfig;\n\n // Ground group: an inside-facing lower hemisphere that WRITES depth\n // => hides below-horizon stars (very Stellarium)\n const groundGroup = new THREE.Group();\n scene.add(groundGroup);\n\n function buildGroundHemisphere(radius: number) {\n groundGroup.clear();\n\n // inside-facing lower hemisphere\n const hemi = new THREE.SphereGeometry(radius, 64, 32, 0, Math.PI * 2, Math.PI / 2, Math.PI);\n hemi.scale(-1, 1, 1);\n\n // vertex color gradient: darker down, brighter near horizon\n const count = (hemi.attributes.position as THREE.BufferAttribute).count;\n const colors = new Float32Array(count * 3);\n const pos = hemi.attributes.position as THREE.BufferAttribute;\n const c = new THREE.Color();\n\n for (let i = 0; i < count; i++) {\n const y = pos.getY(i); // [-radius, 0]\n const t = THREE.MathUtils.clamp(1 - Math.abs(y) / radius, 0, 1);\n // A simple deep-blue to near-horizon glow-ish ramp\n c.setRGB(\n THREE.MathUtils.lerp(0x06 / 255, 0x15 / 255, t),\n THREE.MathUtils.lerp(0x10 / 255, 0x23 / 255, t),\n THREE.MathUtils.lerp(0x17 / 255, 0x35 / 255, t)\n );\n colors.set([c.r, c.g, c.b], i * 3);\n }\n hemi.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\n const groundMat = new THREE.MeshBasicMaterial({\n vertexColors: true,\n side: THREE.FrontSide,\n depthWrite: true, // important: occlude stars under horizon\n depthTest: true,\n });\n\n const hemiMesh = new THREE.Mesh(hemi, groundMat);\n groundGroup.add(hemiMesh);\n\n if (env.horizonGlow) {\n const inner = radius * 0.985;\n const outer = radius * 1.005;\n const ringGeo = new THREE.RingGeometry(inner, outer, 128);\n ringGeo.rotateX(-Math.PI / 2);\n\n const ringMat = new THREE.ShaderMaterial({\n transparent: true,\n depthWrite: false,\n uniforms: {\n uInner: { value: inner },\n uOuter: { value: outer },\n uColor: { value: new THREE.Color(0x7aa2ff) },\n },\n vertexShader: `\n varying vec2 vXY;\n void main() {\n vXY = position.xz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform float uInner;\n uniform float uOuter;\n uniform vec3 uColor;\n varying vec2 vXY;\n\n void main() {\n float r = length(vXY);\n float t = clamp((r - uInner) / (uOuter - uInner), 0.0, 1.0);\n // peak glow near inner edge, fade outwards\n float a = pow(1.0 - t, 2.2) * 0.35;\n gl_FragColor = vec4(uColor, a);\n }\n `,\n });\n\n const ring = new THREE.Mesh(ringGeo, ringMat);\n ring.position.y = 0.0;\n groundGroup.add(ring);\n }\n }\n\n buildGroundHemisphere(env.groundRadius);\n\n // Backdrop stars (procedural points) far beyond your “model stars”\n const backdropGroup = new THREE.Group();\n scene.add(backdropGroup);\n\n function buildBackdropStars(radius: number, count: number) {\n backdropGroup.clear();\n\n const starGeo = new THREE.BufferGeometry();\n const starPos = new Float32Array(count * 3);\n\n for (let i = 0; i < count; i++) {\n const r = radius + Math.random() * (radius * 0.5);\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n starPos[i * 3] = r * Math.sin(phi) * Math.cos(theta);\n starPos[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta);\n starPos[i * 3 + 2] = r * Math.cos(phi);\n }\n\n starGeo.setAttribute(\"position\", new THREE.BufferAttribute(starPos, 3));\n const starMat = new THREE.PointsMaterial({\n color: 0x9aa6b2,\n size: 0.5,\n transparent: true,\n opacity: 0.55,\n depthWrite: false,\n });\n\n const stars = new THREE.Points(starGeo, starMat);\n backdropGroup.add(stars);\n }\n\n buildBackdropStars(env.skyRadius, 6500);\n\n // ---------------------------\n // Picking / Model content\n // ---------------------------\n const raycaster = new THREE.Raycaster();\n const pointer = new THREE.Vector2();\n\n const root = new THREE.Group();\n scene.add(root);\n\n let raf = 0;\n let running = false;\n let handlers: Handlers = { onSelect, onHover };\n let hoveredId: string | null = null;\n let isDragging = false;\n\n const nodeById = new Map<string, SceneNode>();\n const meshById = new Map<string, THREE.Object3D>();\n const lineByBookId = new Map<string, THREE.Line>();\n const dynamicObjects: { obj: THREE.Object3D; initialScale: THREE.Vector3; type: \"star\" | \"label\" }[] = [];\n\n // ---------------------------\n // Resize\n // ---------------------------\n function resize() {\n const w = container.clientWidth || 1;\n const h = container.clientHeight || 1;\n renderer.setSize(w, h, false);\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n }\n\n // ---------------------------\n // Dispose helpers\n // ---------------------------\n function disposeObject(obj: THREE.Object3D) {\n obj.traverse((o: any) => {\n if (o.geometry) o.geometry.dispose?.();\n if (o.material) {\n const mats = Array.isArray(o.material) ? o.material : [o.material];\n mats.forEach((m: any) => {\n if (m.map) m.map.dispose?.();\n m.dispose?.();\n });\n }\n });\n }\n\n function createTextSprite(text: string, color: string = \"#ffffff\") {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n\n const fontSize = 48;\n const font = `bold ${fontSize}px sans-serif`;\n ctx.font = font;\n\n const metrics = ctx.measureText(text);\n const w = Math.ceil(metrics.width);\n const h = Math.ceil(fontSize * 1.2);\n\n canvas.width = w;\n canvas.height = h;\n\n ctx.font = font;\n ctx.fillStyle = color;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, w / 2, h / 2);\n\n const tex = new THREE.CanvasTexture(canvas);\n tex.minFilter = THREE.LinearFilter;\n\n const mat = new THREE.SpriteMaterial({\n map: tex,\n transparent: true,\n depthWrite: false,\n depthTest: true,\n });\n\n const sprite = new THREE.Sprite(mat);\n\n // World-size label (you can later do Stellarium-style pixel fitting if you want)\n const targetHeight = 2;\n const aspect = w / h;\n sprite.scale.set(targetHeight * aspect, targetHeight, 1);\n\n return sprite;\n }\n\n function createStarTexture() {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 64;\n canvas.height = 64;\n const ctx = canvas.getContext(\"2d\")!;\n\n const gradient = ctx.createRadialGradient(32, 32, 0, 32, 32, 32);\n gradient.addColorStop(0, \"rgba(255, 255, 255, 1)\");\n gradient.addColorStop(0.2, \"rgba(255, 255, 255, 0.8)\");\n gradient.addColorStop(0.5, \"rgba(255, 255, 255, 0.2)\");\n gradient.addColorStop(1, \"rgba(255, 255, 255, 0)\");\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 64, 64);\n\n const tex = new THREE.CanvasTexture(canvas);\n return tex;\n }\n\n const starTexture = createStarTexture();\n\n function clearRoot() {\n for (const child of [...root.children]) {\n root.remove(child);\n disposeObject(child);\n }\n nodeById.clear();\n meshById.clear();\n lineByBookId.clear();\n dynamicObjects.length = 0;\n }\n\n function buildFromModel(model: SceneModel, cfg: StarMapConfig) {\n clearRoot();\n\n // background + camera\n if (cfg.background && cfg.background !== \"transparent\") {\n scene.background = new THREE.Color(cfg.background);\n } else {\n scene.background = null;\n }\n\n // Respect config FOV if provided, otherwise use Stellarium-ish default\n camera.fov = cfg.camera?.fov ?? env.defaultFov;\n camera.updateProjectionMatrix();\n\n // Default to placing content at a \"sky-like\" radius if not specified\n const layoutCfg = {\n ...cfg.layout,\n radius: cfg.layout?.radius ?? 2000,\n };\n const laidOut = computeLayoutPositions(model, layoutCfg);\n\n // Create meshes\n for (const n of laidOut.nodes) {\n nodeById.set(n.id, n);\n\n const x = (n.meta?.x as number) ?? 0;\n const y = (n.meta?.y as number) ?? 0;\n const z = (n.meta?.z as number) ?? 0;\n\n // Level 3: Chapters -> Stars (Sprites)\n if (n.level === 3) {\n const mat = new THREE.SpriteMaterial({ \n map: starTexture, \n color: 0xffffff,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false\n });\n const sprite = new THREE.Sprite(mat);\n\n sprite.position.set(x, y, z);\n sprite.userData = { id: n.id, level: n.level };\n \n // Base size for stars\n const baseScale = 2.0;\n sprite.scale.setScalar(baseScale);\n\n // Add to dynamic scaling list\n dynamicObjects.push({ obj: sprite, initialScale: sprite.scale.clone(), type: \"star\" });\n\n // Hidden label for hover\n if (n.label) {\n const labelSprite = createTextSprite(n.label);\n if (labelSprite) {\n labelSprite.position.set(0, 1.2, 0);\n labelSprite.visible = false;\n sprite.add(labelSprite);\n }\n }\n\n root.add(sprite);\n meshById.set(n.id, sprite);\n }\n // Level 1 (Division) or 2 (Book) -> Text Labels on the Sky\n else if (n.level === 1 || n.level === 2) {\n if (n.label) {\n // Level 1 (e.g. \"Gospels\") vs Level 2 (e.g. \"John\")\n const isBook = n.level === 2;\n const color = isBook ? \"#ffffff\" : \"#38bdf8\";\n \n // Division labels: smaller, static\n // Book labels: larger, dynamic\n const baseScale = isBook ? 3.0 : 7.0; \n\n const labelSprite = createTextSprite(n.label, color); \n if (labelSprite) {\n labelSprite.position.set(x, y, z);\n labelSprite.scale.multiplyScalar(baseScale);\n root.add(labelSprite);\n\n // Only add Books to dynamicObjects so they scale/fade.\n // Divisions stay static.\n if (isBook) {\n dynamicObjects.push({ obj: labelSprite, initialScale: labelSprite.scale.clone(), type: \"label\" });\n }\n }\n }\n }\n }\n\n applyVisuals({ model: laidOut, cfg, meshById });\n\n\n // ---------------------------\n // Draw Constellation Lines (Sequential)\n // ---------------------------\n const lineMat = new THREE.LineBasicMaterial({\n color: 0x445566,\n transparent: true,\n opacity: 0.3,\n depthWrite: false,\n blending: THREE.AdditiveBlending\n });\n\n // Group by book\n const bookMap = new Map<string, SceneNode[]>();\n for (const n of laidOut.nodes) {\n if (n.level === 3 && n.parent) {\n const list = bookMap.get(n.parent) ?? [];\n list.push(n);\n bookMap.set(n.parent, list);\n }\n }\n\n for (const [bookId, chapters] of bookMap.entries()) {\n // Sort by chapter number\n chapters.sort((a, b) => {\n const cA = (a.meta?.chapter as number) || 0;\n const cB = (b.meta?.chapter as number) || 0;\n return cA - cB;\n });\n\n if (chapters.length < 2) continue;\n\n const points: THREE.Vector3[] = [];\n for (const c of chapters) {\n const x = (c.meta?.x as number) ?? 0;\n const y = (c.meta?.y as number) ?? 0;\n const z = (c.meta?.z as number) ?? 0;\n points.push(new THREE.Vector3(x, y, z));\n }\n\n const geo = new THREE.BufferGeometry().setFromPoints(points);\n const line = new THREE.Line(geo, lineMat);\n root.add(line);\n lineByBookId.set(bookId, line);\n }\n\n resize();\n }\n\n function setConfig(cfg: StarMapConfig) {\n let model = cfg.model;\n if (!model && cfg.data && cfg.adapter) model = cfg.adapter(cfg.data);\n\n if (!model) {\n clearRoot();\n return;\n }\n\n buildFromModel(model, cfg);\n }\n\n function setHandlers(next: Handlers) {\n handlers = next;\n }\n\n function pick(ev: MouseEvent) {\n const rect = renderer.domElement.getBoundingClientRect();\n pointer.x = ((ev.clientX - rect.left) / rect.width) * 2 - 1;\n pointer.y = -(((ev.clientY - rect.top) / rect.height) * 2 - 1);\n\n raycaster.setFromCamera(pointer, camera);\n const hits = raycaster.intersectObjects(root.children, true);\n // pick meshes or sprites\n const hit = hits.find((h) => h.object.type === \"Mesh\" || h.object.type === \"Sprite\");\n const id = hit?.object?.userData?.id as string | undefined;\n return id ? nodeById.get(id) : undefined;\n }\n\n // ---------------------------\n // Hover logic (labels on L3)\n // ---------------------------\n function onPointerMove(ev: PointerEvent) {\n const node = pick(ev);\n const nextId = node?.id ?? null;\n\n if (nextId !== hoveredId) {\n // hide previous hovered L3 label\n if (hoveredId) {\n const prevMesh = meshById.get(hoveredId);\n const prevNode = nodeById.get(hoveredId);\n if (prevMesh && prevNode && prevNode.level === 3) {\n const label = prevMesh.children.find((c) => c instanceof THREE.Sprite);\n if (label) label.visible = false;\n }\n }\n\n hoveredId = nextId;\n\n // show current hovered L3 label\n if (nextId) {\n const mesh = meshById.get(nextId);\n const n = nodeById.get(nextId);\n if (mesh && n && n.level === 3) {\n const label = mesh.children.find((c) => c instanceof THREE.Sprite);\n if (label) {\n label.visible = true;\n // Since we are using sprites now, they look at camera.\n // We might want to offset the label so it doesn't overlap the star.\n label.position.set(0, 0.8, 0); \n }\n\n // Brighten lines on hover\n if (n.parent) {\n const line = lineByBookId.get(n.parent);\n if (line) (line.material as THREE.LineBasicMaterial).opacity = 0.8;\n }\n }\n }\n\n handlers.onHover?.(node);\n }\n }\n\n function onPointerDown() {\n isDragging = false;\n }\n\n function onChange() {\n // OrbitControls fires change while dragging\n isDragging = true;\n }\n\n // ---------------------------\n // Stellarium-ish zoom (FOV)\n // ---------------------------\n const onWheelFov = (ev: WheelEvent) => {\n ev.preventDefault();\n\n // Trackpad pinch on macOS tends to come through as wheel w/ ctrlKey=true\n const speed = (ev.ctrlKey ? 0.15 : 1) * env.fovWheelSensitivity!;\n const next = THREE.MathUtils.clamp(\n camera.fov + ev.deltaY * speed,\n env.minFov!,\n env.maxFov!\n );\n\n if (next !== camera.fov) {\n camera.fov = next;\n camera.updateProjectionMatrix();\n }\n };\n\n const onDblClick = (ev: MouseEvent) => {\n const node = pick(ev);\n if (node) {\n const mesh = meshById.get(node.id);\n if (mesh) {\n animateFocusTo(mesh);\n return;\n }\n }\n\n if (!env.resetFovOnDblClick) return;\n camera.fov = env.defaultFov!;\n camera.updateProjectionMatrix();\n };\n\n // ---------------------------\n // Click-to-focus (aim + zoom)\n // ---------------------------\n let focusAnimRaf = 0;\n\n function cancelFocusAnim() {\n if (focusAnimRaf) cancelAnimationFrame(focusAnimRaf);\n focusAnimRaf = 0;\n }\n\n function getControlsAnglesSafe() {\n // OrbitControls exposes getAzimuthalAngle/getPolarAngle\n const getAz = (controls as any).getAzimuthalAngle?.bind(controls);\n const getPol = (controls as any).getPolarAngle?.bind(controls);\n return {\n azimuth: typeof getAz === \"function\" ? getAz() : 0,\n polar: typeof getPol === \"function\" ? getPol() : Math.PI / 4,\n };\n }\n\n function setControlsAnglesSafe(azimuth: number, polar: number) {\n // Newer three exposes setAzimuthalAngle / setPolarAngle.\n const setAz = (controls as any).setAzimuthalAngle?.bind(controls);\n const setPol = (controls as any).setPolarAngle?.bind(controls);\n\n if (typeof setAz === \"function\" && typeof setPol === \"function\") {\n setAz(azimuth);\n setPol(polar);\n controls.update();\n return;\n }\n\n // Fallback: rotate camera directly to look at a direction\n // (keeps the “standing in the middle” feel even if controls lacks setters)\n const dir = new THREE.Vector3();\n dir.setFromSphericalCoords(1, polar, azimuth);\n const lookAt = dir.clone().multiplyScalar(10);\n camera.lookAt(lookAt);\n }\n\n function aimAtWorldPoint(worldPoint: THREE.Vector3) {\n // We’re “at the origin”, so direction is point normalized.\n // OrbitControls places camera relative to target. To look AT 'dir', camera must be at '-dir'.\n const dir = worldPoint.clone().normalize().negate();\n // Convert direction -> spherical angles compatible with OrbitControls\n // In three: Spherical(phi=polar from +Y, theta=azimuth around Y from +Z toward +X)\n const spherical = new THREE.Spherical().setFromVector3(dir);\n let targetPolar = spherical.phi;\n let targetAz = spherical.theta;\n\n // Clamp to our allowed range (zenith..horizon)\n targetPolar = THREE.MathUtils.clamp(targetPolar, controls.minPolarAngle, controls.maxPolarAngle);\n\n return { targetAz, targetPolar };\n }\n\n function easeInOutCubic(t: number) {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n }\n\n function animateFocusTo(mesh: THREE.Object3D) {\n cancelFocusAnim();\n\n const { azimuth: startAz, polar: startPolar } = getControlsAnglesSafe();\n const startFov = camera.fov;\n\n const { targetAz, targetPolar } = aimAtWorldPoint(mesh.getWorldPosition(new THREE.Vector3()));\n const endFov = THREE.MathUtils.clamp(env.focusZoomFov!, env.minFov!, env.maxFov!);\n\n const start = performance.now();\n const dur = Math.max(120, env.focusDurationMs || 650);\n\n const tick = (now: number) => {\n const t = THREE.MathUtils.clamp((now - start) / dur, 0, 1);\n const k = easeInOutCubic(t);\n\n // Interpolate angles (shortest path for azimuth)\n let dAz = targetAz - startAz;\n // wrap to [-PI, PI]\n dAz = ((dAz + Math.PI) % (Math.PI * 2)) - Math.PI;\n\n const curAz = startAz + dAz * k;\n const curPolar = THREE.MathUtils.lerp(startPolar, targetPolar, k);\n setControlsAnglesSafe(curAz, curPolar);\n\n camera.fov = THREE.MathUtils.lerp(startFov, endFov, k);\n camera.updateProjectionMatrix();\n\n if (t < 1) {\n focusAnimRaf = requestAnimationFrame(tick);\n } else {\n focusAnimRaf = 0;\n }\n };\n\n focusAnimRaf = requestAnimationFrame(tick);\n }\n\n function onPointerUp(ev: PointerEvent) {\n if (isDragging) return;\n\n const node = pick(ev);\n if (!node) return;\n\n // fire your existing handler\n handlers.onSelect?.(node);\n\n // optional: also do Stellarium-like “aim + zoom” on select\n if (env.focusOnSelect) {\n const mesh = meshById.get(node.id);\n if (mesh) animateFocusTo(mesh);\n }\n }\n\n // ---------------------------\n // Lifecycle\n // ---------------------------\n function start() {\n if (running) return;\n running = true;\n\n resize();\n window.addEventListener(\"resize\", resize);\n\n renderer.domElement.addEventListener(\"pointermove\", onPointerMove);\n renderer.domElement.addEventListener(\"pointerdown\", onPointerDown);\n renderer.domElement.addEventListener(\"pointerup\", onPointerUp);\n\n // wheel FOV zoom (passive:false so preventDefault works)\n renderer.domElement.addEventListener(\"wheel\", onWheelFov, { passive: false });\n\n renderer.domElement.addEventListener(\"dblclick\", onDblClick);\n\n controls.addEventListener(\"change\", onChange);\n\n const tick = () => {\n raf = requestAnimationFrame(tick);\n \n // Damping rotation sensitivity based on zoom level\n controls.rotateSpeed = camera.fov / (env.defaultFov || 90);\n \n // Dynamic scaling based on FOV (Zoomed out = larger stars/labels)\n // Reference: FOV 15 is \"close up\" (scale 1x). FOV 90 is \"wide\" (scale larger).\n // Formula: scale = 1 + (fov - 15) * factor\n const fov = camera.fov;\n const minZoomFov = 15; // The FOV where items should be \"normal size\"\n \n // Factor to control how much they grow. \n // We want stars to stay point-like but be visible.\n const scaleFactor = Math.max(1, 1 + (fov - minZoomFov) * 0.05);\n\n // Gaze-based fading for labels\n const cameraDir = new THREE.Vector3();\n camera.getWorldDirection(cameraDir);\n \n // Re-use vector to avoid GC\n const objPos = new THREE.Vector3();\n const objDir = new THREE.Vector3();\n\n for (let i = 0; i < dynamicObjects.length; i++) {\n const item = dynamicObjects[i];\n // Scale from INITIAL vector to preserve aspect ratio\n item.obj.scale.copy(item.initialScale).multiplyScalar(scaleFactor);\n\n // Gaze check for labels\n if (item.type === \"label\") {\n const sprite = item.obj as THREE.Sprite;\n \n // Get direction to object\n // Since camera is at 0,0,0 (mostly), direction is just position normalized.\n // But our camera might be slightly offset (0,0,0.01).\n // Let's be precise:\n sprite.getWorldPosition(objPos);\n objDir.subVectors(objPos, camera.position).normalize();\n \n // Dot product: 1.0 = direct center, 0.0 = 90 deg off\n const dot = cameraDir.dot(objDir);\n \n // Define \"focus cone\"\n // 1.0 -> 0.95 (approx 18 deg): Full opacity\n // 0.95 -> 0.85 (approx 30 deg): Fade out\n // < 0.85: Invisible\n const fullVisibleDot = 0.96;\n const invisibleDot = 0.88;\n \n let opacity = 0;\n if (dot >= fullVisibleDot) {\n opacity = 1;\n } else if (dot > invisibleDot) {\n opacity = (dot - invisibleDot) / (fullVisibleDot - invisibleDot);\n }\n \n // Smooth transition or direct? Direct is fine for now, standard lerp.\n sprite.material.opacity = opacity;\n sprite.visible = opacity > 0.01;\n\n // Also fade the corresponding constellation lines\n const bookId = nodeById.get(item.obj.userData.id)?.id;\n if (bookId) {\n const line = lineByBookId.get(bookId);\n if (line) {\n (line.material as THREE.LineBasicMaterial).opacity = 0.05 + opacity * 0.45;\n }\n }\n }\n }\n\n controls.update();\n renderer.render(scene, camera);\n };\n tick();\n }\n\n function stop() {\n running = false;\n cancelAnimationFrame(raf);\n cancelFocusAnim();\n\n window.removeEventListener(\"resize\", resize);\n\n renderer.domElement.removeEventListener(\"pointermove\", onPointerMove);\n renderer.domElement.removeEventListener(\"pointerdown\", onPointerDown);\n renderer.domElement.removeEventListener(\"pointerup\", onPointerUp);\n renderer.domElement.removeEventListener(\"wheel\", onWheelFov as any);\n renderer.domElement.removeEventListener(\"dblclick\", onDblClick);\n\n controls.removeEventListener(\"change\", onChange);\n }\n\n function dispose() {\n stop();\n clearRoot();\n\n // env groups\n for (const child of [...groundGroup.children]) {\n groundGroup.remove(child);\n disposeObject(child);\n }\n for (const child of [...backdropGroup.children]) {\n backdropGroup.remove(child);\n disposeObject(child);\n }\n\n controls.dispose();\n renderer.dispose();\n renderer.domElement.remove();\n }\n\n return { setConfig, start, stop, dispose, setHandlers };\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport type { StarMapConfig, SceneNode } from \"../types\";\n\nexport type StarMapProps = {\n config: StarMapConfig;\n className?: string;\n onSelect?: (node: SceneNode) => void;\n onHover?: (node?: SceneNode) => void;\n};\n\nexport function StarMap({ config, className, onSelect, onHover }: StarMapProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const engineRef = useRef<any>(null);\n\n useEffect(() => {\n let disposed = false;\n\n async function init() {\n if (!containerRef.current) return;\n const { createEngine } = await import(\"../engine/createEngine\");\n if (disposed) return;\n\n engineRef.current = createEngine({\n container: containerRef.current,\n onSelect,\n onHover\n });\n\n engineRef.current.setConfig(config);\n engineRef.current.start();\n }\n\n init();\n\n return () => {\n disposed = true;\n engineRef.current?.dispose?.();\n engineRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n engineRef.current?.setConfig?.(config);\n }, [config]);\n\n useEffect(() => {\n engineRef.current?.setHandlers?.({ onSelect, onHover });\n }, [onSelect, onHover]);\n\n return <div ref={containerRef} className={className} style={{ width: \"100%\", height: \"100%\" }} />;\n}\n","import type { SceneModel, SceneNode } from \"../types\";\n\nexport type BibleJSON = {\n testaments: Array<{\n name: string;\n divisions: Array<{\n name: string;\n books: Array<{\n key: string;\n name: string;\n chapters: number;\n verses?: number[];\n icons?: string[];\n }>;\n }>;\n }>;\n};\n\nexport function bibleToSceneModel(data: BibleJSON): SceneModel {\n const nodes: SceneNode[] = [];\n const links: SceneModel[\"links\"] = [];\n\n const id = {\n testament: (t: string) => `T:${t}`,\n division: (t: string, d: string) => `D:${t}:${d}`,\n book: (key: string) => `B:${key}`,\n chapter: (key: string, ch: number) => `C:${key}:${ch}`\n };\n\n for (const t of data.testaments) {\n const tid = id.testament(t.name);\n nodes.push({ id: tid, label: t.name, level: 0, meta: { testament: t.name } });\n\n for (const d of t.divisions) {\n const did = id.division(t.name, d.name);\n nodes.push({\n id: did,\n label: d.name,\n level: 1,\n parent: tid,\n meta: { testament: t.name, division: d.name }\n });\n links.push({ source: did, target: tid });\n\n for (const b of d.books) {\n const bid = id.book(b.key);\n nodes.push({\n id: bid,\n label: b.name,\n level: 2,\n parent: did,\n meta: { testament: t.name, division: d.name, bookKey: b.key, book: b.name }\n });\n links.push({ source: bid, target: did });\n\n const verses = b.verses ?? [];\n for (let i = 0; i < verses.length; i++) {\n const chapterNum = i + 1;\n const cid = id.chapter(b.key, chapterNum);\n nodes.push({\n id: cid,\n label: `${b.name} ${chapterNum}`,\n level: 3,\n parent: bid,\n weight: verses[i],\n icon: b.icons?.[i] ?? b.icons?.[0], \n meta: {\n testament: t.name,\n division: d.name,\n bookKey: b.key,\n book: b.name,\n chapter: chapterNum\n }\n });\n links.push({ source: cid, target: bid });\n }\n }\n }\n }\n\n return { nodes, links };\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -549,7 +549,11 @@ function createEngine({
|
|
|
549
549
|
}
|
|
550
550
|
function buildFromModel(model, cfg) {
|
|
551
551
|
clearRoot();
|
|
552
|
-
if (cfg.background
|
|
552
|
+
if (cfg.background && cfg.background !== "transparent") {
|
|
553
|
+
scene.background = new THREE4.Color(cfg.background);
|
|
554
|
+
} else {
|
|
555
|
+
scene.background = null;
|
|
556
|
+
}
|
|
553
557
|
camera.fov = cfg.camera?.fov ?? env.defaultFov;
|
|
554
558
|
camera.updateProjectionMatrix();
|
|
555
559
|
const layoutCfg = {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/constellations.ts","../src/engine/layout.ts","../src/engine/materials.ts","../src/engine/createEngine.ts","../src/react/StarMap.tsx","../src/adapters/bible.ts"],"names":["THREE2","THREE3","lookAt","start","createEngine"],"mappings":"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","file":"index.js","sourcesContent":["import * as THREE from \"three\";\n\nexport type Point3D = { x: number; y: number; z: number };\n\n// Helper to rotate a point in 3D space\nfunction rotatePoint(point: Point3D, euler: THREE.Euler): Point3D {\n const v = new THREE.Vector3(point.x, point.y, point.z);\n v.applyEuler(euler);\n return { x: v.x, y: v.y, z: v.z };\n}\n\n/**\n * Generates a Golden Spiral (Galaxy-like).\n * Good for books with many chapters (Gen, Psalms, etc).\n */\nexport function layoutSpiral(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n const goldenAngle = Math.PI * (3 - Math.sqrt(5)); // ~2.4 radians\n\n for (let i = 0; i < count; i++) {\n // radius grows with sqrt of index to keep area constant\n const r = radius * Math.sqrt((i + 1) / count); \n const theta = i * goldenAngle;\n\n const x = r * Math.cos(theta);\n const z = r * Math.sin(theta);\n \n // slight variation in y for 3D depth, but mostly flat disc\n const y = (Math.random() - 0.5) * (radius * 0.1); \n\n points.push({ x, y, z });\n }\n return points;\n}\n\n/**\n * Generates a Cross shape.\n * Vertical bar is longer, horizontal bar crosses near top.\n */\nexport function layoutCross(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n \n // Split chapters: 70% vertical, 30% horizontal\n const verticalCount = Math.ceil(count * 0.7);\n const horizontalCount = count - verticalCount;\n \n const height = radius * 2.5;\n const width = radius * 1.5;\n\n // Vertical beam (top to bottom)\n for (let i = 0; i < verticalCount; i++) {\n const t = i / (verticalCount - 1 || 1); // 0..1\n // x=0, z=0\n const y = (height / 2) - t * height; \n points.push({ x: 0, y, z: 0 });\n }\n\n // Horizontal beam (left to right)\n // Crosses at roughly 30% from top of vertical\n const crossY = (height / 2) - (height * 0.3);\n\n for (let i = 0; i < horizontalCount; i++) {\n const t = i / (horizontalCount - 1 || 1); // 0..1\n const x = (-width / 2) + t * width;\n points.push({ x, y: crossY, z: 0 });\n }\n\n return points;\n}\n\n/**\n * Generates a Tablet/Grid shape (for Law).\n * Two columns of stars.\n */\nexport function layoutTablet(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n const cols = 2;\n const rows = Math.ceil(count / cols);\n const w = radius * 1.5;\n const h = radius * 2.0;\n\n for (let i = 0; i < count; i++) {\n const col = i % cols;\n const row = Math.floor(i / cols);\n \n // x: -w/2 or +w/2\n const x = (col === 0 ? -1 : 1) * (w * 0.25);\n // y: top to bottom\n const y = (h / 2) - (row / (rows - 1 || 1)) * h;\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Crown shape (for Kings/Chronicles).\n * A semi-circle/circle with \"spikes\".\n */\nexport function layoutCrown(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n // Semi-circle arc (from -PI/2 to PI/2?) or full circle?\n // Let's do a wide arc \"smile\" shape pointing up.\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1); \n const angle = -Math.PI * 0.8 + t * Math.PI * 1.6; // wide arc\n \n // Base arc\n let r = radius;\n // Spikes: every 3rd star is higher?\n if (i % 3 === 1) r *= 1.4;\n\n const x = r * Math.sin(angle);\n const y = r * Math.cos(angle) * 0.5; // flatten height\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Harp shape (for Psalms).\n * A frame with \"strings\".\n */\nexport function layoutHarp(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n // A simple triangle frame\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1);\n \n // Parametric curve for a harp-ish shape\n // x goes left to right\n const x = (-radius) + t * (radius * 2);\n \n // y follows a curve\n // rapid rise on right side\n const y = (-radius) + Math.pow(t, 2) * (radius * 2);\n\n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Flame/Teardrop shape (for Acts).\n */\nexport function layoutFlame(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1) * Math.PI * 2; // 0 to 2PI\n // Spiral tapering up?\n // Let's do a simple parametric teardrop\n \n // Distribute points along the perimeter of a teardrop\n // Parametric eq: x = cos(t), y = sin(t) * sin(t/2)^m\n \n // Actually, just a noisy vertical spiral looks good as fire\n const tNorm = i / count; \n const r = radius * (1 - tNorm) * 0.8; // tapering radius\n const angle = tNorm * Math.PI * 4; // 2 turns\n const y = (tNorm - 0.5) * radius * 3; // tall\n\n const x = r * Math.cos(angle);\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Registry mapping Book Keys (e.g., \"MAT\") to Layout Functions\n */\nconst LAYOUT_REGISTRY: Record<string, (c: number, r: number) => Point3D[]> = {\n // Law -> Tablet\n \"GEN\": layoutTablet,\n \"EXO\": layoutTablet,\n \"LEV\": layoutTablet,\n \"NUM\": layoutTablet,\n \"DEU\": layoutTablet,\n\n // Kings/History -> Crown\n \"1SA\": layoutCrown,\n \"2SA\": layoutCrown,\n \"1KI\": layoutCrown,\n \"2KI\": layoutCrown,\n \"1CH\": layoutCrown,\n \"2CH\": layoutCrown,\n\n // Poetry -> Harp/Spiral\n \"PSA\": layoutHarp,\n \"SNG\": layoutHarp,\n\n // Gospels -> Cross\n \"MAT\": layoutCross,\n \"MRK\": layoutCross,\n \"LUK\": layoutCross,\n \"JHN\": layoutCross,\n \n // Acts -> Flame\n \"ACT\": layoutFlame,\n};\n\nexport function getConstellationLayout(bookKey: string, chapterCount: number, radius: number): Point3D[] {\n const generator = LAYOUT_REGISTRY[bookKey] || layoutSpiral;\n return generator(chapterCount, radius);\n}\n","import * as THREE from \"three\";\nimport type { SceneModel, SceneNode } from \"../types\";\nimport { getConstellationLayout, Point3D } from \"./constellations\";\n\n// Helper: Rotate point P to look at Target T (from 0,0,0)\nfunction lookAt(point: Point3D, target: THREE.Vector3, up: THREE.Vector3): Point3D {\n // We create a rotation matrix that rotates (0,0,1) to 'target'\n // and apply it to 'point' (which is defined in a local XY plane usually)\n \n // For simplicity: We want to place the constellation (defined flat on XY or XZ)\n // tangent to the sphere surface at 'target'.\n \n const zAxis = target.clone().normalize(); // The \"Normal\" of the book center\n const xAxis = new THREE.Vector3().crossVectors(up, zAxis).normalize();\n const yAxis = new THREE.Vector3().crossVectors(zAxis, xAxis).normalize();\n\n const m = new THREE.Matrix4().makeBasis(xAxis, yAxis, zAxis);\n const v = new THREE.Vector3(point.x, point.y, point.z);\n v.applyMatrix4(m); // Rotate\n v.add(target); // Translate\n \n return { x: v.x, y: v.y, z: v.z };\n}\n\nexport function computeLayoutPositions(\n model: SceneModel,\n layout?: { mode?: \"radial\" | \"grid\" | \"force\" | \"spherical\"; radius?: number; chapterRingSpacing?: number }\n): SceneModel {\n const mode = layout?.mode ?? \"spherical\";\n const radius = layout?.radius ?? 2000;\n const ringSpacing = layout?.chapterRingSpacing ?? 15;\n\n const childrenMap = new Map<string, SceneNode[]>();\n const roots: SceneNode[] = [];\n const books: SceneNode[] = [];\n\n // Build hierarchy\n for (const n of model.nodes) {\n if (n.level === 2) books.push(n); // Collect books for spherical layout\n if (n.parent) {\n const children = childrenMap.get(n.parent) ?? [];\n children.push(n);\n childrenMap.set(n.parent, children);\n } else {\n roots.push(n);\n }\n }\n\n const updatedNodes = model.nodes.map((n) => ({ ...n, meta: { ...(n.meta ?? {}) } }));\n const updatedNodeMap = new Map(updatedNodes.map(n => [n.id, n]));\n const leafCounts = new Map<string, number>();\n\n // Helper: Count leaves\n function getLeafCount(node: SceneNode): number {\n const children = childrenMap.get(node.id) ?? [];\n if (children.length === 0) {\n leafCounts.set(node.id, 1);\n return 1;\n }\n let count = 0;\n for (const c of children) count += getLeafCount(c);\n leafCounts.set(node.id, count);\n return count;\n }\n roots.forEach(getLeafCount);\n\n // --- SPHERICAL MODE ---\n if (mode === \"spherical\") {\n const numBooks = books.length;\n const phi = Math.PI * (3 - Math.sqrt(5)); // Golden Angle\n\n // Fibonacci Sphere Distribution for Books (Upper Hemisphere Only)\n for (let i = 0; i < numBooks; i++) {\n const book = books[i];\n const uBook = updatedNodeMap.get(book.id)!;\n const bookKey = (uBook.meta as any).bookKey as string;\n\n // y goes from 1.0 (zenith) to 0.05 (just above horizon)\n const y = 1.0 - (i / (numBooks - 1)) * 0.95; \n const radiusAtY = Math.sqrt(1 - y * y);\n const theta = phi * i;\n\n const x = Math.cos(theta) * radiusAtY;\n const z = Math.sin(theta) * radiusAtY;\n\n const bookPos = new THREE.Vector3(x, y, z).multiplyScalar(radius);\n \n (uBook.meta as any).x = bookPos.x;\n (uBook.meta as any).y = bookPos.y;\n (uBook.meta as any).z = bookPos.z;\n\n // 2. Layout Chapters (Constellation)\n const chapters = childrenMap.get(book.id) ?? [];\n if (chapters.length > 0) {\n // Adjust territory: we have 2x more density now (half sphere)\n const territoryRadius = (radius * 2) / Math.sqrt(numBooks * 2) * 0.7; \n const localPoints = getConstellationLayout(bookKey, chapters.length, territoryRadius);\n const up = new THREE.Vector3(0, 1, 0); \n \n chapters.forEach((chap, idx) => {\n const uChap = updatedNodeMap.get(chap.id)!;\n const lp = localPoints[idx];\n const wp = lookAt(lp, bookPos, up);\n\n (uChap.meta as any).x = wp.x;\n (uChap.meta as any).y = wp.y;\n (uChap.meta as any).z = wp.z;\n });\n }\n }\n\n // 1. Divisions (L1)\n const divisions = model.nodes.filter(n => n.level === 1);\n divisions.forEach(d => {\n const children = childrenMap.get(d.id) ?? [];\n if (children.length === 0) return;\n\n const centroid = new THREE.Vector3();\n children.forEach(c => {\n const u = updatedNodeMap.get(c.id)!;\n centroid.add(new THREE.Vector3((u.meta as any).x, (u.meta as any).y, (u.meta as any).z));\n });\n centroid.divideScalar(children.length);\n\n if (centroid.length() > 0.1) {\n centroid.setLength(radius * 0.85); // Float inside\n const uNode = updatedNodeMap.get(d.id)!;\n (uNode.meta as any).x = centroid.x;\n (uNode.meta as any).y = centroid.y;\n (uNode.meta as any).z = centroid.z;\n }\n });\n\n // 2. Testaments (L0)\n const testaments = model.nodes.filter(n => n.level === 0);\n testaments.forEach(t => {\n const children = childrenMap.get(t.id) ?? [];\n if (children.length === 0) return;\n\n const centroid = new THREE.Vector3();\n children.forEach(c => {\n const u = updatedNodeMap.get(c.id)!;\n centroid.add(new THREE.Vector3((u.meta as any).x, (u.meta as any).y, (u.meta as any).z));\n });\n centroid.divideScalar(children.length);\n\n if (centroid.length() > 0.1) {\n centroid.setLength(radius * 0.75); // Float further inside\n const uNode = updatedNodeMap.get(t.id)!;\n (uNode.meta as any).x = centroid.x;\n (uNode.meta as any).y = centroid.y;\n (uNode.meta as any).z = centroid.z;\n }\n });\n\n return { ...model, nodes: updatedNodes };\n }\n\n // --- RADIAL MODE (Existing) ---\n function layoutRadial(nodes: SceneNode[], startAngle: number, totalAngle: number, level: number) {\n if (nodes.length === 0) return;\n nodes.sort((a, b) => a.id.localeCompare(b.id)); // Deterministic\n\n const totalLeaves = nodes.reduce((sum, n) => sum + (leafCounts.get(n.id) ?? 1), 0);\n let currentAngle = startAngle;\n const currentRadius = level === 0 ? 0 : (radius + (level - 1) * ringSpacing);\n\n for (const node of nodes) {\n const weight = leafCounts.get(node.id) ?? 1;\n const nodeAngleSpan = (weight / totalLeaves) * totalAngle;\n const midAngle = currentAngle + nodeAngleSpan / 2;\n\n const updatedNode = updatedNodeMap.get(node.id)!;\n const r = level === 0 ? 0 : currentRadius;\n \n (updatedNode.meta as any).x = Math.cos(midAngle) * r;\n (updatedNode.meta as any).y = Math.sin(midAngle) * r;\n (updatedNode.meta as any).z = 0;\n (updatedNode.meta as any).angle = midAngle;\n\n const children = childrenMap.get(node.id) ?? [];\n if (children.length > 0) {\n layoutRadial(children, currentAngle, nodeAngleSpan, level + 1);\n }\n currentAngle += nodeAngleSpan;\n }\n }\n\n layoutRadial(roots, 0, Math.PI * 2, 0);\n\n return { ...model, nodes: updatedNodes };\n}","import * as THREE from \"three\";\nimport type { SceneModel, StarMapConfig } from \"../types\";\n\nfunction matches(node: any, when: Record<string, unknown>) {\n for (const [k, v] of Object.entries(when)) {\n // check top level first, then meta\n const val = node[k] !== undefined ? node[k] : node.meta?.[k];\n if (val !== v) return false;\n }\n return true;\n}\n\nexport function applyVisuals({\n model,\n cfg,\n meshById\n }: {\n model: SceneModel;\n cfg: StarMapConfig;\n meshById: Map<string, THREE.Object3D>;\n}) {\n const colorRules = cfg.visuals?.colorBy ?? [];\n const sizeRules = cfg.visuals?.sizeBy ?? [];\n\n // precompute min/max for weight scaling\n const weights = model.nodes.map((n) => n.weight).filter((x): x is number => typeof x === \"number\");\n const minW = weights.length ? Math.min(...weights) : 0;\n const maxW = weights.length ? Math.max(...weights) : 1;\n const range = Math.max(0, maxW - minW);\n\n for (const node of model.nodes) {\n const mesh = meshById.get(node.id) as THREE.Mesh | undefined;\n if (!mesh) continue;\n\n // color\n let color: string | undefined;\n for (const rule of colorRules) {\n if (matches(node, rule.when)) {\n color = rule.value;\n break;\n }\n }\n if (color && (mesh.material as any)?.color) {\n (mesh.material as THREE.MeshBasicMaterial).color = new THREE.Color(color);\n }\n\n // size by weight\n for (const rule of sizeRules) {\n if (!matches(node, rule.when)) continue;\n const w = node[rule.field];\n if (typeof w !== \"number\") continue;\n\n const t = range === 0 ? 0.5 : (w - minW) / range;\n const clamped = Math.min(1, Math.max(0, t));\n const s = rule.scale[0] + t * (rule.scale[1] - rule.scale[0]);\n mesh.scale.setScalar(clamped === t ? s : rule.scale[0] + clamped * (rule.scale[1] - rule.scale[0]));\n break;\n }\n }\n}\n","import * as THREE from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls\";\nimport type { StarMapConfig, SceneModel, SceneNode } from \"../types\";\nimport { computeLayoutPositions } from \"./layout\";\nimport { applyVisuals } from \"./materials\";\n\ntype Handlers = {\n onSelect?: (node: SceneNode) => void;\n onHover?: (node?: SceneNode) => void;\n};\n\ntype EngineConfig = {\n // Stellarium-ish “stand in the middle and look out”\n skyRadius?: number; // radius for procedural backdrop stars\n groundRadius?: number; // radius of the ground hemisphere used to occlude “below horizon”\n horizonGlow?: boolean;\n\n // Zoom behaviour (FOV-based)\n defaultFov?: number;\n minFov?: number;\n maxFov?: number;\n fovWheelSensitivity?: number; // deg per wheel deltaY unit (scaled for ctrlKey pinch)\n resetFovOnDblClick?: boolean;\n\n // Click-to-focus behaviour\n focusOnSelect?: boolean;\n focusZoomFov?: number; // fov to animate to on focus\n focusDurationMs?: number;\n};\n\nexport function createEngine({\n container,\n onSelect,\n onHover,\n }: {\n container: HTMLDivElement;\n onSelect?: Handlers[\"onSelect\"];\n onHover?: Handlers[\"onHover\"];\n}) {\n // ---------------------------\n // Renderer / Scene / Camera\n // ---------------------------\n const renderer = new THREE.WebGLRenderer({ antialias: true });\n renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\n renderer.setClearColor(0x000000, 1);\n container.appendChild(renderer.domElement);\n // Prevent browser gestures from fighting pointer controls\n (renderer.domElement.style as any).touchAction = \"none\";\n\n const scene = new THREE.Scene();\n\n const camera = new THREE.PerspectiveCamera(90, 1, 0.1, 5000);\n // Tiny offset so OrbitControls has a radius to work with (like your Angular app)\n camera.position.set(0, 0, 0.01);\n camera.up.set(0, 1, 0);\n\n // ---------------------------\n // Controls: “look around”\n // ---------------------------\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.target.set(0, 0, 0);\n controls.enableRotate = true;\n controls.enablePan = false;\n controls.enableZoom = false; // wheel controls FOV (not dolly)\n controls.enableDamping = true;\n controls.dampingFactor = 0.07;\n controls.screenSpacePanning = false;\n\n // Free yaw; clamp pitch so we don’t go “under” the horizon.\n const EPS = THREE.MathUtils.degToRad(0.05);\n controls.minAzimuthAngle = -Infinity;\n controls.maxAzimuthAngle = Infinity;\n // OrbitControls: 0=top(looking down), PI=bottom(looking up).\n // We want to look UP at the sky, so we need range [PI/2, PI].\n controls.minPolarAngle = Math.PI / 2 + EPS; \n controls.maxPolarAngle = Math.PI - EPS; \n controls.update();\n\n // ---------------------------\n // Stellarium-ish environment\n // ---------------------------\n const env = {\n skyRadius: 2800,\n groundRadius: 995,\n horizonGlow: true,\n\n defaultFov: 90,\n minFov: 1,\n maxFov: 110,\n fovWheelSensitivity: 0.04,\n resetFovOnDblClick: true,\n\n focusOnSelect: false,\n focusZoomFov: 18,\n focusDurationMs: 650,\n } satisfies EngineConfig;\n\n // Ground group: an inside-facing lower hemisphere that WRITES depth\n // => hides below-horizon stars (very Stellarium)\n const groundGroup = new THREE.Group();\n scene.add(groundGroup);\n\n function buildGroundHemisphere(radius: number) {\n groundGroup.clear();\n\n // inside-facing lower hemisphere\n const hemi = new THREE.SphereGeometry(radius, 64, 32, 0, Math.PI * 2, Math.PI / 2, Math.PI);\n hemi.scale(-1, 1, 1);\n\n // vertex color gradient: darker down, brighter near horizon\n const count = (hemi.attributes.position as THREE.BufferAttribute).count;\n const colors = new Float32Array(count * 3);\n const pos = hemi.attributes.position as THREE.BufferAttribute;\n const c = new THREE.Color();\n\n for (let i = 0; i < count; i++) {\n const y = pos.getY(i); // [-radius, 0]\n const t = THREE.MathUtils.clamp(1 - Math.abs(y) / radius, 0, 1);\n // A simple deep-blue to near-horizon glow-ish ramp\n c.setRGB(\n THREE.MathUtils.lerp(0x06 / 255, 0x15 / 255, t),\n THREE.MathUtils.lerp(0x10 / 255, 0x23 / 255, t),\n THREE.MathUtils.lerp(0x17 / 255, 0x35 / 255, t)\n );\n colors.set([c.r, c.g, c.b], i * 3);\n }\n hemi.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\n const groundMat = new THREE.MeshBasicMaterial({\n vertexColors: true,\n side: THREE.FrontSide,\n depthWrite: true, // important: occlude stars under horizon\n depthTest: true,\n });\n\n const hemiMesh = new THREE.Mesh(hemi, groundMat);\n groundGroup.add(hemiMesh);\n\n if (env.horizonGlow) {\n const inner = radius * 0.985;\n const outer = radius * 1.005;\n const ringGeo = new THREE.RingGeometry(inner, outer, 128);\n ringGeo.rotateX(-Math.PI / 2);\n\n const ringMat = new THREE.ShaderMaterial({\n transparent: true,\n depthWrite: false,\n uniforms: {\n uInner: { value: inner },\n uOuter: { value: outer },\n uColor: { value: new THREE.Color(0x7aa2ff) },\n },\n vertexShader: `\n varying vec2 vXY;\n void main() {\n vXY = position.xz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform float uInner;\n uniform float uOuter;\n uniform vec3 uColor;\n varying vec2 vXY;\n\n void main() {\n float r = length(vXY);\n float t = clamp((r - uInner) / (uOuter - uInner), 0.0, 1.0);\n // peak glow near inner edge, fade outwards\n float a = pow(1.0 - t, 2.2) * 0.35;\n gl_FragColor = vec4(uColor, a);\n }\n `,\n });\n\n const ring = new THREE.Mesh(ringGeo, ringMat);\n ring.position.y = 0.0;\n groundGroup.add(ring);\n }\n }\n\n buildGroundHemisphere(env.groundRadius);\n\n // Backdrop stars (procedural points) far beyond your “model stars”\n const backdropGroup = new THREE.Group();\n scene.add(backdropGroup);\n\n function buildBackdropStars(radius: number, count: number) {\n backdropGroup.clear();\n\n const starGeo = new THREE.BufferGeometry();\n const starPos = new Float32Array(count * 3);\n\n for (let i = 0; i < count; i++) {\n const r = radius + Math.random() * (radius * 0.5);\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n starPos[i * 3] = r * Math.sin(phi) * Math.cos(theta);\n starPos[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta);\n starPos[i * 3 + 2] = r * Math.cos(phi);\n }\n\n starGeo.setAttribute(\"position\", new THREE.BufferAttribute(starPos, 3));\n const starMat = new THREE.PointsMaterial({\n color: 0x9aa6b2,\n size: 0.5,\n transparent: true,\n opacity: 0.55,\n depthWrite: false,\n });\n\n const stars = new THREE.Points(starGeo, starMat);\n backdropGroup.add(stars);\n }\n\n buildBackdropStars(env.skyRadius, 6500);\n\n // ---------------------------\n // Picking / Model content\n // ---------------------------\n const raycaster = new THREE.Raycaster();\n const pointer = new THREE.Vector2();\n\n const root = new THREE.Group();\n scene.add(root);\n\n let raf = 0;\n let running = false;\n let handlers: Handlers = { onSelect, onHover };\n let hoveredId: string | null = null;\n let isDragging = false;\n\n const nodeById = new Map<string, SceneNode>();\n const meshById = new Map<string, THREE.Object3D>();\n const lineByBookId = new Map<string, THREE.Line>();\n const dynamicObjects: { obj: THREE.Object3D; initialScale: THREE.Vector3; type: \"star\" | \"label\" }[] = [];\n\n // ---------------------------\n // Resize\n // ---------------------------\n function resize() {\n const w = container.clientWidth || 1;\n const h = container.clientHeight || 1;\n renderer.setSize(w, h, false);\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n }\n\n // ---------------------------\n // Dispose helpers\n // ---------------------------\n function disposeObject(obj: THREE.Object3D) {\n obj.traverse((o: any) => {\n if (o.geometry) o.geometry.dispose?.();\n if (o.material) {\n const mats = Array.isArray(o.material) ? o.material : [o.material];\n mats.forEach((m: any) => {\n if (m.map) m.map.dispose?.();\n m.dispose?.();\n });\n }\n });\n }\n\n function createTextSprite(text: string, color: string = \"#ffffff\") {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n\n const fontSize = 48;\n const font = `bold ${fontSize}px sans-serif`;\n ctx.font = font;\n\n const metrics = ctx.measureText(text);\n const w = Math.ceil(metrics.width);\n const h = Math.ceil(fontSize * 1.2);\n\n canvas.width = w;\n canvas.height = h;\n\n ctx.font = font;\n ctx.fillStyle = color;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, w / 2, h / 2);\n\n const tex = new THREE.CanvasTexture(canvas);\n tex.minFilter = THREE.LinearFilter;\n\n const mat = new THREE.SpriteMaterial({\n map: tex,\n transparent: true,\n depthWrite: false,\n depthTest: true,\n });\n\n const sprite = new THREE.Sprite(mat);\n\n // World-size label (you can later do Stellarium-style pixel fitting if you want)\n const targetHeight = 2;\n const aspect = w / h;\n sprite.scale.set(targetHeight * aspect, targetHeight, 1);\n\n return sprite;\n }\n\n function createStarTexture() {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 64;\n canvas.height = 64;\n const ctx = canvas.getContext(\"2d\")!;\n\n const gradient = ctx.createRadialGradient(32, 32, 0, 32, 32, 32);\n gradient.addColorStop(0, \"rgba(255, 255, 255, 1)\");\n gradient.addColorStop(0.2, \"rgba(255, 255, 255, 0.8)\");\n gradient.addColorStop(0.5, \"rgba(255, 255, 255, 0.2)\");\n gradient.addColorStop(1, \"rgba(255, 255, 255, 0)\");\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 64, 64);\n\n const tex = new THREE.CanvasTexture(canvas);\n return tex;\n }\n\n const starTexture = createStarTexture();\n\n function clearRoot() {\n for (const child of [...root.children]) {\n root.remove(child);\n disposeObject(child);\n }\n nodeById.clear();\n meshById.clear();\n lineByBookId.clear();\n dynamicObjects.length = 0;\n }\n\n function buildFromModel(model: SceneModel, cfg: StarMapConfig) {\n clearRoot();\n\n // background + camera\n if (cfg.background) scene.background = new THREE.Color(cfg.background);\n\n // Respect config FOV if provided, otherwise use Stellarium-ish default\n camera.fov = cfg.camera?.fov ?? env.defaultFov;\n camera.updateProjectionMatrix();\n\n // Default to placing content at a \"sky-like\" radius if not specified\n const layoutCfg = {\n ...cfg.layout,\n radius: cfg.layout?.radius ?? 2000,\n };\n const laidOut = computeLayoutPositions(model, layoutCfg);\n\n // Create meshes\n for (const n of laidOut.nodes) {\n nodeById.set(n.id, n);\n\n const x = (n.meta?.x as number) ?? 0;\n const y = (n.meta?.y as number) ?? 0;\n const z = (n.meta?.z as number) ?? 0;\n\n // Level 3: Chapters -> Stars (Sprites)\n if (n.level === 3) {\n const mat = new THREE.SpriteMaterial({ \n map: starTexture, \n color: 0xffffff,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false\n });\n const sprite = new THREE.Sprite(mat);\n\n sprite.position.set(x, y, z);\n sprite.userData = { id: n.id, level: n.level };\n \n // Base size for stars\n const baseScale = 2.0;\n sprite.scale.setScalar(baseScale);\n\n // Add to dynamic scaling list\n dynamicObjects.push({ obj: sprite, initialScale: sprite.scale.clone(), type: \"star\" });\n\n // Hidden label for hover\n if (n.label) {\n const labelSprite = createTextSprite(n.label);\n if (labelSprite) {\n labelSprite.position.set(0, 1.2, 0);\n labelSprite.visible = false;\n sprite.add(labelSprite);\n }\n }\n\n root.add(sprite);\n meshById.set(n.id, sprite);\n }\n // Level 1 (Division) or 2 (Book) -> Text Labels on the Sky\n else if (n.level === 1 || n.level === 2) {\n if (n.label) {\n // Level 1 (e.g. \"Gospels\") vs Level 2 (e.g. \"John\")\n const isBook = n.level === 2;\n const color = isBook ? \"#ffffff\" : \"#38bdf8\";\n \n // Division labels: smaller, static\n // Book labels: larger, dynamic\n const baseScale = isBook ? 3.0 : 7.0; \n\n const labelSprite = createTextSprite(n.label, color); \n if (labelSprite) {\n labelSprite.position.set(x, y, z);\n labelSprite.scale.multiplyScalar(baseScale);\n root.add(labelSprite);\n\n // Only add Books to dynamicObjects so they scale/fade.\n // Divisions stay static.\n if (isBook) {\n dynamicObjects.push({ obj: labelSprite, initialScale: labelSprite.scale.clone(), type: \"label\" });\n }\n }\n }\n }\n }\n\n applyVisuals({ model: laidOut, cfg, meshById });\n\n\n // ---------------------------\n // Draw Constellation Lines (Sequential)\n // ---------------------------\n const lineMat = new THREE.LineBasicMaterial({\n color: 0x445566,\n transparent: true,\n opacity: 0.3,\n depthWrite: false,\n blending: THREE.AdditiveBlending\n });\n\n // Group by book\n const bookMap = new Map<string, SceneNode[]>();\n for (const n of laidOut.nodes) {\n if (n.level === 3 && n.parent) {\n const list = bookMap.get(n.parent) ?? [];\n list.push(n);\n bookMap.set(n.parent, list);\n }\n }\n\n for (const [bookId, chapters] of bookMap.entries()) {\n // Sort by chapter number\n chapters.sort((a, b) => {\n const cA = (a.meta?.chapter as number) || 0;\n const cB = (b.meta?.chapter as number) || 0;\n return cA - cB;\n });\n\n if (chapters.length < 2) continue;\n\n const points: THREE.Vector3[] = [];\n for (const c of chapters) {\n const x = (c.meta?.x as number) ?? 0;\n const y = (c.meta?.y as number) ?? 0;\n const z = (c.meta?.z as number) ?? 0;\n points.push(new THREE.Vector3(x, y, z));\n }\n\n const geo = new THREE.BufferGeometry().setFromPoints(points);\n const line = new THREE.Line(geo, lineMat);\n root.add(line);\n lineByBookId.set(bookId, line);\n }\n\n resize();\n }\n\n function setConfig(cfg: StarMapConfig) {\n let model = cfg.model;\n if (!model && cfg.data && cfg.adapter) model = cfg.adapter(cfg.data);\n\n if (!model) {\n clearRoot();\n return;\n }\n\n buildFromModel(model, cfg);\n }\n\n function setHandlers(next: Handlers) {\n handlers = next;\n }\n\n function pick(ev: MouseEvent) {\n const rect = renderer.domElement.getBoundingClientRect();\n pointer.x = ((ev.clientX - rect.left) / rect.width) * 2 - 1;\n pointer.y = -(((ev.clientY - rect.top) / rect.height) * 2 - 1);\n\n raycaster.setFromCamera(pointer, camera);\n const hits = raycaster.intersectObjects(root.children, true);\n // pick meshes or sprites\n const hit = hits.find((h) => h.object.type === \"Mesh\" || h.object.type === \"Sprite\");\n const id = hit?.object?.userData?.id as string | undefined;\n return id ? nodeById.get(id) : undefined;\n }\n\n // ---------------------------\n // Hover logic (labels on L3)\n // ---------------------------\n function onPointerMove(ev: PointerEvent) {\n const node = pick(ev);\n const nextId = node?.id ?? null;\n\n if (nextId !== hoveredId) {\n // hide previous hovered L3 label\n if (hoveredId) {\n const prevMesh = meshById.get(hoveredId);\n const prevNode = nodeById.get(hoveredId);\n if (prevMesh && prevNode && prevNode.level === 3) {\n const label = prevMesh.children.find((c) => c instanceof THREE.Sprite);\n if (label) label.visible = false;\n }\n }\n\n hoveredId = nextId;\n\n // show current hovered L3 label\n if (nextId) {\n const mesh = meshById.get(nextId);\n const n = nodeById.get(nextId);\n if (mesh && n && n.level === 3) {\n const label = mesh.children.find((c) => c instanceof THREE.Sprite);\n if (label) {\n label.visible = true;\n // Since we are using sprites now, they look at camera.\n // We might want to offset the label so it doesn't overlap the star.\n label.position.set(0, 0.8, 0); \n }\n\n // Brighten lines on hover\n if (n.parent) {\n const line = lineByBookId.get(n.parent);\n if (line) (line.material as THREE.LineBasicMaterial).opacity = 0.8;\n }\n }\n }\n\n handlers.onHover?.(node);\n }\n }\n\n function onPointerDown() {\n isDragging = false;\n }\n\n function onChange() {\n // OrbitControls fires change while dragging\n isDragging = true;\n }\n\n // ---------------------------\n // Stellarium-ish zoom (FOV)\n // ---------------------------\n const onWheelFov = (ev: WheelEvent) => {\n ev.preventDefault();\n\n // Trackpad pinch on macOS tends to come through as wheel w/ ctrlKey=true\n const speed = (ev.ctrlKey ? 0.15 : 1) * env.fovWheelSensitivity!;\n const next = THREE.MathUtils.clamp(\n camera.fov + ev.deltaY * speed,\n env.minFov!,\n env.maxFov!\n );\n\n if (next !== camera.fov) {\n camera.fov = next;\n camera.updateProjectionMatrix();\n }\n };\n\n const onDblClick = (ev: MouseEvent) => {\n const node = pick(ev);\n if (node) {\n const mesh = meshById.get(node.id);\n if (mesh) {\n animateFocusTo(mesh);\n return;\n }\n }\n\n if (!env.resetFovOnDblClick) return;\n camera.fov = env.defaultFov!;\n camera.updateProjectionMatrix();\n };\n\n // ---------------------------\n // Click-to-focus (aim + zoom)\n // ---------------------------\n let focusAnimRaf = 0;\n\n function cancelFocusAnim() {\n if (focusAnimRaf) cancelAnimationFrame(focusAnimRaf);\n focusAnimRaf = 0;\n }\n\n function getControlsAnglesSafe() {\n // OrbitControls exposes getAzimuthalAngle/getPolarAngle\n const getAz = (controls as any).getAzimuthalAngle?.bind(controls);\n const getPol = (controls as any).getPolarAngle?.bind(controls);\n return {\n azimuth: typeof getAz === \"function\" ? getAz() : 0,\n polar: typeof getPol === \"function\" ? getPol() : Math.PI / 4,\n };\n }\n\n function setControlsAnglesSafe(azimuth: number, polar: number) {\n // Newer three exposes setAzimuthalAngle / setPolarAngle.\n const setAz = (controls as any).setAzimuthalAngle?.bind(controls);\n const setPol = (controls as any).setPolarAngle?.bind(controls);\n\n if (typeof setAz === \"function\" && typeof setPol === \"function\") {\n setAz(azimuth);\n setPol(polar);\n controls.update();\n return;\n }\n\n // Fallback: rotate camera directly to look at a direction\n // (keeps the “standing in the middle” feel even if controls lacks setters)\n const dir = new THREE.Vector3();\n dir.setFromSphericalCoords(1, polar, azimuth);\n const lookAt = dir.clone().multiplyScalar(10);\n camera.lookAt(lookAt);\n }\n\n function aimAtWorldPoint(worldPoint: THREE.Vector3) {\n // We’re “at the origin”, so direction is point normalized.\n // OrbitControls places camera relative to target. To look AT 'dir', camera must be at '-dir'.\n const dir = worldPoint.clone().normalize().negate();\n // Convert direction -> spherical angles compatible with OrbitControls\n // In three: Spherical(phi=polar from +Y, theta=azimuth around Y from +Z toward +X)\n const spherical = new THREE.Spherical().setFromVector3(dir);\n let targetPolar = spherical.phi;\n let targetAz = spherical.theta;\n\n // Clamp to our allowed range (zenith..horizon)\n targetPolar = THREE.MathUtils.clamp(targetPolar, controls.minPolarAngle, controls.maxPolarAngle);\n\n return { targetAz, targetPolar };\n }\n\n function easeInOutCubic(t: number) {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n }\n\n function animateFocusTo(mesh: THREE.Object3D) {\n cancelFocusAnim();\n\n const { azimuth: startAz, polar: startPolar } = getControlsAnglesSafe();\n const startFov = camera.fov;\n\n const { targetAz, targetPolar } = aimAtWorldPoint(mesh.getWorldPosition(new THREE.Vector3()));\n const endFov = THREE.MathUtils.clamp(env.focusZoomFov!, env.minFov!, env.maxFov!);\n\n const start = performance.now();\n const dur = Math.max(120, env.focusDurationMs || 650);\n\n const tick = (now: number) => {\n const t = THREE.MathUtils.clamp((now - start) / dur, 0, 1);\n const k = easeInOutCubic(t);\n\n // Interpolate angles (shortest path for azimuth)\n let dAz = targetAz - startAz;\n // wrap to [-PI, PI]\n dAz = ((dAz + Math.PI) % (Math.PI * 2)) - Math.PI;\n\n const curAz = startAz + dAz * k;\n const curPolar = THREE.MathUtils.lerp(startPolar, targetPolar, k);\n setControlsAnglesSafe(curAz, curPolar);\n\n camera.fov = THREE.MathUtils.lerp(startFov, endFov, k);\n camera.updateProjectionMatrix();\n\n if (t < 1) {\n focusAnimRaf = requestAnimationFrame(tick);\n } else {\n focusAnimRaf = 0;\n }\n };\n\n focusAnimRaf = requestAnimationFrame(tick);\n }\n\n function onPointerUp(ev: PointerEvent) {\n if (isDragging) return;\n\n const node = pick(ev);\n if (!node) return;\n\n // fire your existing handler\n handlers.onSelect?.(node);\n\n // optional: also do Stellarium-like “aim + zoom” on select\n if (env.focusOnSelect) {\n const mesh = meshById.get(node.id);\n if (mesh) animateFocusTo(mesh);\n }\n }\n\n // ---------------------------\n // Lifecycle\n // ---------------------------\n function start() {\n if (running) return;\n running = true;\n\n resize();\n window.addEventListener(\"resize\", resize);\n\n renderer.domElement.addEventListener(\"pointermove\", onPointerMove);\n renderer.domElement.addEventListener(\"pointerdown\", onPointerDown);\n renderer.domElement.addEventListener(\"pointerup\", onPointerUp);\n\n // wheel FOV zoom (passive:false so preventDefault works)\n renderer.domElement.addEventListener(\"wheel\", onWheelFov, { passive: false });\n\n renderer.domElement.addEventListener(\"dblclick\", onDblClick);\n\n controls.addEventListener(\"change\", onChange);\n\n const tick = () => {\n raf = requestAnimationFrame(tick);\n \n // Damping rotation sensitivity based on zoom level\n controls.rotateSpeed = camera.fov / (env.defaultFov || 90);\n \n // Dynamic scaling based on FOV (Zoomed out = larger stars/labels)\n // Reference: FOV 15 is \"close up\" (scale 1x). FOV 90 is \"wide\" (scale larger).\n // Formula: scale = 1 + (fov - 15) * factor\n const fov = camera.fov;\n const minZoomFov = 15; // The FOV where items should be \"normal size\"\n \n // Factor to control how much they grow. \n // We want stars to stay point-like but be visible.\n const scaleFactor = Math.max(1, 1 + (fov - minZoomFov) * 0.05);\n\n // Gaze-based fading for labels\n const cameraDir = new THREE.Vector3();\n camera.getWorldDirection(cameraDir);\n \n // Re-use vector to avoid GC\n const objPos = new THREE.Vector3();\n const objDir = new THREE.Vector3();\n\n for (let i = 0; i < dynamicObjects.length; i++) {\n const item = dynamicObjects[i];\n // Scale from INITIAL vector to preserve aspect ratio\n item.obj.scale.copy(item.initialScale).multiplyScalar(scaleFactor);\n\n // Gaze check for labels\n if (item.type === \"label\") {\n const sprite = item.obj as THREE.Sprite;\n \n // Get direction to object\n // Since camera is at 0,0,0 (mostly), direction is just position normalized.\n // But our camera might be slightly offset (0,0,0.01).\n // Let's be precise:\n sprite.getWorldPosition(objPos);\n objDir.subVectors(objPos, camera.position).normalize();\n \n // Dot product: 1.0 = direct center, 0.0 = 90 deg off\n const dot = cameraDir.dot(objDir);\n \n // Define \"focus cone\"\n // 1.0 -> 0.95 (approx 18 deg): Full opacity\n // 0.95 -> 0.85 (approx 30 deg): Fade out\n // < 0.85: Invisible\n const fullVisibleDot = 0.96;\n const invisibleDot = 0.88;\n \n let opacity = 0;\n if (dot >= fullVisibleDot) {\n opacity = 1;\n } else if (dot > invisibleDot) {\n opacity = (dot - invisibleDot) / (fullVisibleDot - invisibleDot);\n }\n \n // Smooth transition or direct? Direct is fine for now, standard lerp.\n sprite.material.opacity = opacity;\n sprite.visible = opacity > 0.01;\n\n // Also fade the corresponding constellation lines\n const bookId = nodeById.get(item.obj.userData.id)?.id;\n if (bookId) {\n const line = lineByBookId.get(bookId);\n if (line) {\n (line.material as THREE.LineBasicMaterial).opacity = 0.05 + opacity * 0.45;\n }\n }\n }\n }\n\n controls.update();\n renderer.render(scene, camera);\n };\n tick();\n }\n\n function stop() {\n running = false;\n cancelAnimationFrame(raf);\n cancelFocusAnim();\n\n window.removeEventListener(\"resize\", resize);\n\n renderer.domElement.removeEventListener(\"pointermove\", onPointerMove);\n renderer.domElement.removeEventListener(\"pointerdown\", onPointerDown);\n renderer.domElement.removeEventListener(\"pointerup\", onPointerUp);\n renderer.domElement.removeEventListener(\"wheel\", onWheelFov as any);\n renderer.domElement.removeEventListener(\"dblclick\", onDblClick);\n\n controls.removeEventListener(\"change\", onChange);\n }\n\n function dispose() {\n stop();\n clearRoot();\n\n // env groups\n for (const child of [...groundGroup.children]) {\n groundGroup.remove(child);\n disposeObject(child);\n }\n for (const child of [...backdropGroup.children]) {\n backdropGroup.remove(child);\n disposeObject(child);\n }\n\n controls.dispose();\n renderer.dispose();\n renderer.domElement.remove();\n }\n\n return { setConfig, start, stop, dispose, setHandlers };\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport type { StarMapConfig, SceneNode } from \"../types\";\n\nexport type StarMapProps = {\n config: StarMapConfig;\n className?: string;\n onSelect?: (node: SceneNode) => void;\n onHover?: (node?: SceneNode) => void;\n};\n\nexport function StarMap({ config, className, onSelect, onHover }: StarMapProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const engineRef = useRef<any>(null);\n\n useEffect(() => {\n let disposed = false;\n\n async function init() {\n if (!containerRef.current) return;\n const { createEngine } = await import(\"../engine/createEngine\");\n if (disposed) return;\n\n engineRef.current = createEngine({\n container: containerRef.current,\n onSelect,\n onHover\n });\n\n engineRef.current.setConfig(config);\n engineRef.current.start();\n }\n\n init();\n\n return () => {\n disposed = true;\n engineRef.current?.dispose?.();\n engineRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n engineRef.current?.setConfig?.(config);\n }, [config]);\n\n useEffect(() => {\n engineRef.current?.setHandlers?.({ onSelect, onHover });\n }, [onSelect, onHover]);\n\n return <div ref={containerRef} className={className} style={{ width: \"100%\", height: \"100%\" }} />;\n}\n","import type { SceneModel, SceneNode } from \"../types\";\n\nexport type BibleJSON = {\n testaments: Array<{\n name: string;\n divisions: Array<{\n name: string;\n books: Array<{\n key: string;\n name: string;\n chapters: number;\n verses?: number[];\n icons?: string[];\n }>;\n }>;\n }>;\n};\n\nexport function bibleToSceneModel(data: BibleJSON): SceneModel {\n const nodes: SceneNode[] = [];\n const links: SceneModel[\"links\"] = [];\n\n const id = {\n testament: (t: string) => `T:${t}`,\n division: (t: string, d: string) => `D:${t}:${d}`,\n book: (key: string) => `B:${key}`,\n chapter: (key: string, ch: number) => `C:${key}:${ch}`\n };\n\n for (const t of data.testaments) {\n const tid = id.testament(t.name);\n nodes.push({ id: tid, label: t.name, level: 0, meta: { testament: t.name } });\n\n for (const d of t.divisions) {\n const did = id.division(t.name, d.name);\n nodes.push({\n id: did,\n label: d.name,\n level: 1,\n parent: tid,\n meta: { testament: t.name, division: d.name }\n });\n links.push({ source: did, target: tid });\n\n for (const b of d.books) {\n const bid = id.book(b.key);\n nodes.push({\n id: bid,\n label: b.name,\n level: 2,\n parent: did,\n meta: { testament: t.name, division: d.name, bookKey: b.key, book: b.name }\n });\n links.push({ source: bid, target: did });\n\n const verses = b.verses ?? [];\n for (let i = 0; i < verses.length; i++) {\n const chapterNum = i + 1;\n const cid = id.chapter(b.key, chapterNum);\n nodes.push({\n id: cid,\n label: `${b.name} ${chapterNum}`,\n level: 3,\n parent: bid,\n weight: verses[i],\n icon: b.icons?.[i] ?? b.icons?.[0], \n meta: {\n testament: t.name,\n division: d.name,\n bookKey: b.key,\n book: b.name,\n chapter: chapterNum\n }\n });\n links.push({ source: cid, target: bid });\n }\n }\n }\n }\n\n return { nodes, links };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/engine/constellations.ts","../src/engine/layout.ts","../src/engine/materials.ts","../src/engine/createEngine.ts","../src/react/StarMap.tsx","../src/adapters/bible.ts"],"names":["THREE2","THREE3","lookAt","start","createEngine"],"mappings":"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","file":"index.js","sourcesContent":["import * as THREE from \"three\";\n\nexport type Point3D = { x: number; y: number; z: number };\n\n// Helper to rotate a point in 3D space\nfunction rotatePoint(point: Point3D, euler: THREE.Euler): Point3D {\n const v = new THREE.Vector3(point.x, point.y, point.z);\n v.applyEuler(euler);\n return { x: v.x, y: v.y, z: v.z };\n}\n\n/**\n * Generates a Golden Spiral (Galaxy-like).\n * Good for books with many chapters (Gen, Psalms, etc).\n */\nexport function layoutSpiral(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n const goldenAngle = Math.PI * (3 - Math.sqrt(5)); // ~2.4 radians\n\n for (let i = 0; i < count; i++) {\n // radius grows with sqrt of index to keep area constant\n const r = radius * Math.sqrt((i + 1) / count); \n const theta = i * goldenAngle;\n\n const x = r * Math.cos(theta);\n const z = r * Math.sin(theta);\n \n // slight variation in y for 3D depth, but mostly flat disc\n const y = (Math.random() - 0.5) * (radius * 0.1); \n\n points.push({ x, y, z });\n }\n return points;\n}\n\n/**\n * Generates a Cross shape.\n * Vertical bar is longer, horizontal bar crosses near top.\n */\nexport function layoutCross(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n \n // Split chapters: 70% vertical, 30% horizontal\n const verticalCount = Math.ceil(count * 0.7);\n const horizontalCount = count - verticalCount;\n \n const height = radius * 2.5;\n const width = radius * 1.5;\n\n // Vertical beam (top to bottom)\n for (let i = 0; i < verticalCount; i++) {\n const t = i / (verticalCount - 1 || 1); // 0..1\n // x=0, z=0\n const y = (height / 2) - t * height; \n points.push({ x: 0, y, z: 0 });\n }\n\n // Horizontal beam (left to right)\n // Crosses at roughly 30% from top of vertical\n const crossY = (height / 2) - (height * 0.3);\n\n for (let i = 0; i < horizontalCount; i++) {\n const t = i / (horizontalCount - 1 || 1); // 0..1\n const x = (-width / 2) + t * width;\n points.push({ x, y: crossY, z: 0 });\n }\n\n return points;\n}\n\n/**\n * Generates a Tablet/Grid shape (for Law).\n * Two columns of stars.\n */\nexport function layoutTablet(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n const cols = 2;\n const rows = Math.ceil(count / cols);\n const w = radius * 1.5;\n const h = radius * 2.0;\n\n for (let i = 0; i < count; i++) {\n const col = i % cols;\n const row = Math.floor(i / cols);\n \n // x: -w/2 or +w/2\n const x = (col === 0 ? -1 : 1) * (w * 0.25);\n // y: top to bottom\n const y = (h / 2) - (row / (rows - 1 || 1)) * h;\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Crown shape (for Kings/Chronicles).\n * A semi-circle/circle with \"spikes\".\n */\nexport function layoutCrown(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n // Semi-circle arc (from -PI/2 to PI/2?) or full circle?\n // Let's do a wide arc \"smile\" shape pointing up.\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1); \n const angle = -Math.PI * 0.8 + t * Math.PI * 1.6; // wide arc\n \n // Base arc\n let r = radius;\n // Spikes: every 3rd star is higher?\n if (i % 3 === 1) r *= 1.4;\n\n const x = r * Math.sin(angle);\n const y = r * Math.cos(angle) * 0.5; // flatten height\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Harp shape (for Psalms).\n * A frame with \"strings\".\n */\nexport function layoutHarp(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n // A simple triangle frame\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1);\n \n // Parametric curve for a harp-ish shape\n // x goes left to right\n const x = (-radius) + t * (radius * 2);\n \n // y follows a curve\n // rapid rise on right side\n const y = (-radius) + Math.pow(t, 2) * (radius * 2);\n\n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Generates a Flame/Teardrop shape (for Acts).\n */\nexport function layoutFlame(count: number, radius: number): Point3D[] {\n const points: Point3D[] = [];\n \n for (let i = 0; i < count; i++) {\n const t = i / (count - 1 || 1) * Math.PI * 2; // 0 to 2PI\n // Spiral tapering up?\n // Let's do a simple parametric teardrop\n \n // Distribute points along the perimeter of a teardrop\n // Parametric eq: x = cos(t), y = sin(t) * sin(t/2)^m\n \n // Actually, just a noisy vertical spiral looks good as fire\n const tNorm = i / count; \n const r = radius * (1 - tNorm) * 0.8; // tapering radius\n const angle = tNorm * Math.PI * 4; // 2 turns\n const y = (tNorm - 0.5) * radius * 3; // tall\n\n const x = r * Math.cos(angle);\n \n points.push({ x, y, z: 0 });\n }\n return points;\n}\n\n/**\n * Registry mapping Book Keys (e.g., \"MAT\") to Layout Functions\n */\nconst LAYOUT_REGISTRY: Record<string, (c: number, r: number) => Point3D[]> = {\n // Law -> Tablet\n \"GEN\": layoutTablet,\n \"EXO\": layoutTablet,\n \"LEV\": layoutTablet,\n \"NUM\": layoutTablet,\n \"DEU\": layoutTablet,\n\n // Kings/History -> Crown\n \"1SA\": layoutCrown,\n \"2SA\": layoutCrown,\n \"1KI\": layoutCrown,\n \"2KI\": layoutCrown,\n \"1CH\": layoutCrown,\n \"2CH\": layoutCrown,\n\n // Poetry -> Harp/Spiral\n \"PSA\": layoutHarp,\n \"SNG\": layoutHarp,\n\n // Gospels -> Cross\n \"MAT\": layoutCross,\n \"MRK\": layoutCross,\n \"LUK\": layoutCross,\n \"JHN\": layoutCross,\n \n // Acts -> Flame\n \"ACT\": layoutFlame,\n};\n\nexport function getConstellationLayout(bookKey: string, chapterCount: number, radius: number): Point3D[] {\n const generator = LAYOUT_REGISTRY[bookKey] || layoutSpiral;\n return generator(chapterCount, radius);\n}\n","import * as THREE from \"three\";\nimport type { SceneModel, SceneNode } from \"../types\";\nimport { getConstellationLayout, Point3D } from \"./constellations\";\n\n// Helper: Rotate point P to look at Target T (from 0,0,0)\nfunction lookAt(point: Point3D, target: THREE.Vector3, up: THREE.Vector3): Point3D {\n // We create a rotation matrix that rotates (0,0,1) to 'target'\n // and apply it to 'point' (which is defined in a local XY plane usually)\n \n // For simplicity: We want to place the constellation (defined flat on XY or XZ)\n // tangent to the sphere surface at 'target'.\n \n const zAxis = target.clone().normalize(); // The \"Normal\" of the book center\n const xAxis = new THREE.Vector3().crossVectors(up, zAxis).normalize();\n const yAxis = new THREE.Vector3().crossVectors(zAxis, xAxis).normalize();\n\n const m = new THREE.Matrix4().makeBasis(xAxis, yAxis, zAxis);\n const v = new THREE.Vector3(point.x, point.y, point.z);\n v.applyMatrix4(m); // Rotate\n v.add(target); // Translate\n \n return { x: v.x, y: v.y, z: v.z };\n}\n\nexport function computeLayoutPositions(\n model: SceneModel,\n layout?: { mode?: \"radial\" | \"grid\" | \"force\" | \"spherical\"; radius?: number; chapterRingSpacing?: number }\n): SceneModel {\n const mode = layout?.mode ?? \"spherical\";\n const radius = layout?.radius ?? 2000;\n const ringSpacing = layout?.chapterRingSpacing ?? 15;\n\n const childrenMap = new Map<string, SceneNode[]>();\n const roots: SceneNode[] = [];\n const books: SceneNode[] = [];\n\n // Build hierarchy\n for (const n of model.nodes) {\n if (n.level === 2) books.push(n); // Collect books for spherical layout\n if (n.parent) {\n const children = childrenMap.get(n.parent) ?? [];\n children.push(n);\n childrenMap.set(n.parent, children);\n } else {\n roots.push(n);\n }\n }\n\n const updatedNodes = model.nodes.map((n) => ({ ...n, meta: { ...(n.meta ?? {}) } }));\n const updatedNodeMap = new Map(updatedNodes.map(n => [n.id, n]));\n const leafCounts = new Map<string, number>();\n\n // Helper: Count leaves\n function getLeafCount(node: SceneNode): number {\n const children = childrenMap.get(node.id) ?? [];\n if (children.length === 0) {\n leafCounts.set(node.id, 1);\n return 1;\n }\n let count = 0;\n for (const c of children) count += getLeafCount(c);\n leafCounts.set(node.id, count);\n return count;\n }\n roots.forEach(getLeafCount);\n\n // --- SPHERICAL MODE ---\n if (mode === \"spherical\") {\n const numBooks = books.length;\n const phi = Math.PI * (3 - Math.sqrt(5)); // Golden Angle\n\n // Fibonacci Sphere Distribution for Books (Upper Hemisphere Only)\n for (let i = 0; i < numBooks; i++) {\n const book = books[i];\n const uBook = updatedNodeMap.get(book.id)!;\n const bookKey = (uBook.meta as any).bookKey as string;\n\n // y goes from 1.0 (zenith) to 0.05 (just above horizon)\n const y = 1.0 - (i / (numBooks - 1)) * 0.95; \n const radiusAtY = Math.sqrt(1 - y * y);\n const theta = phi * i;\n\n const x = Math.cos(theta) * radiusAtY;\n const z = Math.sin(theta) * radiusAtY;\n\n const bookPos = new THREE.Vector3(x, y, z).multiplyScalar(radius);\n \n (uBook.meta as any).x = bookPos.x;\n (uBook.meta as any).y = bookPos.y;\n (uBook.meta as any).z = bookPos.z;\n\n // 2. Layout Chapters (Constellation)\n const chapters = childrenMap.get(book.id) ?? [];\n if (chapters.length > 0) {\n // Adjust territory: we have 2x more density now (half sphere)\n const territoryRadius = (radius * 2) / Math.sqrt(numBooks * 2) * 0.7; \n const localPoints = getConstellationLayout(bookKey, chapters.length, territoryRadius);\n const up = new THREE.Vector3(0, 1, 0); \n \n chapters.forEach((chap, idx) => {\n const uChap = updatedNodeMap.get(chap.id)!;\n const lp = localPoints[idx];\n const wp = lookAt(lp, bookPos, up);\n\n (uChap.meta as any).x = wp.x;\n (uChap.meta as any).y = wp.y;\n (uChap.meta as any).z = wp.z;\n });\n }\n }\n\n // 1. Divisions (L1)\n const divisions = model.nodes.filter(n => n.level === 1);\n divisions.forEach(d => {\n const children = childrenMap.get(d.id) ?? [];\n if (children.length === 0) return;\n\n const centroid = new THREE.Vector3();\n children.forEach(c => {\n const u = updatedNodeMap.get(c.id)!;\n centroid.add(new THREE.Vector3((u.meta as any).x, (u.meta as any).y, (u.meta as any).z));\n });\n centroid.divideScalar(children.length);\n\n if (centroid.length() > 0.1) {\n centroid.setLength(radius * 0.85); // Float inside\n const uNode = updatedNodeMap.get(d.id)!;\n (uNode.meta as any).x = centroid.x;\n (uNode.meta as any).y = centroid.y;\n (uNode.meta as any).z = centroid.z;\n }\n });\n\n // 2. Testaments (L0)\n const testaments = model.nodes.filter(n => n.level === 0);\n testaments.forEach(t => {\n const children = childrenMap.get(t.id) ?? [];\n if (children.length === 0) return;\n\n const centroid = new THREE.Vector3();\n children.forEach(c => {\n const u = updatedNodeMap.get(c.id)!;\n centroid.add(new THREE.Vector3((u.meta as any).x, (u.meta as any).y, (u.meta as any).z));\n });\n centroid.divideScalar(children.length);\n\n if (centroid.length() > 0.1) {\n centroid.setLength(radius * 0.75); // Float further inside\n const uNode = updatedNodeMap.get(t.id)!;\n (uNode.meta as any).x = centroid.x;\n (uNode.meta as any).y = centroid.y;\n (uNode.meta as any).z = centroid.z;\n }\n });\n\n return { ...model, nodes: updatedNodes };\n }\n\n // --- RADIAL MODE (Existing) ---\n function layoutRadial(nodes: SceneNode[], startAngle: number, totalAngle: number, level: number) {\n if (nodes.length === 0) return;\n nodes.sort((a, b) => a.id.localeCompare(b.id)); // Deterministic\n\n const totalLeaves = nodes.reduce((sum, n) => sum + (leafCounts.get(n.id) ?? 1), 0);\n let currentAngle = startAngle;\n const currentRadius = level === 0 ? 0 : (radius + (level - 1) * ringSpacing);\n\n for (const node of nodes) {\n const weight = leafCounts.get(node.id) ?? 1;\n const nodeAngleSpan = (weight / totalLeaves) * totalAngle;\n const midAngle = currentAngle + nodeAngleSpan / 2;\n\n const updatedNode = updatedNodeMap.get(node.id)!;\n const r = level === 0 ? 0 : currentRadius;\n \n (updatedNode.meta as any).x = Math.cos(midAngle) * r;\n (updatedNode.meta as any).y = Math.sin(midAngle) * r;\n (updatedNode.meta as any).z = 0;\n (updatedNode.meta as any).angle = midAngle;\n\n const children = childrenMap.get(node.id) ?? [];\n if (children.length > 0) {\n layoutRadial(children, currentAngle, nodeAngleSpan, level + 1);\n }\n currentAngle += nodeAngleSpan;\n }\n }\n\n layoutRadial(roots, 0, Math.PI * 2, 0);\n\n return { ...model, nodes: updatedNodes };\n}","import * as THREE from \"three\";\nimport type { SceneModel, StarMapConfig } from \"../types\";\n\nfunction matches(node: any, when: Record<string, unknown>) {\n for (const [k, v] of Object.entries(when)) {\n // check top level first, then meta\n const val = node[k] !== undefined ? node[k] : node.meta?.[k];\n if (val !== v) return false;\n }\n return true;\n}\n\nexport function applyVisuals({\n model,\n cfg,\n meshById\n }: {\n model: SceneModel;\n cfg: StarMapConfig;\n meshById: Map<string, THREE.Object3D>;\n}) {\n const colorRules = cfg.visuals?.colorBy ?? [];\n const sizeRules = cfg.visuals?.sizeBy ?? [];\n\n // precompute min/max for weight scaling\n const weights = model.nodes.map((n) => n.weight).filter((x): x is number => typeof x === \"number\");\n const minW = weights.length ? Math.min(...weights) : 0;\n const maxW = weights.length ? Math.max(...weights) : 1;\n const range = Math.max(0, maxW - minW);\n\n for (const node of model.nodes) {\n const mesh = meshById.get(node.id) as THREE.Mesh | undefined;\n if (!mesh) continue;\n\n // color\n let color: string | undefined;\n for (const rule of colorRules) {\n if (matches(node, rule.when)) {\n color = rule.value;\n break;\n }\n }\n if (color && (mesh.material as any)?.color) {\n (mesh.material as THREE.MeshBasicMaterial).color = new THREE.Color(color);\n }\n\n // size by weight\n for (const rule of sizeRules) {\n if (!matches(node, rule.when)) continue;\n const w = node[rule.field];\n if (typeof w !== \"number\") continue;\n\n const t = range === 0 ? 0.5 : (w - minW) / range;\n const clamped = Math.min(1, Math.max(0, t));\n const s = rule.scale[0] + t * (rule.scale[1] - rule.scale[0]);\n mesh.scale.setScalar(clamped === t ? s : rule.scale[0] + clamped * (rule.scale[1] - rule.scale[0]));\n break;\n }\n }\n}\n","import * as THREE from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls\";\nimport type { StarMapConfig, SceneModel, SceneNode } from \"../types\";\nimport { computeLayoutPositions } from \"./layout\";\nimport { applyVisuals } from \"./materials\";\n\ntype Handlers = {\n onSelect?: (node: SceneNode) => void;\n onHover?: (node?: SceneNode) => void;\n};\n\ntype EngineConfig = {\n // Stellarium-ish “stand in the middle and look out”\n skyRadius?: number; // radius for procedural backdrop stars\n groundRadius?: number; // radius of the ground hemisphere used to occlude “below horizon”\n horizonGlow?: boolean;\n\n // Zoom behaviour (FOV-based)\n defaultFov?: number;\n minFov?: number;\n maxFov?: number;\n fovWheelSensitivity?: number; // deg per wheel deltaY unit (scaled for ctrlKey pinch)\n resetFovOnDblClick?: boolean;\n\n // Click-to-focus behaviour\n focusOnSelect?: boolean;\n focusZoomFov?: number; // fov to animate to on focus\n focusDurationMs?: number;\n};\n\nexport function createEngine({\n container,\n onSelect,\n onHover,\n }: {\n container: HTMLDivElement;\n onSelect?: Handlers[\"onSelect\"];\n onHover?: Handlers[\"onHover\"];\n}) {\n // ---------------------------\n // Renderer / Scene / Camera\n // ---------------------------\n const renderer = new THREE.WebGLRenderer({ antialias: true });\n renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\n renderer.setClearColor(0x000000, 1);\n container.appendChild(renderer.domElement);\n // Prevent browser gestures from fighting pointer controls\n (renderer.domElement.style as any).touchAction = \"none\";\n\n const scene = new THREE.Scene();\n\n const camera = new THREE.PerspectiveCamera(90, 1, 0.1, 5000);\n // Tiny offset so OrbitControls has a radius to work with (like your Angular app)\n camera.position.set(0, 0, 0.01);\n camera.up.set(0, 1, 0);\n\n // ---------------------------\n // Controls: “look around”\n // ---------------------------\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.target.set(0, 0, 0);\n controls.enableRotate = true;\n controls.enablePan = false;\n controls.enableZoom = false; // wheel controls FOV (not dolly)\n controls.enableDamping = true;\n controls.dampingFactor = 0.07;\n controls.screenSpacePanning = false;\n\n // Free yaw; clamp pitch so we don’t go “under” the horizon.\n const EPS = THREE.MathUtils.degToRad(0.05);\n controls.minAzimuthAngle = -Infinity;\n controls.maxAzimuthAngle = Infinity;\n // OrbitControls: 0=top(looking down), PI=bottom(looking up).\n // We want to look UP at the sky, so we need range [PI/2, PI].\n controls.minPolarAngle = Math.PI / 2 + EPS; \n controls.maxPolarAngle = Math.PI - EPS; \n controls.update();\n\n // ---------------------------\n // Stellarium-ish environment\n // ---------------------------\n const env = {\n skyRadius: 2800,\n groundRadius: 995,\n horizonGlow: true,\n\n defaultFov: 90,\n minFov: 1,\n maxFov: 110,\n fovWheelSensitivity: 0.04,\n resetFovOnDblClick: true,\n\n focusOnSelect: false,\n focusZoomFov: 18,\n focusDurationMs: 650,\n } satisfies EngineConfig;\n\n // Ground group: an inside-facing lower hemisphere that WRITES depth\n // => hides below-horizon stars (very Stellarium)\n const groundGroup = new THREE.Group();\n scene.add(groundGroup);\n\n function buildGroundHemisphere(radius: number) {\n groundGroup.clear();\n\n // inside-facing lower hemisphere\n const hemi = new THREE.SphereGeometry(radius, 64, 32, 0, Math.PI * 2, Math.PI / 2, Math.PI);\n hemi.scale(-1, 1, 1);\n\n // vertex color gradient: darker down, brighter near horizon\n const count = (hemi.attributes.position as THREE.BufferAttribute).count;\n const colors = new Float32Array(count * 3);\n const pos = hemi.attributes.position as THREE.BufferAttribute;\n const c = new THREE.Color();\n\n for (let i = 0; i < count; i++) {\n const y = pos.getY(i); // [-radius, 0]\n const t = THREE.MathUtils.clamp(1 - Math.abs(y) / radius, 0, 1);\n // A simple deep-blue to near-horizon glow-ish ramp\n c.setRGB(\n THREE.MathUtils.lerp(0x06 / 255, 0x15 / 255, t),\n THREE.MathUtils.lerp(0x10 / 255, 0x23 / 255, t),\n THREE.MathUtils.lerp(0x17 / 255, 0x35 / 255, t)\n );\n colors.set([c.r, c.g, c.b], i * 3);\n }\n hemi.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\n const groundMat = new THREE.MeshBasicMaterial({\n vertexColors: true,\n side: THREE.FrontSide,\n depthWrite: true, // important: occlude stars under horizon\n depthTest: true,\n });\n\n const hemiMesh = new THREE.Mesh(hemi, groundMat);\n groundGroup.add(hemiMesh);\n\n if (env.horizonGlow) {\n const inner = radius * 0.985;\n const outer = radius * 1.005;\n const ringGeo = new THREE.RingGeometry(inner, outer, 128);\n ringGeo.rotateX(-Math.PI / 2);\n\n const ringMat = new THREE.ShaderMaterial({\n transparent: true,\n depthWrite: false,\n uniforms: {\n uInner: { value: inner },\n uOuter: { value: outer },\n uColor: { value: new THREE.Color(0x7aa2ff) },\n },\n vertexShader: `\n varying vec2 vXY;\n void main() {\n vXY = position.xz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform float uInner;\n uniform float uOuter;\n uniform vec3 uColor;\n varying vec2 vXY;\n\n void main() {\n float r = length(vXY);\n float t = clamp((r - uInner) / (uOuter - uInner), 0.0, 1.0);\n // peak glow near inner edge, fade outwards\n float a = pow(1.0 - t, 2.2) * 0.35;\n gl_FragColor = vec4(uColor, a);\n }\n `,\n });\n\n const ring = new THREE.Mesh(ringGeo, ringMat);\n ring.position.y = 0.0;\n groundGroup.add(ring);\n }\n }\n\n buildGroundHemisphere(env.groundRadius);\n\n // Backdrop stars (procedural points) far beyond your “model stars”\n const backdropGroup = new THREE.Group();\n scene.add(backdropGroup);\n\n function buildBackdropStars(radius: number, count: number) {\n backdropGroup.clear();\n\n const starGeo = new THREE.BufferGeometry();\n const starPos = new Float32Array(count * 3);\n\n for (let i = 0; i < count; i++) {\n const r = radius + Math.random() * (radius * 0.5);\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n starPos[i * 3] = r * Math.sin(phi) * Math.cos(theta);\n starPos[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta);\n starPos[i * 3 + 2] = r * Math.cos(phi);\n }\n\n starGeo.setAttribute(\"position\", new THREE.BufferAttribute(starPos, 3));\n const starMat = new THREE.PointsMaterial({\n color: 0x9aa6b2,\n size: 0.5,\n transparent: true,\n opacity: 0.55,\n depthWrite: false,\n });\n\n const stars = new THREE.Points(starGeo, starMat);\n backdropGroup.add(stars);\n }\n\n buildBackdropStars(env.skyRadius, 6500);\n\n // ---------------------------\n // Picking / Model content\n // ---------------------------\n const raycaster = new THREE.Raycaster();\n const pointer = new THREE.Vector2();\n\n const root = new THREE.Group();\n scene.add(root);\n\n let raf = 0;\n let running = false;\n let handlers: Handlers = { onSelect, onHover };\n let hoveredId: string | null = null;\n let isDragging = false;\n\n const nodeById = new Map<string, SceneNode>();\n const meshById = new Map<string, THREE.Object3D>();\n const lineByBookId = new Map<string, THREE.Line>();\n const dynamicObjects: { obj: THREE.Object3D; initialScale: THREE.Vector3; type: \"star\" | \"label\" }[] = [];\n\n // ---------------------------\n // Resize\n // ---------------------------\n function resize() {\n const w = container.clientWidth || 1;\n const h = container.clientHeight || 1;\n renderer.setSize(w, h, false);\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n }\n\n // ---------------------------\n // Dispose helpers\n // ---------------------------\n function disposeObject(obj: THREE.Object3D) {\n obj.traverse((o: any) => {\n if (o.geometry) o.geometry.dispose?.();\n if (o.material) {\n const mats = Array.isArray(o.material) ? o.material : [o.material];\n mats.forEach((m: any) => {\n if (m.map) m.map.dispose?.();\n m.dispose?.();\n });\n }\n });\n }\n\n function createTextSprite(text: string, color: string = \"#ffffff\") {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n\n const fontSize = 48;\n const font = `bold ${fontSize}px sans-serif`;\n ctx.font = font;\n\n const metrics = ctx.measureText(text);\n const w = Math.ceil(metrics.width);\n const h = Math.ceil(fontSize * 1.2);\n\n canvas.width = w;\n canvas.height = h;\n\n ctx.font = font;\n ctx.fillStyle = color;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, w / 2, h / 2);\n\n const tex = new THREE.CanvasTexture(canvas);\n tex.minFilter = THREE.LinearFilter;\n\n const mat = new THREE.SpriteMaterial({\n map: tex,\n transparent: true,\n depthWrite: false,\n depthTest: true,\n });\n\n const sprite = new THREE.Sprite(mat);\n\n // World-size label (you can later do Stellarium-style pixel fitting if you want)\n const targetHeight = 2;\n const aspect = w / h;\n sprite.scale.set(targetHeight * aspect, targetHeight, 1);\n\n return sprite;\n }\n\n function createStarTexture() {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 64;\n canvas.height = 64;\n const ctx = canvas.getContext(\"2d\")!;\n\n const gradient = ctx.createRadialGradient(32, 32, 0, 32, 32, 32);\n gradient.addColorStop(0, \"rgba(255, 255, 255, 1)\");\n gradient.addColorStop(0.2, \"rgba(255, 255, 255, 0.8)\");\n gradient.addColorStop(0.5, \"rgba(255, 255, 255, 0.2)\");\n gradient.addColorStop(1, \"rgba(255, 255, 255, 0)\");\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, 64, 64);\n\n const tex = new THREE.CanvasTexture(canvas);\n return tex;\n }\n\n const starTexture = createStarTexture();\n\n function clearRoot() {\n for (const child of [...root.children]) {\n root.remove(child);\n disposeObject(child);\n }\n nodeById.clear();\n meshById.clear();\n lineByBookId.clear();\n dynamicObjects.length = 0;\n }\n\n function buildFromModel(model: SceneModel, cfg: StarMapConfig) {\n clearRoot();\n\n // background + camera\n if (cfg.background && cfg.background !== \"transparent\") {\n scene.background = new THREE.Color(cfg.background);\n } else {\n scene.background = null;\n }\n\n // Respect config FOV if provided, otherwise use Stellarium-ish default\n camera.fov = cfg.camera?.fov ?? env.defaultFov;\n camera.updateProjectionMatrix();\n\n // Default to placing content at a \"sky-like\" radius if not specified\n const layoutCfg = {\n ...cfg.layout,\n radius: cfg.layout?.radius ?? 2000,\n };\n const laidOut = computeLayoutPositions(model, layoutCfg);\n\n // Create meshes\n for (const n of laidOut.nodes) {\n nodeById.set(n.id, n);\n\n const x = (n.meta?.x as number) ?? 0;\n const y = (n.meta?.y as number) ?? 0;\n const z = (n.meta?.z as number) ?? 0;\n\n // Level 3: Chapters -> Stars (Sprites)\n if (n.level === 3) {\n const mat = new THREE.SpriteMaterial({ \n map: starTexture, \n color: 0xffffff,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false\n });\n const sprite = new THREE.Sprite(mat);\n\n sprite.position.set(x, y, z);\n sprite.userData = { id: n.id, level: n.level };\n \n // Base size for stars\n const baseScale = 2.0;\n sprite.scale.setScalar(baseScale);\n\n // Add to dynamic scaling list\n dynamicObjects.push({ obj: sprite, initialScale: sprite.scale.clone(), type: \"star\" });\n\n // Hidden label for hover\n if (n.label) {\n const labelSprite = createTextSprite(n.label);\n if (labelSprite) {\n labelSprite.position.set(0, 1.2, 0);\n labelSprite.visible = false;\n sprite.add(labelSprite);\n }\n }\n\n root.add(sprite);\n meshById.set(n.id, sprite);\n }\n // Level 1 (Division) or 2 (Book) -> Text Labels on the Sky\n else if (n.level === 1 || n.level === 2) {\n if (n.label) {\n // Level 1 (e.g. \"Gospels\") vs Level 2 (e.g. \"John\")\n const isBook = n.level === 2;\n const color = isBook ? \"#ffffff\" : \"#38bdf8\";\n \n // Division labels: smaller, static\n // Book labels: larger, dynamic\n const baseScale = isBook ? 3.0 : 7.0; \n\n const labelSprite = createTextSprite(n.label, color); \n if (labelSprite) {\n labelSprite.position.set(x, y, z);\n labelSprite.scale.multiplyScalar(baseScale);\n root.add(labelSprite);\n\n // Only add Books to dynamicObjects so they scale/fade.\n // Divisions stay static.\n if (isBook) {\n dynamicObjects.push({ obj: labelSprite, initialScale: labelSprite.scale.clone(), type: \"label\" });\n }\n }\n }\n }\n }\n\n applyVisuals({ model: laidOut, cfg, meshById });\n\n\n // ---------------------------\n // Draw Constellation Lines (Sequential)\n // ---------------------------\n const lineMat = new THREE.LineBasicMaterial({\n color: 0x445566,\n transparent: true,\n opacity: 0.3,\n depthWrite: false,\n blending: THREE.AdditiveBlending\n });\n\n // Group by book\n const bookMap = new Map<string, SceneNode[]>();\n for (const n of laidOut.nodes) {\n if (n.level === 3 && n.parent) {\n const list = bookMap.get(n.parent) ?? [];\n list.push(n);\n bookMap.set(n.parent, list);\n }\n }\n\n for (const [bookId, chapters] of bookMap.entries()) {\n // Sort by chapter number\n chapters.sort((a, b) => {\n const cA = (a.meta?.chapter as number) || 0;\n const cB = (b.meta?.chapter as number) || 0;\n return cA - cB;\n });\n\n if (chapters.length < 2) continue;\n\n const points: THREE.Vector3[] = [];\n for (const c of chapters) {\n const x = (c.meta?.x as number) ?? 0;\n const y = (c.meta?.y as number) ?? 0;\n const z = (c.meta?.z as number) ?? 0;\n points.push(new THREE.Vector3(x, y, z));\n }\n\n const geo = new THREE.BufferGeometry().setFromPoints(points);\n const line = new THREE.Line(geo, lineMat);\n root.add(line);\n lineByBookId.set(bookId, line);\n }\n\n resize();\n }\n\n function setConfig(cfg: StarMapConfig) {\n let model = cfg.model;\n if (!model && cfg.data && cfg.adapter) model = cfg.adapter(cfg.data);\n\n if (!model) {\n clearRoot();\n return;\n }\n\n buildFromModel(model, cfg);\n }\n\n function setHandlers(next: Handlers) {\n handlers = next;\n }\n\n function pick(ev: MouseEvent) {\n const rect = renderer.domElement.getBoundingClientRect();\n pointer.x = ((ev.clientX - rect.left) / rect.width) * 2 - 1;\n pointer.y = -(((ev.clientY - rect.top) / rect.height) * 2 - 1);\n\n raycaster.setFromCamera(pointer, camera);\n const hits = raycaster.intersectObjects(root.children, true);\n // pick meshes or sprites\n const hit = hits.find((h) => h.object.type === \"Mesh\" || h.object.type === \"Sprite\");\n const id = hit?.object?.userData?.id as string | undefined;\n return id ? nodeById.get(id) : undefined;\n }\n\n // ---------------------------\n // Hover logic (labels on L3)\n // ---------------------------\n function onPointerMove(ev: PointerEvent) {\n const node = pick(ev);\n const nextId = node?.id ?? null;\n\n if (nextId !== hoveredId) {\n // hide previous hovered L3 label\n if (hoveredId) {\n const prevMesh = meshById.get(hoveredId);\n const prevNode = nodeById.get(hoveredId);\n if (prevMesh && prevNode && prevNode.level === 3) {\n const label = prevMesh.children.find((c) => c instanceof THREE.Sprite);\n if (label) label.visible = false;\n }\n }\n\n hoveredId = nextId;\n\n // show current hovered L3 label\n if (nextId) {\n const mesh = meshById.get(nextId);\n const n = nodeById.get(nextId);\n if (mesh && n && n.level === 3) {\n const label = mesh.children.find((c) => c instanceof THREE.Sprite);\n if (label) {\n label.visible = true;\n // Since we are using sprites now, they look at camera.\n // We might want to offset the label so it doesn't overlap the star.\n label.position.set(0, 0.8, 0); \n }\n\n // Brighten lines on hover\n if (n.parent) {\n const line = lineByBookId.get(n.parent);\n if (line) (line.material as THREE.LineBasicMaterial).opacity = 0.8;\n }\n }\n }\n\n handlers.onHover?.(node);\n }\n }\n\n function onPointerDown() {\n isDragging = false;\n }\n\n function onChange() {\n // OrbitControls fires change while dragging\n isDragging = true;\n }\n\n // ---------------------------\n // Stellarium-ish zoom (FOV)\n // ---------------------------\n const onWheelFov = (ev: WheelEvent) => {\n ev.preventDefault();\n\n // Trackpad pinch on macOS tends to come through as wheel w/ ctrlKey=true\n const speed = (ev.ctrlKey ? 0.15 : 1) * env.fovWheelSensitivity!;\n const next = THREE.MathUtils.clamp(\n camera.fov + ev.deltaY * speed,\n env.minFov!,\n env.maxFov!\n );\n\n if (next !== camera.fov) {\n camera.fov = next;\n camera.updateProjectionMatrix();\n }\n };\n\n const onDblClick = (ev: MouseEvent) => {\n const node = pick(ev);\n if (node) {\n const mesh = meshById.get(node.id);\n if (mesh) {\n animateFocusTo(mesh);\n return;\n }\n }\n\n if (!env.resetFovOnDblClick) return;\n camera.fov = env.defaultFov!;\n camera.updateProjectionMatrix();\n };\n\n // ---------------------------\n // Click-to-focus (aim + zoom)\n // ---------------------------\n let focusAnimRaf = 0;\n\n function cancelFocusAnim() {\n if (focusAnimRaf) cancelAnimationFrame(focusAnimRaf);\n focusAnimRaf = 0;\n }\n\n function getControlsAnglesSafe() {\n // OrbitControls exposes getAzimuthalAngle/getPolarAngle\n const getAz = (controls as any).getAzimuthalAngle?.bind(controls);\n const getPol = (controls as any).getPolarAngle?.bind(controls);\n return {\n azimuth: typeof getAz === \"function\" ? getAz() : 0,\n polar: typeof getPol === \"function\" ? getPol() : Math.PI / 4,\n };\n }\n\n function setControlsAnglesSafe(azimuth: number, polar: number) {\n // Newer three exposes setAzimuthalAngle / setPolarAngle.\n const setAz = (controls as any).setAzimuthalAngle?.bind(controls);\n const setPol = (controls as any).setPolarAngle?.bind(controls);\n\n if (typeof setAz === \"function\" && typeof setPol === \"function\") {\n setAz(azimuth);\n setPol(polar);\n controls.update();\n return;\n }\n\n // Fallback: rotate camera directly to look at a direction\n // (keeps the “standing in the middle” feel even if controls lacks setters)\n const dir = new THREE.Vector3();\n dir.setFromSphericalCoords(1, polar, azimuth);\n const lookAt = dir.clone().multiplyScalar(10);\n camera.lookAt(lookAt);\n }\n\n function aimAtWorldPoint(worldPoint: THREE.Vector3) {\n // We’re “at the origin”, so direction is point normalized.\n // OrbitControls places camera relative to target. To look AT 'dir', camera must be at '-dir'.\n const dir = worldPoint.clone().normalize().negate();\n // Convert direction -> spherical angles compatible with OrbitControls\n // In three: Spherical(phi=polar from +Y, theta=azimuth around Y from +Z toward +X)\n const spherical = new THREE.Spherical().setFromVector3(dir);\n let targetPolar = spherical.phi;\n let targetAz = spherical.theta;\n\n // Clamp to our allowed range (zenith..horizon)\n targetPolar = THREE.MathUtils.clamp(targetPolar, controls.minPolarAngle, controls.maxPolarAngle);\n\n return { targetAz, targetPolar };\n }\n\n function easeInOutCubic(t: number) {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n }\n\n function animateFocusTo(mesh: THREE.Object3D) {\n cancelFocusAnim();\n\n const { azimuth: startAz, polar: startPolar } = getControlsAnglesSafe();\n const startFov = camera.fov;\n\n const { targetAz, targetPolar } = aimAtWorldPoint(mesh.getWorldPosition(new THREE.Vector3()));\n const endFov = THREE.MathUtils.clamp(env.focusZoomFov!, env.minFov!, env.maxFov!);\n\n const start = performance.now();\n const dur = Math.max(120, env.focusDurationMs || 650);\n\n const tick = (now: number) => {\n const t = THREE.MathUtils.clamp((now - start) / dur, 0, 1);\n const k = easeInOutCubic(t);\n\n // Interpolate angles (shortest path for azimuth)\n let dAz = targetAz - startAz;\n // wrap to [-PI, PI]\n dAz = ((dAz + Math.PI) % (Math.PI * 2)) - Math.PI;\n\n const curAz = startAz + dAz * k;\n const curPolar = THREE.MathUtils.lerp(startPolar, targetPolar, k);\n setControlsAnglesSafe(curAz, curPolar);\n\n camera.fov = THREE.MathUtils.lerp(startFov, endFov, k);\n camera.updateProjectionMatrix();\n\n if (t < 1) {\n focusAnimRaf = requestAnimationFrame(tick);\n } else {\n focusAnimRaf = 0;\n }\n };\n\n focusAnimRaf = requestAnimationFrame(tick);\n }\n\n function onPointerUp(ev: PointerEvent) {\n if (isDragging) return;\n\n const node = pick(ev);\n if (!node) return;\n\n // fire your existing handler\n handlers.onSelect?.(node);\n\n // optional: also do Stellarium-like “aim + zoom” on select\n if (env.focusOnSelect) {\n const mesh = meshById.get(node.id);\n if (mesh) animateFocusTo(mesh);\n }\n }\n\n // ---------------------------\n // Lifecycle\n // ---------------------------\n function start() {\n if (running) return;\n running = true;\n\n resize();\n window.addEventListener(\"resize\", resize);\n\n renderer.domElement.addEventListener(\"pointermove\", onPointerMove);\n renderer.domElement.addEventListener(\"pointerdown\", onPointerDown);\n renderer.domElement.addEventListener(\"pointerup\", onPointerUp);\n\n // wheel FOV zoom (passive:false so preventDefault works)\n renderer.domElement.addEventListener(\"wheel\", onWheelFov, { passive: false });\n\n renderer.domElement.addEventListener(\"dblclick\", onDblClick);\n\n controls.addEventListener(\"change\", onChange);\n\n const tick = () => {\n raf = requestAnimationFrame(tick);\n \n // Damping rotation sensitivity based on zoom level\n controls.rotateSpeed = camera.fov / (env.defaultFov || 90);\n \n // Dynamic scaling based on FOV (Zoomed out = larger stars/labels)\n // Reference: FOV 15 is \"close up\" (scale 1x). FOV 90 is \"wide\" (scale larger).\n // Formula: scale = 1 + (fov - 15) * factor\n const fov = camera.fov;\n const minZoomFov = 15; // The FOV where items should be \"normal size\"\n \n // Factor to control how much they grow. \n // We want stars to stay point-like but be visible.\n const scaleFactor = Math.max(1, 1 + (fov - minZoomFov) * 0.05);\n\n // Gaze-based fading for labels\n const cameraDir = new THREE.Vector3();\n camera.getWorldDirection(cameraDir);\n \n // Re-use vector to avoid GC\n const objPos = new THREE.Vector3();\n const objDir = new THREE.Vector3();\n\n for (let i = 0; i < dynamicObjects.length; i++) {\n const item = dynamicObjects[i];\n // Scale from INITIAL vector to preserve aspect ratio\n item.obj.scale.copy(item.initialScale).multiplyScalar(scaleFactor);\n\n // Gaze check for labels\n if (item.type === \"label\") {\n const sprite = item.obj as THREE.Sprite;\n \n // Get direction to object\n // Since camera is at 0,0,0 (mostly), direction is just position normalized.\n // But our camera might be slightly offset (0,0,0.01).\n // Let's be precise:\n sprite.getWorldPosition(objPos);\n objDir.subVectors(objPos, camera.position).normalize();\n \n // Dot product: 1.0 = direct center, 0.0 = 90 deg off\n const dot = cameraDir.dot(objDir);\n \n // Define \"focus cone\"\n // 1.0 -> 0.95 (approx 18 deg): Full opacity\n // 0.95 -> 0.85 (approx 30 deg): Fade out\n // < 0.85: Invisible\n const fullVisibleDot = 0.96;\n const invisibleDot = 0.88;\n \n let opacity = 0;\n if (dot >= fullVisibleDot) {\n opacity = 1;\n } else if (dot > invisibleDot) {\n opacity = (dot - invisibleDot) / (fullVisibleDot - invisibleDot);\n }\n \n // Smooth transition or direct? Direct is fine for now, standard lerp.\n sprite.material.opacity = opacity;\n sprite.visible = opacity > 0.01;\n\n // Also fade the corresponding constellation lines\n const bookId = nodeById.get(item.obj.userData.id)?.id;\n if (bookId) {\n const line = lineByBookId.get(bookId);\n if (line) {\n (line.material as THREE.LineBasicMaterial).opacity = 0.05 + opacity * 0.45;\n }\n }\n }\n }\n\n controls.update();\n renderer.render(scene, camera);\n };\n tick();\n }\n\n function stop() {\n running = false;\n cancelAnimationFrame(raf);\n cancelFocusAnim();\n\n window.removeEventListener(\"resize\", resize);\n\n renderer.domElement.removeEventListener(\"pointermove\", onPointerMove);\n renderer.domElement.removeEventListener(\"pointerdown\", onPointerDown);\n renderer.domElement.removeEventListener(\"pointerup\", onPointerUp);\n renderer.domElement.removeEventListener(\"wheel\", onWheelFov as any);\n renderer.domElement.removeEventListener(\"dblclick\", onDblClick);\n\n controls.removeEventListener(\"change\", onChange);\n }\n\n function dispose() {\n stop();\n clearRoot();\n\n // env groups\n for (const child of [...groundGroup.children]) {\n groundGroup.remove(child);\n disposeObject(child);\n }\n for (const child of [...backdropGroup.children]) {\n backdropGroup.remove(child);\n disposeObject(child);\n }\n\n controls.dispose();\n renderer.dispose();\n renderer.domElement.remove();\n }\n\n return { setConfig, start, stop, dispose, setHandlers };\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport type { StarMapConfig, SceneNode } from \"../types\";\n\nexport type StarMapProps = {\n config: StarMapConfig;\n className?: string;\n onSelect?: (node: SceneNode) => void;\n onHover?: (node?: SceneNode) => void;\n};\n\nexport function StarMap({ config, className, onSelect, onHover }: StarMapProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const engineRef = useRef<any>(null);\n\n useEffect(() => {\n let disposed = false;\n\n async function init() {\n if (!containerRef.current) return;\n const { createEngine } = await import(\"../engine/createEngine\");\n if (disposed) return;\n\n engineRef.current = createEngine({\n container: containerRef.current,\n onSelect,\n onHover\n });\n\n engineRef.current.setConfig(config);\n engineRef.current.start();\n }\n\n init();\n\n return () => {\n disposed = true;\n engineRef.current?.dispose?.();\n engineRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n engineRef.current?.setConfig?.(config);\n }, [config]);\n\n useEffect(() => {\n engineRef.current?.setHandlers?.({ onSelect, onHover });\n }, [onSelect, onHover]);\n\n return <div ref={containerRef} className={className} style={{ width: \"100%\", height: \"100%\" }} />;\n}\n","import type { SceneModel, SceneNode } from \"../types\";\n\nexport type BibleJSON = {\n testaments: Array<{\n name: string;\n divisions: Array<{\n name: string;\n books: Array<{\n key: string;\n name: string;\n chapters: number;\n verses?: number[];\n icons?: string[];\n }>;\n }>;\n }>;\n};\n\nexport function bibleToSceneModel(data: BibleJSON): SceneModel {\n const nodes: SceneNode[] = [];\n const links: SceneModel[\"links\"] = [];\n\n const id = {\n testament: (t: string) => `T:${t}`,\n division: (t: string, d: string) => `D:${t}:${d}`,\n book: (key: string) => `B:${key}`,\n chapter: (key: string, ch: number) => `C:${key}:${ch}`\n };\n\n for (const t of data.testaments) {\n const tid = id.testament(t.name);\n nodes.push({ id: tid, label: t.name, level: 0, meta: { testament: t.name } });\n\n for (const d of t.divisions) {\n const did = id.division(t.name, d.name);\n nodes.push({\n id: did,\n label: d.name,\n level: 1,\n parent: tid,\n meta: { testament: t.name, division: d.name }\n });\n links.push({ source: did, target: tid });\n\n for (const b of d.books) {\n const bid = id.book(b.key);\n nodes.push({\n id: bid,\n label: b.name,\n level: 2,\n parent: did,\n meta: { testament: t.name, division: d.name, bookKey: b.key, book: b.name }\n });\n links.push({ source: bid, target: did });\n\n const verses = b.verses ?? [];\n for (let i = 0; i < verses.length; i++) {\n const chapterNum = i + 1;\n const cid = id.chapter(b.key, chapterNum);\n nodes.push({\n id: cid,\n label: `${b.name} ${chapterNum}`,\n level: 3,\n parent: bid,\n weight: verses[i],\n icon: b.icons?.[i] ?? b.icons?.[0], \n meta: {\n testament: t.name,\n division: d.name,\n bookKey: b.key,\n book: b.name,\n chapter: chapterNum\n }\n });\n links.push({ source: cid, target: bid });\n }\n }\n }\n }\n\n return { nodes, links };\n}\n"]}
|