windmill-gint/LEPHE.md

2.8 KiB

Changements faits par Lephe' pour que ça compile :

Dans CMakeLists.txt

  • Ajouté -Wp,-w à src/map.cpp ; ça indique à GCC de passer -w au préprocesseur, ce qui désactive (entre autres) les avertissements de redéfinition de macros pour ce fichier (normalement il faut #undef les macros avant de les redéfinir).

Pour information: -W<lettre>,<options> passe les options (séparées par des virgules) au programme spécifié par la lettre dans la chaîne de compilation : -Wp passe des options au préprocesseur, -Wa à l'assembleur, et -Wl à l'éditeur de liens.

  • Ajouté -Wno-missing-field-initializers à src/map.cpp, ce qui désactive les avertissements pour les champs non initialisés dans les structures ; attention du coup, si tu en oublies des importants personne ne te le dira.

Dans src/map.cpp et src/windmill.cpp

  • Rendu les textures (tex_white, tex_black, etc) non-constantes
    • Dans src/map.cpp: Texture tex_white = {};
    • Dans src/windmill.cpp extern Texture tex_white;

C'est parce qu'en C++ const implique internal linkage (comme static), et du coup la variable n'est visible que dans le fichier où elle est déclarée. Du coup extern const c'est un peu bizarre, et même si certains bouts m'échappent, le résultat c'est que ça ne marche pas. Il y a probablement une meilleure solution que de couper le const, à rechercher une autre fois.

En déclarant les textures non-constantes les noms sont exportés comme il faut et se retrouvent bien. Du coup les 4 textures arrivent dans la section .bss (RAM initialisée à 0) au lieu de .rodata (ROM) ; si c'est un problème et à défaut d'une autre solution, tu peux mettre GSECTION(".rodata") (de <gint/defs/attributes.h>) devant le Texture et ça les déplacera dans leur section d'origine.

Dans src/windmill.cpp

  • Décommenté la vieille fonction render_triangle_white. J'ai vu que render_triangle_black avait été redéfinie, celle-là je n'y ai pas touché.

Test

À ce stade ça compile et le programme ne crashe pas ; l'écran titre a juste une image de titre, et ensuite quand j'appuie sur EXE, écran noir. Pas moyen de sortir, je RESET. Manifestement c'est normal vu la tête de src/main.cpp.

Dans src/windmill.cpp and src/windmill.hpp

  • Décommenté tout le code concernant la VRAM ; la VRAM est accessible par la variable gint_vram déclarée dans <gint/display.h>. Sur Graph mono ce n'est pas un tableau de char mais un tableau de uint32_t donc attention ! Quand tu écris char *vram = ... ça ne pose pas de problème, mais gint_vram[i] contrôle 32 pixels d'un coup.

  • Dans src/windmill.hpp, ajouté #define get_vram_address() ((char *)gint_vram).

  • Dans draw_ground(), renommé sol.x et sol.y en ground.x et ground.y dans la ligne suivante.

vram[(ground.y << 4) + (ground.x>>3)] |= mask;

Test

Pareil.