From 99fd4ca5376a3bdb8f5aa598de35b4dcda9410f0 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Thu, 5 Feb 2026 23:35:28 -0800 Subject: [PATCH] Fix geoset filtering to always show body parts (group 0) Body parts (submeshId 0-99) now always render regardless of activeGeosets. Other geoset groups (hair, chest, etc.) still require explicit enabling. This fixes missing body parts while maintaining equipment filtering. --- src/rendering/character_renderer.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/rendering/character_renderer.cpp b/src/rendering/character_renderer.cpp index e0091300..ca78d4b4 100644 --- a/src/rendering/character_renderer.cpp +++ b/src/rendering/character_renderer.cpp @@ -1218,9 +1218,22 @@ void CharacterRenderer::render(const Camera& camera, const glm::mat4& view, cons // Draw batches (submeshes) with per-batch textures for (const auto& batch : gpuModel.data.batches) { // Filter by active geosets (if set) - if (!instance.activeGeosets.empty() && - instance.activeGeosets.find(batch.submeshId) == instance.activeGeosets.end()) { - continue; + // Geoset format: GroupID * 100 + VariationID + // Groups: 0=body, 1=hair, 2=facial, 3=gloves, 4=boots, 5=chest, 7=ears, 13=pants, 15=cape, 17=eyeglow + if (!instance.activeGeosets.empty()) { + uint16_t group = batch.submeshId / 100; + uint16_t variation = batch.submeshId % 100; + + // Always show body parts (group 0) + if (group == 0) { + // Body always renders + } else { + // For other groups, check if this specific geoset is enabled + bool found = instance.activeGeosets.find(batch.submeshId) != instance.activeGeosets.end(); + if (!found) { + continue; + } + } } // Resolve texture for this batch