Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » gint : un noyau pour développer des add-ins
Lephenixnoir En ligne Administrateur Points: 17214 Défis: 142 Message

gint : un noyau pour développer des add-ins

Posté le 20/02/2015 17:30

Les SDKs classiques pour écrire des add-ins sont le fx-9860G SDK de Casio avec fxlib (pour Graph monochrome) et le PrizmSDK avec libfxcg (pour Prizm et Graph 90+E). Voici mon alternative : le fxSDK avec gint, pour toutes les plateformes.

Contrairement à fxlib et libfxcg, qui appellent les fonctions de l'OS pour faire leur travail, gint est un noyau indépendant de l'OS qui exploite seul le matériel et le met à disposition de votre add-in. Il vous offre plus de finesse sur le contrôle du matériel, notamment le clavier, l'écran et les horloges, de meilleurs performances sur le dessin, les drivers et la gestion de interruptions, et des choses entièrement nouvelles comme le moteur de gris.

Toutes les sources de gint sont publiques et accessibles sur la forge de Planète Casio :

» Dépôt Gitea Lephenixnoir/gint «

Voici plus précisément ce que gint vous offre de nouveau :

• Un contrôle détaillé du clavier pour les jeux, parfait pour les combos !
• Des timers avec une précision de 60 ns, d'autres à 30 µs
• Toutes vos images converties automatiquement sans code à copier (plus de Sprite Coder)
• Des polices personnalisées
• Des fonctions de dessin, d'images et de texte fulgurantes et optimisées la main
• Mesurer les performance de votre code à la microseconde près (avec libprof)
• Le contrôle du matériel et des interruptions
• Plein de petites choses pratiques comme dprint(1, 1, "x=%d", x)

• (Graph monochrome) Un moteur de gris pour faire des jeux en 4 couleurs !
• (Graph monochrome) La compatibilité SH3 et SH4, avec le même fichier g1a.

• (Graph 90+E) Une nouvelle police de texte, plus lisible et économe en espace
• (Graph 90+E) Le dessin en plein écran, sans les bordures blanches et la barre de statut !
• (Graph 90+E) Un driver écran capable de triple-buffering

Le coût de tout ceci, c'est que vous avez une copie du code de gint dans votre add-in. Cela prend environ 20 ko de place (selon la quantité de fonctions que vous utilisez), soit à peu près comme le sprintf() de fxlib qui fait 18 ko !

Et voici quelques photos et captures d'écran !





Tester gint sur votre machine

La fin du portage vers la Graph 90+E signera la sortie de gint v2. L'add-in de test de l'application est désormais gintctl :

» Dépôt Gitea Lephenixnoir/gintctl «

En plus de tester les fonctionnalités de gint, cet add-in contient quelques outils permettant d'inspecter la machine, la mémoire, et les registres. Je le développe au fur et à mesure, et je posterai un protocole de test complet avec la sortie de la v2 !

Utiliser gint pour développer des add-ins

Normalement, vous avez besoin du fxSDK pour développer avec gint. Le fxSDK est compatible avec Linux et Mac OS, et on peut réfléchir à un portage sous Windows s'il y a vraiment des intéressés. Il faut l'installer en premier (et avoir un cross-compilateur GCC).

La procédure de compilation et d'installation de gint est décrite sur le README du dépôt, c'est du configure - make tout à fait banal.

Une fois que gint est installé sur votre système, voyez les tutoriels de développement pour avoir un aperçu de son fonctionnement. La plupart des choses sont expliquées dans les en-têtes (fichiers .h) de la bibliothèque que vous pouvez consulter en ligne, sur votre copie locale du dépôt, ou dans les dossiers d'installation du compilateur.

Obtenir la dernière version de gint après une mise à jour

Je pousse régulièrement des mises à jour de gint sur le dépôt du projet. Pour les télécharger, tapez git pull, puis recompilez et réinstallez gint avec make et make install.


Fichier joint


Précédente 1, 2, 3 ··· 10 ··· 20 ··· 30 ··· 33, 34, 35, 36
Lephenixnoir En ligne Administrateur Points: 17214 Défis: 142 Message

Citer : Posté le 14/02/2020 15:14 | #


Aha ! Eh... c'est possible mais ça c'est "très dur" par contre. Je peux le coder c'est pas un problème, mais ce sera lent.

