@naniteninja/trait-visual 1.0.2 → 1.0.3
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.
|
@@ -3,7 +3,7 @@ import * as i0 from '@angular/core';
|
|
|
3
3
|
import { Input, ViewChild, Component } from '@angular/core';
|
|
4
4
|
import * as THREE from 'three';
|
|
5
5
|
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
|
|
6
|
-
import
|
|
6
|
+
import { PCA } from 'ml-pca';
|
|
7
7
|
|
|
8
8
|
class Node extends THREE.Object3D {
|
|
9
9
|
options;
|
|
@@ -1934,7 +1934,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.11", ngImpo
|
|
|
1934
1934
|
}] } });
|
|
1935
1935
|
|
|
1936
1936
|
// Dynamically resolve the PCA constructor for different build types
|
|
1937
|
-
const PCAClass =
|
|
1937
|
+
const PCAClass = PCA.default || PCA.PCA || PCA;
|
|
1938
1938
|
let dynamicCounts = {
|
|
1939
1939
|
attributes: 8,
|
|
1940
1940
|
preferences: 8
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naniteninja-trait-visual.mjs","sources":["../../../projects/trait-visual/src/lib/objects/Node.ts","../../../projects/trait-visual/src/lib/objects/Cluster.ts","../../../projects/trait-visual/src/lib/services/black-hole-particle-field.ts","../../../projects/trait-visual/src/lib/trait-visual.component.ts","../../../projects/trait-visual/src/lib/trait-visual.component.html","../../../projects/trait-visual/src/lib/data/nodes.data.ts","../../../projects/trait-visual/src/public-api.ts","../../../projects/trait-visual/src/naniteninja-trait-visual.ts"],"sourcesContent":["import * as THREE from 'three';\nimport { ISimulationConfigs, INodeData, ISwapAnimation } from '../app.types';\nimport { GlowUniforms } from '../types/glow.types';\n\nexport class Node extends THREE.Object3D {\n options: ISimulationConfigs;\n velocity: THREE.Vector3;\n isSun: boolean;\n attributes: number[];\n preferences: number[];\n preference: number = 0;\n mesh: THREE.Mesh;\n swap: ISwapAnimation | null = null;\n\n static attributeWeights: number[] = [];\n static preferenceWeights: number[] = [];\n private static normalizeWeights(weights: number[], len: number): number[] {\n const list = Array.isArray(weights) ? weights.slice(0, len) : [];\n const extended = list.slice();\n while (extended.length < len) extended.push(1);\n return extended.map((w) => (Number.isFinite(w) && w >= 0 ? w : 0));\n }\n\n private sunBaseScale: number = 3;\n private halo!: THREE.Mesh;\n private coreSprite!: THREE.Sprite;\n private haloSprite!: THREE.Sprite;\n private readonly baseSphereRadius = 0.05; // geometry radius\n\n private clock = new THREE.Clock();\n\n constructor(data: INodeData, options: ISimulationConfigs) {\n super();\n this.options = options;\n this.position.fromArray(data.initialPosition);\n this.velocity = new THREE.Vector3(0, 0, 0);\n this.userData = { ...data };\n this.isSun = data.isSun;\n\n this.attributes = data.attributes\n ? [...Object.values(data.attributes)]\n : Array.from({ length: 10 }, () => Math.floor(Math.random() * 99));\n\n this.preferences = data.preferences\n ? [...Object.values(data.preferences)]\n : Array.from({ length: 10 }, () => Math.floor(Math.random() * 99));\n\n // Create glowing core using additive Fresnel-like shader (center-bright)\n const geom = new THREE.SphereGeometry(this.baseSphereRadius, 48, 48);\n const coreMat = makeCoreGlowMaterial(\n this.isSun ? new THREE.Color('#C300FF') : new THREE.Color('#FF3366'),\n this.isSun ? 0.9 : 0.7,\n 3.5,\n this.isSun ? 0.6 : 0.35 // base floor so planets stay red from all angles\n );\n this.mesh = new THREE.Mesh(geom, coreMat);\n this.add(this.mesh);\n\n // Soft additive rim glow (BackSide Fresnel)\n const haloMat = makeRimGlowMaterial(\n this.isSun ? new THREE.Color('#C300FF') : new THREE.Color('#FF3366'),\n this.isSun ? 0.22 : 0.16,\n 0.2,\n 2.2\n );\n this.halo = new THREE.Mesh(geom.clone(), haloMat);\n this.halo.scale.setScalar(this.isSun ? 1.8 : 1.35);\n this.add(this.halo);\n\n // Camera-facing luminous core billboard to ensure visibility from all angles\n this.coreSprite = this.createBillboardGlow(\n this.isSun ? new THREE.Color('#C300FF') : new THREE.Color('#FF3366'),\n this.isSun ? 0.35 : 0.25, // reduced to avoid washing out particles\n this.isSun ? 1.4 : 1.05\n );\n this.coreSprite.visible = false; // keep glow sprites hidden for clearer particles\n this.add(this.coreSprite);\n\n // Softer, larger halo billboard (always-on rim feel)\n this.halo.visible = false; // keep mesh halo hidden\n this.haloSprite = this.createBillboardGlow(\n this.isSun ? new THREE.Color('#C300FF') : new THREE.Color('#FF3366'),\n this.isSun ? 0.08 : 0.06, // much softer halo\n this.isSun ? 2.2 : 1.6\n );\n this.haloSprite.renderOrder = 18;\n this.haloSprite.visible = false; // hide outer halo to ensure particles remain readable\n this.add(this.haloSprite);\n }\n\n updatePhysics(nodes: Node[], central: Node | null, deltaTime: number): void {\n if (!nodes || nodes.length === 0) return;\n\n const forces: THREE.Vector3[] = nodes.map(() => new THREE.Vector3());\n\n // --- Attraction: from each non-sun node to central (sun) ---\n if (central) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node === central) continue;\n\n const d = central.position.clone().sub(node.position);\n const distanceSq = d.lengthSq() + 1e-4;\n\n const compatibility = node.calculatePreferredCompatibility(central);\n\n let force = d\n .normalize()\n .multiplyScalar(\n (this.options.sun.attraction * compatibility * 2.0) /\n (distanceSq + 0.5)\n );\n\n // Clamp runaway attraction\n force.clampLength(0, 0.08);\n forces[i].add(force);\n }\n }\n\n // ---Outer ↔ Outer interactions (blend of attraction and repulsion) ---\n for (let i = 0; i < nodes.length; i++) {\n const a = nodes[i];\n if (a === central) continue;\n\n for (let j = i + 1; j < nodes.length; j++) {\n const b = nodes[j];\n if (b === central) continue;\n\n const dir = b.position.clone().sub(a.position);\n const distSq = dir.lengthSq() + 1e-6;\n const dist = Math.sqrt(distSq);\n\n if (dist < 1e-8) continue;\n\n const similarity = a.calculateAttributeCompatibility(b);\n const dissimilarity = 1 - similarity;\n\n const radiusA = a.baseSphereRadius * a.mesh.scale.x;\n const radiusB = b.baseSphereRadius * b.mesh.scale.x;\n const minDist = (radiusA + radiusB) * 1;\n\n if (dist < minDist) {\n const repel = dir\n .normalize()\n .multiplyScalar(this.options.planet.repulsion / (distSq + 0.01));\n repel.clampLength(0, 0.25);\n forces[i].sub(repel);\n forces[j].add(repel);\n continue;\n }\n\n const attractMag =\n (30 * similarity * 3.0) / (distSq + 0.5);\n const repelMag =\n 90 * dissimilarity / (distSq + 0.5);\n\n const netMag = attractMag - repelMag;\n if (Math.abs(netMag) < 1e-4) continue;\n\n const f = dir.normalize().multiplyScalar(netMag).clampLength(-0.9, 0.9);\n\n forces[i].add(f);\n forces[j].add(f.clone().multiplyScalar(-1));\n }\n }\n\n // ---Extra Repulsion (outer nodes only) ---\n for (let i = 0; i < nodes.length; i++) {\n const a = nodes[i];\n if (a === central) continue;\n\n for (let j = i + 1; j < nodes.length; j++) {\n const b = nodes[j];\n if (b === central) continue;\n\n const dir = a.position.clone().sub(b.position);\n const distSq = dir.lengthSq() + 1e-4;\n const similarity = a.calculateAttributeCompatibility(b);\n const mag =\n 20 * (1 - similarity) / (distSq + 0.5);\n\n const f = dir.normalize().multiplyScalar(mag).clampLength(0, 0.9);\n forces[i].add(f);\n forces[j].add(f.clone().multiplyScalar(-1));\n }\n }\n\n // --- Apply forces → velocities → positions ---\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node == central) continue;\n\n if (!(node.velocity instanceof THREE.Vector3)) {\n node.velocity = new THREE.Vector3(0, 0, 0);\n }\n\n const effectiveDt = Math.min(deltaTime, 0.95);\n const acceleration = forces[i];\n\n // apply acceleration\n node.velocity.addScaledVector(acceleration, effectiveDt);\n\n // --- jitter suppression ---\n // add a small deadzone to prevent micro-oscillation\n if (node.velocity.lengthSq() < 1e-10) {\n node.velocity.set(0, 0, 0);\n continue;\n }\n\n // soft low-pass filter to smooth small fluctuations\n node.velocity.lerp(node.velocity.clone(), 0.95);\n\n // damping\n // const dampingFactor = 1 - 0.8 * 0.9;\n const dampingFactor = 0.181;\n node.velocity.multiplyScalar(dampingFactor);\n\n // clamp to prevent small high-frequency shake\n node.velocity.clampLength(0, 0.15);\n\n // integrate motion\n node.position.addScaledVector(node.velocity, effectiveDt);\n\n // --- Multi-node jitter suppression (group stabilizer) ---\n if (nodes.length > 2) {\n let nearCount = 0;\n for (let j = 0; j < nodes.length; j++) {\n if (j === i || nodes[j] === central) continue;\n const d = node.position.distanceTo(nodes[j].position);\n if (d < 0.35) nearCount++; // consider nodes within a small neighborhood\n }\n // if surrounded by 2+ near neighbors and moving very slowly, freeze micro motion\n if (nearCount >= 2 && node.velocity.lengthSq() < 1e-5) {\n node.velocity.multiplyScalar(0.1); // heavy dampening\n if (node.velocity.lengthSq() < 1e-10) node.velocity.set(0, 0, 0);\n }\n }\n\n }\n\n // --- Final stabilization: prevent overlap among similar clusters ---\n const separationRadius = 0.12; \n const stiffness = 0.1; \n\n for (let i = 0; i < nodes.length; i++) {\n const a = nodes[i];\n if (a === central) continue;\n for (let j = i + 1; j < nodes.length; j++) {\n const b = nodes[j];\n if (b === central) continue;\n\n const dir = a.position.clone().sub(b.position);\n const dist = dir.length();\n if (dist < separationRadius && dist > 0.01) {\n // very small corrective displacement only, not a new force\n const overlap = separationRadius - dist;\n const correction = dir.normalize().multiplyScalar(overlap * stiffness);\n a.position.add(correction);\n b.position.sub(correction);\n }\n }\n }\n\n \n }\n\n\n setSun(state: boolean = !this.isSun, preference?: number): void {\n this.isSun = state;\n\n if (state) {\n // Switch to neon purple core; keep sprites hidden for clarity\n const core = this.mesh.material as THREE.ShaderMaterial;\n core.uniforms['glowColor'].value = new THREE.Color('#C300FF');\n core.uniforms['opacity'].value = 0.9;\n core.uniforms['base'].value = 0.6;\n const halo = this.halo.material as THREE.ShaderMaterial;\n halo.uniforms['glowColor'].value = new THREE.Color('#C300FF');\n halo.uniforms['opacity'].value = 0.22;\n this.halo.scale.setScalar(1.8);\n // Billboard core (hidden)\n (this.coreSprite.material as THREE.SpriteMaterial).color =\n new THREE.Color('#C300FF');\n (this.coreSprite.material as THREE.SpriteMaterial).opacity = 0.35;\n const dSun = this.baseSphereRadius * 2 * 1.8;\n this.coreSprite.scale.set(dSun, dSun, 1);\n // Billboard halo (hidden)\n (this.haloSprite.material as THREE.SpriteMaterial).color =\n new THREE.Color('#C300FF');\n (this.haloSprite.material as THREE.SpriteMaterial).opacity = 0.08;\n const dSunHalo = this.baseSphereRadius * 2 * 3.0;\n this.haloSprite.scale.set(dSunHalo, dSunHalo, 1);\n } else {\n // Switch to pink-red core; keep sprites hidden for clarity\n const core = this.mesh.material as THREE.ShaderMaterial;\n core.uniforms['glowColor'].value = new THREE.Color('#FF3366');\n core.uniforms['opacity'].value = 0.7;\n core.uniforms['base'].value = 0.35;\n const halo = this.halo.material as THREE.ShaderMaterial;\n halo.uniforms['glowColor'].value = new THREE.Color('#FF3366');\n halo.uniforms['opacity'].value = 0.16;\n this.halo.scale.setScalar(1.35);\n // Billboard core (hidden)\n (this.coreSprite.material as THREE.SpriteMaterial).color =\n new THREE.Color('#FF3366');\n (this.coreSprite.material as THREE.SpriteMaterial).opacity = 0.25;\n const d = this.baseSphereRadius * 2 * 1.3;\n this.coreSprite.scale.set(d, d, 1);\n // Billboard halo (hidden)\n (this.haloSprite.material as THREE.SpriteMaterial).color =\n new THREE.Color('#FF3366');\n (this.haloSprite.material as THREE.SpriteMaterial).opacity = 0.06;\n const dHalo = this.baseSphereRadius * 2 * 2.0;\n this.haloSprite.scale.set(dHalo, dHalo, 1);\n }\n\n if (preference !== undefined) {\n this.preference = preference;\n }\n }\n\n calculatePreferredCompatibility(sun: Node): number {\n const sunPreferences = sun.preferences;\n const planetAttributes = this.attributes;\n const len = Math.min(sunPreferences.length, planetAttributes.length);\n const weights = Node.normalizeWeights(Node.preferenceWeights, len);\n let diffSum = 0;\n let weightSum = 0;\n for (let i = 0; i < len; i++) {\n const w = weights[i];\n diffSum += w * Math.abs(sunPreferences[i] - planetAttributes[i]);\n weightSum += w;\n }\n const maxDiff = Math.max(1e-6, weightSum * 100);\n return 1 - diffSum / maxDiff;\n }\n\n calculateAttributeCompatibility(other: Node): number {\n const attributesA = this.attributes;\n const attributesB = other.attributes;\n const len = Math.min(attributesA.length, attributesB.length);\n const weights = Node.normalizeWeights(Node.attributeWeights, len);\n let diffSum = 0;\n let weightSum = 0;\n for (let i = 0; i < len; i++) {\n const w = weights[i];\n diffSum += w * Math.abs(attributesA[i] - attributesB[i]);\n weightSum += w;\n }\n const maxDiff = Math.max(1e-6, weightSum * 100);\n return 1 - diffSum / maxDiff;\n }\n\n update(\n nodes: Node[],\n cursorPosition?: THREE.Vector3,\n scene?: THREE.Scene,\n camera?: THREE.Camera\n ): void {\n if (this.swap) {\n this.handleSwapAnimation();\n return;\n }\n\n // Sun: keep steady size and glow (disable pulsation)\n if (this.isSun) {\n const targetScale = this.sunBaseScale;\n this.mesh.scale.lerp(\n new THREE.Vector3(targetScale, targetScale, targetScale),\n 0.2\n );\n const core = this.mesh.material as THREE.ShaderMaterial;\n core.uniforms['opacity'].value = 0.75;\n const haloMat = this.halo.material as THREE.ShaderMaterial;\n haloMat.uniforms['opacity'].value = 0.14;\n const haloScale = 1.8;\n this.halo.scale.lerp(new THREE.Vector3(haloScale, haloScale, haloScale), 0.2);\n // Sprites remain hidden/steady\n return;\n }\n let totalForce = new THREE.Vector3();\n const sun: Node | null = nodes.find((n) => n.isSun) ?? null;\n if (sun) {\n totalForce.add(this.calculateSunForce(sun));\n\n // Update planet glow based on compatibility with sun\n const compat = this.calculatePreferredCompatibility(sun); // 0..1\n const core = this.mesh.material as THREE.ShaderMaterial;\n core.uniforms['opacity'].value = 0.55 + compat * 0.4; // brighter core with compatibility\n // Planet additive halo tightly around mesh\n const haloMat = this.halo.material as THREE.ShaderMaterial;\n const baseOpacity = 0.12 + compat * 0.25; // 0.12..0.37\n let proximityBoost = 0;\n if (cursorPosition) {\n const d = this.position.distanceTo(cursorPosition);\n proximityBoost = Math.max(0, 1 - d / 1.5) * 0.04; // very subtle\n }\n haloMat.uniforms['opacity'].value = Math.min(\n 0.5,\n baseOpacity + proximityBoost\n );\n this.mesh.scale.set(1.9, 1.9, 1.9);\n const s = 1.35 * (1 + compat * 0.15);\n this.halo.scale.lerp(new THREE.Vector3(s, s, s), 0.25);\n // Billboard tuning for planets\n const coreMat = this.coreSprite.material as THREE.SpriteMaterial;\n coreMat.opacity = 0.45 + compat * 0.35 + proximityBoost * 0.2;\n const d2 =\n this.baseSphereRadius * 2 * (1.3 + compat * 0.2) * this.mesh.scale.x;\n this.coreSprite.scale.lerp(new THREE.Vector3(d2, d2, 1), 0.2);\n const haloMatS = this.haloSprite.material as THREE.SpriteMaterial;\n haloMatS.opacity = 0.16 + compat * 0.18 + proximityBoost * 0.1;\n const d2h =\n this.baseSphereRadius * 2 * (2.0 + compat * 0.5) * this.mesh.scale.x;\n this.haloSprite.scale.lerp(new THREE.Vector3(d2h, d2h, 1), 0.2);\n }\n totalForce.add(this.calculatePlanetRepulsion(nodes));\n totalForce.add(this.calculatePlanetAttraction(nodes));\n totalForce.multiplyScalar(this.options.velocityDamping);\n\n\n const deltaTime = this.clock.getDelta();\n\n this.updatePhysics(nodes, sun, deltaTime);\n this.applyForces(totalForce);\n }\n\n // (Sprite-based glow removed in favor of additive core + halo meshes)\n private createBillboardGlow(\n color: THREE.Color,\n opacity: number,\n diameterMultiplier: number\n ): THREE.Sprite {\n const size = 128;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n const g = ctx.createRadialGradient(\n size / 2,\n size / 2,\n 0,\n size / 2,\n size / 2,\n size / 2\n );\n g.addColorStop(0.0, 'rgba(255,255,255,1)');\n g.addColorStop(0.5, 'rgba(255,255,255,0.6)');\n g.addColorStop(1.0, 'rgba(255,255,255,0)');\n ctx.fillStyle = g;\n ctx.fillRect(0, 0, size, size);\n const tex = new THREE.CanvasTexture(canvas);\n tex.minFilter = THREE.LinearFilter;\n tex.magFilter = THREE.LinearFilter;\n const material = new THREE.SpriteMaterial({\n map: tex,\n color,\n transparent: true,\n opacity,\n depthWrite: false,\n depthTest: false,\n blending: THREE.AdditiveBlending,\n });\n const sprite = new THREE.Sprite(material);\n const diameter = this.baseSphereRadius * 2 * diameterMultiplier;\n sprite.scale.set(diameter, diameter, 1);\n sprite.renderOrder = 20;\n return sprite;\n }\n\n private calculateSunForce(sun: Node): THREE.Vector3 {\n let force = new THREE.Vector3();\n const compatibility = this.calculatePreferredCompatibility(sun);\n const desiredDistance = 0.25 + (1 - compatibility) * 4.0;\n const currentDistance = sun.position.distanceTo(this.position);\n const error = currentDistance - desiredDistance;\n const directionToSun = new THREE.Vector3()\n .subVectors(sun.position, this.position)\n .normalize();\n\n if (currentDistance < desiredDistance) {\n const repulsionForce =\n -this.options.sun.repulsion *\n (desiredDistance - currentDistance) *\n compatibility;\n force.add(directionToSun.multiplyScalar(repulsionForce));\n } else {\n const attractionForce =\n 2 * this.options.sun.attraction * error * compatibility + 0.001;\n force.add(directionToSun.multiplyScalar(attractionForce));\n }\n\n return force;\n }\n\n private calculatePlanetAttraction(nodes: Node[]): THREE.Vector3 {\n let attractionForce = new THREE.Vector3();\n const attractionConstant = 0.001;\n nodes.forEach((other) => {\n if (other !== this && !other.isSun) {\n const compatibility = this.calculateAttributeCompatibility(other);\n const forceMagnitude = attractionConstant * compatibility - 0.001;\n const attractionDirection = new THREE.Vector3()\n .subVectors(other.position, this.position)\n .normalize();\n attractionForce.add(attractionDirection.multiplyScalar(forceMagnitude));\n }\n });\n return attractionForce;\n }\n\n private calculatePlanetRepulsion(nodes: Node[]): THREE.Vector3 {\n let repulsionForce = new THREE.Vector3();\n nodes.forEach((other) => {\n if (other !== this && !other.isSun) {\n const distance = this.position.distanceTo(other.position);\n if (distance < this.options.planet.repulsionInitializationThreshold) {\n const compatibility = this.calculateAttributeCompatibility(other);\n const repulsion =\n this.options.planet.repulsion *\n (this.options.planet.repulsionInitializationThreshold -\n distance) *\n (1 - compatibility) +\n 0.001;\n const repulsionDirection = new THREE.Vector3()\n .subVectors(this.position, other.position)\n .normalize();\n repulsionForce.add(repulsionDirection.multiplyScalar(repulsion));\n }\n }\n });\n return repulsionForce;\n }\n\n private applyForces(force: THREE.Vector3): void {\n this.velocity.add(force);\n if (this.velocity.length() > this.options.maxVelocity) {\n this.velocity.setLength(this.options.maxVelocity);\n }\n this.velocity.multiplyScalar(this.options.velocityDamping);\n this.position.add(this.velocity);\n }\n\n private handleSwapAnimation(): void {\n if (!this.swap) return;\n const currentSwap = this.swap;\n const currentTime = performance.now();\n let progress = (currentTime - currentSwap.startTime) / currentSwap.duration;\n if (progress >= 1) {\n progress = 1;\n this.velocity.set(0, 0, 0);\n this.swap = null;\n }\n this.position.copy(\n currentSwap.start.clone().lerp(currentSwap.end, progress)\n );\n }\n}\n\nfunction makeCoreGlowMaterial(\n color: THREE.Color,\n opacity = 0.8,\n power = 3.5,\n base = 0.1\n): THREE.ShaderMaterial {\n const uniforms: GlowUniforms = {\n glowColor: { value: color },\n opacity: { value: opacity },\n p: { value: power },\n base: { value: base },\n };\n const vertex = `\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n void main() {\n vNormal = normalize(normalMatrix * normal);\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\n vWorldPosition = worldPosition.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n const fragment = `\n uniform vec3 glowColor;\n uniform float opacity;\n uniform float p;\n uniform float base;\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n void main() {\n vec3 viewDir = normalize(cameraPosition - vWorldPosition);\n // Center-bright with a base floor so sides never go black\n float ndv = clamp(dot(vNormal, viewDir), 0.0, 1.0);\n float intensity = base + (1.0 - base) * pow(ndv, p);\n gl_FragColor = vec4(glowColor * intensity, intensity * opacity);\n }\n `;\n return new THREE.ShaderMaterial({\n uniforms,\n vertexShader: vertex,\n fragmentShader: fragment,\n transparent: true,\n depthWrite: false,\n blending: THREE.AdditiveBlending,\n side: THREE.FrontSide,\n });\n}\n\nfunction makeRimGlowMaterial(\n color: THREE.Color,\n opacity = 0.2,\n c = 0.2,\n power = 2.2\n): THREE.ShaderMaterial {\n const uniforms: GlowUniforms = {\n glowColor: { value: color },\n opacity: { value: opacity },\n c: { value: c },\n p: { value: power },\n };\n const vertex = `\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n void main() {\n vNormal = normalize(normalMatrix * normal);\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\n vWorldPosition = worldPosition.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n const fragment = `\n uniform vec3 glowColor;\n uniform float opacity;\n uniform float c;\n uniform float p;\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n void main() {\n vec3 viewDir = normalize(cameraPosition - vWorldPosition);\n float intensity = pow(max(0.0, c - dot(vNormal, viewDir)), p);\n gl_FragColor = vec4(glowColor, intensity * opacity);\n }\n `;\n return new THREE.ShaderMaterial({\n uniforms,\n vertexShader: vertex,\n fragmentShader: fragment,\n transparent: true,\n depthWrite: false,\n blending: THREE.AdditiveBlending,\n side: THREE.BackSide,\n });\n}\n\n(Node.prototype as any).makeCoreGlowMaterial = makeCoreGlowMaterial;\n(Node.prototype as any).makeRimGlowMaterial = makeRimGlowMaterial;\n","import * as THREE from 'three';\nimport {\n ISimulationConfigs,\n INodeData,\n} from '../app.types';\nimport { Node } from './Node';\n\nexport class Cluster extends THREE.Object3D {\n options: ISimulationConfigs;\n nodes: Node[];\n\n constructor(nodeData: INodeData[], options?: Partial<ISimulationConfigs>) {\n super();\n this.options = {\n sun: {\n attraction: 1,\n repulsion: 1,\n repulsionInitializationThreshold: 0.4,\n },\n planet: {\n attraction: 1,\n repulsion: 1,\n repulsionInitializationThreshold: 0.2,\n },\n maxVelocity: 0.02,\n velocityDamping: 0.8,\n minAttributeValue: 0,\n minPreferenceValue: 0,\n maxAttributeValue: 100,\n maxPreferenceValue: 100,\n ...options,\n };\n this.nodes = [];\n this.setUp(nodeData);\n }\n\n setUp(nodeData: INodeData[]): void {\n nodeData.forEach((data) => {\n const node = new Node(data, this.options);\n this.nodes.push(node);\n this.add(node);\n });\n }\n\n update(cursorPosition?: THREE.Vector3, scene?: THREE.Scene, camera?: THREE.Camera): void {\n this.nodes.forEach((node) => node.update(this.nodes, cursorPosition, scene, camera));\n\n // Bound the position within (-8, -8, -8) and (8, 8, 8)\n const BOUND = 8;\n this.position.x = THREE.MathUtils.clamp(this.position.x, -BOUND, BOUND);\n this.position.y = THREE.MathUtils.clamp(this.position.y, -BOUND, BOUND);\n this.position.z = THREE.MathUtils.clamp(this.position.z, -BOUND, BOUND);\n }\n}","import * as THREE from 'three';\nimport { ParticleFieldOptions, FlowParticle } from '../types/particle-field.types';\n\nexport class BlackHoleParticleField {\n // Private properties\n private scene: THREE.Scene;\n private particles: FlowParticle[] = [];\n private particleSystem: THREE.Points | null = null;\n\n // Natural particle count for bubble-like effect\n private particleCount: number = 200;\n\n // Visual parameters (scaled by coreRadius)\n private coreRadius: number = 0.39; // defaults; overridden per-node via options\n private readonly FIELD_RADIUS_FACTOR = 0.9; // relative scale\n\n private readonly NEON_PURPLE = new THREE.Color(0xc300ff);\n private readonly PINK_RED = new THREE.Color(0xff3366);\n private palette: 'sun' | 'planet' = 'planet';\n // Use even surface distribution (no view alignment by default)\n private useSurface: boolean = true;\n private seedCounter = 0; // Fibonacci seed index\n private speedScale = 1; // instance speed scaler (planets slower)\n\n // Animation params (slower, smoother orbits)\n private readonly MIN_SPEED = 0.4; // radians/sec\n private readonly MAX_SPEED = 1.2;\n private get FRONT_MIN() {\n return this.coreRadius * 0.06;\n }\n // Physical speed coupling (omega ≈ k * |v| / r) and clamps\n private readonly OMEGA_K = 1.0;\n private readonly OMEGA_MAX_RIM = 0.9; // rad/s\n private readonly OMEGA_MAX_CAP = 0.7; // rad/s\n // Surface mode coupling (gentler, avoids insect jitter)\n private readonly OMEGA_SURFACE_K = 0.8; // coupling from |vProj|/r → rad/s\n private readonly OMEGA_SURFACE_MAX = 0.8; // clamp for surface mode\n private readonly OMEGA_SURFACE_BASE_MIN = 0.12; // intrinsic base speed\n private readonly OMEGA_SURFACE_BASE_MAX = 0.28;\n private readonly SPEED_EPS = 1e-5;\n private readonly SHIMMER_FRAC = 0.02; // 2% at rest\n\n // Debugging: color bands and periodically log counts\n private debugBands = false;\n private lastDebugLogMs = 0;\n private bandCounts: Record<FlowParticle['type'], number> = {\n topCurve: 0,\n bottomCurve: 0,\n orbit: 0,\n topCap: 0,\n bottomCap: 0,\n surface: 0,\n };\n private readonly MIN_LIFETIME = 3.0;\n private readonly MAX_LIFETIME = 6.0;\n\n // --- anchor tracking + flow alignment ---\n private targetAnchor = new THREE.Vector3(); // last received from update()\n private anchor = new THREE.Vector3(); // smoothed, z=0\n private readonly anchorLerp = 1.0; // fully attached to the cursor position\n private lastRight = new THREE.Vector3(1, 0, 0); // cached flow-aligned right axis\n private flowSpeedScale = 1.0;\n private prevTargetAnchor = new THREE.Vector3(); // for anchor-delta velocity\n private readonly worldUp = new THREE.Vector3(0, 1, 0);\n\n constructor(scene: THREE.Scene, opts?: ParticleFieldOptions) {\n this.scene = scene;\n if (opts?.coreRadius && Number.isFinite(opts.coreRadius)) {\n this.coreRadius = Math.max(0.01, opts.coreRadius);\n }\n if (opts?.particleCount && Number.isFinite(opts.particleCount)) {\n this.particleCount = Math.max(8, Math.floor(opts.particleCount));\n }\n if (opts?.palette) {\n this.palette = opts.palette;\n }\n if (opts?.distribution) {\n this.useSurface = opts.distribution === 'surface';\n }\n if (opts?.speedScale && Number.isFinite(opts.speedScale)) {\n this.speedScale = Math.max(0.05, opts.speedScale);\n }\n // Enable debug via query param ?debugBands=1\n try {\n const search = (window as any)?.location?.search ?? '';\n this.debugBands = /(?:^|[?&])debugBands=1(?:&|$)/.test(search);\n } catch {}\n\n this.initializeParticleField();\n }\n\n // Public methods\n\n /**\n * Update particle field anchored at `anchorPosition`, advected by `flow`.\n */\n update(\n anchorPosition: THREE.Vector3,\n flow: THREE.Vector3,\n deltaTime: number,\n camera?: THREE.Camera\n ): void {\n if (!this.particleSystem) return;\n\n // 1) Accept input, use full 3D coordinates\n const x = anchorPosition?.x;\n const y = anchorPosition?.y;\n const z = anchorPosition?.z;\n if (Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z)) {\n // Anchor exactly at the target position (no world-Z offset)\n this.targetAnchor.set(x, y, z);\n }\n // Smooth follow to avoid jitter (and hide any one-frame glitches)\n this.anchor.lerp(this.targetAnchor, this.anchorLerp);\n\n // Move the ENTIRE particle system to the anchor.\n // Geometry stays in LOCAL rim-space.\n this.particleSystem.position.copy(this.anchor);\n\n // 2) Delta time guard\n if (!Number.isFinite(deltaTime) || deltaTime <= 0) deltaTime = 1 / 60;\n\n const geom = this.particleSystem.geometry as THREE.BufferGeometry;\n const positions = geom.getAttribute('position').array as Float32Array;\n const colors = geom.getAttribute('color').array as Float32Array;\n // (sizes/opacities kept for shader)\n const sizes = geom.getAttribute('size').array as Float32Array;\n\n // 3) Build a WORLD-coupled plane (flow + worldUp) and fuse flow with anchor-delta\n const camForward = new THREE.Vector3(0, 0, 1);\n const camUp = new THREE.Vector3(0, 1, 0);\n if (camera) {\n camera.getWorldDirection(camForward);\n camUp.copy(camera.up).normalize();\n }\n\n // Compute anchor-delta velocity (works during drag/swap)\n // Prevent first-frame spike\n if (this.prevTargetAnchor.lengthSq() === 0) {\n this.prevTargetAnchor.copy(this.targetAnchor);\n }\n const anchorDelta = new THREE.Vector3().subVectors(\n this.targetAnchor,\n this.prevTargetAnchor\n );\n const vAnchor = anchorDelta\n .clone()\n .multiplyScalar(1 / Math.max(1e-6, deltaTime));\n const vNode = (flow || new THREE.Vector3()).clone();\n const vNodeMag = vNode.length();\n const vAncMag = vAnchor.length();\n const w = vAncMag / Math.max(1e-6, vAncMag + vNodeMag); // prefer anchor when node velocity is small\n const vFlow = vNode.multiplyScalar(1 - w).add(vAnchor.multiplyScalar(w));\n\n // Project flow onto world-up plane\n const proj = vFlow\n .clone()\n .sub(this.worldUp.clone().multiplyScalar(vFlow.dot(this.worldUp)));\n const projLen = proj.length();\n // Adaptive smoothing: snappier when faster\n const speedHigh = 0.02; // typical maxVelocity\n const alpha = THREE.MathUtils.clamp(\n 0.4 - 0.3 * Math.min(1, vFlow.length() / speedHigh),\n 0.1,\n 0.45\n );\n if (projLen > 1e-6) {\n const instRight = proj.clone().normalize();\n this.lastRight.lerp(instRight, alpha).normalize();\n }\n // If invalid, fall back to camera plane right\n if (\n !Number.isFinite(\n this.lastRight.x + this.lastRight.y + this.lastRight.z\n ) ||\n this.lastRight.lengthSq() < 1e-6\n ) {\n const rightCam = camForward.clone().cross(camUp).normalize();\n if (rightCam.lengthSq() > 0) this.lastRight.copy(rightCam);\n else this.lastRight.set(1, 0, 0);\n }\n let right = this.lastRight.clone();\n const up = this.worldUp.clone();\n let forward = new THREE.Vector3().crossVectors(right, up).normalize();\n // Hybrid plane: bias normal toward camera to avoid \"edge-only\" look\n const speedNorm = THREE.MathUtils.clamp(vFlow.length() / 0.02, 0, 1);\n const cameraBias = THREE.MathUtils.clamp(0.35 - 0.2 * speedNorm, 0.1, 0.35);\n forward = forward.clone().lerp(camForward, cameraBias).normalize();\n // Recompute right to stay orthonormal after blending\n right = up.clone().cross(forward).normalize();\n\n // For sign decisions, use instantaneous (unsmoothed) projected flow when available\n const instRight =\n projLen > 1e-6 ? proj.clone().normalize() : this.lastRight.clone();\n if (right.dot(instRight) < 0) right.multiplyScalar(-1);\n const flowSpeed = vFlow.length();\n this.flowSpeedScale = THREE.MathUtils.clamp(flowSpeed * 100, 0, 3); // not used for omega anymore but kept for wiggles\n\n for (let i = 0; i < this.particles.length; i++) {\n let p = this.particles[i];\n\n p.age += deltaTime;\n const twoPi = Math.PI * 2;\n // Angular wander: scale by flow for banded mode; always small for surface mode\n const speedFactor = this.useSurface\n ? 0.5\n : THREE.MathUtils.clamp(flowSpeed / 0.02, 0, 1);\n const wander =\n p.angleWanderAmp *\n speedFactor *\n Math.sin(2 * Math.PI * p.angleWanderFreq * p.age + p.angleWanderPhase);\n\n if (this.useSurface && p.type === 'surface' && p.u && p.v) {\n // ALWAYS use dynamic direction based on node velocity, never fixed dirSign\n const camRight = camForward.clone().cross(camUp).normalize();\n\n // Calculate direction based on world velocity + anchor movement\n const totalFlow = vFlow.clone();\n const flowMagnitude = totalFlow.length();\n\n // Determine rotation direction from velocity:\n // - Node moving right (+X) → particles rotate clockwise (+1)\n // - Node moving left (-X) → particles rotate counter-clockwise (-1)\n let dir = 1; // default when stationary\n if (flowMagnitude > 1e-5) {\n const flowRightComponent = totalFlow.dot(camRight);\n dir = Math.sign(flowRightComponent) || 1;\n } else {\n // When stationary, use natural rotation based on particle's orbit plane\n // This prevents systematic patterns that cause ring formation\n const orbitNormal = new THREE.Vector3().crossVectors(p.u, p.v);\n dir = Math.sign(orbitNormal.y) || 1; // Use Y component for consistent but varied direction\n }\n // Project node flow into the particle's plane and derive omega\n const n = new THREE.Vector3().crossVectors(p.u, p.v).normalize();\n const vProjLen = vFlow\n .clone()\n .sub(n.clone().multiplyScalar(vFlow.dot(n)))\n .length();\n const baseR = Math.max(1e-4, p.radius);\n const omegaFlow = this.OMEGA_SURFACE_K * (vProjLen / baseR);\n const omegaBase = p.baseOmega ?? this.OMEGA_SURFACE_BASE_MIN;\n const omega = Math.min(\n this.OMEGA_SURFACE_MAX * this.speedScale,\n (omegaBase + omegaFlow) * this.speedScale\n );\n\n // Tiny wander for natural look (very small)\n p.angle += dir * (omega + wander) * deltaTime;\n if (p.angle > Math.PI) p.angle -= twoPi;\n if (p.angle < -Math.PI) p.angle += twoPi;\n\n // Precession disabled for now\n\n const local = this.getLocalOrbitPos(\n p,\n p.age,\n right,\n up,\n forward,\n camForward\n );\n positions[i * 3 + 0] = local.x;\n positions[i * 3 + 1] = local.y;\n positions[i * 3 + 2] = local.z;\n } else {\n // Legacy banded motion aligned with flow\n const margin = p.thetaMargin ?? 0;\n const baseR = Math.max(1e-4, p.radius);\n const omegaRaw = this.OMEGA_K * (flowSpeed / baseR);\n const omegaClamp =\n p.type === 'topCap' || p.type === 'bottomCap'\n ? this.OMEGA_MAX_CAP\n : this.OMEGA_MAX_RIM;\n const omega = Math.min(omegaRaw, omegaClamp);\n const angSign = Math.sign(vFlow.dot(instRight)) || 1;\n\n p.angle += angSign * (omega + wander) * deltaTime;\n if (p.angle > Math.PI) p.angle -= twoPi;\n if (p.angle < -Math.PI) p.angle += twoPi;\n\n const local = this.getLocalOrbitPos(\n p,\n p.age,\n right,\n up,\n forward,\n camForward\n );\n positions[i * 3 + 0] = local.x;\n positions[i * 3 + 1] = local.y;\n positions[i * 3 + 2] = local.z;\n }\n\n if (p.age >= p.lifetime) {\n // Retain particle; just reset time and vary wiggle phase\n p.age = 0;\n p.lifetime =\n this.MIN_LIFETIME +\n Math.random() * (this.MAX_LIFETIME - this.MIN_LIFETIME);\n p.wigglePhase = Math.random() * Math.PI * 2;\n }\n }\n\n // Periodic debug counts log\n if (this.debugBands) {\n const now = performance.now();\n if (now - this.lastDebugLogMs > 2000) {\n this.lastDebugLogMs = now;\n // Recompute counts once (particles are fixed types)\n const counts: Record<string, number> = {};\n for (const p of this.particles)\n counts[p.type] = (counts[p.type] || 0) + 1;\n console.info('[ParticleBands]', counts);\n }\n }\n\n // 4) Push updates\n geom.getAttribute('position').needsUpdate = true;\n geom.getAttribute('color').needsUpdate = true;\n geom.computeBoundingSphere?.();\n\n // Keep last target anchor for next-frame delta\n this.prevTargetAnchor.copy(this.targetAnchor);\n }\n\n /**\n * Resize the field to a new `coreRadius` while preserving particle distribution.\n * Scales all radius-like parameters so visuals stay consistent.\n */\n resizeCoreRadius(newRadius: number): void {\n if (!Number.isFinite(newRadius) || newRadius <= 0) return;\n const old = this.coreRadius;\n if (!old || Math.abs(newRadius - old) < 1e-6) return;\n const s = newRadius / old;\n\n // Update core scalar used in shaders/limits\n this.coreRadius = newRadius;\n\n // Proportionally scale particle radii and related amplitudes/biases\n for (let i = 0; i < this.particles.length; i++) {\n const p = this.particles[i];\n p.radius *= s;\n p.radialJitterAmp *= s;\n p.upBias *= s;\n p.depthBias *= s;\n if (p.capRadBias) p.capRadBias *= s;\n p.arcUpAmp *= s;\n p.arcDepthAmp *= s;\n p.arcRadAmp *= s;\n }\n }\n\n // Public toggle for debug coloring\n public setDebugBands(enabled: boolean) {\n if (this.debugBands === enabled) return;\n this.debugBands = enabled;\n if (!this.particleSystem) return;\n const colors = (\n this.particleSystem.geometry as THREE.BufferGeometry\n ).getAttribute('color') as THREE.BufferAttribute;\n for (let i = 0; i < this.particles.length; i++) {\n const c = this.debugBands\n ? this.getDebugColorForType(this.particles[i].type)\n : this.particles[i].color;\n colors.setX(i, c.r);\n colors.setY(i, c.g);\n colors.setZ(i, c.b);\n }\n colors.needsUpdate = true;\n }\n\n public toggleDebugBands(): boolean {\n this.setDebugBands(!this.debugBands);\n return this.debugBands;\n }\n\n // Switch palette at runtime (e.g., when a node becomes or ceases to be the sun)\n public setPalette(newPalette: 'sun' | 'planet'): void {\n if (this.palette === newPalette) return;\n this.palette = newPalette;\n if (!this.particleSystem) return;\n const geom = this.particleSystem.geometry as THREE.BufferGeometry;\n const colorsAttr = geom.getAttribute('color') as THREE.BufferAttribute;\n const base = this.palette === 'sun' ? this.NEON_PURPLE : this.PINK_RED;\n for (let i = 0; i < this.particles.length; i++) {\n const jitter = THREE.MathUtils.lerp(0.9, 1.1, Math.random());\n const c = base.clone().multiplyScalar(jitter);\n c.r = Math.min(1, Math.max(0, c.r));\n c.g = Math.min(1, Math.max(0, c.g));\n c.b = Math.min(1, Math.max(0, c.b));\n this.particles[i].color.copy(c);\n if (!this.debugBands) {\n colorsAttr.setX(i, c.r);\n colorsAttr.setY(i, c.g);\n colorsAttr.setZ(i, c.b);\n }\n }\n colorsAttr.needsUpdate = true;\n }\n\n dispose(): void {\n if (this.particleSystem) {\n this.scene.remove(this.particleSystem);\n this.particleSystem.geometry.dispose();\n (this.particleSystem.material as THREE.Material).dispose();\n this.particleSystem = null;\n }\n this.particles.length = 0;\n }\n\n // Private methods\n\n // --------------------------- init ---------------------------\n\n private initializeParticleField(): void {\n this.generateParticles();\n this.createParticleSystem();\n }\n\n private generateParticles(): void {\n this.particles.length = 0;\n // reset counts\n (Object.keys(this.bandCounts) as FlowParticle['type'][]).forEach(\n (k) => (this.bandCounts[k] = 0)\n );\n\n for (let i = 0; i < this.particleCount; i++) {\n const p = this.createNewParticle();\n this.particles.push(p);\n this.bandCounts[p.type]++;\n }\n }\n\n private createNewParticle(): FlowParticle {\n // New mode: evenly spread particles around the surface using per-particle orbit planes\n if (this.useSurface) {\n const type: FlowParticle['type'] = 'surface';\n\n // Fibonacci sphere to pick an initial position direction (uniform on sphere)\n const i = this.seedCounter++;\n const n = Math.max(1, this.particleCount);\n const golden = Math.PI * (3 - Math.sqrt(5));\n const offset = 2 / n;\n const y = i * offset - 1 + offset / 2; // uniform in [-1, 1]\n const rxy = Math.sqrt(Math.max(0, 1 - y * y));\n const theta = golden * i;\n const ux = Math.cos(theta) * rxy;\n const uz = Math.sin(theta) * rxy;\n const u = new THREE.Vector3(ux, y, uz).normalize(); // direction to initial point\n\n // Build an orbit plane containing u: choose a random axis perpendicular to u\n let rand = new THREE.Vector3(\n Math.random(),\n Math.random(),\n Math.random()\n ).normalize();\n if (Math.abs(rand.dot(u)) > 0.95) rand = new THREE.Vector3(1, 0, 0); // avoid parallel\n const axis = new THREE.Vector3().crossVectors(u, rand).normalize(); // plane normal\n const v = new THREE.Vector3().crossVectors(axis, u).normalize(); // completes basis\n\n // Small random rotation around the plane to avoid grid-like bands\n const angle = THREE.MathUtils.randFloatSpread(Math.PI * 2);\n // Tight shell: 1.002R .. 1.008R\n const radius =\n this.coreRadius *\n (1 + THREE.MathUtils.lerp(0.002, 0.008, Math.random()));\n // Speed is derived from node flow at runtime; initialize small values to avoid spikes\n const angularSpeed = 0;\n const radialJitterAmp = this.coreRadius * 0.002; // very subtle breathing\n const radialJitterFreq = 0.2 + Math.random() * 0.3;\n\n // Color from palette with small jitter\n const base = this.palette === 'sun' ? this.NEON_PURPLE : this.PINK_RED;\n const cjit = THREE.MathUtils.lerp(0.9, 1.1, Math.random());\n const color = base.clone().multiplyScalar(cjit);\n color.r = Math.min(1, Math.max(0, color.r));\n color.g = Math.min(1, Math.max(0, color.g));\n color.b = Math.min(1, Math.max(0, color.b));\n\n const precessAxis = new THREE.Vector3(0, 0, 1); // disabled precession\n const precessSpeed = 0;\n\n // Intrinsic orbit speed so particles revolve even when node is stationary\n const baseOmega =\n THREE.MathUtils.lerp(\n this.OMEGA_SURFACE_BASE_MIN,\n this.OMEGA_SURFACE_BASE_MAX,\n Math.random()\n ) * this.speedScale;\n\n return {\n type,\n radius,\n angle,\n angularSpeed,\n radialJitterAmp,\n radialJitterFreq,\n size: 0.8 + Math.random() * 1.4,\n color,\n opacity: 0.85,\n lifetime:\n this.MIN_LIFETIME +\n Math.random() * (this.MAX_LIFETIME - this.MIN_LIFETIME),\n age: Math.random() * 0.5,\n ellipse: 1,\n upBias: 0,\n depthBias: 0,\n wigglePhase: Math.random() * Math.PI * 2,\n wiggleFreqUp: 0.25 + Math.random() * 0.4,\n wiggleFreqDepth: 0.25 + Math.random() * 0.4,\n capRadBias: 0,\n tiltUF: undefined,\n arcUpAmp: 0,\n arcDepthAmp: 0,\n arcRadAmp: this.coreRadius * 0.004,\n arcFreq: 1,\n angleWanderAmp: THREE.MathUtils.lerp(0.01, 0.03, Math.random()),\n angleWanderFreq: 0.15 + Math.random() * 0.3,\n angleWanderPhase: Math.random() * Math.PI * 2,\n verticalOffset: 0,\n phi: undefined,\n thetaMargin: 0,\n frontCurveAngle: undefined,\n phiAmp: 0,\n axis,\n u,\n v,\n dirSign: 1, // Unused - direction calculated dynamically\n precessAxis,\n precessSpeed,\n baseOmega,\n };\n }\n\n // Legacy banded distribution (kept for reference and fallback)\n // Distribution for full wrap with clear center:\n // topCurve ~22%, bottomCurve ~22% (rim ~44%), topCap ~28%, bottomCap ~28% (caps ~56%)\n const rpick = Math.random();\n const type: FlowParticle['type'] =\n rpick < 0.22\n ? 'topCurve'\n : rpick < 0.44\n ? 'bottomCurve'\n : rpick < 0.72\n ? 'topCap'\n : 'bottomCap';\n\n // Keep particles hugging the node surface\n const rim = this.coreRadius * 1.005; // very tight\n const rimBand = 0.01; // thin band width\n const capSurfaceR = THREE.MathUtils.lerp(\n this.coreRadius * 1.01,\n this.coreRadius * 1.03,\n Math.random()\n );\n\n // Per-particle shape and offsets to avoid identical tracks\n const ellipse = 0.96 + Math.random() * 0.08; // very subtle, 0.96–1.04\n const upScale = this.coreRadius;\n let upBias = 0;\n switch (type) {\n case 'topCurve':\n upBias = THREE.MathUtils.lerp(0.006, 0.018, Math.random()) * upScale;\n break;\n case 'bottomCurve':\n upBias = -THREE.MathUtils.lerp(0.006, 0.018, Math.random()) * upScale;\n break;\n default:\n upBias = 0;\n }\n const depthBias =\n THREE.MathUtils.lerp(-0.012, 0.012, Math.random()) * this.coreRadius;\n const capRadBias =\n type === 'topCap' || type === 'bottomCap'\n ? THREE.MathUtils.lerp(-0.004, 0.004, Math.random()) * this.coreRadius\n : 0;\n\n // Optional tilt for mid bands: 1 = use up (vertical), 0 = use forward (horizontal)\n // Center bands disabled; keep tiltUF unused/default\n const tiltUF = undefined;\n\n // Compute mid-band plane radius if needed\n // Center bands disabled; mid-plane values unused\n const midOffset = 0;\n const midSurfR = 0;\n const midPlaneRadius = 0;\n\n let radius = 0;\n if (type === 'topCap' || type === 'bottomCap') {\n radius = Math.max(0.0001, capSurfaceR + capRadBias);\n } else {\n // Rim bands, allow very tight to surface\n radius = rim + Math.random() * rimBand;\n // Occasionally let bottom dip slightly for occlusion hug\n if (type === 'bottomCurve' && Math.random() < 0.2) {\n radius =\n this.coreRadius * THREE.MathUtils.lerp(0.98, 1.0, Math.random());\n }\n }\n\n // Define spherical latitude (phi) per band to control top gap filling\n // phi: 0 (top pole), PI/2 (equator/rim), PI (bottom pole)\n const rimPhi = Math.PI * 0.5; // 90° (equator)\n // Caps sit close to rim so center stays clear, but still on surface\n const topPhiMin = rimPhi - 0.22; // ~12.6° above rim\n const topPhiMax = rimPhi - 0.12; // ~6.9° above rim\n const botPhiMin = rimPhi + 0.12; // ~6.9° below rim\n const botPhiMax = rimPhi + 0.22; // ~12.6° below rim\n\n const biasTowardB = (a: number, b: number, pow = 2.0) =>\n a + (b - a) * Math.pow(Math.random(), 1 / pow);\n const biasTowardA = (a: number, b: number, pow = 2.0) =>\n a + (b - a) * (1 - Math.pow(Math.random(), 1 / pow));\n\n let phi: number;\n // Set phi only for caps and mids to place them on inner surfaces\n switch (type) {\n case 'topCap':\n phi = THREE.MathUtils.clamp(\n THREE.MathUtils.lerp(topPhiMin, topPhiMax, Math.random()),\n 0.02,\n rimPhi - 0.02\n );\n break;\n case 'bottomCap':\n phi = THREE.MathUtils.clamp(\n THREE.MathUtils.lerp(botPhiMin, botPhiMax, Math.random()),\n rimPhi + 0.02,\n Math.PI - 0.02\n );\n break;\n default:\n // Rim arcs: slight above/below equator\n phi =\n type === 'topCurve'\n ? rimPhi - THREE.MathUtils.lerp(0.02, 0.04, Math.random())\n : type === 'bottomCurve'\n ? rimPhi + THREE.MathUtils.lerp(0.02, 0.04, Math.random())\n : rimPhi;\n }\n\n // Random initial angle per group to avoid trains\n let angle = 0;\n if (type === 'topCap' || type === 'bottomCap') {\n // Start near left edge of front half\n angle = -Math.PI * 0.95 + Math.random() * 0.1;\n } else {\n // Rim arcs: anywhere around\n angle = THREE.MathUtils.lerp(-Math.PI, Math.PI, Math.random());\n }\n // small variance\n angle += (Math.random() - 0.5) * 0.05;\n // Per-group base speeds retained but will be overridden by physical mapping\n const baseSpeed = THREE.MathUtils.lerp(\n this.MIN_SPEED,\n this.MAX_SPEED,\n Math.random()\n );\n const speedMul =\n type === 'topCurve' || type === 'bottomCurve'\n ? 1.1\n : type === 'topCap' || type === 'bottomCap'\n ? 0.95\n : 0.8; // orbit\n const angularSpeed = baseSpeed * speedMul;\n\n // Subtle breathing; even smaller so it hugs the surface and avoids clipping\n const radialJitterAmp =\n this.coreRadius *\n (type === 'topCap' || type === 'bottomCap' ? 0.012 : this.SHIMMER_FRAC);\n const radialJitterFreq = 0.3 + Math.random() * 0.5; // Hz (gentle)\n\n // Color selection based on palette: sun = purple family, planet = pink-red\n const base = this.palette === 'sun' ? this.NEON_PURPLE : this.PINK_RED;\n // subtle per-particle variation within same family (lighten/darken slightly)\n const jitter = THREE.MathUtils.lerp(0.9, 1.1, Math.random());\n const color = base.clone().multiplyScalar(jitter);\n color.r = Math.min(1, Math.max(0, color.r));\n color.g = Math.min(1, Math.max(0, color.g));\n color.b = Math.min(1, Math.max(0, color.b));\n\n // Wiggles for extra micro-variation\n const wigglePhase = Math.random() * Math.PI * 2;\n const wiggleFreqUp = 0.3 + Math.random() * 0.5; // 0.3–0.8 Hz\n const wiggleFreqDepth = 0.25 + Math.random() * 0.4; // 0.25–0.65 Hz\n\n // Angle-correlated drift and angular wander\n const arcFreq = Math.floor(1 + Math.random() * 3); // 1..3\n const arcUpAmp =\n type === 'topCap' || type === 'bottomCap'\n ? upScale * THREE.MathUtils.lerp(0.001, 0.004, Math.random())\n : upScale * THREE.MathUtils.lerp(0.002, 0.008, Math.random());\n const arcDepthAmp =\n type === 'topCap' || type === 'bottomCap'\n ? this.coreRadius * THREE.MathUtils.lerp(0.001, 0.004, Math.random())\n : this.coreRadius * THREE.MathUtils.lerp(0.002, 0.006, Math.random());\n const arcRadAmp =\n type === 'topCap' || type === 'bottomCap'\n ? radius * THREE.MathUtils.lerp(0.004, 0.01, Math.random())\n : radius * THREE.MathUtils.lerp(0.006, 0.015, Math.random());\n const angleWanderAmp = THREE.MathUtils.lerp(0.03, 0.1, Math.random()); // rad/s (scaled by speed later)\n const angleWanderFreq = 0.3 + Math.random() * 0.5; // Hz\n const angleWanderPhase = Math.random() * Math.PI * 2;\n\n return {\n type,\n radius,\n angle,\n angularSpeed,\n radialJitterAmp,\n radialJitterFreq,\n size: 0.8 + Math.random() * 1.4, // smaller discs (0.8..2.2)\n color,\n opacity: 0.85,\n lifetime:\n this.MIN_LIFETIME +\n Math.random() * (this.MAX_LIFETIME - this.MIN_LIFETIME),\n age: Math.random() * 0.5,\n ellipse,\n upBias,\n depthBias,\n wigglePhase,\n wiggleFreqUp,\n wiggleFreqDepth,\n capRadBias,\n tiltUF,\n arcUpAmp,\n arcDepthAmp,\n arcRadAmp,\n arcFreq,\n angleWanderAmp,\n angleWanderFreq,\n angleWanderPhase,\n verticalOffset: 0,\n phi,\n thetaMargin:\n type === 'topCap' || type === 'bottomCap' ? Math.PI * 0.18 : 0,\n frontCurveAngle: undefined,\n phiAmp:\n type === 'topCap' || type === 'bottomCap'\n ? THREE.MathUtils.lerp(0.04, 0.1, Math.random())\n : THREE.MathUtils.lerp(0.0, 0.03, Math.random()),\n };\n }\n\n // (Removed spline generation in favor of analytic 3D orbits)\n\n // --------------------- THREE objects -----------------------\n\n private createParticleSystem(): void {\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(this.particleCount * 3);\n const colors = new Float32Array(this.particleCount * 3);\n\n // (Kept for future shader; PointsMaterial won't use them per-vertex)\n const sizes = new Float32Array(this.particleCount);\n const opacities = new Float32Array(this.particleCount);\n\n // Initialize LOCAL positions (do NOT offset by anchor here)\n for (let i = 0; i < this.particleCount; i++) {\n const p = this.particles[i];\n const xy = this.getLocalOrbitPos(\n p,\n 0,\n new THREE.Vector3(1, 0, 0),\n new THREE.Vector3(0, 1, 0),\n new THREE.Vector3(0, 0, 1),\n new THREE.Vector3(0, 0, 1)\n ); // initial position\n positions[i * 3 + 0] = xy.x;\n positions[i * 3 + 1] = xy.y;\n positions[i * 3 + 2] = xy.z;\n\n if (this.debugBands) {\n const c = this.getDebugColorForType(p.type);\n colors[i * 3 + 0] = c.r;\n colors[i * 3 + 1] = c.g;\n colors[i * 3 + 2] = c.b;\n } else {\n colors[i * 3 + 0] = p.color.r;\n colors[i * 3 + 1] = p.color.g;\n colors[i * 3 + 2] = p.color.b;\n }\n\n sizes[i] = p.size;\n opacities[i] = p.opacity;\n }\n\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));\n geometry.setAttribute('size', new THREE.BufferAttribute(sizes, 1));\n geometry.setAttribute('opacity', new THREE.BufferAttribute(opacities, 1));\n\n // Mark frequently-updated attributes\n // No need for setUsage in the current version of THREE.js\n // Just use needsUpdate to tell Three.js to re-upload the buffers each frame\n geometry.getAttribute('position').needsUpdate = true;\n geometry.getAttribute('color').needsUpdate = true;\n\n // Custom bubble shader for perfect circular bubbles with dramatic lighting\n const vertexShader = `\n attribute float size;\n attribute float opacity;\n varying vec3 vColor;\n varying float vOpacity;\n varying float vSize;\n\n void main() {\n vColor = color;\n vOpacity = opacity;\n vSize = size;\n\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n\n // Smaller bokeh-style circles\n gl_PointSize = size * 4.0;\n\n gl_Position = projectionMatrix * mvPosition;\n }\n `;\n\n const fragmentShader = `\n varying vec3 vColor;\n varying float vOpacity;\n varying float vSize;\n\n void main() {\n // Create circular bubble coordinate system\n vec2 center = gl_PointCoord - 0.5;\n float distance = length(center);\n\n // Perfect circular mask - discard pixels outside circle\n if (distance > 0.5) discard;\n\n // Dramatic bubble lighting effects\n float rimDistance = distance * 2.0; // 0.0 at center, 1.0 at edge\n\n // Bright center fading to edge (soap bubble effect)\n float centerGlow = 1.0 - smoothstep(0.0, 0.35, rimDistance);\n\n // Rim lighting - bright edges\n float rimGlow = smoothstep(0.65, 1.0, rimDistance) * 2.0;\n\n // Glass-like inner reflection\n float bubble = smoothstep(0.85, 0.25, rimDistance);\n\n // Combine lighting effects\n float totalGlow = centerGlow * 0.7 + rimGlow * 1.6 + bubble * 0.7;\n\n // Final bubble color with dramatic lighting\n vec3 finalColor = vColor * totalGlow * 1.9;\n\n // Smooth alpha falloff for glass-like appearance\n float alpha = (1.0 - smoothstep(0.35, 0.52, distance)) * vOpacity;\n\n gl_FragColor = vec4(finalColor, alpha);\n }\n `;\n\n const material = new THREE.ShaderMaterial({\n vertexShader,\n fragmentShader,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n vertexColors: true,\n });\n\n this.particleSystem = new THREE.Points(geometry, material);\n this.particleSystem.frustumCulled = false;\n\n // Initial anchor placement at origin; will follow in update()\n this.particleSystem.position.copy(this.anchor);\n\n this.scene.add(this.particleSystem);\n }\n\n // Compute local position on the orbit for a particle at its current angle,\n // adding a subtle radial breathing.\n private getLocalOrbitPos(\n p: FlowParticle,\n age: number,\n right: THREE.Vector3,\n up: THREE.Vector3,\n forward: THREE.Vector3,\n camForward: THREE.Vector3\n ): THREE.Vector3 {\n if (this.useSurface && p.type === 'surface' && p.u && p.v) {\n // Surface-spread: use per-particle plane basis (u, v); allow full wrap\n const jitter =\n p.radialJitterAmp * Math.sin(age * 2 * Math.PI * p.radialJitterFreq);\n const arcRad =\n p.arcRadAmp * Math.sin(p.arcFreq * p.angle + (p.wigglePhase || 0));\n let r = Math.max(0.001, p.radius + jitter + arcRad);\n const cosA = Math.cos(p.angle);\n const sinA = Math.sin(p.angle);\n const out = new THREE.Vector3();\n out.add(p.u.clone().multiplyScalar(cosA * r));\n out.add(p.v.clone().multiplyScalar(sinA * r));\n // Tiny axis wiggle for thickness\n if (p.axis) {\n const axWiggle =\n 0.002 *\n this.coreRadius *\n Math.sin(\n age * 2 * Math.PI * (p.wiggleFreqUp || 0.3) + (p.wigglePhase || 0)\n );\n out.add(p.axis.clone().multiplyScalar(axWiggle));\n }\n // Hard clamp to tight shell near exact surface\n const minR = this.coreRadius * 1.0;\n const maxR = this.coreRadius * 1.01;\n const len = out.length();\n if (len < minR) out.setLength(minR);\n else if (len > maxR) out.setLength(maxR);\n return out;\n }\n const jitter =\n p.radialJitterAmp * Math.sin(age * 2 * Math.PI * p.radialJitterFreq);\n // Angle-correlated radial modulation prevents strict rings\n const arcRad =\n p.arcRadAmp * Math.sin(p.arcFreq * p.angle + p.wigglePhase * 0.71);\n let r = Math.max(0.001, p.radius + jitter + arcRad);\n const cosA = Math.cos(p.angle);\n const sinA = Math.sin(p.angle);\n const out = new THREE.Vector3();\n const upWiggle =\n 0.004 *\n this.coreRadius *\n Math.sin(age * 2 * Math.PI * p.wiggleFreqUp + p.wigglePhase);\n const depthWiggle =\n 0.004 *\n this.coreRadius *\n Math.cos(age * 2 * Math.PI * p.wiggleFreqDepth + p.wigglePhase * 0.37);\n const arcUp = p.arcUpAmp * Math.sin(p.arcFreq * p.angle + p.wigglePhase);\n const arcDepth =\n p.arcDepthAmp * Math.cos(p.arcFreq * p.angle + p.wigglePhase * 0.53);\n\n // Unified spherical placement (true wrap) for rim + caps\n // Vary phi along theta for cap crescents; keep rim near equator\n let phi = p.phi ?? Math.PI * 0.5;\n const isCap = p.type === 'topCap' || p.type === 'bottomCap';\n if (isCap && p.phiAmp) {\n const sign = p.type === 'topCap' ? -1 : 1; // pull toward rim at arc center\n phi = THREE.MathUtils.clamp(\n phi + sign * p.phiAmp * Math.sin(p.angle),\n 0.02,\n Math.PI - 0.02\n );\n }\n const rp = r * Math.sin(phi);\n const y = r * Math.cos(phi);\n const x = rp * cosA * p.ellipse;\n const z = rp * sinA;\n out.copy(right).multiplyScalar(x);\n out.add(up.clone().multiplyScalar(y));\n out.add(forward.clone().multiplyScalar(z));\n // Layer subtle extras\n out.add(up.clone().multiplyScalar(p.upBias + upWiggle + arcUp));\n out.add(\n forward.clone().multiplyScalar(p.depthBias + depthWiggle + arcDepth)\n );\n // Different penetration limits for different particle types\n const minShell =\n p.type === 'topCurve' || p.type === 'bottomCurve'\n ? this.coreRadius * 0.7 // Rim particles: 30% inside surface\n : this.coreRadius * 1.0; // Cap particles: stay at surface level\n const len = out.length();\n if (len < minShell) {\n if (len < 1e-6) {\n out.set(minShell, 0, 0);\n } else {\n out.multiplyScalar(minShell / len);\n }\n }\n // For banded mode, keep a slight front-bias so arcs read clearly\n if (!(this.useSurface && p.type === 'surface')) {\n const fCam = out.dot(camForward);\n if (fCam > -this.FRONT_MIN) {\n out.add(camForward.clone().multiplyScalar(-this.FRONT_MIN - fCam));\n }\n }\n return out;\n }\n\n // Debug color palette per band\n private getDebugColorForType(type: FlowParticle['type']): THREE.Color {\n switch (type) {\n case 'topCurve':\n return new THREE.Color(0x00ffff); // cyan\n case 'bottomCurve':\n return new THREE.Color(0xff8800); // orange\n case 'topCap':\n return new THREE.Color(0xff00ff); // magenta\n case 'bottomCap':\n return new THREE.Color(0xffff00); // yellow\n case 'orbit':\n return new THREE.Color(0xffffff); // white\n case 'surface':\n return new THREE.Color(0x66ff66); // green for debug\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n ElementRef,\n OnInit,\n AfterViewInit,\n OnDestroy,\n ViewChild,\n Renderer2,\n NgZone,\n Input,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport * as THREE from 'three';\nimport { OrbitControls } from 'three/addons/controls/OrbitControls.js';\nimport { INodeData } from './app.types';\nimport { Cluster } from './objects/Cluster';\nimport { Node } from './objects/Node';\nimport { BlackHoleParticleField } from './services/black-hole-particle-field';\nimport { StellarDustField, DustMode } from './services/stellar-dust-field';\n\n@Component({\n selector: 'tv-trait-visual',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './trait-visual.component.html',\n styleUrls: ['./trait-visual.component.scss'],\n})\nexport class TraitVisualComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges {\n @ViewChild('rendererCanvas', { static: true }) canvasRef!: ElementRef;\n\n // Input properties for configuration\n @Input() nodeData: INodeData[] = [];\n @Input() attributeWeights: number[] = [];\n @Input() preferenceWeights: number[] = [];\n @Input() attributeCount?: number;\n @Input() preferenceCount?: number;\n\n // Three.js scene properties\n scene!: THREE.Scene;\n camera!: THREE.PerspectiveCamera;\n renderer!: THREE.WebGLRenderer;\n controls!: OrbitControls;\n raycaster: THREE.Raycaster = new THREE.Raycaster();\n mouse: THREE.Vector2 = new THREE.Vector2();\n cluster!: Cluster;\n selectedNode: Node | null = null;\n draggingNode: Node | null = null;\n dragPlane: THREE.Plane = new THREE.Plane();\n dragOffset: THREE.Vector3 = new THREE.Vector3();\n newNodeCounter: number = 1;\n isCameraLocked = false;\n\n // Private properties\n private nodeAuras: Map<Node, BlackHoleParticleField> = new Map();\n private starFieldNear!: THREE.Points;\n private starFieldFar!: THREE.Points;\n private starTexture: THREE.Texture | null = null;\n private dustField: StellarDustField | null = null;\n private readonly pointerPitchAxis = new THREE.Vector3(1, 0, 0);\n private readonly pointerYawAxis = new THREE.Vector3(0, 1, 0);\n private pointerPitchCurrent = 0;\n private pointerPitchTarget = 0;\n private pointerYawCurrent = 0;\n private pointerYawTarget = 0;\n private pointerYawAccumulated = 0;\n private readonly pointerOffset = new THREE.Vector3();\n private readonly pointerPitchMax = THREE.MathUtils.degToRad(1.8);\n private readonly pointerYawMax = THREE.MathUtils.degToRad(0.8);\n private readonly pointerYawSpeed = THREE.MathUtils.degToRad(0.15);\n private readonly pointerPitchDamping = 4;\n private readonly pointerYawDamping = 4;\n\n constructor(private renderer2: Renderer2, private ngZone: NgZone) {}\n\n ngOnInit(): void {\n console.log('TraitVisualComponent: ngOnInit - nodeData length:', this.nodeData.length);\n console.log('TraitVisualComponent: attributeWeights length:', this.attributeWeights.length);\n console.log('TraitVisualComponent: preferenceWeights length:', this.preferenceWeights.length);\n this.initScene();\n if (this.nodeData.length > 0) {\n this.loadNodes();\n this.syncNodeWeightGlobals();\n } else {\n console.warn('TraitVisualComponent: No nodeData provided!');\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['nodeData'] && !changes['nodeData'].firstChange && this.scene) {\n // Reload nodes when nodeData changes\n if (this.cluster) {\n this.scene.remove(this.cluster);\n this.nodeAuras.forEach((a) => a.dispose());\n this.nodeAuras.clear();\n }\n if (this.nodeData.length > 0) {\n this.loadNodes();\n this.syncNodeWeightGlobals();\n }\n }\n if ((changes['attributeWeights'] || changes['preferenceWeights']) && !changes['attributeWeights']?.firstChange && !changes['preferenceWeights']?.firstChange) {\n this.syncNodeWeightGlobals();\n }\n }\n\n ngAfterViewInit(): void {\n this.animate();\n\n this.renderer2.listen(\n this.canvasRef.nativeElement,\n 'contextmenu',\n (event: MouseEvent) => this.onRightClick(event)\n );\n\n window.addEventListener('resize', () => this.onWindowResize());\n\n const canvas = this.canvasRef.nativeElement;\n this.renderer2.listen('window', 'mousemove', (event: MouseEvent) =>\n this.onMouseMove(event)\n );\n this.renderer2.listen(canvas, 'mousedown', (event: MouseEvent) =>\n this.onDragStart(event)\n );\n this.renderer2.listen(canvas, 'mousemove', (event: MouseEvent) =>\n this.onDragMove(event)\n );\n this.renderer2.listen(canvas, 'mouseup', (event: MouseEvent) =>\n this.onDragEnd(event)\n );\n this.renderer2.listen(canvas, 'mouseleave', (event: MouseEvent) => {\n this.onDragEnd(event);\n this.onCanvasLeave();\n });\n }\n\n ngOnDestroy(): void {\n // Dispose all auras\n this.nodeAuras.forEach((a) => a.dispose());\n this.nodeAuras.clear();\n this.dustField?.dispose();\n }\n\n currentCentral(): Node | null {\n if (!this.cluster) return null;\n return this.cluster.nodes.find((node) => node.isSun) || null;\n }\n\n nonSuns(): Node[] {\n if (!this.cluster) return [];\n return this.cluster.nodes.filter((node) => !node.isSun);\n }\n\n private syncNodeWeightGlobals(): void {\n if (this.attributeWeights.length > 0) {\n Node.attributeWeights = this.attributeWeights.slice();\n }\n if (this.preferenceWeights.length > 0) {\n Node.preferenceWeights = this.preferenceWeights.slice();\n }\n }\n\n private initScene(): void {\n this.scene = new THREE.Scene();\n this.camera = new THREE.PerspectiveCamera(\n 55,\n window.innerWidth / window.innerHeight,\n 0.1,\n 1000\n );\n this.camera.up.set(0, 1, 0);\n this.camera.position.set(0, 0, 60);\n const initialTilt = THREE.MathUtils.degToRad(-45);\n this.camera.position.applyAxisAngle(\n new THREE.Vector3(1, 0, 0),\n -initialTilt\n );\n this.camera.lookAt(0, 0, 0);\n this.renderer = new THREE.WebGLRenderer({\n canvas: this.canvasRef.nativeElement,\n antialias: true,\n alpha: true,\n });\n this.renderer.setClearColor(0x000000, 0);\n this.renderer.setSize(window.innerWidth, window.innerHeight);\n this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n this.controls.target.set(0, 0, 0);\n this.controls.enableDamping = true;\n this.controls.enableRotate = true;\n this.controls.screenSpacePanning = true;\n this.controls.enablePan = true;\n this.controls.enableZoom = true;\n this.scene.add(new THREE.AmbientLight(0xbbbbbb, 1));\n this.scene.add(new THREE.DirectionalLight(0xffffff, 1));\n\n // Add immersive 3D starfields\n this.starFieldFar = this.createStarField({\n count: 1200,\n innerRadius: 120,\n outerRadius: 170,\n size: 1,\n opacity: 0.6,\n });\n this.starFieldFar.renderOrder = -2;\n this.scene.add(this.starFieldFar);\n\n this.starFieldNear = this.createStarField({\n count: 200,\n innerRadius: 60,\n outerRadius: 110,\n size: 1.2,\n opacity: 0.75,\n });\n this.starFieldNear.renderOrder = -1;\n this.scene.add(this.starFieldNear);\n }\n\n private loadNodes(): void {\n if (this.nodeData.length === 0) return;\n \n this.cluster = new Cluster(this.nodeData);\n this.scene.add(this.cluster);\n const initialCentral =\n this.cluster.nodes.find((node) => node.isSun) || this.cluster.nodes[0];\n initialCentral.setSun(true, 5);\n initialCentral.mesh.scale.set(3, 3, 3);\n this.ensureNodeAuras();\n\n const sun = this.currentCentral();\n if (sun) {\n const geom = sun.mesh.geometry as THREE.SphereGeometry;\n const bs =\n geom.boundingSphere ?? new THREE.Sphere(new THREE.Vector3(), 0.05);\n const coreRadius = (bs.radius || 0.05) * sun.mesh.scale.x;\n\n let dustOuter = 18.0;\n let dustThickness = 0.0;\n let dustMidCount = 160000;\n let dustBokehCount = 24000;\n let dustNoise = 0.035;\n let dustMinW = 0.02;\n let dustMaxW = 0.08;\n let dustMode: DustMode = 'disk';\n let searchParams: URLSearchParams | undefined;\n try {\n const rawSearch = (window as any)?.location?.search ?? '';\n searchParams = new URLSearchParams(rawSearch);\n } catch {\n searchParams = undefined;\n }\n\n const parseParam = (key: string, fallback: number) => {\n if (!searchParams) return fallback;\n const raw = searchParams.get(key);\n if (raw === null) return fallback;\n const value = parseFloat(raw);\n return Number.isFinite(value) ? value : fallback;\n };\n\n dustOuter = Math.max(\n coreRadius * 1.05,\n parseParam('dustOuter', dustOuter)\n );\n dustThickness = Math.max(0, parseParam('dustThick', dustThickness));\n dustMidCount = Math.max(\n 0,\n Math.round(parseParam('dustCount', dustMidCount))\n );\n dustBokehCount = Math.max(\n 0,\n Math.round(parseParam('dustBokeh', dustBokehCount))\n );\n dustNoise = Math.max(0, parseParam('dustNoise', dustNoise));\n dustMinW = Math.max(0.001, parseParam('dustMinW', dustMinW));\n dustMaxW = Math.max(dustMinW + 0.001, parseParam('dustMaxW', dustMaxW));\n const dustModeParam = searchParams?.get('dustMode');\n if (dustModeParam === 'disk') {\n dustMode = 'disk';\n }\n }\n }\n\n private onWindowResize(): void {\n this.camera.aspect = window.innerWidth / window.innerHeight;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(window.innerWidth, window.innerHeight);\n this.dustField?.setViewportHeight(window.innerHeight);\n }\n\n private onRightClick(event: MouseEvent): void {\n event.preventDefault();\n // Simplified right-click handling - just select node\n this.raycaster.setFromCamera(this.mouse, this.camera);\n const intersects = this.raycaster.intersectObjects(\n this.cluster?.children || [],\n true\n );\n if (intersects.length > 0) {\n this.selectedNode = intersects[0].object.parent as Node;\n }\n }\n\n private onMouseMove(event: MouseEvent): void {\n if (this.draggingNode) return;\n this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n this.mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n\n this.pointerPitchTarget = 0;\n this.pointerYawTarget = 0;\n this.pointerYawAccumulated = 0;\n return;\n }\n\n private onDragStart(event: MouseEvent): void {\n event.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n const mouse = new THREE.Vector2(\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\n -((event.clientY - rect.top) / rect.height) * 2 + 1\n );\n this.raycaster.setFromCamera(mouse, this.camera);\n const intersects = this.raycaster.intersectObjects(\n this.cluster?.children || [],\n true\n );\n if (intersects.length > 0) {\n this.draggingNode = intersects[0].object.parent as Node;\n this.controls.enabled = false;\n const planeNormal = this.camera\n .getWorldDirection(new THREE.Vector3())\n .clone()\n .negate();\n this.dragPlane.setFromNormalAndCoplanarPoint(\n planeNormal,\n intersects[0].point\n );\n this.dragOffset.copy(intersects[0].point).sub(this.draggingNode.position);\n }\n }\n\n private onDragMove(event: MouseEvent): void {\n if (!this.draggingNode) return;\n event.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n const mouse = new THREE.Vector2(\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\n -((event.clientY - rect.top) / rect.height) * 2 + 1\n );\n this.raycaster.setFromCamera(mouse, this.camera);\n const intersection = new THREE.Vector3();\n if (this.raycaster.ray.intersectPlane(this.dragPlane, intersection)) {\n this.draggingNode.position.copy(intersection.sub(this.dragOffset));\n }\n }\n\n private onDragEnd(event: MouseEvent): void {\n if (!this.draggingNode) return;\n event.preventDefault();\n this.draggingNode = null;\n this.controls.enabled = true;\n }\n\n private onCanvasLeave(): void {\n this.resetPointerPitch();\n }\n\n private resetPointerPitch(instant = false): void {\n this.pointerPitchTarget = 0;\n this.pointerYawTarget = 0;\n this.pointerYawAccumulated = 0;\n if (!instant) return;\n if (!this.camera || !this.controls) {\n this.pointerPitchCurrent = 0;\n this.pointerYawCurrent = 0;\n return;\n }\n const target = this.controls.target;\n const offset = this.pointerOffset;\n offset.copy(this.camera.position).sub(target);\n\n if (this.pointerPitchCurrent !== 0) {\n offset.applyAxisAngle(this.pointerPitchAxis, -this.pointerPitchCurrent);\n }\n if (this.pointerYawCurrent !== 0) {\n offset.applyAxisAngle(this.pointerYawAxis, -this.pointerYawCurrent);\n }\n\n this.camera.position.copy(target).add(offset);\n this.camera.lookAt(target);\n this.pointerPitchCurrent = 0;\n this.pointerYawCurrent = 0;\n }\n\n private updateCameraOrbitFromPointer(deltaTime: number): void {\n if (!this.camera || !this.controls) return;\n if (this.isCameraLocked) return;\n\n const target = this.controls.target;\n const offset = this.pointerOffset;\n offset.copy(this.camera.position).sub(target);\n\n if (this.pointerPitchCurrent !== 0) {\n offset.applyAxisAngle(this.pointerPitchAxis, -this.pointerPitchCurrent);\n }\n if (this.pointerYawCurrent !== 0) {\n offset.applyAxisAngle(this.pointerYawAxis, -this.pointerYawCurrent);\n }\n\n const dt = Math.max(deltaTime, 0);\n const dampingPitch = 1 - Math.exp(-this.pointerPitchDamping * dt);\n const dampingYaw = 1 - Math.exp(-this.pointerYawDamping * dt);\n const lerpFactorPitch = THREE.MathUtils.clamp(\n Number.isFinite(dampingPitch) ? dampingPitch : 0,\n 0,\n 1\n );\n const lerpFactorYaw = THREE.MathUtils.clamp(\n Number.isFinite(dampingYaw) ? dampingYaw : 0,\n 0,\n 1\n );\n\n this.pointerPitchCurrent = THREE.MathUtils.lerp(\n this.pointerPitchCurrent,\n this.pointerPitchTarget,\n lerpFactorPitch\n );\n\n this.pointerYawCurrent = THREE.MathUtils.lerp(\n this.pointerYawCurrent,\n this.pointerYawTarget,\n lerpFactorYaw\n );\n\n if (\n Math.abs(this.pointerPitchCurrent) < 1e-4 &&\n Math.abs(this.pointerPitchTarget) < 1e-4\n ) {\n this.pointerPitchCurrent = 0;\n }\n\n if (\n Math.abs(this.pointerYawCurrent) < 1e-4 &&\n Math.abs(this.pointerYawTarget) < 1e-4\n ) {\n this.pointerYawCurrent = 0;\n }\n\n if (this.pointerPitchCurrent !== 0) {\n offset.applyAxisAngle(this.pointerPitchAxis, this.pointerPitchCurrent);\n }\n if (this.pointerYawCurrent !== 0) {\n offset.applyAxisAngle(this.pointerYawAxis, this.pointerYawCurrent);\n }\n\n this.camera.position.copy(target).add(offset);\n this.camera.lookAt(target);\n }\n\n private animate(): void {\n this.ngZone.runOutsideAngular(() => {\n let lastTime = 0;\n\n const loop = (currentTime: number) => {\n requestAnimationFrame(loop);\n\n const deltaTime = (currentTime - lastTime) / 1000;\n lastTime = currentTime;\n\n this.controls.update();\n this.updateCameraOrbitFromPointer(deltaTime);\n\n if (this.cluster)\n this.cluster.update(undefined, this.scene, this.camera);\n\n if (this.cluster) {\n for (const node of this.cluster.nodes) {\n const aura = this.nodeAuras.get(node);\n if (aura) {\n const geom = node.mesh.geometry as THREE.SphereGeometry;\n const bs =\n geom.boundingSphere ??\n new THREE.Sphere(new THREE.Vector3(), 0.05);\n const newCoreRadius = (bs.radius || 0.05) * node.mesh.scale.x;\n const ud: any = node.userData as any;\n const prevCoreRadius = ud._auraCoreRadius as number | undefined;\n const needsResize =\n !prevCoreRadius ||\n Math.abs(newCoreRadius - prevCoreRadius) / prevCoreRadius >\n 0.005;\n if (needsResize) {\n aura.resizeCoreRadius(newCoreRadius);\n const occ: THREE.Mesh | undefined = ud._occluder as\n | THREE.Mesh\n | undefined;\n if (occ && prevCoreRadius) {\n const scaleFactor = newCoreRadius / prevCoreRadius;\n occ.scale.multiplyScalar(scaleFactor);\n }\n ud._auraCoreRadius = newCoreRadius;\n }\n\n aura.update(node.position, node.velocity, deltaTime, this.camera);\n }\n }\n }\n\n const center = this.currentCentral()?.position ?? new THREE.Vector3();\n if (this.dustField && this.cluster) {\n const atts = this.cluster.nodes\n .filter((n) => !n.isSun)\n .map((n) => {\n const geom = n.mesh.geometry as THREE.SphereGeometry;\n const bs =\n geom.boundingSphere ??\n new THREE.Sphere(new THREE.Vector3(), 0.05);\n const radius = (bs.radius || 0.05) * n.mesh.scale.x;\n return { position: n.position.clone(), radius };\n });\n this.dustField.setAttractorsWorld(atts);\n }\n this.dustField?.update(deltaTime, center);\n\n if (this.starFieldNear && this.starFieldFar) {\n this.starFieldNear.rotation.y += 0.00025;\n this.starFieldFar.rotation.y += 0.0001;\n }\n\n this.renderer.render(this.scene, this.camera);\n };\n loop(0);\n });\n }\n\n private ensureNodeAuras(): void {\n if (!this.cluster) return;\n for (const node of this.cluster.nodes) {\n if (!this.nodeAuras.has(node)) {\n const geom = node.mesh.geometry as THREE.SphereGeometry;\n const bs =\n geom.boundingSphere ?? new THREE.Sphere(new THREE.Vector3(), 0.05);\n const coreRadius = (bs.radius || 0.05) * node.mesh.scale.x;\n const particleCount = node.isSun ? 900 : 200; // Increased from 600 to 900 for supermassive black hole effect\n const aura = new BlackHoleParticleField(this.scene, {\n coreRadius,\n particleCount,\n palette: node.isSun ? 'sun' : 'planet',\n distribution: 'surface',\n speedScale: 0.3,\n });\n this.nodeAuras.set(node, aura);\n const occGeom = new THREE.SphereGeometry(coreRadius * 0.99, 24, 24);\n const occMat = new THREE.MeshBasicMaterial({\n color: 0x000000,\n depthWrite: true,\n });\n (occMat as any).colorWrite = false;\n const occluder = new THREE.Mesh(occGeom, occMat);\n occluder.renderOrder = -0.5;\n node.add(occluder);\n (node.userData as any)._auraCoreRadius = coreRadius;\n (node.userData as any)._occluder = occluder;\n }\n }\n }\n\n private createStarField(opts: {\n count: number;\n innerRadius: number;\n outerRadius: number;\n size: number;\n opacity: number;\n }): THREE.Points {\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(opts.count * 3);\n const colors = new Float32Array(opts.count * 3);\n\n for (let i = 0; i < opts.count; i++) {\n const dir = new THREE.Vector3(\n Math.random() * 2 - 1,\n Math.random() * 2 - 1,\n Math.random() * 2 - 1\n ).normalize();\n const r = THREE.MathUtils.lerp(\n opts.innerRadius,\n opts.outerRadius,\n Math.random()\n );\n const pos = dir.multiplyScalar(r);\n positions[i * 3 + 0] = pos.x;\n positions[i * 3 + 1] = pos.y;\n positions[i * 3 + 2] = pos.z;\n\n const warm = Math.random() < 0.45;\n const c = warm\n ? new THREE.Color(1.0, 0.92 + Math.random() * 0.05, 0.98)\n : new THREE.Color(0.92, 0.95 + Math.random() * 0.04, 1.0);\n colors[i * 3 + 0] = c.r;\n colors[i * 3 + 1] = c.g;\n colors[i * 3 + 2] = c.b;\n }\n\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));\n\n const material = new THREE.PointsMaterial({\n size: opts.size,\n sizeAttenuation: true,\n transparent: true,\n opacity: opts.opacity,\n depthWrite: false,\n vertexColors: true,\n blending: THREE.AdditiveBlending,\n map: this.getStarTexture(),\n alphaMap: this.getStarTexture(),\n });\n material.alphaTest = 0.15;\n\n const points = new THREE.Points(geometry, material);\n points.frustumCulled = false;\n return points;\n }\n\n private getStarTexture(): THREE.Texture {\n if (this.starTexture) return this.starTexture;\n const size = 128;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n const g = ctx.createRadialGradient(\n size / 2,\n size / 2,\n 0,\n size / 2,\n size / 2,\n size / 2\n );\n g.addColorStop(0.0, 'rgba(255,255,255,1)');\n g.addColorStop(0.4, 'rgba(255,255,255,0.9)');\n g.addColorStop(0.7, 'rgba(255,255,255,0.4)');\n g.addColorStop(1.0, 'rgba(255,255,255,0)');\n ctx.fillStyle = g;\n ctx.fillRect(0, 0, size, size);\n const texture = new THREE.CanvasTexture(canvas);\n texture.minFilter = THREE.LinearFilter;\n texture.magFilter = THREE.LinearFilter;\n texture.anisotropy = 2;\n texture.needsUpdate = true;\n this.starTexture = texture;\n return texture;\n }\n}\n","<div class=\"app-wrapper\">\n <canvas #rendererCanvas></canvas>\n</div>\n\n","import { Vector3 } from 'three';\nimport * as PCAImport from 'ml-pca';\nimport { INodeData } from '../app.types';\n\n// Dynamically resolve the PCA constructor for different build types\nconst PCAClass: any = (PCAImport as any).default || (PCAImport as any).PCA || PCAImport;\n\nexport let dynamicCounts = {\n attributes: 8,\n preferences: 8\n};\n\nexport function updateCounts(attrCount: number, prefCount: number) {\n dynamicCounts.attributes = attrCount;\n dynamicCounts.preferences = prefCount;\n}\n\n/**\n * Performs PCA on a list of attribute arrays to map them into 3D space.\n * Returns:\n * - positions: normalized [x, y, z] tuples\n * - weights: per-attribute magnitude across PCA components\n */\nfunction computePCA3D(attributesList: number[][]): {\n positions: [number, number, number][],\n weights: number[]\n} {\n const pca = new PCAClass(attributesList, { center: true, scale: true });\n const reduced: number[][] = pca.predict(attributesList, { nComponents: 3 }).to2DArray();\n\n // --- Compute per-attribute weights ---\n const loadings = pca.getLoadings().to2DArray(); \n const weights = loadings.map((arr: number[]) =>\n Math.sqrt(arr[0] ** 2 + arr[1] ** 2 + arr[2] ** 2)\n );\n\n const maxAbs = Math.max(\n ...reduced.flatMap((arr: number[]) => arr.map((v: number) => Math.abs(v)))\n );\n const positions = reduced.map(\n (arr: number[]): [number, number, number] => [\n arr[0] / maxAbs,\n arr[1] / maxAbs,\n arr[2] / maxAbs\n ]\n );\n\n return { positions, weights };\n}\n\nfunction generateAttributes(count: number, base = 0): Record<string, number> {\n const attrs: Record<string, number> = {};\n for (let i = 0; i < count; i++) attrs[`attr${i + 1}`] = (base + i * 20) % 101;\n return attrs;\n}\n\nconst colors = ['#C300FF', '#FF3366'];\n\n\nconst baseNodes: INodeData[] = [\n {\n id: 1,\n name: 'James',\n initialPosition: [0, 0, 0] as [number, number, number],\n isSun: true,\n color: '#C300FF',\n attributes: generateAttributes(dynamicCounts.attributes, 0),\n preferences: generateAttributes(dynamicCounts.preferences, 100),\n },\n ...[...Array(10)].map((_, i): INodeData => {\n const id = i + 2;\n const names = ['John', 'Alice', 'Robert', 'Emma', 'Michael', 'Sarah', 'David', 'Lisa', 'Chris', 'Maria'];\n return {\n id,\n name: names[i],\n initialPosition: [0, 0, 0] as [number, number, number],\n isSun: false,\n color: colors[i % 2],\n attributes: generateAttributes(dynamicCounts.attributes, i * 10),\n preferences: generateAttributes(dynamicCounts.preferences, 0),\n };\n }),\n];\n\n\nconst attributesList = baseNodes.map((n) => Object.values(n.attributes));\nconst { positions, weights } = computePCA3D(attributesList);\n\nexport const nodeData: INodeData[] = baseNodes.map((node, i) => {\n if (node.isSun) return { ...node, initialPosition: [0, 0, 0] as [number, number, number] };\n const [x, y, z] = positions[i];\n return {\n ...node,\n initialPosition: [x * 5, y * 5, z * 5] as [number, number, number],\n };\n});\n\nexport const attributeWeights: number[] = weights;\n","/*\n * Public API Surface of trait-visual\n */\n\n// Main component\nexport * from './lib/trait-visual.component';\n\n// Types\nexport * from './lib/app.types';\n\n// Configuration utilities\nexport { dynamicCounts, updateCounts, attributeWeights, nodeData } from './lib/data/nodes.data';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"naniteninja-trait-visual.mjs","sources":["../../../projects/trait-visual/src/lib/objects/Node.ts","../../../projects/trait-visual/src/lib/objects/Cluster.ts","../../../projects/trait-visual/src/lib/services/black-hole-particle-field.ts","../../../projects/trait-visual/src/lib/trait-visual.component.ts","../../../projects/trait-visual/src/lib/trait-visual.component.html","../../../projects/trait-visual/src/lib/data/nodes.data.ts","../../../projects/trait-visual/src/public-api.ts","../../../projects/trait-visual/src/naniteninja-trait-visual.ts"],"sourcesContent":["import * as THREE from 'three';\nimport { ISimulationConfigs, INodeData, ISwapAnimation } from '../app.types';\nimport { GlowUniforms } from '../types/glow.types';\n\nexport class Node extends THREE.Object3D {\n options: ISimulationConfigs;\n velocity: THREE.Vector3;\n isSun: boolean;\n attributes: number[];\n preferences: number[];\n preference: number = 0;\n mesh: THREE.Mesh;\n swap: ISwapAnimation | null = null;\n\n static attributeWeights: number[] = [];\n static preferenceWeights: number[] = [];\n private static normalizeWeights(weights: number[], len: number): number[] {\n const list = Array.isArray(weights) ? weights.slice(0, len) : [];\n const extended = list.slice();\n while (extended.length < len) extended.push(1);\n return extended.map((w) => (Number.isFinite(w) && w >= 0 ? w : 0));\n }\n\n private sunBaseScale: number = 3;\n private halo!: THREE.Mesh;\n private coreSprite!: THREE.Sprite;\n private haloSprite!: THREE.Sprite;\n private readonly baseSphereRadius = 0.05; // geometry radius\n\n private clock = new THREE.Clock();\n\n constructor(data: INodeData, options: ISimulationConfigs) {\n super();\n this.options = options;\n this.position.fromArray(data.initialPosition);\n this.velocity = new THREE.Vector3(0, 0, 0);\n this.userData = { ...data };\n this.isSun = data.isSun;\n\n this.attributes = data.attributes\n ? [...Object.values(data.attributes)]\n : Array.from({ length: 10 }, () => Math.floor(Math.random() * 99));\n\n this.preferences = data.preferences\n ? [...Object.values(data.preferences)]\n : Array.from({ length: 10 }, () => Math.floor(Math.random() * 99));\n\n // Create glowing core using additive Fresnel-like shader (center-bright)\n const geom = new THREE.SphereGeometry(this.baseSphereRadius, 48, 48);\n const coreMat = makeCoreGlowMaterial(\n this.isSun ? new THREE.Color('#C300FF') : new THREE.Color('#FF3366'),\n this.isSun ? 0.9 : 0.7,\n 3.5,\n this.isSun ? 0.6 : 0.35 // base floor so planets stay red from all angles\n );\n this.mesh = new THREE.Mesh(geom, coreMat);\n this.add(this.mesh);\n\n // Soft additive rim glow (BackSide Fresnel)\n const haloMat = makeRimGlowMaterial(\n this.isSun ? new THREE.Color('#C300FF') : new THREE.Color('#FF3366'),\n this.isSun ? 0.22 : 0.16,\n 0.2,\n 2.2\n );\n this.halo = new THREE.Mesh(geom.clone(), haloMat);\n this.halo.scale.setScalar(this.isSun ? 1.8 : 1.35);\n this.add(this.halo);\n\n // Camera-facing luminous core billboard to ensure visibility from all angles\n this.coreSprite = this.createBillboardGlow(\n this.isSun ? new THREE.Color('#C300FF') : new THREE.Color('#FF3366'),\n this.isSun ? 0.35 : 0.25, // reduced to avoid washing out particles\n this.isSun ? 1.4 : 1.05\n );\n this.coreSprite.visible = false; // keep glow sprites hidden for clearer particles\n this.add(this.coreSprite);\n\n // Softer, larger halo billboard (always-on rim feel)\n this.halo.visible = false; // keep mesh halo hidden\n this.haloSprite = this.createBillboardGlow(\n this.isSun ? new THREE.Color('#C300FF') : new THREE.Color('#FF3366'),\n this.isSun ? 0.08 : 0.06, // much softer halo\n this.isSun ? 2.2 : 1.6\n );\n this.haloSprite.renderOrder = 18;\n this.haloSprite.visible = false; // hide outer halo to ensure particles remain readable\n this.add(this.haloSprite);\n }\n\n updatePhysics(nodes: Node[], central: Node | null, deltaTime: number): void {\n if (!nodes || nodes.length === 0) return;\n\n const forces: THREE.Vector3[] = nodes.map(() => new THREE.Vector3());\n\n // --- Attraction: from each non-sun node to central (sun) ---\n if (central) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node === central) continue;\n\n const d = central.position.clone().sub(node.position);\n const distanceSq = d.lengthSq() + 1e-4;\n\n const compatibility = node.calculatePreferredCompatibility(central);\n\n let force = d\n .normalize()\n .multiplyScalar(\n (this.options.sun.attraction * compatibility * 2.0) /\n (distanceSq + 0.5)\n );\n\n // Clamp runaway attraction\n force.clampLength(0, 0.08);\n forces[i].add(force);\n }\n }\n\n // ---Outer ↔ Outer interactions (blend of attraction and repulsion) ---\n for (let i = 0; i < nodes.length; i++) {\n const a = nodes[i];\n if (a === central) continue;\n\n for (let j = i + 1; j < nodes.length; j++) {\n const b = nodes[j];\n if (b === central) continue;\n\n const dir = b.position.clone().sub(a.position);\n const distSq = dir.lengthSq() + 1e-6;\n const dist = Math.sqrt(distSq);\n\n if (dist < 1e-8) continue;\n\n const similarity = a.calculateAttributeCompatibility(b);\n const dissimilarity = 1 - similarity;\n\n const radiusA = a.baseSphereRadius * a.mesh.scale.x;\n const radiusB = b.baseSphereRadius * b.mesh.scale.x;\n const minDist = (radiusA + radiusB) * 1;\n\n if (dist < minDist) {\n const repel = dir\n .normalize()\n .multiplyScalar(this.options.planet.repulsion / (distSq + 0.01));\n repel.clampLength(0, 0.25);\n forces[i].sub(repel);\n forces[j].add(repel);\n continue;\n }\n\n const attractMag =\n (30 * similarity * 3.0) / (distSq + 0.5);\n const repelMag =\n 90 * dissimilarity / (distSq + 0.5);\n\n const netMag = attractMag - repelMag;\n if (Math.abs(netMag) < 1e-4) continue;\n\n const f = dir.normalize().multiplyScalar(netMag).clampLength(-0.9, 0.9);\n\n forces[i].add(f);\n forces[j].add(f.clone().multiplyScalar(-1));\n }\n }\n\n // ---Extra Repulsion (outer nodes only) ---\n for (let i = 0; i < nodes.length; i++) {\n const a = nodes[i];\n if (a === central) continue;\n\n for (let j = i + 1; j < nodes.length; j++) {\n const b = nodes[j];\n if (b === central) continue;\n\n const dir = a.position.clone().sub(b.position);\n const distSq = dir.lengthSq() + 1e-4;\n const similarity = a.calculateAttributeCompatibility(b);\n const mag =\n 20 * (1 - similarity) / (distSq + 0.5);\n\n const f = dir.normalize().multiplyScalar(mag).clampLength(0, 0.9);\n forces[i].add(f);\n forces[j].add(f.clone().multiplyScalar(-1));\n }\n }\n\n // --- Apply forces → velocities → positions ---\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node == central) continue;\n\n if (!(node.velocity instanceof THREE.Vector3)) {\n node.velocity = new THREE.Vector3(0, 0, 0);\n }\n\n const effectiveDt = Math.min(deltaTime, 0.95);\n const acceleration = forces[i];\n\n // apply acceleration\n node.velocity.addScaledVector(acceleration, effectiveDt);\n\n // --- jitter suppression ---\n // add a small deadzone to prevent micro-oscillation\n if (node.velocity.lengthSq() < 1e-10) {\n node.velocity.set(0, 0, 0);\n continue;\n }\n\n // soft low-pass filter to smooth small fluctuations\n node.velocity.lerp(node.velocity.clone(), 0.95);\n\n // damping\n // const dampingFactor = 1 - 0.8 * 0.9;\n const dampingFactor = 0.181;\n node.velocity.multiplyScalar(dampingFactor);\n\n // clamp to prevent small high-frequency shake\n node.velocity.clampLength(0, 0.15);\n\n // integrate motion\n node.position.addScaledVector(node.velocity, effectiveDt);\n\n // --- Multi-node jitter suppression (group stabilizer) ---\n if (nodes.length > 2) {\n let nearCount = 0;\n for (let j = 0; j < nodes.length; j++) {\n if (j === i || nodes[j] === central) continue;\n const d = node.position.distanceTo(nodes[j].position);\n if (d < 0.35) nearCount++; // consider nodes within a small neighborhood\n }\n // if surrounded by 2+ near neighbors and moving very slowly, freeze micro motion\n if (nearCount >= 2 && node.velocity.lengthSq() < 1e-5) {\n node.velocity.multiplyScalar(0.1); // heavy dampening\n if (node.velocity.lengthSq() < 1e-10) node.velocity.set(0, 0, 0);\n }\n }\n\n }\n\n // --- Final stabilization: prevent overlap among similar clusters ---\n const separationRadius = 0.12; \n const stiffness = 0.1; \n\n for (let i = 0; i < nodes.length; i++) {\n const a = nodes[i];\n if (a === central) continue;\n for (let j = i + 1; j < nodes.length; j++) {\n const b = nodes[j];\n if (b === central) continue;\n\n const dir = a.position.clone().sub(b.position);\n const dist = dir.length();\n if (dist < separationRadius && dist > 0.01) {\n // very small corrective displacement only, not a new force\n const overlap = separationRadius - dist;\n const correction = dir.normalize().multiplyScalar(overlap * stiffness);\n a.position.add(correction);\n b.position.sub(correction);\n }\n }\n }\n\n \n }\n\n\n setSun(state: boolean = !this.isSun, preference?: number): void {\n this.isSun = state;\n\n if (state) {\n // Switch to neon purple core; keep sprites hidden for clarity\n const core = this.mesh.material as THREE.ShaderMaterial;\n core.uniforms['glowColor'].value = new THREE.Color('#C300FF');\n core.uniforms['opacity'].value = 0.9;\n core.uniforms['base'].value = 0.6;\n const halo = this.halo.material as THREE.ShaderMaterial;\n halo.uniforms['glowColor'].value = new THREE.Color('#C300FF');\n halo.uniforms['opacity'].value = 0.22;\n this.halo.scale.setScalar(1.8);\n // Billboard core (hidden)\n (this.coreSprite.material as THREE.SpriteMaterial).color =\n new THREE.Color('#C300FF');\n (this.coreSprite.material as THREE.SpriteMaterial).opacity = 0.35;\n const dSun = this.baseSphereRadius * 2 * 1.8;\n this.coreSprite.scale.set(dSun, dSun, 1);\n // Billboard halo (hidden)\n (this.haloSprite.material as THREE.SpriteMaterial).color =\n new THREE.Color('#C300FF');\n (this.haloSprite.material as THREE.SpriteMaterial).opacity = 0.08;\n const dSunHalo = this.baseSphereRadius * 2 * 3.0;\n this.haloSprite.scale.set(dSunHalo, dSunHalo, 1);\n } else {\n // Switch to pink-red core; keep sprites hidden for clarity\n const core = this.mesh.material as THREE.ShaderMaterial;\n core.uniforms['glowColor'].value = new THREE.Color('#FF3366');\n core.uniforms['opacity'].value = 0.7;\n core.uniforms['base'].value = 0.35;\n const halo = this.halo.material as THREE.ShaderMaterial;\n halo.uniforms['glowColor'].value = new THREE.Color('#FF3366');\n halo.uniforms['opacity'].value = 0.16;\n this.halo.scale.setScalar(1.35);\n // Billboard core (hidden)\n (this.coreSprite.material as THREE.SpriteMaterial).color =\n new THREE.Color('#FF3366');\n (this.coreSprite.material as THREE.SpriteMaterial).opacity = 0.25;\n const d = this.baseSphereRadius * 2 * 1.3;\n this.coreSprite.scale.set(d, d, 1);\n // Billboard halo (hidden)\n (this.haloSprite.material as THREE.SpriteMaterial).color =\n new THREE.Color('#FF3366');\n (this.haloSprite.material as THREE.SpriteMaterial).opacity = 0.06;\n const dHalo = this.baseSphereRadius * 2 * 2.0;\n this.haloSprite.scale.set(dHalo, dHalo, 1);\n }\n\n if (preference !== undefined) {\n this.preference = preference;\n }\n }\n\n calculatePreferredCompatibility(sun: Node): number {\n const sunPreferences = sun.preferences;\n const planetAttributes = this.attributes;\n const len = Math.min(sunPreferences.length, planetAttributes.length);\n const weights = Node.normalizeWeights(Node.preferenceWeights, len);\n let diffSum = 0;\n let weightSum = 0;\n for (let i = 0; i < len; i++) {\n const w = weights[i];\n diffSum += w * Math.abs(sunPreferences[i] - planetAttributes[i]);\n weightSum += w;\n }\n const maxDiff = Math.max(1e-6, weightSum * 100);\n return 1 - diffSum / maxDiff;\n }\n\n calculateAttributeCompatibility(other: Node): number {\n const attributesA = this.attributes;\n const attributesB = other.attributes;\n const len = Math.min(attributesA.length, attributesB.length);\n const weights = Node.normalizeWeights(Node.attributeWeights, len);\n let diffSum = 0;\n let weightSum = 0;\n for (let i = 0; i < len; i++) {\n const w = weights[i];\n diffSum += w * Math.abs(attributesA[i] - attributesB[i]);\n weightSum += w;\n }\n const maxDiff = Math.max(1e-6, weightSum * 100);\n return 1 - diffSum / maxDiff;\n }\n\n update(\n nodes: Node[],\n cursorPosition?: THREE.Vector3,\n scene?: THREE.Scene,\n camera?: THREE.Camera\n ): void {\n if (this.swap) {\n this.handleSwapAnimation();\n return;\n }\n\n // Sun: keep steady size and glow (disable pulsation)\n if (this.isSun) {\n const targetScale = this.sunBaseScale;\n this.mesh.scale.lerp(\n new THREE.Vector3(targetScale, targetScale, targetScale),\n 0.2\n );\n const core = this.mesh.material as THREE.ShaderMaterial;\n core.uniforms['opacity'].value = 0.75;\n const haloMat = this.halo.material as THREE.ShaderMaterial;\n haloMat.uniforms['opacity'].value = 0.14;\n const haloScale = 1.8;\n this.halo.scale.lerp(new THREE.Vector3(haloScale, haloScale, haloScale), 0.2);\n // Sprites remain hidden/steady\n return;\n }\n let totalForce = new THREE.Vector3();\n const sun: Node | null = nodes.find((n) => n.isSun) ?? null;\n if (sun) {\n totalForce.add(this.calculateSunForce(sun));\n\n // Update planet glow based on compatibility with sun\n const compat = this.calculatePreferredCompatibility(sun); // 0..1\n const core = this.mesh.material as THREE.ShaderMaterial;\n core.uniforms['opacity'].value = 0.55 + compat * 0.4; // brighter core with compatibility\n // Planet additive halo tightly around mesh\n const haloMat = this.halo.material as THREE.ShaderMaterial;\n const baseOpacity = 0.12 + compat * 0.25; // 0.12..0.37\n let proximityBoost = 0;\n if (cursorPosition) {\n const d = this.position.distanceTo(cursorPosition);\n proximityBoost = Math.max(0, 1 - d / 1.5) * 0.04; // very subtle\n }\n haloMat.uniforms['opacity'].value = Math.min(\n 0.5,\n baseOpacity + proximityBoost\n );\n this.mesh.scale.set(1.9, 1.9, 1.9);\n const s = 1.35 * (1 + compat * 0.15);\n this.halo.scale.lerp(new THREE.Vector3(s, s, s), 0.25);\n // Billboard tuning for planets\n const coreMat = this.coreSprite.material as THREE.SpriteMaterial;\n coreMat.opacity = 0.45 + compat * 0.35 + proximityBoost * 0.2;\n const d2 =\n this.baseSphereRadius * 2 * (1.3 + compat * 0.2) * this.mesh.scale.x;\n this.coreSprite.scale.lerp(new THREE.Vector3(d2, d2, 1), 0.2);\n const haloMatS = this.haloSprite.material as THREE.SpriteMaterial;\n haloMatS.opacity = 0.16 + compat * 0.18 + proximityBoost * 0.1;\n const d2h =\n this.baseSphereRadius * 2 * (2.0 + compat * 0.5) * this.mesh.scale.x;\n this.haloSprite.scale.lerp(new THREE.Vector3(d2h, d2h, 1), 0.2);\n }\n totalForce.add(this.calculatePlanetRepulsion(nodes));\n totalForce.add(this.calculatePlanetAttraction(nodes));\n totalForce.multiplyScalar(this.options.velocityDamping);\n\n\n const deltaTime = this.clock.getDelta();\n\n this.updatePhysics(nodes, sun, deltaTime);\n this.applyForces(totalForce);\n }\n\n // (Sprite-based glow removed in favor of additive core + halo meshes)\n private createBillboardGlow(\n color: THREE.Color,\n opacity: number,\n diameterMultiplier: number\n ): THREE.Sprite {\n const size = 128;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n const g = ctx.createRadialGradient(\n size / 2,\n size / 2,\n 0,\n size / 2,\n size / 2,\n size / 2\n );\n g.addColorStop(0.0, 'rgba(255,255,255,1)');\n g.addColorStop(0.5, 'rgba(255,255,255,0.6)');\n g.addColorStop(1.0, 'rgba(255,255,255,0)');\n ctx.fillStyle = g;\n ctx.fillRect(0, 0, size, size);\n const tex = new THREE.CanvasTexture(canvas);\n tex.minFilter = THREE.LinearFilter;\n tex.magFilter = THREE.LinearFilter;\n const material = new THREE.SpriteMaterial({\n map: tex,\n color,\n transparent: true,\n opacity,\n depthWrite: false,\n depthTest: false,\n blending: THREE.AdditiveBlending,\n });\n const sprite = new THREE.Sprite(material);\n const diameter = this.baseSphereRadius * 2 * diameterMultiplier;\n sprite.scale.set(diameter, diameter, 1);\n sprite.renderOrder = 20;\n return sprite;\n }\n\n private calculateSunForce(sun: Node): THREE.Vector3 {\n let force = new THREE.Vector3();\n const compatibility = this.calculatePreferredCompatibility(sun);\n const desiredDistance = 0.25 + (1 - compatibility) * 4.0;\n const currentDistance = sun.position.distanceTo(this.position);\n const error = currentDistance - desiredDistance;\n const directionToSun = new THREE.Vector3()\n .subVectors(sun.position, this.position)\n .normalize();\n\n if (currentDistance < desiredDistance) {\n const repulsionForce =\n -this.options.sun.repulsion *\n (desiredDistance - currentDistance) *\n compatibility;\n force.add(directionToSun.multiplyScalar(repulsionForce));\n } else {\n const attractionForce =\n 2 * this.options.sun.attraction * error * compatibility + 0.001;\n force.add(directionToSun.multiplyScalar(attractionForce));\n }\n\n return force;\n }\n\n private calculatePlanetAttraction(nodes: Node[]): THREE.Vector3 {\n let attractionForce = new THREE.Vector3();\n const attractionConstant = 0.001;\n nodes.forEach((other) => {\n if (other !== this && !other.isSun) {\n const compatibility = this.calculateAttributeCompatibility(other);\n const forceMagnitude = attractionConstant * compatibility - 0.001;\n const attractionDirection = new THREE.Vector3()\n .subVectors(other.position, this.position)\n .normalize();\n attractionForce.add(attractionDirection.multiplyScalar(forceMagnitude));\n }\n });\n return attractionForce;\n }\n\n private calculatePlanetRepulsion(nodes: Node[]): THREE.Vector3 {\n let repulsionForce = new THREE.Vector3();\n nodes.forEach((other) => {\n if (other !== this && !other.isSun) {\n const distance = this.position.distanceTo(other.position);\n if (distance < this.options.planet.repulsionInitializationThreshold) {\n const compatibility = this.calculateAttributeCompatibility(other);\n const repulsion =\n this.options.planet.repulsion *\n (this.options.planet.repulsionInitializationThreshold -\n distance) *\n (1 - compatibility) +\n 0.001;\n const repulsionDirection = new THREE.Vector3()\n .subVectors(this.position, other.position)\n .normalize();\n repulsionForce.add(repulsionDirection.multiplyScalar(repulsion));\n }\n }\n });\n return repulsionForce;\n }\n\n private applyForces(force: THREE.Vector3): void {\n this.velocity.add(force);\n if (this.velocity.length() > this.options.maxVelocity) {\n this.velocity.setLength(this.options.maxVelocity);\n }\n this.velocity.multiplyScalar(this.options.velocityDamping);\n this.position.add(this.velocity);\n }\n\n private handleSwapAnimation(): void {\n if (!this.swap) return;\n const currentSwap = this.swap;\n const currentTime = performance.now();\n let progress = (currentTime - currentSwap.startTime) / currentSwap.duration;\n if (progress >= 1) {\n progress = 1;\n this.velocity.set(0, 0, 0);\n this.swap = null;\n }\n this.position.copy(\n currentSwap.start.clone().lerp(currentSwap.end, progress)\n );\n }\n}\n\nfunction makeCoreGlowMaterial(\n color: THREE.Color,\n opacity = 0.8,\n power = 3.5,\n base = 0.1\n): THREE.ShaderMaterial {\n const uniforms: GlowUniforms = {\n glowColor: { value: color },\n opacity: { value: opacity },\n p: { value: power },\n base: { value: base },\n };\n const vertex = `\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n void main() {\n vNormal = normalize(normalMatrix * normal);\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\n vWorldPosition = worldPosition.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n const fragment = `\n uniform vec3 glowColor;\n uniform float opacity;\n uniform float p;\n uniform float base;\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n void main() {\n vec3 viewDir = normalize(cameraPosition - vWorldPosition);\n // Center-bright with a base floor so sides never go black\n float ndv = clamp(dot(vNormal, viewDir), 0.0, 1.0);\n float intensity = base + (1.0 - base) * pow(ndv, p);\n gl_FragColor = vec4(glowColor * intensity, intensity * opacity);\n }\n `;\n return new THREE.ShaderMaterial({\n uniforms,\n vertexShader: vertex,\n fragmentShader: fragment,\n transparent: true,\n depthWrite: false,\n blending: THREE.AdditiveBlending,\n side: THREE.FrontSide,\n });\n}\n\nfunction makeRimGlowMaterial(\n color: THREE.Color,\n opacity = 0.2,\n c = 0.2,\n power = 2.2\n): THREE.ShaderMaterial {\n const uniforms: GlowUniforms = {\n glowColor: { value: color },\n opacity: { value: opacity },\n c: { value: c },\n p: { value: power },\n };\n const vertex = `\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n void main() {\n vNormal = normalize(normalMatrix * normal);\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\n vWorldPosition = worldPosition.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n const fragment = `\n uniform vec3 glowColor;\n uniform float opacity;\n uniform float c;\n uniform float p;\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n void main() {\n vec3 viewDir = normalize(cameraPosition - vWorldPosition);\n float intensity = pow(max(0.0, c - dot(vNormal, viewDir)), p);\n gl_FragColor = vec4(glowColor, intensity * opacity);\n }\n `;\n return new THREE.ShaderMaterial({\n uniforms,\n vertexShader: vertex,\n fragmentShader: fragment,\n transparent: true,\n depthWrite: false,\n blending: THREE.AdditiveBlending,\n side: THREE.BackSide,\n });\n}\n\n(Node.prototype as any).makeCoreGlowMaterial = makeCoreGlowMaterial;\n(Node.prototype as any).makeRimGlowMaterial = makeRimGlowMaterial;\n","import * as THREE from 'three';\nimport {\n ISimulationConfigs,\n INodeData,\n} from '../app.types';\nimport { Node } from './Node';\n\nexport class Cluster extends THREE.Object3D {\n options: ISimulationConfigs;\n nodes: Node[];\n\n constructor(nodeData: INodeData[], options?: Partial<ISimulationConfigs>) {\n super();\n this.options = {\n sun: {\n attraction: 1,\n repulsion: 1,\n repulsionInitializationThreshold: 0.4,\n },\n planet: {\n attraction: 1,\n repulsion: 1,\n repulsionInitializationThreshold: 0.2,\n },\n maxVelocity: 0.02,\n velocityDamping: 0.8,\n minAttributeValue: 0,\n minPreferenceValue: 0,\n maxAttributeValue: 100,\n maxPreferenceValue: 100,\n ...options,\n };\n this.nodes = [];\n this.setUp(nodeData);\n }\n\n setUp(nodeData: INodeData[]): void {\n nodeData.forEach((data) => {\n const node = new Node(data, this.options);\n this.nodes.push(node);\n this.add(node);\n });\n }\n\n update(cursorPosition?: THREE.Vector3, scene?: THREE.Scene, camera?: THREE.Camera): void {\n this.nodes.forEach((node) => node.update(this.nodes, cursorPosition, scene, camera));\n\n // Bound the position within (-8, -8, -8) and (8, 8, 8)\n const BOUND = 8;\n this.position.x = THREE.MathUtils.clamp(this.position.x, -BOUND, BOUND);\n this.position.y = THREE.MathUtils.clamp(this.position.y, -BOUND, BOUND);\n this.position.z = THREE.MathUtils.clamp(this.position.z, -BOUND, BOUND);\n }\n}","import * as THREE from 'three';\nimport { ParticleFieldOptions, FlowParticle } from '../types/particle-field.types';\n\nexport class BlackHoleParticleField {\n // Private properties\n private scene: THREE.Scene;\n private particles: FlowParticle[] = [];\n private particleSystem: THREE.Points | null = null;\n\n // Natural particle count for bubble-like effect\n private particleCount: number = 200;\n\n // Visual parameters (scaled by coreRadius)\n private coreRadius: number = 0.39; // defaults; overridden per-node via options\n private readonly FIELD_RADIUS_FACTOR = 0.9; // relative scale\n\n private readonly NEON_PURPLE = new THREE.Color(0xc300ff);\n private readonly PINK_RED = new THREE.Color(0xff3366);\n private palette: 'sun' | 'planet' = 'planet';\n // Use even surface distribution (no view alignment by default)\n private useSurface: boolean = true;\n private seedCounter = 0; // Fibonacci seed index\n private speedScale = 1; // instance speed scaler (planets slower)\n\n // Animation params (slower, smoother orbits)\n private readonly MIN_SPEED = 0.4; // radians/sec\n private readonly MAX_SPEED = 1.2;\n private get FRONT_MIN() {\n return this.coreRadius * 0.06;\n }\n // Physical speed coupling (omega ≈ k * |v| / r) and clamps\n private readonly OMEGA_K = 1.0;\n private readonly OMEGA_MAX_RIM = 0.9; // rad/s\n private readonly OMEGA_MAX_CAP = 0.7; // rad/s\n // Surface mode coupling (gentler, avoids insect jitter)\n private readonly OMEGA_SURFACE_K = 0.8; // coupling from |vProj|/r → rad/s\n private readonly OMEGA_SURFACE_MAX = 0.8; // clamp for surface mode\n private readonly OMEGA_SURFACE_BASE_MIN = 0.12; // intrinsic base speed\n private readonly OMEGA_SURFACE_BASE_MAX = 0.28;\n private readonly SPEED_EPS = 1e-5;\n private readonly SHIMMER_FRAC = 0.02; // 2% at rest\n\n // Debugging: color bands and periodically log counts\n private debugBands = false;\n private lastDebugLogMs = 0;\n private bandCounts: Record<FlowParticle['type'], number> = {\n topCurve: 0,\n bottomCurve: 0,\n orbit: 0,\n topCap: 0,\n bottomCap: 0,\n surface: 0,\n };\n private readonly MIN_LIFETIME = 3.0;\n private readonly MAX_LIFETIME = 6.0;\n\n // --- anchor tracking + flow alignment ---\n private targetAnchor = new THREE.Vector3(); // last received from update()\n private anchor = new THREE.Vector3(); // smoothed, z=0\n private readonly anchorLerp = 1.0; // fully attached to the cursor position\n private lastRight = new THREE.Vector3(1, 0, 0); // cached flow-aligned right axis\n private flowSpeedScale = 1.0;\n private prevTargetAnchor = new THREE.Vector3(); // for anchor-delta velocity\n private readonly worldUp = new THREE.Vector3(0, 1, 0);\n\n constructor(scene: THREE.Scene, opts?: ParticleFieldOptions) {\n this.scene = scene;\n if (opts?.coreRadius && Number.isFinite(opts.coreRadius)) {\n this.coreRadius = Math.max(0.01, opts.coreRadius);\n }\n if (opts?.particleCount && Number.isFinite(opts.particleCount)) {\n this.particleCount = Math.max(8, Math.floor(opts.particleCount));\n }\n if (opts?.palette) {\n this.palette = opts.palette;\n }\n if (opts?.distribution) {\n this.useSurface = opts.distribution === 'surface';\n }\n if (opts?.speedScale && Number.isFinite(opts.speedScale)) {\n this.speedScale = Math.max(0.05, opts.speedScale);\n }\n // Enable debug via query param ?debugBands=1\n try {\n const search = (window as any)?.location?.search ?? '';\n this.debugBands = /(?:^|[?&])debugBands=1(?:&|$)/.test(search);\n } catch {}\n\n this.initializeParticleField();\n }\n\n // Public methods\n\n /**\n * Update particle field anchored at `anchorPosition`, advected by `flow`.\n */\n update(\n anchorPosition: THREE.Vector3,\n flow: THREE.Vector3,\n deltaTime: number,\n camera?: THREE.Camera\n ): void {\n if (!this.particleSystem) return;\n\n // 1) Accept input, use full 3D coordinates\n const x = anchorPosition?.x;\n const y = anchorPosition?.y;\n const z = anchorPosition?.z;\n if (Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z)) {\n // Anchor exactly at the target position (no world-Z offset)\n this.targetAnchor.set(x, y, z);\n }\n // Smooth follow to avoid jitter (and hide any one-frame glitches)\n this.anchor.lerp(this.targetAnchor, this.anchorLerp);\n\n // Move the ENTIRE particle system to the anchor.\n // Geometry stays in LOCAL rim-space.\n this.particleSystem.position.copy(this.anchor);\n\n // 2) Delta time guard\n if (!Number.isFinite(deltaTime) || deltaTime <= 0) deltaTime = 1 / 60;\n\n const geom = this.particleSystem.geometry as THREE.BufferGeometry;\n const positions = geom.getAttribute('position').array as Float32Array;\n const colors = geom.getAttribute('color').array as Float32Array;\n // (sizes/opacities kept for shader)\n const sizes = geom.getAttribute('size').array as Float32Array;\n\n // 3) Build a WORLD-coupled plane (flow + worldUp) and fuse flow with anchor-delta\n const camForward = new THREE.Vector3(0, 0, 1);\n const camUp = new THREE.Vector3(0, 1, 0);\n if (camera) {\n camera.getWorldDirection(camForward);\n camUp.copy(camera.up).normalize();\n }\n\n // Compute anchor-delta velocity (works during drag/swap)\n // Prevent first-frame spike\n if (this.prevTargetAnchor.lengthSq() === 0) {\n this.prevTargetAnchor.copy(this.targetAnchor);\n }\n const anchorDelta = new THREE.Vector3().subVectors(\n this.targetAnchor,\n this.prevTargetAnchor\n );\n const vAnchor = anchorDelta\n .clone()\n .multiplyScalar(1 / Math.max(1e-6, deltaTime));\n const vNode = (flow || new THREE.Vector3()).clone();\n const vNodeMag = vNode.length();\n const vAncMag = vAnchor.length();\n const w = vAncMag / Math.max(1e-6, vAncMag + vNodeMag); // prefer anchor when node velocity is small\n const vFlow = vNode.multiplyScalar(1 - w).add(vAnchor.multiplyScalar(w));\n\n // Project flow onto world-up plane\n const proj = vFlow\n .clone()\n .sub(this.worldUp.clone().multiplyScalar(vFlow.dot(this.worldUp)));\n const projLen = proj.length();\n // Adaptive smoothing: snappier when faster\n const speedHigh = 0.02; // typical maxVelocity\n const alpha = THREE.MathUtils.clamp(\n 0.4 - 0.3 * Math.min(1, vFlow.length() / speedHigh),\n 0.1,\n 0.45\n );\n if (projLen > 1e-6) {\n const instRight = proj.clone().normalize();\n this.lastRight.lerp(instRight, alpha).normalize();\n }\n // If invalid, fall back to camera plane right\n if (\n !Number.isFinite(\n this.lastRight.x + this.lastRight.y + this.lastRight.z\n ) ||\n this.lastRight.lengthSq() < 1e-6\n ) {\n const rightCam = camForward.clone().cross(camUp).normalize();\n if (rightCam.lengthSq() > 0) this.lastRight.copy(rightCam);\n else this.lastRight.set(1, 0, 0);\n }\n let right = this.lastRight.clone();\n const up = this.worldUp.clone();\n let forward = new THREE.Vector3().crossVectors(right, up).normalize();\n // Hybrid plane: bias normal toward camera to avoid \"edge-only\" look\n const speedNorm = THREE.MathUtils.clamp(vFlow.length() / 0.02, 0, 1);\n const cameraBias = THREE.MathUtils.clamp(0.35 - 0.2 * speedNorm, 0.1, 0.35);\n forward = forward.clone().lerp(camForward, cameraBias).normalize();\n // Recompute right to stay orthonormal after blending\n right = up.clone().cross(forward).normalize();\n\n // For sign decisions, use instantaneous (unsmoothed) projected flow when available\n const instRight =\n projLen > 1e-6 ? proj.clone().normalize() : this.lastRight.clone();\n if (right.dot(instRight) < 0) right.multiplyScalar(-1);\n const flowSpeed = vFlow.length();\n this.flowSpeedScale = THREE.MathUtils.clamp(flowSpeed * 100, 0, 3); // not used for omega anymore but kept for wiggles\n\n for (let i = 0; i < this.particles.length; i++) {\n let p = this.particles[i];\n\n p.age += deltaTime;\n const twoPi = Math.PI * 2;\n // Angular wander: scale by flow for banded mode; always small for surface mode\n const speedFactor = this.useSurface\n ? 0.5\n : THREE.MathUtils.clamp(flowSpeed / 0.02, 0, 1);\n const wander =\n p.angleWanderAmp *\n speedFactor *\n Math.sin(2 * Math.PI * p.angleWanderFreq * p.age + p.angleWanderPhase);\n\n if (this.useSurface && p.type === 'surface' && p.u && p.v) {\n // ALWAYS use dynamic direction based on node velocity, never fixed dirSign\n const camRight = camForward.clone().cross(camUp).normalize();\n\n // Calculate direction based on world velocity + anchor movement\n const totalFlow = vFlow.clone();\n const flowMagnitude = totalFlow.length();\n\n // Determine rotation direction from velocity:\n // - Node moving right (+X) → particles rotate clockwise (+1)\n // - Node moving left (-X) → particles rotate counter-clockwise (-1)\n let dir = 1; // default when stationary\n if (flowMagnitude > 1e-5) {\n const flowRightComponent = totalFlow.dot(camRight);\n dir = Math.sign(flowRightComponent) || 1;\n } else {\n // When stationary, use natural rotation based on particle's orbit plane\n // This prevents systematic patterns that cause ring formation\n const orbitNormal = new THREE.Vector3().crossVectors(p.u, p.v);\n dir = Math.sign(orbitNormal.y) || 1; // Use Y component for consistent but varied direction\n }\n // Project node flow into the particle's plane and derive omega\n const n = new THREE.Vector3().crossVectors(p.u, p.v).normalize();\n const vProjLen = vFlow\n .clone()\n .sub(n.clone().multiplyScalar(vFlow.dot(n)))\n .length();\n const baseR = Math.max(1e-4, p.radius);\n const omegaFlow = this.OMEGA_SURFACE_K * (vProjLen / baseR);\n const omegaBase = p.baseOmega ?? this.OMEGA_SURFACE_BASE_MIN;\n const omega = Math.min(\n this.OMEGA_SURFACE_MAX * this.speedScale,\n (omegaBase + omegaFlow) * this.speedScale\n );\n\n // Tiny wander for natural look (very small)\n p.angle += dir * (omega + wander) * deltaTime;\n if (p.angle > Math.PI) p.angle -= twoPi;\n if (p.angle < -Math.PI) p.angle += twoPi;\n\n // Precession disabled for now\n\n const local = this.getLocalOrbitPos(\n p,\n p.age,\n right,\n up,\n forward,\n camForward\n );\n positions[i * 3 + 0] = local.x;\n positions[i * 3 + 1] = local.y;\n positions[i * 3 + 2] = local.z;\n } else {\n // Legacy banded motion aligned with flow\n const margin = p.thetaMargin ?? 0;\n const baseR = Math.max(1e-4, p.radius);\n const omegaRaw = this.OMEGA_K * (flowSpeed / baseR);\n const omegaClamp =\n p.type === 'topCap' || p.type === 'bottomCap'\n ? this.OMEGA_MAX_CAP\n : this.OMEGA_MAX_RIM;\n const omega = Math.min(omegaRaw, omegaClamp);\n const angSign = Math.sign(vFlow.dot(instRight)) || 1;\n\n p.angle += angSign * (omega + wander) * deltaTime;\n if (p.angle > Math.PI) p.angle -= twoPi;\n if (p.angle < -Math.PI) p.angle += twoPi;\n\n const local = this.getLocalOrbitPos(\n p,\n p.age,\n right,\n up,\n forward,\n camForward\n );\n positions[i * 3 + 0] = local.x;\n positions[i * 3 + 1] = local.y;\n positions[i * 3 + 2] = local.z;\n }\n\n if (p.age >= p.lifetime) {\n // Retain particle; just reset time and vary wiggle phase\n p.age = 0;\n p.lifetime =\n this.MIN_LIFETIME +\n Math.random() * (this.MAX_LIFETIME - this.MIN_LIFETIME);\n p.wigglePhase = Math.random() * Math.PI * 2;\n }\n }\n\n // Periodic debug counts log\n if (this.debugBands) {\n const now = performance.now();\n if (now - this.lastDebugLogMs > 2000) {\n this.lastDebugLogMs = now;\n // Recompute counts once (particles are fixed types)\n const counts: Record<string, number> = {};\n for (const p of this.particles)\n counts[p.type] = (counts[p.type] || 0) + 1;\n console.info('[ParticleBands]', counts);\n }\n }\n\n // 4) Push updates\n geom.getAttribute('position').needsUpdate = true;\n geom.getAttribute('color').needsUpdate = true;\n geom.computeBoundingSphere?.();\n\n // Keep last target anchor for next-frame delta\n this.prevTargetAnchor.copy(this.targetAnchor);\n }\n\n /**\n * Resize the field to a new `coreRadius` while preserving particle distribution.\n * Scales all radius-like parameters so visuals stay consistent.\n */\n resizeCoreRadius(newRadius: number): void {\n if (!Number.isFinite(newRadius) || newRadius <= 0) return;\n const old = this.coreRadius;\n if (!old || Math.abs(newRadius - old) < 1e-6) return;\n const s = newRadius / old;\n\n // Update core scalar used in shaders/limits\n this.coreRadius = newRadius;\n\n // Proportionally scale particle radii and related amplitudes/biases\n for (let i = 0; i < this.particles.length; i++) {\n const p = this.particles[i];\n p.radius *= s;\n p.radialJitterAmp *= s;\n p.upBias *= s;\n p.depthBias *= s;\n if (p.capRadBias) p.capRadBias *= s;\n p.arcUpAmp *= s;\n p.arcDepthAmp *= s;\n p.arcRadAmp *= s;\n }\n }\n\n // Public toggle for debug coloring\n public setDebugBands(enabled: boolean) {\n if (this.debugBands === enabled) return;\n this.debugBands = enabled;\n if (!this.particleSystem) return;\n const colors = (\n this.particleSystem.geometry as THREE.BufferGeometry\n ).getAttribute('color') as THREE.BufferAttribute;\n for (let i = 0; i < this.particles.length; i++) {\n const c = this.debugBands\n ? this.getDebugColorForType(this.particles[i].type)\n : this.particles[i].color;\n colors.setX(i, c.r);\n colors.setY(i, c.g);\n colors.setZ(i, c.b);\n }\n colors.needsUpdate = true;\n }\n\n public toggleDebugBands(): boolean {\n this.setDebugBands(!this.debugBands);\n return this.debugBands;\n }\n\n // Switch palette at runtime (e.g., when a node becomes or ceases to be the sun)\n public setPalette(newPalette: 'sun' | 'planet'): void {\n if (this.palette === newPalette) return;\n this.palette = newPalette;\n if (!this.particleSystem) return;\n const geom = this.particleSystem.geometry as THREE.BufferGeometry;\n const colorsAttr = geom.getAttribute('color') as THREE.BufferAttribute;\n const base = this.palette === 'sun' ? this.NEON_PURPLE : this.PINK_RED;\n for (let i = 0; i < this.particles.length; i++) {\n const jitter = THREE.MathUtils.lerp(0.9, 1.1, Math.random());\n const c = base.clone().multiplyScalar(jitter);\n c.r = Math.min(1, Math.max(0, c.r));\n c.g = Math.min(1, Math.max(0, c.g));\n c.b = Math.min(1, Math.max(0, c.b));\n this.particles[i].color.copy(c);\n if (!this.debugBands) {\n colorsAttr.setX(i, c.r);\n colorsAttr.setY(i, c.g);\n colorsAttr.setZ(i, c.b);\n }\n }\n colorsAttr.needsUpdate = true;\n }\n\n dispose(): void {\n if (this.particleSystem) {\n this.scene.remove(this.particleSystem);\n this.particleSystem.geometry.dispose();\n (this.particleSystem.material as THREE.Material).dispose();\n this.particleSystem = null;\n }\n this.particles.length = 0;\n }\n\n // Private methods\n\n // --------------------------- init ---------------------------\n\n private initializeParticleField(): void {\n this.generateParticles();\n this.createParticleSystem();\n }\n\n private generateParticles(): void {\n this.particles.length = 0;\n // reset counts\n (Object.keys(this.bandCounts) as FlowParticle['type'][]).forEach(\n (k) => (this.bandCounts[k] = 0)\n );\n\n for (let i = 0; i < this.particleCount; i++) {\n const p = this.createNewParticle();\n this.particles.push(p);\n this.bandCounts[p.type]++;\n }\n }\n\n private createNewParticle(): FlowParticle {\n // New mode: evenly spread particles around the surface using per-particle orbit planes\n if (this.useSurface) {\n const type: FlowParticle['type'] = 'surface';\n\n // Fibonacci sphere to pick an initial position direction (uniform on sphere)\n const i = this.seedCounter++;\n const n = Math.max(1, this.particleCount);\n const golden = Math.PI * (3 - Math.sqrt(5));\n const offset = 2 / n;\n const y = i * offset - 1 + offset / 2; // uniform in [-1, 1]\n const rxy = Math.sqrt(Math.max(0, 1 - y * y));\n const theta = golden * i;\n const ux = Math.cos(theta) * rxy;\n const uz = Math.sin(theta) * rxy;\n const u = new THREE.Vector3(ux, y, uz).normalize(); // direction to initial point\n\n // Build an orbit plane containing u: choose a random axis perpendicular to u\n let rand = new THREE.Vector3(\n Math.random(),\n Math.random(),\n Math.random()\n ).normalize();\n if (Math.abs(rand.dot(u)) > 0.95) rand = new THREE.Vector3(1, 0, 0); // avoid parallel\n const axis = new THREE.Vector3().crossVectors(u, rand).normalize(); // plane normal\n const v = new THREE.Vector3().crossVectors(axis, u).normalize(); // completes basis\n\n // Small random rotation around the plane to avoid grid-like bands\n const angle = THREE.MathUtils.randFloatSpread(Math.PI * 2);\n // Tight shell: 1.002R .. 1.008R\n const radius =\n this.coreRadius *\n (1 + THREE.MathUtils.lerp(0.002, 0.008, Math.random()));\n // Speed is derived from node flow at runtime; initialize small values to avoid spikes\n const angularSpeed = 0;\n const radialJitterAmp = this.coreRadius * 0.002; // very subtle breathing\n const radialJitterFreq = 0.2 + Math.random() * 0.3;\n\n // Color from palette with small jitter\n const base = this.palette === 'sun' ? this.NEON_PURPLE : this.PINK_RED;\n const cjit = THREE.MathUtils.lerp(0.9, 1.1, Math.random());\n const color = base.clone().multiplyScalar(cjit);\n color.r = Math.min(1, Math.max(0, color.r));\n color.g = Math.min(1, Math.max(0, color.g));\n color.b = Math.min(1, Math.max(0, color.b));\n\n const precessAxis = new THREE.Vector3(0, 0, 1); // disabled precession\n const precessSpeed = 0;\n\n // Intrinsic orbit speed so particles revolve even when node is stationary\n const baseOmega =\n THREE.MathUtils.lerp(\n this.OMEGA_SURFACE_BASE_MIN,\n this.OMEGA_SURFACE_BASE_MAX,\n Math.random()\n ) * this.speedScale;\n\n return {\n type,\n radius,\n angle,\n angularSpeed,\n radialJitterAmp,\n radialJitterFreq,\n size: 0.8 + Math.random() * 1.4,\n color,\n opacity: 0.85,\n lifetime:\n this.MIN_LIFETIME +\n Math.random() * (this.MAX_LIFETIME - this.MIN_LIFETIME),\n age: Math.random() * 0.5,\n ellipse: 1,\n upBias: 0,\n depthBias: 0,\n wigglePhase: Math.random() * Math.PI * 2,\n wiggleFreqUp: 0.25 + Math.random() * 0.4,\n wiggleFreqDepth: 0.25 + Math.random() * 0.4,\n capRadBias: 0,\n tiltUF: undefined,\n arcUpAmp: 0,\n arcDepthAmp: 0,\n arcRadAmp: this.coreRadius * 0.004,\n arcFreq: 1,\n angleWanderAmp: THREE.MathUtils.lerp(0.01, 0.03, Math.random()),\n angleWanderFreq: 0.15 + Math.random() * 0.3,\n angleWanderPhase: Math.random() * Math.PI * 2,\n verticalOffset: 0,\n phi: undefined,\n thetaMargin: 0,\n frontCurveAngle: undefined,\n phiAmp: 0,\n axis,\n u,\n v,\n dirSign: 1, // Unused - direction calculated dynamically\n precessAxis,\n precessSpeed,\n baseOmega,\n };\n }\n\n // Legacy banded distribution (kept for reference and fallback)\n // Distribution for full wrap with clear center:\n // topCurve ~22%, bottomCurve ~22% (rim ~44%), topCap ~28%, bottomCap ~28% (caps ~56%)\n const rpick = Math.random();\n const type: FlowParticle['type'] =\n rpick < 0.22\n ? 'topCurve'\n : rpick < 0.44\n ? 'bottomCurve'\n : rpick < 0.72\n ? 'topCap'\n : 'bottomCap';\n\n // Keep particles hugging the node surface\n const rim = this.coreRadius * 1.005; // very tight\n const rimBand = 0.01; // thin band width\n const capSurfaceR = THREE.MathUtils.lerp(\n this.coreRadius * 1.01,\n this.coreRadius * 1.03,\n Math.random()\n );\n\n // Per-particle shape and offsets to avoid identical tracks\n const ellipse = 0.96 + Math.random() * 0.08; // very subtle, 0.96–1.04\n const upScale = this.coreRadius;\n let upBias = 0;\n switch (type) {\n case 'topCurve':\n upBias = THREE.MathUtils.lerp(0.006, 0.018, Math.random()) * upScale;\n break;\n case 'bottomCurve':\n upBias = -THREE.MathUtils.lerp(0.006, 0.018, Math.random()) * upScale;\n break;\n default:\n upBias = 0;\n }\n const depthBias =\n THREE.MathUtils.lerp(-0.012, 0.012, Math.random()) * this.coreRadius;\n const capRadBias =\n type === 'topCap' || type === 'bottomCap'\n ? THREE.MathUtils.lerp(-0.004, 0.004, Math.random()) * this.coreRadius\n : 0;\n\n // Optional tilt for mid bands: 1 = use up (vertical), 0 = use forward (horizontal)\n // Center bands disabled; keep tiltUF unused/default\n const tiltUF = undefined;\n\n // Compute mid-band plane radius if needed\n // Center bands disabled; mid-plane values unused\n const midOffset = 0;\n const midSurfR = 0;\n const midPlaneRadius = 0;\n\n let radius = 0;\n if (type === 'topCap' || type === 'bottomCap') {\n radius = Math.max(0.0001, capSurfaceR + capRadBias);\n } else {\n // Rim bands, allow very tight to surface\n radius = rim + Math.random() * rimBand;\n // Occasionally let bottom dip slightly for occlusion hug\n if (type === 'bottomCurve' && Math.random() < 0.2) {\n radius =\n this.coreRadius * THREE.MathUtils.lerp(0.98, 1.0, Math.random());\n }\n }\n\n // Define spherical latitude (phi) per band to control top gap filling\n // phi: 0 (top pole), PI/2 (equator/rim), PI (bottom pole)\n const rimPhi = Math.PI * 0.5; // 90° (equator)\n // Caps sit close to rim so center stays clear, but still on surface\n const topPhiMin = rimPhi - 0.22; // ~12.6° above rim\n const topPhiMax = rimPhi - 0.12; // ~6.9° above rim\n const botPhiMin = rimPhi + 0.12; // ~6.9° below rim\n const botPhiMax = rimPhi + 0.22; // ~12.6° below rim\n\n const biasTowardB = (a: number, b: number, pow = 2.0) =>\n a + (b - a) * Math.pow(Math.random(), 1 / pow);\n const biasTowardA = (a: number, b: number, pow = 2.0) =>\n a + (b - a) * (1 - Math.pow(Math.random(), 1 / pow));\n\n let phi: number;\n // Set phi only for caps and mids to place them on inner surfaces\n switch (type) {\n case 'topCap':\n phi = THREE.MathUtils.clamp(\n THREE.MathUtils.lerp(topPhiMin, topPhiMax, Math.random()),\n 0.02,\n rimPhi - 0.02\n );\n break;\n case 'bottomCap':\n phi = THREE.MathUtils.clamp(\n THREE.MathUtils.lerp(botPhiMin, botPhiMax, Math.random()),\n rimPhi + 0.02,\n Math.PI - 0.02\n );\n break;\n default:\n // Rim arcs: slight above/below equator\n phi =\n type === 'topCurve'\n ? rimPhi - THREE.MathUtils.lerp(0.02, 0.04, Math.random())\n : type === 'bottomCurve'\n ? rimPhi + THREE.MathUtils.lerp(0.02, 0.04, Math.random())\n : rimPhi;\n }\n\n // Random initial angle per group to avoid trains\n let angle = 0;\n if (type === 'topCap' || type === 'bottomCap') {\n // Start near left edge of front half\n angle = -Math.PI * 0.95 + Math.random() * 0.1;\n } else {\n // Rim arcs: anywhere around\n angle = THREE.MathUtils.lerp(-Math.PI, Math.PI, Math.random());\n }\n // small variance\n angle += (Math.random() - 0.5) * 0.05;\n // Per-group base speeds retained but will be overridden by physical mapping\n const baseSpeed = THREE.MathUtils.lerp(\n this.MIN_SPEED,\n this.MAX_SPEED,\n Math.random()\n );\n const speedMul =\n type === 'topCurve' || type === 'bottomCurve'\n ? 1.1\n : type === 'topCap' || type === 'bottomCap'\n ? 0.95\n : 0.8; // orbit\n const angularSpeed = baseSpeed * speedMul;\n\n // Subtle breathing; even smaller so it hugs the surface and avoids clipping\n const radialJitterAmp =\n this.coreRadius *\n (type === 'topCap' || type === 'bottomCap' ? 0.012 : this.SHIMMER_FRAC);\n const radialJitterFreq = 0.3 + Math.random() * 0.5; // Hz (gentle)\n\n // Color selection based on palette: sun = purple family, planet = pink-red\n const base = this.palette === 'sun' ? this.NEON_PURPLE : this.PINK_RED;\n // subtle per-particle variation within same family (lighten/darken slightly)\n const jitter = THREE.MathUtils.lerp(0.9, 1.1, Math.random());\n const color = base.clone().multiplyScalar(jitter);\n color.r = Math.min(1, Math.max(0, color.r));\n color.g = Math.min(1, Math.max(0, color.g));\n color.b = Math.min(1, Math.max(0, color.b));\n\n // Wiggles for extra micro-variation\n const wigglePhase = Math.random() * Math.PI * 2;\n const wiggleFreqUp = 0.3 + Math.random() * 0.5; // 0.3–0.8 Hz\n const wiggleFreqDepth = 0.25 + Math.random() * 0.4; // 0.25–0.65 Hz\n\n // Angle-correlated drift and angular wander\n const arcFreq = Math.floor(1 + Math.random() * 3); // 1..3\n const arcUpAmp =\n type === 'topCap' || type === 'bottomCap'\n ? upScale * THREE.MathUtils.lerp(0.001, 0.004, Math.random())\n : upScale * THREE.MathUtils.lerp(0.002, 0.008, Math.random());\n const arcDepthAmp =\n type === 'topCap' || type === 'bottomCap'\n ? this.coreRadius * THREE.MathUtils.lerp(0.001, 0.004, Math.random())\n : this.coreRadius * THREE.MathUtils.lerp(0.002, 0.006, Math.random());\n const arcRadAmp =\n type === 'topCap' || type === 'bottomCap'\n ? radius * THREE.MathUtils.lerp(0.004, 0.01, Math.random())\n : radius * THREE.MathUtils.lerp(0.006, 0.015, Math.random());\n const angleWanderAmp = THREE.MathUtils.lerp(0.03, 0.1, Math.random()); // rad/s (scaled by speed later)\n const angleWanderFreq = 0.3 + Math.random() * 0.5; // Hz\n const angleWanderPhase = Math.random() * Math.PI * 2;\n\n return {\n type,\n radius,\n angle,\n angularSpeed,\n radialJitterAmp,\n radialJitterFreq,\n size: 0.8 + Math.random() * 1.4, // smaller discs (0.8..2.2)\n color,\n opacity: 0.85,\n lifetime:\n this.MIN_LIFETIME +\n Math.random() * (this.MAX_LIFETIME - this.MIN_LIFETIME),\n age: Math.random() * 0.5,\n ellipse,\n upBias,\n depthBias,\n wigglePhase,\n wiggleFreqUp,\n wiggleFreqDepth,\n capRadBias,\n tiltUF,\n arcUpAmp,\n arcDepthAmp,\n arcRadAmp,\n arcFreq,\n angleWanderAmp,\n angleWanderFreq,\n angleWanderPhase,\n verticalOffset: 0,\n phi,\n thetaMargin:\n type === 'topCap' || type === 'bottomCap' ? Math.PI * 0.18 : 0,\n frontCurveAngle: undefined,\n phiAmp:\n type === 'topCap' || type === 'bottomCap'\n ? THREE.MathUtils.lerp(0.04, 0.1, Math.random())\n : THREE.MathUtils.lerp(0.0, 0.03, Math.random()),\n };\n }\n\n // (Removed spline generation in favor of analytic 3D orbits)\n\n // --------------------- THREE objects -----------------------\n\n private createParticleSystem(): void {\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(this.particleCount * 3);\n const colors = new Float32Array(this.particleCount * 3);\n\n // (Kept for future shader; PointsMaterial won't use them per-vertex)\n const sizes = new Float32Array(this.particleCount);\n const opacities = new Float32Array(this.particleCount);\n\n // Initialize LOCAL positions (do NOT offset by anchor here)\n for (let i = 0; i < this.particleCount; i++) {\n const p = this.particles[i];\n const xy = this.getLocalOrbitPos(\n p,\n 0,\n new THREE.Vector3(1, 0, 0),\n new THREE.Vector3(0, 1, 0),\n new THREE.Vector3(0, 0, 1),\n new THREE.Vector3(0, 0, 1)\n ); // initial position\n positions[i * 3 + 0] = xy.x;\n positions[i * 3 + 1] = xy.y;\n positions[i * 3 + 2] = xy.z;\n\n if (this.debugBands) {\n const c = this.getDebugColorForType(p.type);\n colors[i * 3 + 0] = c.r;\n colors[i * 3 + 1] = c.g;\n colors[i * 3 + 2] = c.b;\n } else {\n colors[i * 3 + 0] = p.color.r;\n colors[i * 3 + 1] = p.color.g;\n colors[i * 3 + 2] = p.color.b;\n }\n\n sizes[i] = p.size;\n opacities[i] = p.opacity;\n }\n\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));\n geometry.setAttribute('size', new THREE.BufferAttribute(sizes, 1));\n geometry.setAttribute('opacity', new THREE.BufferAttribute(opacities, 1));\n\n // Mark frequently-updated attributes\n // No need for setUsage in the current version of THREE.js\n // Just use needsUpdate to tell Three.js to re-upload the buffers each frame\n geometry.getAttribute('position').needsUpdate = true;\n geometry.getAttribute('color').needsUpdate = true;\n\n // Custom bubble shader for perfect circular bubbles with dramatic lighting\n const vertexShader = `\n attribute float size;\n attribute float opacity;\n varying vec3 vColor;\n varying float vOpacity;\n varying float vSize;\n\n void main() {\n vColor = color;\n vOpacity = opacity;\n vSize = size;\n\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n\n // Smaller bokeh-style circles\n gl_PointSize = size * 4.0;\n\n gl_Position = projectionMatrix * mvPosition;\n }\n `;\n\n const fragmentShader = `\n varying vec3 vColor;\n varying float vOpacity;\n varying float vSize;\n\n void main() {\n // Create circular bubble coordinate system\n vec2 center = gl_PointCoord - 0.5;\n float distance = length(center);\n\n // Perfect circular mask - discard pixels outside circle\n if (distance > 0.5) discard;\n\n // Dramatic bubble lighting effects\n float rimDistance = distance * 2.0; // 0.0 at center, 1.0 at edge\n\n // Bright center fading to edge (soap bubble effect)\n float centerGlow = 1.0 - smoothstep(0.0, 0.35, rimDistance);\n\n // Rim lighting - bright edges\n float rimGlow = smoothstep(0.65, 1.0, rimDistance) * 2.0;\n\n // Glass-like inner reflection\n float bubble = smoothstep(0.85, 0.25, rimDistance);\n\n // Combine lighting effects\n float totalGlow = centerGlow * 0.7 + rimGlow * 1.6 + bubble * 0.7;\n\n // Final bubble color with dramatic lighting\n vec3 finalColor = vColor * totalGlow * 1.9;\n\n // Smooth alpha falloff for glass-like appearance\n float alpha = (1.0 - smoothstep(0.35, 0.52, distance)) * vOpacity;\n\n gl_FragColor = vec4(finalColor, alpha);\n }\n `;\n\n const material = new THREE.ShaderMaterial({\n vertexShader,\n fragmentShader,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n vertexColors: true,\n });\n\n this.particleSystem = new THREE.Points(geometry, material);\n this.particleSystem.frustumCulled = false;\n\n // Initial anchor placement at origin; will follow in update()\n this.particleSystem.position.copy(this.anchor);\n\n this.scene.add(this.particleSystem);\n }\n\n // Compute local position on the orbit for a particle at its current angle,\n // adding a subtle radial breathing.\n private getLocalOrbitPos(\n p: FlowParticle,\n age: number,\n right: THREE.Vector3,\n up: THREE.Vector3,\n forward: THREE.Vector3,\n camForward: THREE.Vector3\n ): THREE.Vector3 {\n if (this.useSurface && p.type === 'surface' && p.u && p.v) {\n // Surface-spread: use per-particle plane basis (u, v); allow full wrap\n const jitter =\n p.radialJitterAmp * Math.sin(age * 2 * Math.PI * p.radialJitterFreq);\n const arcRad =\n p.arcRadAmp * Math.sin(p.arcFreq * p.angle + (p.wigglePhase || 0));\n let r = Math.max(0.001, p.radius + jitter + arcRad);\n const cosA = Math.cos(p.angle);\n const sinA = Math.sin(p.angle);\n const out = new THREE.Vector3();\n out.add(p.u.clone().multiplyScalar(cosA * r));\n out.add(p.v.clone().multiplyScalar(sinA * r));\n // Tiny axis wiggle for thickness\n if (p.axis) {\n const axWiggle =\n 0.002 *\n this.coreRadius *\n Math.sin(\n age * 2 * Math.PI * (p.wiggleFreqUp || 0.3) + (p.wigglePhase || 0)\n );\n out.add(p.axis.clone().multiplyScalar(axWiggle));\n }\n // Hard clamp to tight shell near exact surface\n const minR = this.coreRadius * 1.0;\n const maxR = this.coreRadius * 1.01;\n const len = out.length();\n if (len < minR) out.setLength(minR);\n else if (len > maxR) out.setLength(maxR);\n return out;\n }\n const jitter =\n p.radialJitterAmp * Math.sin(age * 2 * Math.PI * p.radialJitterFreq);\n // Angle-correlated radial modulation prevents strict rings\n const arcRad =\n p.arcRadAmp * Math.sin(p.arcFreq * p.angle + p.wigglePhase * 0.71);\n let r = Math.max(0.001, p.radius + jitter + arcRad);\n const cosA = Math.cos(p.angle);\n const sinA = Math.sin(p.angle);\n const out = new THREE.Vector3();\n const upWiggle =\n 0.004 *\n this.coreRadius *\n Math.sin(age * 2 * Math.PI * p.wiggleFreqUp + p.wigglePhase);\n const depthWiggle =\n 0.004 *\n this.coreRadius *\n Math.cos(age * 2 * Math.PI * p.wiggleFreqDepth + p.wigglePhase * 0.37);\n const arcUp = p.arcUpAmp * Math.sin(p.arcFreq * p.angle + p.wigglePhase);\n const arcDepth =\n p.arcDepthAmp * Math.cos(p.arcFreq * p.angle + p.wigglePhase * 0.53);\n\n // Unified spherical placement (true wrap) for rim + caps\n // Vary phi along theta for cap crescents; keep rim near equator\n let phi = p.phi ?? Math.PI * 0.5;\n const isCap = p.type === 'topCap' || p.type === 'bottomCap';\n if (isCap && p.phiAmp) {\n const sign = p.type === 'topCap' ? -1 : 1; // pull toward rim at arc center\n phi = THREE.MathUtils.clamp(\n phi + sign * p.phiAmp * Math.sin(p.angle),\n 0.02,\n Math.PI - 0.02\n );\n }\n const rp = r * Math.sin(phi);\n const y = r * Math.cos(phi);\n const x = rp * cosA * p.ellipse;\n const z = rp * sinA;\n out.copy(right).multiplyScalar(x);\n out.add(up.clone().multiplyScalar(y));\n out.add(forward.clone().multiplyScalar(z));\n // Layer subtle extras\n out.add(up.clone().multiplyScalar(p.upBias + upWiggle + arcUp));\n out.add(\n forward.clone().multiplyScalar(p.depthBias + depthWiggle + arcDepth)\n );\n // Different penetration limits for different particle types\n const minShell =\n p.type === 'topCurve' || p.type === 'bottomCurve'\n ? this.coreRadius * 0.7 // Rim particles: 30% inside surface\n : this.coreRadius * 1.0; // Cap particles: stay at surface level\n const len = out.length();\n if (len < minShell) {\n if (len < 1e-6) {\n out.set(minShell, 0, 0);\n } else {\n out.multiplyScalar(minShell / len);\n }\n }\n // For banded mode, keep a slight front-bias so arcs read clearly\n if (!(this.useSurface && p.type === 'surface')) {\n const fCam = out.dot(camForward);\n if (fCam > -this.FRONT_MIN) {\n out.add(camForward.clone().multiplyScalar(-this.FRONT_MIN - fCam));\n }\n }\n return out;\n }\n\n // Debug color palette per band\n private getDebugColorForType(type: FlowParticle['type']): THREE.Color {\n switch (type) {\n case 'topCurve':\n return new THREE.Color(0x00ffff); // cyan\n case 'bottomCurve':\n return new THREE.Color(0xff8800); // orange\n case 'topCap':\n return new THREE.Color(0xff00ff); // magenta\n case 'bottomCap':\n return new THREE.Color(0xffff00); // yellow\n case 'orbit':\n return new THREE.Color(0xffffff); // white\n case 'surface':\n return new THREE.Color(0x66ff66); // green for debug\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n ElementRef,\n OnInit,\n AfterViewInit,\n OnDestroy,\n ViewChild,\n Renderer2,\n NgZone,\n Input,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport * as THREE from 'three';\nimport { OrbitControls } from 'three/addons/controls/OrbitControls.js';\nimport { INodeData } from './app.types';\nimport { Cluster } from './objects/Cluster';\nimport { Node } from './objects/Node';\nimport { BlackHoleParticleField } from './services/black-hole-particle-field';\nimport { StellarDustField, DustMode } from './services/stellar-dust-field';\n\n@Component({\n selector: 'tv-trait-visual',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './trait-visual.component.html',\n styleUrls: ['./trait-visual.component.scss'],\n})\nexport class TraitVisualComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges {\n @ViewChild('rendererCanvas', { static: true }) canvasRef!: ElementRef;\n\n // Input properties for configuration\n @Input() nodeData: INodeData[] = [];\n @Input() attributeWeights: number[] = [];\n @Input() preferenceWeights: number[] = [];\n @Input() attributeCount?: number;\n @Input() preferenceCount?: number;\n\n // Three.js scene properties\n scene!: THREE.Scene;\n camera!: THREE.PerspectiveCamera;\n renderer!: THREE.WebGLRenderer;\n controls!: OrbitControls;\n raycaster: THREE.Raycaster = new THREE.Raycaster();\n mouse: THREE.Vector2 = new THREE.Vector2();\n cluster!: Cluster;\n selectedNode: Node | null = null;\n draggingNode: Node | null = null;\n dragPlane: THREE.Plane = new THREE.Plane();\n dragOffset: THREE.Vector3 = new THREE.Vector3();\n newNodeCounter: number = 1;\n isCameraLocked = false;\n\n // Private properties\n private nodeAuras: Map<Node, BlackHoleParticleField> = new Map();\n private starFieldNear!: THREE.Points;\n private starFieldFar!: THREE.Points;\n private starTexture: THREE.Texture | null = null;\n private dustField: StellarDustField | null = null;\n private readonly pointerPitchAxis = new THREE.Vector3(1, 0, 0);\n private readonly pointerYawAxis = new THREE.Vector3(0, 1, 0);\n private pointerPitchCurrent = 0;\n private pointerPitchTarget = 0;\n private pointerYawCurrent = 0;\n private pointerYawTarget = 0;\n private pointerYawAccumulated = 0;\n private readonly pointerOffset = new THREE.Vector3();\n private readonly pointerPitchMax = THREE.MathUtils.degToRad(1.8);\n private readonly pointerYawMax = THREE.MathUtils.degToRad(0.8);\n private readonly pointerYawSpeed = THREE.MathUtils.degToRad(0.15);\n private readonly pointerPitchDamping = 4;\n private readonly pointerYawDamping = 4;\n\n constructor(private renderer2: Renderer2, private ngZone: NgZone) {}\n\n ngOnInit(): void {\n console.log('TraitVisualComponent: ngOnInit - nodeData length:', this.nodeData.length);\n console.log('TraitVisualComponent: attributeWeights length:', this.attributeWeights.length);\n console.log('TraitVisualComponent: preferenceWeights length:', this.preferenceWeights.length);\n this.initScene();\n if (this.nodeData.length > 0) {\n this.loadNodes();\n this.syncNodeWeightGlobals();\n } else {\n console.warn('TraitVisualComponent: No nodeData provided!');\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['nodeData'] && !changes['nodeData'].firstChange && this.scene) {\n // Reload nodes when nodeData changes\n if (this.cluster) {\n this.scene.remove(this.cluster);\n this.nodeAuras.forEach((a) => a.dispose());\n this.nodeAuras.clear();\n }\n if (this.nodeData.length > 0) {\n this.loadNodes();\n this.syncNodeWeightGlobals();\n }\n }\n if ((changes['attributeWeights'] || changes['preferenceWeights']) && !changes['attributeWeights']?.firstChange && !changes['preferenceWeights']?.firstChange) {\n this.syncNodeWeightGlobals();\n }\n }\n\n ngAfterViewInit(): void {\n this.animate();\n\n this.renderer2.listen(\n this.canvasRef.nativeElement,\n 'contextmenu',\n (event: MouseEvent) => this.onRightClick(event)\n );\n\n window.addEventListener('resize', () => this.onWindowResize());\n\n const canvas = this.canvasRef.nativeElement;\n this.renderer2.listen('window', 'mousemove', (event: MouseEvent) =>\n this.onMouseMove(event)\n );\n this.renderer2.listen(canvas, 'mousedown', (event: MouseEvent) =>\n this.onDragStart(event)\n );\n this.renderer2.listen(canvas, 'mousemove', (event: MouseEvent) =>\n this.onDragMove(event)\n );\n this.renderer2.listen(canvas, 'mouseup', (event: MouseEvent) =>\n this.onDragEnd(event)\n );\n this.renderer2.listen(canvas, 'mouseleave', (event: MouseEvent) => {\n this.onDragEnd(event);\n this.onCanvasLeave();\n });\n }\n\n ngOnDestroy(): void {\n // Dispose all auras\n this.nodeAuras.forEach((a) => a.dispose());\n this.nodeAuras.clear();\n this.dustField?.dispose();\n }\n\n currentCentral(): Node | null {\n if (!this.cluster) return null;\n return this.cluster.nodes.find((node) => node.isSun) || null;\n }\n\n nonSuns(): Node[] {\n if (!this.cluster) return [];\n return this.cluster.nodes.filter((node) => !node.isSun);\n }\n\n private syncNodeWeightGlobals(): void {\n if (this.attributeWeights.length > 0) {\n Node.attributeWeights = this.attributeWeights.slice();\n }\n if (this.preferenceWeights.length > 0) {\n Node.preferenceWeights = this.preferenceWeights.slice();\n }\n }\n\n private initScene(): void {\n this.scene = new THREE.Scene();\n this.camera = new THREE.PerspectiveCamera(\n 55,\n window.innerWidth / window.innerHeight,\n 0.1,\n 1000\n );\n this.camera.up.set(0, 1, 0);\n this.camera.position.set(0, 0, 60);\n const initialTilt = THREE.MathUtils.degToRad(-45);\n this.camera.position.applyAxisAngle(\n new THREE.Vector3(1, 0, 0),\n -initialTilt\n );\n this.camera.lookAt(0, 0, 0);\n this.renderer = new THREE.WebGLRenderer({\n canvas: this.canvasRef.nativeElement,\n antialias: true,\n alpha: true,\n });\n this.renderer.setClearColor(0x000000, 0);\n this.renderer.setSize(window.innerWidth, window.innerHeight);\n this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n this.controls.target.set(0, 0, 0);\n this.controls.enableDamping = true;\n this.controls.enableRotate = true;\n this.controls.screenSpacePanning = true;\n this.controls.enablePan = true;\n this.controls.enableZoom = true;\n this.scene.add(new THREE.AmbientLight(0xbbbbbb, 1));\n this.scene.add(new THREE.DirectionalLight(0xffffff, 1));\n\n // Add immersive 3D starfields\n this.starFieldFar = this.createStarField({\n count: 1200,\n innerRadius: 120,\n outerRadius: 170,\n size: 1,\n opacity: 0.6,\n });\n this.starFieldFar.renderOrder = -2;\n this.scene.add(this.starFieldFar);\n\n this.starFieldNear = this.createStarField({\n count: 200,\n innerRadius: 60,\n outerRadius: 110,\n size: 1.2,\n opacity: 0.75,\n });\n this.starFieldNear.renderOrder = -1;\n this.scene.add(this.starFieldNear);\n }\n\n private loadNodes(): void {\n if (this.nodeData.length === 0) return;\n \n this.cluster = new Cluster(this.nodeData);\n this.scene.add(this.cluster);\n const initialCentral =\n this.cluster.nodes.find((node) => node.isSun) || this.cluster.nodes[0];\n initialCentral.setSun(true, 5);\n initialCentral.mesh.scale.set(3, 3, 3);\n this.ensureNodeAuras();\n\n const sun = this.currentCentral();\n if (sun) {\n const geom = sun.mesh.geometry as THREE.SphereGeometry;\n const bs =\n geom.boundingSphere ?? new THREE.Sphere(new THREE.Vector3(), 0.05);\n const coreRadius = (bs.radius || 0.05) * sun.mesh.scale.x;\n\n let dustOuter = 18.0;\n let dustThickness = 0.0;\n let dustMidCount = 160000;\n let dustBokehCount = 24000;\n let dustNoise = 0.035;\n let dustMinW = 0.02;\n let dustMaxW = 0.08;\n let dustMode: DustMode = 'disk';\n let searchParams: URLSearchParams | undefined;\n try {\n const rawSearch = (window as any)?.location?.search ?? '';\n searchParams = new URLSearchParams(rawSearch);\n } catch {\n searchParams = undefined;\n }\n\n const parseParam = (key: string, fallback: number) => {\n if (!searchParams) return fallback;\n const raw = searchParams.get(key);\n if (raw === null) return fallback;\n const value = parseFloat(raw);\n return Number.isFinite(value) ? value : fallback;\n };\n\n dustOuter = Math.max(\n coreRadius * 1.05,\n parseParam('dustOuter', dustOuter)\n );\n dustThickness = Math.max(0, parseParam('dustThick', dustThickness));\n dustMidCount = Math.max(\n 0,\n Math.round(parseParam('dustCount', dustMidCount))\n );\n dustBokehCount = Math.max(\n 0,\n Math.round(parseParam('dustBokeh', dustBokehCount))\n );\n dustNoise = Math.max(0, parseParam('dustNoise', dustNoise));\n dustMinW = Math.max(0.001, parseParam('dustMinW', dustMinW));\n dustMaxW = Math.max(dustMinW + 0.001, parseParam('dustMaxW', dustMaxW));\n const dustModeParam = searchParams?.get('dustMode');\n if (dustModeParam === 'disk') {\n dustMode = 'disk';\n }\n }\n }\n\n private onWindowResize(): void {\n this.camera.aspect = window.innerWidth / window.innerHeight;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(window.innerWidth, window.innerHeight);\n this.dustField?.setViewportHeight(window.innerHeight);\n }\n\n private onRightClick(event: MouseEvent): void {\n event.preventDefault();\n // Simplified right-click handling - just select node\n this.raycaster.setFromCamera(this.mouse, this.camera);\n const intersects = this.raycaster.intersectObjects(\n this.cluster?.children || [],\n true\n );\n if (intersects.length > 0) {\n this.selectedNode = intersects[0].object.parent as Node;\n }\n }\n\n private onMouseMove(event: MouseEvent): void {\n if (this.draggingNode) return;\n this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n this.mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n\n this.pointerPitchTarget = 0;\n this.pointerYawTarget = 0;\n this.pointerYawAccumulated = 0;\n return;\n }\n\n private onDragStart(event: MouseEvent): void {\n event.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n const mouse = new THREE.Vector2(\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\n -((event.clientY - rect.top) / rect.height) * 2 + 1\n );\n this.raycaster.setFromCamera(mouse, this.camera);\n const intersects = this.raycaster.intersectObjects(\n this.cluster?.children || [],\n true\n );\n if (intersects.length > 0) {\n this.draggingNode = intersects[0].object.parent as Node;\n this.controls.enabled = false;\n const planeNormal = this.camera\n .getWorldDirection(new THREE.Vector3())\n .clone()\n .negate();\n this.dragPlane.setFromNormalAndCoplanarPoint(\n planeNormal,\n intersects[0].point\n );\n this.dragOffset.copy(intersects[0].point).sub(this.draggingNode.position);\n }\n }\n\n private onDragMove(event: MouseEvent): void {\n if (!this.draggingNode) return;\n event.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n const mouse = new THREE.Vector2(\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\n -((event.clientY - rect.top) / rect.height) * 2 + 1\n );\n this.raycaster.setFromCamera(mouse, this.camera);\n const intersection = new THREE.Vector3();\n if (this.raycaster.ray.intersectPlane(this.dragPlane, intersection)) {\n this.draggingNode.position.copy(intersection.sub(this.dragOffset));\n }\n }\n\n private onDragEnd(event: MouseEvent): void {\n if (!this.draggingNode) return;\n event.preventDefault();\n this.draggingNode = null;\n this.controls.enabled = true;\n }\n\n private onCanvasLeave(): void {\n this.resetPointerPitch();\n }\n\n private resetPointerPitch(instant = false): void {\n this.pointerPitchTarget = 0;\n this.pointerYawTarget = 0;\n this.pointerYawAccumulated = 0;\n if (!instant) return;\n if (!this.camera || !this.controls) {\n this.pointerPitchCurrent = 0;\n this.pointerYawCurrent = 0;\n return;\n }\n const target = this.controls.target;\n const offset = this.pointerOffset;\n offset.copy(this.camera.position).sub(target);\n\n if (this.pointerPitchCurrent !== 0) {\n offset.applyAxisAngle(this.pointerPitchAxis, -this.pointerPitchCurrent);\n }\n if (this.pointerYawCurrent !== 0) {\n offset.applyAxisAngle(this.pointerYawAxis, -this.pointerYawCurrent);\n }\n\n this.camera.position.copy(target).add(offset);\n this.camera.lookAt(target);\n this.pointerPitchCurrent = 0;\n this.pointerYawCurrent = 0;\n }\n\n private updateCameraOrbitFromPointer(deltaTime: number): void {\n if (!this.camera || !this.controls) return;\n if (this.isCameraLocked) return;\n\n const target = this.controls.target;\n const offset = this.pointerOffset;\n offset.copy(this.camera.position).sub(target);\n\n if (this.pointerPitchCurrent !== 0) {\n offset.applyAxisAngle(this.pointerPitchAxis, -this.pointerPitchCurrent);\n }\n if (this.pointerYawCurrent !== 0) {\n offset.applyAxisAngle(this.pointerYawAxis, -this.pointerYawCurrent);\n }\n\n const dt = Math.max(deltaTime, 0);\n const dampingPitch = 1 - Math.exp(-this.pointerPitchDamping * dt);\n const dampingYaw = 1 - Math.exp(-this.pointerYawDamping * dt);\n const lerpFactorPitch = THREE.MathUtils.clamp(\n Number.isFinite(dampingPitch) ? dampingPitch : 0,\n 0,\n 1\n );\n const lerpFactorYaw = THREE.MathUtils.clamp(\n Number.isFinite(dampingYaw) ? dampingYaw : 0,\n 0,\n 1\n );\n\n this.pointerPitchCurrent = THREE.MathUtils.lerp(\n this.pointerPitchCurrent,\n this.pointerPitchTarget,\n lerpFactorPitch\n );\n\n this.pointerYawCurrent = THREE.MathUtils.lerp(\n this.pointerYawCurrent,\n this.pointerYawTarget,\n lerpFactorYaw\n );\n\n if (\n Math.abs(this.pointerPitchCurrent) < 1e-4 &&\n Math.abs(this.pointerPitchTarget) < 1e-4\n ) {\n this.pointerPitchCurrent = 0;\n }\n\n if (\n Math.abs(this.pointerYawCurrent) < 1e-4 &&\n Math.abs(this.pointerYawTarget) < 1e-4\n ) {\n this.pointerYawCurrent = 0;\n }\n\n if (this.pointerPitchCurrent !== 0) {\n offset.applyAxisAngle(this.pointerPitchAxis, this.pointerPitchCurrent);\n }\n if (this.pointerYawCurrent !== 0) {\n offset.applyAxisAngle(this.pointerYawAxis, this.pointerYawCurrent);\n }\n\n this.camera.position.copy(target).add(offset);\n this.camera.lookAt(target);\n }\n\n private animate(): void {\n this.ngZone.runOutsideAngular(() => {\n let lastTime = 0;\n\n const loop = (currentTime: number) => {\n requestAnimationFrame(loop);\n\n const deltaTime = (currentTime - lastTime) / 1000;\n lastTime = currentTime;\n\n this.controls.update();\n this.updateCameraOrbitFromPointer(deltaTime);\n\n if (this.cluster)\n this.cluster.update(undefined, this.scene, this.camera);\n\n if (this.cluster) {\n for (const node of this.cluster.nodes) {\n const aura = this.nodeAuras.get(node);\n if (aura) {\n const geom = node.mesh.geometry as THREE.SphereGeometry;\n const bs =\n geom.boundingSphere ??\n new THREE.Sphere(new THREE.Vector3(), 0.05);\n const newCoreRadius = (bs.radius || 0.05) * node.mesh.scale.x;\n const ud: any = node.userData as any;\n const prevCoreRadius = ud._auraCoreRadius as number | undefined;\n const needsResize =\n !prevCoreRadius ||\n Math.abs(newCoreRadius - prevCoreRadius) / prevCoreRadius >\n 0.005;\n if (needsResize) {\n aura.resizeCoreRadius(newCoreRadius);\n const occ: THREE.Mesh | undefined = ud._occluder as\n | THREE.Mesh\n | undefined;\n if (occ && prevCoreRadius) {\n const scaleFactor = newCoreRadius / prevCoreRadius;\n occ.scale.multiplyScalar(scaleFactor);\n }\n ud._auraCoreRadius = newCoreRadius;\n }\n\n aura.update(node.position, node.velocity, deltaTime, this.camera);\n }\n }\n }\n\n const center = this.currentCentral()?.position ?? new THREE.Vector3();\n if (this.dustField && this.cluster) {\n const atts = this.cluster.nodes\n .filter((n) => !n.isSun)\n .map((n) => {\n const geom = n.mesh.geometry as THREE.SphereGeometry;\n const bs =\n geom.boundingSphere ??\n new THREE.Sphere(new THREE.Vector3(), 0.05);\n const radius = (bs.radius || 0.05) * n.mesh.scale.x;\n return { position: n.position.clone(), radius };\n });\n this.dustField.setAttractorsWorld(atts);\n }\n this.dustField?.update(deltaTime, center);\n\n if (this.starFieldNear && this.starFieldFar) {\n this.starFieldNear.rotation.y += 0.00025;\n this.starFieldFar.rotation.y += 0.0001;\n }\n\n this.renderer.render(this.scene, this.camera);\n };\n loop(0);\n });\n }\n\n private ensureNodeAuras(): void {\n if (!this.cluster) return;\n for (const node of this.cluster.nodes) {\n if (!this.nodeAuras.has(node)) {\n const geom = node.mesh.geometry as THREE.SphereGeometry;\n const bs =\n geom.boundingSphere ?? new THREE.Sphere(new THREE.Vector3(), 0.05);\n const coreRadius = (bs.radius || 0.05) * node.mesh.scale.x;\n const particleCount = node.isSun ? 900 : 200; // Increased from 600 to 900 for supermassive black hole effect\n const aura = new BlackHoleParticleField(this.scene, {\n coreRadius,\n particleCount,\n palette: node.isSun ? 'sun' : 'planet',\n distribution: 'surface',\n speedScale: 0.3,\n });\n this.nodeAuras.set(node, aura);\n const occGeom = new THREE.SphereGeometry(coreRadius * 0.99, 24, 24);\n const occMat = new THREE.MeshBasicMaterial({\n color: 0x000000,\n depthWrite: true,\n });\n (occMat as any).colorWrite = false;\n const occluder = new THREE.Mesh(occGeom, occMat);\n occluder.renderOrder = -0.5;\n node.add(occluder);\n (node.userData as any)._auraCoreRadius = coreRadius;\n (node.userData as any)._occluder = occluder;\n }\n }\n }\n\n private createStarField(opts: {\n count: number;\n innerRadius: number;\n outerRadius: number;\n size: number;\n opacity: number;\n }): THREE.Points {\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(opts.count * 3);\n const colors = new Float32Array(opts.count * 3);\n\n for (let i = 0; i < opts.count; i++) {\n const dir = new THREE.Vector3(\n Math.random() * 2 - 1,\n Math.random() * 2 - 1,\n Math.random() * 2 - 1\n ).normalize();\n const r = THREE.MathUtils.lerp(\n opts.innerRadius,\n opts.outerRadius,\n Math.random()\n );\n const pos = dir.multiplyScalar(r);\n positions[i * 3 + 0] = pos.x;\n positions[i * 3 + 1] = pos.y;\n positions[i * 3 + 2] = pos.z;\n\n const warm = Math.random() < 0.45;\n const c = warm\n ? new THREE.Color(1.0, 0.92 + Math.random() * 0.05, 0.98)\n : new THREE.Color(0.92, 0.95 + Math.random() * 0.04, 1.0);\n colors[i * 3 + 0] = c.r;\n colors[i * 3 + 1] = c.g;\n colors[i * 3 + 2] = c.b;\n }\n\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));\n\n const material = new THREE.PointsMaterial({\n size: opts.size,\n sizeAttenuation: true,\n transparent: true,\n opacity: opts.opacity,\n depthWrite: false,\n vertexColors: true,\n blending: THREE.AdditiveBlending,\n map: this.getStarTexture(),\n alphaMap: this.getStarTexture(),\n });\n material.alphaTest = 0.15;\n\n const points = new THREE.Points(geometry, material);\n points.frustumCulled = false;\n return points;\n }\n\n private getStarTexture(): THREE.Texture {\n if (this.starTexture) return this.starTexture;\n const size = 128;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d')!;\n const g = ctx.createRadialGradient(\n size / 2,\n size / 2,\n 0,\n size / 2,\n size / 2,\n size / 2\n );\n g.addColorStop(0.0, 'rgba(255,255,255,1)');\n g.addColorStop(0.4, 'rgba(255,255,255,0.9)');\n g.addColorStop(0.7, 'rgba(255,255,255,0.4)');\n g.addColorStop(1.0, 'rgba(255,255,255,0)');\n ctx.fillStyle = g;\n ctx.fillRect(0, 0, size, size);\n const texture = new THREE.CanvasTexture(canvas);\n texture.minFilter = THREE.LinearFilter;\n texture.magFilter = THREE.LinearFilter;\n texture.anisotropy = 2;\n texture.needsUpdate = true;\n this.starTexture = texture;\n return texture;\n }\n}\n","<div class=\"app-wrapper\">\n <canvas #rendererCanvas></canvas>\n</div>\n\n","import { Vector3 } from 'three';\nimport { PCA as PCAImport } from 'ml-pca';\nimport { INodeData } from '../app.types';\n\n// Dynamically resolve the PCA constructor for different build types\nconst PCAClass: any = (PCAImport as any).default || (PCAImport as any).PCA || PCAImport;\n\nexport let dynamicCounts = {\n attributes: 8,\n preferences: 8\n};\n\nexport function updateCounts(attrCount: number, prefCount: number) {\n dynamicCounts.attributes = attrCount;\n dynamicCounts.preferences = prefCount;\n}\n\n/**\n * Performs PCA on a list of attribute arrays to map them into 3D space.\n * Returns:\n * - positions: normalized [x, y, z] tuples\n * - weights: per-attribute magnitude across PCA components\n */\nfunction computePCA3D(attributesList: number[][]): {\n positions: [number, number, number][],\n weights: number[]\n} {\n const pca = new PCAClass(attributesList, { center: true, scale: true });\n const reduced: number[][] = pca.predict(attributesList, { nComponents: 3 }).to2DArray();\n\n // --- Compute per-attribute weights ---\n const loadings = pca.getLoadings().to2DArray(); \n const weights = loadings.map((arr: number[]) =>\n Math.sqrt(arr[0] ** 2 + arr[1] ** 2 + arr[2] ** 2)\n );\n\n const maxAbs = Math.max(\n ...reduced.flatMap((arr: number[]) => arr.map((v: number) => Math.abs(v)))\n );\n const positions = reduced.map(\n (arr: number[]): [number, number, number] => [\n arr[0] / maxAbs,\n arr[1] / maxAbs,\n arr[2] / maxAbs\n ]\n );\n\n return { positions, weights };\n}\n\nfunction generateAttributes(count: number, base = 0): Record<string, number> {\n const attrs: Record<string, number> = {};\n for (let i = 0; i < count; i++) attrs[`attr${i + 1}`] = (base + i * 20) % 101;\n return attrs;\n}\n\nconst colors = ['#C300FF', '#FF3366'];\n\n\nconst baseNodes: INodeData[] = [\n {\n id: 1,\n name: 'James',\n initialPosition: [0, 0, 0] as [number, number, number],\n isSun: true,\n color: '#C300FF',\n attributes: generateAttributes(dynamicCounts.attributes, 0),\n preferences: generateAttributes(dynamicCounts.preferences, 100),\n },\n ...[...Array(10)].map((_, i): INodeData => {\n const id = i + 2;\n const names = ['John', 'Alice', 'Robert', 'Emma', 'Michael', 'Sarah', 'David', 'Lisa', 'Chris', 'Maria'];\n return {\n id,\n name: names[i],\n initialPosition: [0, 0, 0] as [number, number, number],\n isSun: false,\n color: colors[i % 2],\n attributes: generateAttributes(dynamicCounts.attributes, i * 10),\n preferences: generateAttributes(dynamicCounts.preferences, 0),\n };\n }),\n];\n\n\nconst attributesList = baseNodes.map((n) => Object.values(n.attributes));\nconst { positions, weights } = computePCA3D(attributesList);\n\nexport const nodeData: INodeData[] = baseNodes.map((node, i) => {\n if (node.isSun) return { ...node, initialPosition: [0, 0, 0] as [number, number, number] };\n const [x, y, z] = positions[i];\n return {\n ...node,\n initialPosition: [x * 5, y * 5, z * 5] as [number, number, number],\n };\n});\n\nexport const attributeWeights: number[] = weights;\n","/*\n * Public API Surface of trait-visual\n */\n\n// Main component\nexport * from './lib/trait-visual.component';\n\n// Types\nexport * from './lib/app.types';\n\n// Configuration utilities\nexport { dynamicCounts, updateCounts, attributeWeights, nodeData } from './lib/data/nodes.data';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["PCAImport"],"mappings":"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"}
|
|
Binary file
|