@naniteninja/trait-visual 1.0.1

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.
@@ -0,0 +1,101 @@
1
+ import * as THREE from 'three';
2
+ import { DustMode, DustOptions, DustPaletteOptions, DustPaletteStop } from '../types/dust-field.types';
3
+ export type { DustMode, DustOptions, DustPaletteOptions, DustPaletteStop };
4
+ /**
5
+ * StellarDustField
6
+ *
7
+ * A true 3D, GPU‑animated particle disk that orbits a given center (the sun).
8
+ * It uses two draw calls: a dense mid/far bed of tiny points and a sparse
9
+ * foreground bokeh cohort of large, soft discs. Motion is computed fully on
10
+ * the GPU (vertex shader) from per‑particle attributes; the CPU only updates
11
+ * a few uniforms per frame.
12
+ */
13
+ export declare class StellarDustField {
14
+ private scene;
15
+ private group;
16
+ private points;
17
+ private readonly MAX_ATTRACTORS;
18
+ private readonly MAX_PALETTE_STOPS;
19
+ private attractorWorldPos;
20
+ private attractorWorldRad;
21
+ private attractorLocalPos;
22
+ private attractorRadius;
23
+ private nearRadiusFactor;
24
+ private stickEpsRel;
25
+ private stickEpsMin;
26
+ private stickEpsMax;
27
+ private attractStrength;
28
+ private tangentialBias;
29
+ private debugDustTouch;
30
+ private lastDustLogMs;
31
+ private useAttract;
32
+ private debugLogPalette;
33
+ private debugLogBands;
34
+ private debugEdgeMix;
35
+ private debugDimLights;
36
+ private whitenScale;
37
+ private alphaScale;
38
+ private paletteStops;
39
+ private paletteHueBiasScale;
40
+ private paletteBackgroundLift;
41
+ private paletteCoreIntensity;
42
+ private paletteUniformColors;
43
+ private paletteUniformStops;
44
+ private paletteUniformIntensities;
45
+ private paletteUniformCount;
46
+ private diskFraction;
47
+ private diskBokehFraction;
48
+ private haloRadiusMultiplier;
49
+ private armCount;
50
+ private armPopulation;
51
+ private armSpread;
52
+ private armTwist;
53
+ private haloArmPopulation;
54
+ private haloArmSpread;
55
+ private haloArmTwist;
56
+ private dustMode;
57
+ private sphereJitter;
58
+ private static readonly DEFAULT_PALETTE;
59
+ private opts;
60
+ private time;
61
+ private viewportHeight;
62
+ constructor(scene: THREE.Scene, options?: DustOptions);
63
+ setBrightnessScale(scale: number): void;
64
+ setWhitenScale(scale: number): void;
65
+ setBrightness(value01: number): void;
66
+ applyOptions(o: DustOptions): void;
67
+ setMode(mode: DustMode): void;
68
+ setSphereParameters(params: {
69
+ jitter?: number;
70
+ }): void;
71
+ setDiskNormal(normal: THREE.Vector3): void;
72
+ setViewportHeight(h: number): void;
73
+ private buildPaletteFromLegacyColors;
74
+ private applyPalette;
75
+ private syncLegacyColorsFromPalette;
76
+ private updatePaletteUniformsOnMaterials;
77
+ private samplePaletteAt;
78
+ private colorToHexString;
79
+ logPaletteRamp(samples?: number): void;
80
+ private logDiskBandStats;
81
+ private refreshPaletteUniformData;
82
+ update(dt: number, center: THREE.Vector3): void;
83
+ dispose(): void;
84
+ /**
85
+ * Provide world-space node centers and radii; internally converted to
86
+ * dust-local coordinates and pushed to shader uniforms.
87
+ */
88
+ setAttractorsWorld(attractors: {
89
+ position: THREE.Vector3;
90
+ radius: number;
91
+ }[]): void;
92
+ setAttractEnabled(enabled: boolean): void;
93
+ private build;
94
+ private makeCohort;
95
+ private makeMaterial;
96
+ private valueNoise2D;
97
+ private samplePeriodicFbm;
98
+ private sampleAndLogContacts;
99
+ private hashFloat;
100
+ private syncAttractorUniforms;
101
+ }
@@ -0,0 +1,73 @@
1
+ import { ElementRef, OnInit, AfterViewInit, OnDestroy, Renderer2, NgZone, OnChanges, SimpleChanges } from '@angular/core';
2
+ import * as THREE from 'three';
3
+ import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
4
+ import { INodeData } from './app.types';
5
+ import { Cluster } from './objects/Cluster';
6
+ import { Node } from './objects/Node';
7
+ import * as i0 from "@angular/core";
8
+ export declare class TraitVisualComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges {
9
+ private renderer2;
10
+ private ngZone;
11
+ canvasRef: ElementRef;
12
+ nodeData: INodeData[];
13
+ attributeWeights: number[];
14
+ preferenceWeights: number[];
15
+ attributeCount?: number;
16
+ preferenceCount?: number;
17
+ scene: THREE.Scene;
18
+ camera: THREE.PerspectiveCamera;
19
+ renderer: THREE.WebGLRenderer;
20
+ controls: OrbitControls;
21
+ raycaster: THREE.Raycaster;
22
+ mouse: THREE.Vector2;
23
+ cluster: Cluster;
24
+ selectedNode: Node | null;
25
+ draggingNode: Node | null;
26
+ dragPlane: THREE.Plane;
27
+ dragOffset: THREE.Vector3;
28
+ newNodeCounter: number;
29
+ isCameraLocked: boolean;
30
+ private nodeAuras;
31
+ private starFieldNear;
32
+ private starFieldFar;
33
+ private starTexture;
34
+ private dustField;
35
+ private readonly pointerPitchAxis;
36
+ private readonly pointerYawAxis;
37
+ private pointerPitchCurrent;
38
+ private pointerPitchTarget;
39
+ private pointerYawCurrent;
40
+ private pointerYawTarget;
41
+ private pointerYawAccumulated;
42
+ private readonly pointerOffset;
43
+ private readonly pointerPitchMax;
44
+ private readonly pointerYawMax;
45
+ private readonly pointerYawSpeed;
46
+ private readonly pointerPitchDamping;
47
+ private readonly pointerYawDamping;
48
+ constructor(renderer2: Renderer2, ngZone: NgZone);
49
+ ngOnInit(): void;
50
+ ngOnChanges(changes: SimpleChanges): void;
51
+ ngAfterViewInit(): void;
52
+ ngOnDestroy(): void;
53
+ currentCentral(): Node | null;
54
+ nonSuns(): Node[];
55
+ private syncNodeWeightGlobals;
56
+ private initScene;
57
+ private loadNodes;
58
+ private onWindowResize;
59
+ private onRightClick;
60
+ private onMouseMove;
61
+ private onDragStart;
62
+ private onDragMove;
63
+ private onDragEnd;
64
+ private onCanvasLeave;
65
+ private resetPointerPitch;
66
+ private updateCameraOrbitFromPointer;
67
+ private animate;
68
+ private ensureNodeAuras;
69
+ private createStarField;
70
+ private getStarTexture;
71
+ static ɵfac: i0.ɵɵFactoryDeclaration<TraitVisualComponent, never>;
72
+ static ɵcmp: i0.ɵɵComponentDeclaration<TraitVisualComponent, "tv-trait-visual", never, { "nodeData": { "alias": "nodeData"; "required": false; }; "attributeWeights": { "alias": "attributeWeights"; "required": false; }; "preferenceWeights": { "alias": "preferenceWeights"; "required": false; }; "attributeCount": { "alias": "attributeCount"; "required": false; }; "preferenceCount": { "alias": "preferenceCount"; "required": false; }; }, {}, never, never, true, never>;
73
+ }
@@ -0,0 +1,55 @@
1
+ import * as THREE from 'three';
2
+ export type DustMode = 'disk' | 'sphere';
3
+ export interface DustPaletteStop {
4
+ /**
5
+ * Normalized radial position within the dust field (0 = core, 1 = outer edge).
6
+ */
7
+ at: number;
8
+ /**
9
+ * Color at this stop. Accepts any THREE color representation.
10
+ */
11
+ color: THREE.ColorRepresentation;
12
+ /**
13
+ * Optional intensity multiplier applied when lerping between stops.
14
+ * Defaults to 1.0.
15
+ */
16
+ intensity?: number;
17
+ }
18
+ export interface DustPaletteOptions {
19
+ /**
20
+ * Ordered palette stops that describe the desired color ramp.
21
+ * Values outside [0, 1] will be clamped.
22
+ */
23
+ stops: DustPaletteStop[];
24
+ /**
25
+ * Strength multiplier for hue bias modulation in the shader.
26
+ * Defaults to 0.65.
27
+ */
28
+ hueBiasScale?: number;
29
+ /**
30
+ * Minimum luminance floor to keep blacks saturated but not crushed.
31
+ * Defaults to 0.06.
32
+ */
33
+ backgroundLift?: number;
34
+ /**
35
+ * Maximum brightness applied to the core (radialT ~ 0).
36
+ * Defaults to 1.4.
37
+ */
38
+ coreIntensity?: number;
39
+ }
40
+ export interface DustOptions {
41
+ innerRadius?: number;
42
+ outerRadius?: number;
43
+ thickness?: number;
44
+ countMidFar?: number;
45
+ countBokeh?: number;
46
+ minAngularVel?: number;
47
+ maxAngularVel?: number;
48
+ noiseStrength?: number;
49
+ colorInner?: THREE.ColorRepresentation;
50
+ colorMid?: THREE.ColorRepresentation;
51
+ colorOuter?: THREE.ColorRepresentation;
52
+ palette?: DustPaletteOptions;
53
+ renderOrder?: number;
54
+ }
55
+ export type Cohort = 'disk' | 'diskBokeh' | 'halo' | 'haloBokeh';
@@ -0,0 +1,18 @@
1
+ import * as THREE from 'three';
2
+ export type GlowUniforms = {
3
+ glowColor: {
4
+ value: THREE.Color;
5
+ };
6
+ opacity: {
7
+ value: number;
8
+ };
9
+ c?: {
10
+ value: number;
11
+ };
12
+ p?: {
13
+ value: number;
14
+ };
15
+ base?: {
16
+ value: number;
17
+ };
18
+ };
@@ -0,0 +1,48 @@
1
+ import * as THREE from 'three';
2
+ export interface ParticleFieldOptions {
3
+ coreRadius: number;
4
+ particleCount?: number;
5
+ palette?: 'sun' | 'planet';
6
+ distribution?: 'surface' | 'banded';
7
+ speedScale?: number;
8
+ }
9
+ export interface FlowParticle {
10
+ type: 'topCurve' | 'bottomCurve' | 'orbit' | 'topCap' | 'bottomCap' | 'surface';
11
+ radius: number;
12
+ angle: number;
13
+ angularSpeed: number;
14
+ radialJitterAmp: number;
15
+ radialJitterFreq: number;
16
+ verticalOffset?: number;
17
+ size: number;
18
+ color: THREE.Color;
19
+ opacity: number;
20
+ lifetime: number;
21
+ age: number;
22
+ ellipse: number;
23
+ upBias: number;
24
+ depthBias: number;
25
+ wigglePhase: number;
26
+ wiggleFreqUp: number;
27
+ wiggleFreqDepth: number;
28
+ capRadBias?: number;
29
+ arcUpAmp: number;
30
+ arcDepthAmp: number;
31
+ arcRadAmp: number;
32
+ arcFreq: number;
33
+ angleWanderAmp: number;
34
+ angleWanderFreq: number;
35
+ angleWanderPhase: number;
36
+ tiltUF?: number;
37
+ phi?: number;
38
+ thetaMargin?: number;
39
+ frontCurveAngle?: number;
40
+ phiAmp?: number;
41
+ axis?: THREE.Vector3;
42
+ u?: THREE.Vector3;
43
+ v?: THREE.Vector3;
44
+ dirSign?: 1 | -1;
45
+ precessAxis?: THREE.Vector3;
46
+ precessSpeed?: number;
47
+ baseOmega?: number;
48
+ }
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@naniteninja/trait-visual",
3
+ "version": "1.0.1",
4
+ "description": "Angular library for visualizing trait-based relationships in 3D space using Three.js",
5
+ "keywords": [
6
+ "angular",
7
+ "three.js",
8
+ "visualization",
9
+ "3d",
10
+ "traits",
11
+ "pca",
12
+ "personality",
13
+ "test"
14
+ ],
15
+ "author": "naniteninja",
16
+ "license": "MIT",
17
+ "publishConfig": {
18
+ "registry": "https://registry.npmjs.org/",
19
+ "access": "restricted"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/naniteninja/trait-visual.git"
24
+ },
25
+ "peerDependencies": {
26
+ "@angular/common": "^19.2.0",
27
+ "@angular/core": "^19.2.0"
28
+ },
29
+ "dependencies": {
30
+ "three": "^0.174.0",
31
+ "ml-pca": "^4.1.1",
32
+ "tslib": "^2.3.0"
33
+ },
34
+ "sideEffects": false,
35
+ "module": "fesm2022/naniteninja-trait-visual.mjs",
36
+ "typings": "index.d.ts",
37
+ "exports": {
38
+ "./package.json": {
39
+ "default": "./package.json"
40
+ },
41
+ ".": {
42
+ "types": "./index.d.ts",
43
+ "default": "./fesm2022/naniteninja-trait-visual.mjs"
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,3 @@
1
+ export * from './lib/trait-visual.component';
2
+ export * from './lib/app.types';
3
+ export { dynamicCounts, updateCounts, attributeWeights, nodeData } from './lib/data/nodes.data';