## Blender Export Utilities
- Add blenderExporter utility with ESM support (tsx)
- Create CLI script for exporting .blend files to GLB
- Add npm scripts: export-blend, export-blend:watch, export-blend:batch
- Support watch mode, batch export, and Draco compression
- Complete documentation in docs/BLENDER_EXPORT.md
- Add loadAsset utility helper
## Asset Structure Reorganization
- Move models to themeable structure: public/assets/themes/default/models/
- Add themes/ directory with source .blend files
- Remove old model files from public/ root
- Consolidate to asteroid.glb, base.glb, ship.glb
## Level Configuration Improvements
- Make startBase optional in LevelConfig interface
- Update LevelGenerator to not generate startBase data by default
- Update LevelDeserializer to handle optional startBase
- Update Level1 to handle null startBase
- Fix levelEditor to remove startBase generation references
- Update validation to treat startBase as optional
## Dependencies
- Add tsx for ESM TypeScript execution
- Add @types/node for Node.js types
- Update package-lock.json
This enables modding support with themeable assets and simplifies
level generation by making base stations optional.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Switch to asteroid4.glb model with updated material handling
- Adjust difficulty parameters: increased spawn distances (220-450m range), updated force multipliers, varied asteroid sizes
- Fix scoreboard timer display (was showing frames instead of actual seconds)
- Refactor star base to use asset container with mesh merging for better performance
- Change star base physics from STATIC to ANIMATED with collision detection enabled
- Add directional lighting in level deserializer for improved scene lighting
- Clean up commented code and optimize debug logging
- Update base.glb 3D model
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Use spherical coordinates (theta, phi) instead of circular (2D)
- Apply equal-area distribution formula for even spacing on sphere
- Convert spherical to Cartesian: (r, theta, phi) -> (x, y, z)
- Asteroids now surround player from all directions (above, below, around)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix scoreboard remaining count initialization
- Add setRemainingCount() method to Scoreboard class
- Initialize count once with total asteroids in Level1
- Remove incorrect per-asteroid notifications from deserializer
- Distribute asteroids evenly around base in circular pattern
- Calculate positions using angle: (i / total) * 2π
- Add small random variation (±0.15 radians) for natural spacing
- Set tangential velocities for orbital motion
- Apply to both LevelGenerator and CustomLevelGenerator
- Eliminate code duplication in level generation
- Convert LevelGenerator static constants to public instance properties
- Remove ~130 lines of duplicated code from CustomLevelGenerator
- CustomLevelGenerator now just inherits from base class
- Net reduction: 99 lines of code
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>