La composition avec transparence (alpha compositing, je ne sais pas comment le dire mieux) c'est très calculatoire. D'abord il faut décomposer les couleurs en canaux, pas moyen de tricher avec la représentation binaire. Ensuite, en principe, il faut sortir de l'espace RGB et aller dans le linéaire pour faire la composition. Donc il faut jouer de l'exponentation avec le gamma. Tu peux approximer ça en des carrés et des racines carrées. Une fois composé (quelques multiplications et additions), il faut revenir du linéaire vers le RGB et recomposer les couleurs.

Tu rentres dans le traitement d'images à proprement parler.

Il me semble que dans Gravity Duck Prizm il fait pas ça (?), de mémoire le sprite du canard fond au blanc et ensuite soit il disparaît immédiatement soit le blanc se fond dans le décor. C'est très différent sur le plan calcul.
Kikoodx En ligne Membre Points: 1854 Défis: 11 Message

Citer : Posté le 14/02/2020 15:29 | #


Ah c'est coûteux en effet. Mais ça pourrait être utile dans certaines situations.
L'explosion à la mort du canard m'a l'air d'être un effet de transparence. Le cercle blanc s'affiche en transparence au-dessus des éléments du décor et de fond.
Lephenixnoir En ligne Administrateur Points: 17214 Défis: 142 Message

Citer : Posté le 14/02/2020 15:33 | #


Afficher du blanc avec un niveau de transparence variable ça s'imite facilement. Il suffit d'utiliser la formule d'éclaircissement que j'ai montrée plus haut plusieurs fois. (Après 5/6 fois tout devient blanc.)

Tandis qu'afficher une image sur une autre en semi-transparent, ça c'est une autre affaire...
Kikoodx En ligne Membre Points: 1854 Défis: 11 Message

Citer : Posté le 14/02/2020 15:49 | #


D'accord. Justement je pense que c'était plus qu'assombrir l'image, mais je dois me tromper si tu le dis

Je pense avoir fait une bêtise, j'ai supprimé build-cg pour le regénérer entièrement (les images n'étaient pas mises à jour), et j'obtiens ces erreurs :
./build.sh
making levels.c
building for cg

:: Making into build-cg

sh-elf-gcc -c src/levels.c -o build-cg/src/levels.c.o -mb -ffreestanding -nostdlib -fstrict-volatile-bitfields -Wall -Wextra -Os -D FXCG50  -m4-nofpu -I include -MMD -MT build-cg/src/levels.c.o -MF build-cg/src/levels.c.d -MP
fxconv -i assets-cg/img/ground.png -o build-cg/assets/img/ground.png.o --cg --toolchain=sh-elf name:img_ground profile:p4
fxconv -i assets-cg/img/spike.png -o build-cg/assets/img/spike.png.o --cg --toolchain=sh-elf name:img_spike profile:p4
fxconv -i assets-cg/img/jitem_popup.png -o build-cg/assets/img/jitem_popup.png.o --cg --toolchain=sh-elf name:img_jitem_popup profile:p4
fxconv -i assets-cg/img/jitem.png -o build-cg/assets/img/jitem.png.o --cg --toolchain=sh-elf name:img_jitem profile:p4
fxconv -i assets-cg/img/player.png -o build-cg/assets/img/player.png.o --cg --toolchain=sh-elf name:img_player profile:p4
fxconv -i assets-cg/img/elevator.png -o build-cg/assets/img/elevator.png.o --cg --toolchain=sh-elf name:img_elevator profile:p4
sh-elf-gcc -o build-cg/platform.elf build-cg/src/collide.c.o build-cg/src/player.c.o build-cg/src/draw.c.o build-cg/src/levels.c.o build-cg/src/main.c.o build-cg/assets/img/ground.png.o build-cg/assets/img/spike.png.o build-cg/assets/img/jitem_popup.png.o build-cg/assets/img/jitem.png.o build-cg/assets/img/player.png.o build-cg/assets/img/elevator.png.o -mb -ffreestanding -nostdlib -fstrict-volatile-bitfields -Wall -Wextra -Os -D FXCG50  -m4-nofpu -I include  -T fxcg50.ld  -lgint-cg  -lgint-cg -lgcc -Wl,-Map=build-cg/map
sh-elf-gcc: error: build-cg/assets/img/ground.png.o: No such file or directory
sh-elf-gcc: error: build-cg/assets/img/spike.png.o: No such file or directory
sh-elf-gcc: error: build-cg/assets/img/jitem_popup.png.o: No such file or directory
sh-elf-gcc: error: build-cg/assets/img/jitem.png.o: No such file or directory
sh-elf-gcc: error: build-cg/assets/img/player.png.o: No such file or directory
sh-elf-gcc: error: build-cg/assets/img/elevator.png.o: No such file or directory
Makefile:107: recipe for target 'platform.g3a' failed
make: *** [platform.g3a] Error 1
done

