mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-16 06:02:02 +00:00
perf(goal): merge goal visuals into one ArrayMesh
Goal._build_visuals() built 10 MeshInstance3D nodes across 4 materials (1 pocket + 1 net + 4 bezel-ring + 4 rim-ring boxes) per goal. Replaced with a single MeshInstance3D wrapping one ArrayMesh with 4 SurfaceTool- committed surfaces (pocket, net, bezel, rim), one material per surface via surface_set_material — 10 nodes down to 1, same 4 materials. Kept 4 surfaces rather than collapsing further: the rim is a tuned team-tinted emitter, the net carries its own discard shader, and the pocket/bezel differ in albedo/metallic/roughness. Merging those into a shared material would be a visible regression, not a free win. Added a local box-to-SurfaceTool helper (6 quads via arena_boundary.gd's _add_quad/_add_tri winding-correction trick, copied in rather than shared since that file's geometry is collision-adjacent). The pocket's old cull_mode = CULL_FRONT trick is replaced by emitting its geometry with inverted winding; the net's cull_front stays material-driven since goal_net.gdshader's own render_mode depends on that winding convention. Verified in the editor: both team-tinted goals render an intact pocket, net, bezel and glowing rim with no backface/winding artifacts, and the headless free_play smoke test still runs clean.
This commit is contained in:
@@ -26,7 +26,6 @@ Bugs found in an adversarial review. None are gameplay- or physics-affecting, so
|
||||
## Performance
|
||||
|
||||
- [ ] Shared per-team materials instead of `Ship._apply_team_color()` allocating a fresh `StandardMaterial3D` and assigning it as `material_override` (and running at least twice per ship — once from `_ready`, once from the `team` setter). Removes the allocation and lets same-team ships batch.
|
||||
- [ ] Merge each goal's visuals into one `ArrayMesh` with a hull surface and a net surface — currently 11 `MeshInstance3D`s and 4 materials per goal, ~22 draw calls for a static prop. `arena_boundary.gd:333` already demonstrates the `SurfaceTool` technique in this codebase.
|
||||
- [ ] Merge the four non-tinted ship meshes (Hull/Canopy/EngineGlowL/R) into one — 6 draw calls per ship down to 3. Irrelevant at 1v1; 36 calls before VFX at 3v3.
|
||||
- [ ] Name collision layers in `project.godot` and assign them — nothing configures `collision_layer`/`collision_mask` today, so every body tests against every other.
|
||||
- [ ] Measure `nebula_dust.gdshader`'s per-fragment depth-texture sample across 500 large soft billboards before adding more particle work.
|
||||
|
||||
Reference in New Issue
Block a user