All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.2.4 - 2026-01-04
- Reset to defaults button now fully updates particle visuals (particle count, colors, and all parameters)
- Missing
onColorChange()callback in reset() method - Missing
onParticleCountChange()callback in reset() method
- Simplified CLI API - Removed file path argument, focus on drag-and-drop workflow only
- README clarification - Highlighted drag-and-drop as primary usage method
- CLI cleanup - Removed unused file handling code from bin/luminar.mjs
0.2.3 - 2026-01-04
- Removed test vector field data from published package
- Added
public/vector-field.jsonto.npmignoreto prevent shipping runtime data - Package now starts clean with empty fields instead of pre-loaded test data
0.2.2 - 2026-01-04
- CLI module resolution error when running
npx @brandonlukas/luminar - Inlined CSV parser in bin/luminar.mjs to avoid import path issues
- Inlined CSV parser in scripts/visualize-csv.mjs for consistency
0.2.1 - 2026-01-04
- Comprehensive CHANGELOG.md documenting all v0.2.0 improvements
- Enhanced README.md with features list, architecture overview, and parameter table
- Screenshot reference in README for visual demonstration
- Improved README structure with clear sections for Quick Start, CSV Format, Local Development, Recording, and Parameters
- Updated documentation to reflect all performance optimizations and new features
0.2.0 - 2026-01-04
- Dual vector field support - Load two CSV fields side-by-side with independent colors
- Drag-and-drop interface - Side-specific visual feedback for left/right field loading
- 8 color presets - Luminous violet, pure white, neon cyan, electric lime, solar flare, aurora mint, sunrise coral, ember gold
- Motion trails effect - Optional afterimage pass with configurable decay rate
- Field management controls - Clear Field A/B buttons to reset individual fields
- Turbulence/noise parameter - Adjustable noise strength for organic particle motion
- WebM video recording - Export at 60fps with resolutions up to 4K
- Recording duration options - Choose 3s, 5s, 10s, or 15s capture length
- Modular architecture - Separated into
ParticleSystem,FieldLoader,ControlPanel,RecordingManagermodules - Spatial grid data structure - O(1) field lookups for high-performance rendering
- CSV parser module - Shared parsing logic between CLI and dev scripts
- Comprehensive README - Features list, architecture overview, parameter table
- 10-100x performance improvement - Spatial grid replaces O(n) linear search with O(1) grid lookups
- Optimized particle updates - Eliminated 300k Math.sqrt() calls per second via squared distance comparisons
- Cached loop calculations - Speed multiplier and jitter range computed once per frame
- Conditional noise evaluation - Noise check performed once per frame instead of per particle
- Bounding sphere computation - Enables Three.js frustum culling for off-screen particles
- Auto-calibrated cell size - Spatial grid adapts to field data density
- Organized property groups - Clear sections for buffers, field data, spatial grid, view state, noise
- Extracted helper methods - Single-responsibility functions for particle reset, noise application, coordinate transforms
- Coordinate transformation utilities - Explicit
dataToWorldandworldToDataconverters - Readonly constants - Immutable noise scale and time scale values
- Improved code readability - Split complex methods into high-level flow + detail helpers
- Enhanced control panel - Collapsible sections, field colors, clear buttons, trail controls
- Responsive field layout - Dynamic viewport offset calculation based on window width
- Grid search accuracy - Searches 3×3 grid cells (current + 8 neighbors) for robust nearest-neighbor lookups
- Header detection - CSV parser auto-skips header rows when present
- Field border calibration - Automatically computed from average nearest-neighbor spacing
- Unused
VIEW_OFFSETconstant - Unused
viewOffsetYvariable - Unused
colorPresetparameter - Duplicate
COLOR_PRESETSdefinition - Unused
getFieldDistControlHandlefunction - Unused
fieldDistControlHandlevariable
- Spatial grid: O(1) average-case field lookups vs O(n) linear search
- Field sampling: With 1000 field points, reduced from ~300M operations/second to ~5M
- Particle updates: Eliminated redundant sqrt, multiplication, and condition checks
- Rendering pipeline: Frustum culling automatically discards off-screen particles
- Bundle size: 542.23 kB (gzip: 137.60 kB)
- Build time: ~165ms for 23 modules
- Target: ES2022, TypeScript strict mode
- Three.js: OrthographicCamera, BufferGeometry, Points, UnrealBloomPass, AfterimagePass
- CLI: Zero-install via
npx @brandonlukas/luminar
0.1.0 - Initial Release
- Basic particle flow visualization with bloom effects
- CSV vector field loading via CLI
- Adjustable parameters: particle count, size, bloom, lifetime
- Orthographic camera with responsive framing
- Additive blending for luminous aesthetic
- Real-time control panel