En effet, le dossier build-cg/assets/img est vide. Quel est le problème ? Merci d'avance
Lephenixnoir En ligne Administrateur Points: 17214 Défis: 142 Message

Citer : Posté le 14/02/2020 15:58 | #


C'est ma faute.

Je l'ai mentionné rapidement sur l'issue, mais le code de p8 et p4 est sur le dépôt... de gint. La partie fxSDK est encore sur mon PC personnel. Donc les fichiers convertis ne sont pas produits...

Je vais pousser tout ça ce soir (dans ~2 heures). Désolé... x)
Kikoodx En ligne Membre Points: 1854 Défis: 11 Message

Citer : Posté le 14/02/2020 16:02 | #


C'est drôle je viens de répondre à ton message sur le Gitea, je venais de le comprendre par moi-même x)
Pas de problème o/
Lephenixnoir En ligne Administrateur Points: 17214 Défis: 142 Message

Citer : Posté le 19/02/2020 22:29 | #


C'est drôle je viens de répondre à ton message sur le Gitea, je venais de le comprendre par moi-même x)
Pas de problème o/

Hey mais j'ai oublié, il ne fallait pas hésiter à me le rappeler. C'est poussé, tu peux récupérer la branche master et réinstaller le fxSDK pour avoir les profils de couleur p4 et p8 sur fxconv pour Graph 90. Si tu étais sur dev, j'ai fusionné et supprimé la branche (ça rendait encore des gens confus...) donc repasse sur master.
Dodormeur En ligne Ancien rédacteur Points: 3963 Défis: 82 Message

Citer : Posté le 20/02/2020 14:34 | #


