Probleme
Apres confirmation que la tile 26 de l’atlas est bien la texture correcte
du corps du crab (motif en losange brun, visible dans le jeu Amiga original),
les polys du crab corps/queue (texOffset 0x8202) apparaissaient toujours
noirs alors que la texture etait bien presente dans l’atlas.
Cause racine
Dans brightnessToColor(), on samplait UN SEUL pixel de la texture pour
en deduire la vertex_color :
int argb = TextureMapConverter.sampleColor(texData, shadeData, palette,
texOffset, brightness);
return new ColorRGBA(r/255, g/255, b/255, 1f);
Cette vertex_color est ensuite utilisee en mode Unshaded + VertexColor + ColorMap
pour moduler la texture : pixel_final = texture * vertex_color.
Probleme : le sample tombait a rowStart+8, colStart+2. Pour la tile 26
du crab, 48% des pixels sont d’index palette 0 (= noir). Donc le sample
tombait tres souvent sur un pixel noir -> vertex_color = noir ->
texture * noir = noir -> tout le polygone devenait noir.
Meme si la texture dans l’atlas etait correcte, on la multipliait par 0.
Fix
brightnessToColor() retourne maintenant un facteur de luminosite uniforme
(gris) base sur le brightness, sans sampler la texture :
int shadeCalc = (brightness * 32 * 41) >> 12;
int shade = Math.max(0, Math.min(31, 31 - shadeCalc));
float factor = 1.0f - (shade / 31.0f) * 0.75f; // 1.0 clair -> 0.25 sombre
return new ColorRGBA(factor, factor, factor, 1.0f);
La texture (dans l’atlas) reste intacte, et le shade est juste un
multiplicateur uniforme 0.25..1.0. On conserve la texture visible au lieu
de l’ecraser.
Impact
Ce fix devrait :
– Résoudre le corps/queue noir du crab (tile 26 existe mais etait ecrasee)
– Résoudre le manche du rifle (possible meme bug de sample)
– Potentiellement résoudre les ailes noires du wasp (si brightness haut + pixel 0)
– Ne pas dégrader les autres modeles (le facteur est plus tolerant)
Fichiers modifies
src/main/java/com/ab3d2/tools/VectObjConverter.java: brightnessToColor()