- Fix Entity3D self-reference cycle: replace raw `self` pointer with
`pyobject` strong-ref pattern matching UIEntity (closes#266)
- TileLayer inherits Grid texture when none set, in all three attachment
paths: constructor, add_layer(), and .grid property (closes#254)
- Add SpatialHash::queryCell() for O(1) entity-at-cell lookup; fix
missing spatial_hash.insert() in Entity.__init__ grid= kwarg path;
use queryCell in GridPoint.entities (closes#253)
- Add FOV dirty flag and parameter cache to skip redundant computeFOV
calls when map unchanged and params match (closes#292)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add SpatialHash class for efficient spatial queries on entities:
- New SpatialHash.h/cpp with bucket-based spatial hashing
- Grid.entities_in_radius(x, y, radius) method for O(k) queries
- Automatic spatial hash updates on entity add/remove/move
Benchmark results at 2,000 entities:
- Single query: 16.2× faster (0.044ms → 0.003ms)
- N×N visibility: 104.8× faster (74ms → 1ms)
This enables efficient range queries for AI, visibility, and
collision detection without scanning all entities.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>