Pour la compilation de gint, j'ai un problème lors du make
-e \e[30;1m>\e[0;1m fxconv\e[0m font5x7.png
  File "/mnt/c/Users/damie/Programmation/gintLibs/bin/fxconv", line 86
    err(f"execution mode -{mode} expects an input file")
                                                      ^
SyntaxError: invalid syntax
Makefile:109: recipe for target 'src/font5x7.png.o' failed
make: *** [src/font5x7.png.o] Error 1

même avec python 3.7.6 (et python3 et python qui sont des alias de python3.7 pour être sur). Je sais pas trop d'ou ca vient, a priori mes libs sont a jour maintenant, et j'ai essayé de supprimer et re-cloner gint, mais cela n'a pas changé; est-ce que ca serait mon installation de fxsdk ou de gcc qui a eu un problème?

Ajouté le 20/02/2020 à 14:35 :
(A noter aussi que lorsque je clone le git de gint j'ai une "warning: remote HEAD refers to nonexistent ref, unable to checkout." et du coup un dossier vide, mais un git checkout compat corrige ce soucis)
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm (dont je connais le nom, mais pas vous ) Arcuz !
Lephenixnoir En ligne Administrateur Points: 17214 Défis: 142 Message

Citer : Posté le 20/02/2020 14:39 | #


L'endroit de l'erreur est le premier endroit du script où il y a une f-string. Il est clair que le Python qui exécute ce script ne l'a pas reconnu. Ce que tu as fait semble solide, mais il doit rester une arnaque...

Note que les alias ça ne change rien dans un Makefile. Pour savoir ce que make lance il faut désactiver tes alias et utiliser which, ou simplement le bugger avec strace, ou d'autres.

L'histoire du git checkout compat c'est "normal".

Ajouté le 22/02/2020 à 19:12 :
Je viens de pousser un commit qui règle un problème passager avec getkey().

C'est un peu compliqué. Si on appelle getkey() et qu'on appuie sur la touche K, getkey() s'en souviendra. Ça sert à éviter qu'on puisse interférer avec la répétition de K en appuyant sur une autre touche. Cependant, si après avoir obtenu l'information K de getkey() on se met à récupérer des événements autrements (pollevent(), waitevent() ou clearevents()), getkey() peut rater l'information de relâchement de K, auquel cas il continuera injustement de refuser les autres touches.

J'ai ajouté une vérification à l'entrée de getkey() permettant d'éviter ça. Si la dernière touche pressée ne l'est plus quand on entre dans getkey(), alors getkey() se réinitialise.
Milang En ligne Membre Points: 464 Défis: 2 Message

Citer : Posté le 23/02/2020 13:20 | #


C'est ça le bug que j'avais signalé plus tôt ! J'utilisais getkey, mais dès qu'il y avait validation, à aucun moment getkey n'enregistrait que la touche de validation avait été pressée puisque je passais en pollevent()
https://dev.planet-casio.com/Fr/forums/topic13572-33-gint-un-noyau-pour-developper-des-add-ins.html#173013

C'est génial ça, je vais pouvoir me remettre à utiliser getkey alors
Lephenixnoir En ligne Administrateur Points: 17214 Défis: 142 Message

Citer : Posté le 23/02/2020 16:14 | #


Le triple buffering n'était pas encore en place sur Graph 90+E, donc je suis en train de faire ça. Je suis parvenu à mettre en évidence les artefacts visuels qui se produisent si on commence le frame suivant sur la même VRAM, mais uniquement en tordant mon code pour le faire apparaître, et en faisant exprès de dessiner sur la fin de la VRAM, dont je savais pertinemment qu'elle n'était pas encore modifiée.

Voilà donc un constat intéressant pour ceux qui seraient tentés de lancer des gros projets. Il est possible de bénéficier à la fois de la vitesse de transfert du DMA (jusqu'à 10 ms gagnées par frame !) tout en n'utilisant qu'une seule VRAM (170 ko économisés !). Il suffit de commencer chaque frame en dessinant en haut de la VRAM. Par exemple, si on dessine un terrain construit sur un ensemble de tiles, on peut faire ça :
• Envoyer le frame précédent avec dupdate().
• (Optionnel : faire un truc annexe comme le moteur physique ou les IAs pour laisser le DMA prendre de l'avance.)
• Faire le rendu du terrain. Au début de chaque ligne, vérifier dans les registres du DMA que la bande horizontale concernée a déjà été envoyée à la VRAM, et dessiner.
Cette méthodologie aurait pu être présentée bien avant, mais ce que je réalise maintenant c'est que très peu de temps sera perdu, voire pas de temps du tout (bon à part le fait que de toute façon la RAM n'est pas parallèle de toute façon). Et croyez-moi 170 ko de RAM ça peut vous sauver la vie

Voilà voilà, sinon le triple buffering est poussé sur la branche compat, ce qui fait de la pile graphique par défaut de gint l'une des options les plus performantes pour Graph 90+E clé en main. Pour indication, le visualisateur hexa de mémoire de gintctl, une application pas très exigeante en ressources mais dont le code ne fait pas particulièrement attention aux performances, tourne à 43 FPS.

Autres modifications notable :
• Ajout de DWIDTH et DHEIGHT donnant la taille de l'écran (je ne sais plus qui me l'avait demandé)
• Ajout d'une couleur C_RGB(r,g,b) sur Graph 90 (0 ≤ r,g,b ≤ 31)

Ajouté le 23/02/2020 à 16:15 :
C'est ça le bug que j'avais signalé plus tôt !

Je me suis demandé ! Bon ben désolé de pas m'en être rendu compte à ce moment-là. La bonne nouvelle, c'est que keydown() était exactement la solution à ce problème. Maintenant, je suis certain que mon modèle clavier est fiable, robuste et polyvalent. Et ça fait bien 3 ans que j'en tente des variantes dans tous les sens ! xD
Précédente 1, 2, 3 ··· 10 ··· 20 ··· 30 ··· 33, 34, 35, 36

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
Pour coloriser votre code, cliquez ici.
Sinon cliquez sur le bouton ci-dessous.
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2020 | Il y a 113 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd