mardi, mai 31, 2011

Et ... qu'est-ce qu'on fait maintenant ?

Bion première release de AnimEDS: check, mise à jour de SEDS : check. Quoi d'autre ?

En premier, une petite uniformisation de mon environnement de compilation ne serait peut-être pas une mauvaise idée. J'avais identifié un problème de performances dans la libfat pendant les congés de Noël ... ça pourrait valoir la peine de revenir dessus histoire de soumettre un "vrai" patch pour le projet devkitpro. Pour l'instant:
- démarrer SEDSgama.nds depuis le menu R4 et faire un "QUIT" vers rungama.nds: ok
- mise à jour interne de SEDSgama et rungama: ok, mais lent (compilé sur beetle)
- démarrer SEDSgama depuis runbeta: ok, mais empèche d'utiliser le loader pour sortir de SEDSgama.

Ensuite, on pourra voir pour les histoires d'effets miroir dans AnimEDS, la définition d'autres structures de sprites (changer le nombre de membres et l'utilisation des pages de sprites) et le support de tout ça dans le moteur de jeu (eh oui, l'idée, ça reste de faire des jeux).

samedi, mai 28, 2011

Download Sprite Editor 0.4

Here we go: The newest version of my Sprite Editor for Nintendo DS.



Nous y voilà. Enfin toutes les améliorations apportées à mon Sprite Editor pour DS depuis fin 2008 regroupées, contrôlées, et documentées dans la version 0.4:
  • éditeur de palette complet et plus ergonomique
  • fonctions miroir, superpositions d'images et remplissage rapide
  • Réorganisation et réduction de couleurs (non-documenté)
  • compatibilité avec les animations produites par AnimEDS


Press L+R in the application for hints, or read the detailed manual

jeudi, mai 26, 2011

grayscale preview : done.

Well, I guess it would be fair enough to admit that my knowledge in image processing turned out to be insufficient to provide a "magic contrast boost" slider in SEDS. Yet I regularly have contrast issues with my sprites, and I've learnt on Pixelation forums that turning your sprite into grayscale is a nice way to investigate whether a sprite is contrasted and readable enough. So the plan was

gray = red*.30+grn*.59+blu*.11
C'est la formule qui permet de passer d'une couleur RGB à un niveau de gris "équivalent". Or, passer son sprite en niveau de gris, c'est le truc ultime des gurus de Pixelation pour savoir si le contraste est suffisant ou non. A défaut d'un "boosteur de contraste" magique, c'est le moins que je puisse tenter.

Reste à le mettre en oeuvre. C'est le genre de chose qui aurait été impensable avec mes éditeurs sous DOS, n'ayant qu'une palette unique de 256 couleurs ... Mais ici, avec le soutient des "sprites DirectColor" (ou ATTR0_BMP), c'est une autre histoire ... Moyennant une consommation de mémoire vidéo un peu plus importante, je peux directement donner les composant RGB de chaque pixel individuellement et indépendamment des palettes "background" et "sprite".

Ca n'aura pas été sans mal quand même, tant le fonctionnement de ces sprites diffère de celui de mes "bons vieux sprites habituels". D'abord, exit le tiling. Le pixel (x,y) à l'intérieur du sprite est stocké dans le y*width+x ème "short", tout simplement. Vu que la dénomination officielle est "SPR_BITMAP", il fallait un peu s'y attendre, celà dit :P
Deuxio, ces sprites-là ont leur propre bits de contrôle dans REG_DISPCNT, et peuvent donc rester en "mode 2D" alors que les autres sprites sont en mode 1D. On dirait d'ailleurs que desmume a encore quelques soucis avec ça et qu'il utilise ces sprites en mode 1D quoi qu'il advienne 0_0.
Enfin, le "numéro de tile" n'est plus du tout interprété de la même manière. L'interprétation exacte est donnée sur gbatek, mais en ce qui me concerne je me suis contenté d'une heuristique du genre "tileno/2" avec un 'padding' pour aligner les données du sprites sur le bloc de 32 tiles le plus proche:

tileno=Engine::allocate(Engine::RES_SPRITETILE,32+PAD); // will use directcolor.
if (PAD && tileno&(PAD-1)) tileno=(tileno+PAD)&(~(PAD-1));
sprdata = SPRITE_GFX + tileno*32;
Engine::sprites[oam].attribute[0]=ATTR0_BMP|ATTR0_ROTSCALE_DOUBLE|OBJ_Y(0);
Engine::sprites[oam].attribute[1]=ATTR1_ROTDATA(rot)|ATTR1_SIZE_32|OBJ_X(96);
Engine::sprites[oam].attribute[2]=ATTR2_PRIORITY(1)|ATTR2_ALPHA(1)|(tileno/2);
The idea was to use "direct-color" sprites in order to have the freedom of picking RGB colors without messing up with the sprite palette (sprites are already used to render the whole palette at the bottom of the editor, so that we have enough freedom for widgets). That would only cost me some more video memory (clearly affordable in this context) ... and some discovery of these new sprites' oddities...
A separate control on 1D/2D sprites, a specific scheme for reading data out of the VRAM (lowest bits of "tileno" are now used as a horizontal shift in an otherwise bitmap area) ... And of course, no tiling of the sprite data (these are named "BITMAP" sprites. What exactly did you expect, hmm ?)

Well, that's all done, now. Just give me some more time to remove debugging statements, and I should be able to release Sprite Editor 0.4 by Monday.

mercredi, mai 25, 2011

Contrast Boost ...

J'ai la fâcheuse manie de dessiner avec un contraste trop faible entre mes couleurs (cf image du milieu), et du coup, toutes mes tentatives d'ombrage et de lumière ont tendance à tomber à plat, en particulier sur des décors plus variés... du coup, je corrige a posteriori dans The Gimp, avec un résultat plus ou moins heureux, vu que je ne sais pas ajuster la disposition des pixels en fonction des nouvelles couleurs...

J'avais donc dans l'idée d'ajouter un bouton (ou une règlette) "augmenter le contraste" dans SEDS pour sa prochaine révision ... encore faudrait-il savoir ce que cette règlette serait supposée faire. Le contraste automatique de Gimp agit à la fois sur la saturation en couleurs (augmentée dans tous les cas) et sur la valeur (hsV), mais pas évident d'en déduire ce qui est effectivement fait.
La difficulté, à la main, serait de revoir l'ensemble des couleurs d'un dégradé tout en gardant la cohérence du dégradé. J'ai tenté de modifier les "sliders" de l'éditeur de palette pour faciliter l'édition d'une succession de couleurs .. pour rien: la fonction souhaitée (sélectionner un slider sans le modifier) était déjà disponible avec L+click :P

Je pourrais peut-être déjà proposer une variante "niveaux de gris" du sprite, ce qui a tendance à faire ressortir les problèmes de contrastes pour les gens qui se laissent trop facilement distraire par la "chrominance" ... comme moi, apparemment :P

samedi, mai 21, 2011

Pas de 3DS pour moi.



Devant, un bijou technologique. Derrière, un appareil sur lequel vous n'avez finalement aucun contrôle, qui s'apparente d'avantage à un mouchard déposé chez vous par Nintendo qu'à une console de jeu!

Que Nintendo veuille protéger ses ventes, très bien pour moi. Qu'ils poursuivent en justice les gens qui vendent du matériel destiné au piratage de leurs jeux, pas de soucis avec ça non plus. Les jeux qui m'intéressent sont parfois bien dur à trouver, mais jusqu'ici, j'ai presque toujours fini par mettre la main dessus, que ce soit à la médiathèque ou en magasin. Qu'ils bloquent l'accès au "DSiWare" quand un composant non-conforme est présent (ou a laissé des traces dans le système), "fair enough".

En revanche, s'octroyer le droit de rendre l'appareil que vous avez acheté définitivement hors d'usage, là je dis non. Sony qui retire à distance la fonction Other OS, c'était déjà exagéré, mais menacer (et avoir techniquement prévu) de transformer l'appareil en un tas de transistors inutilisables est tout simplement inacceptable. S'octroyer le droit d'utiliser les commentaires et les photos prises par l'utilisateur, c'est du Big Bowser à l'état pur. Mille sabords, on l'a acheté, cet engin, ou on s'est vendu ?

Je suis malheureusement trop tard pour la campagne, mais mon choix est fait: votre percée technologique, vous pouvez vous asseoir dessus, messieurs. Je suis seul maître à bord et seul responsable de mes actes en 192.168.*.* et j'entends bien le rester. Comptez sur moi pour avertir tous les parents aux alentours de ne pas acheter cet engin à leurs gamins!

Cliquez sur l'image pour accéder aux informations de la campagne contre Nintendo of America.

vendredi, mai 20, 2011

srpite eoitdr rleasee psotpnoed

Ouhlà! Qu'est-ce que c'est que ce souk !?? Je savais que j'avais fait pas mal de modification à ma bibliothèque de "support" pour le Sprite Editor, mais là, on nage en plein délire !? Les widgets "grille 16x16" et "grille 32x32" sont inversées ou quelque-chose du genre. Du coup, ce n'est plus l'image à l'écran qui est manipulée, mais une autre, hors-écran. Bin il va y avoir un peu de nettoyage à faire avant de faire une release du Sprite Editor, on dirait bien.

WTH? I knew the "core" libgeds library (the Gui Engine) had been reviewed several times since the last SpriteEditor release ... and obviously I should have proceeded with back-compatibility tests more often, because it looks like *nothing* works with this SEDS 0.4 release candidate. Oh, well, the palette edition window do work flawlessly, but there's something horribly wrong with the grid widgets. It looks like the 32x32 grid handle clicks when the 16x16 grid is displayed and vice-versa. The hell if I know why. More clean-up, code printing, overlining, and UML teacup to come ahead, I'm afraid.

The release is postponed until I can figure out where all this mess comes from.

mardi, mai 17, 2011

Sprite Editor v0.4 pour bientôt ?

Dur à croire, mais SEDS v0.3, c'était il y a plus de 2 ans 1/2 déjà. Entretemps, j'ai ajouté l'outil "seau de couleur" (L+B), récemment ajusté pour fonctionner aussi en 16x16. Au passage, avec l'éditeur d'animation qui ajoute de nouvelles informations dans les fichiers .spr, je dois ajuster le Sprite Editor pour qu'il ne perde pas les animations dès qu'on édite les images ...
L'idéal, bien sûr, ce sera d'intégrer les deux outils, mais on en est pas encore là (prototypage oblige).

Autre soucis: le devkitpro "32", ou plus exactement, le mécanisme "standardisé" pour passer d'un programme à l'autre. Pour l'instant, le nouveau SEDS n'est capable de passer à un autre programme que si "quelqu'un d'autre" (runme, hbmenu) a placé le stub en mémoire... Celà dit, il y aura quand-même encore quelques petites choses à régler dans la partie "palette" (qui traînent depuis un bail :P)

  • [done]click on color in the preview, and see where it is on the palette
  • [done]R recalls the former color (undo)
  • swap mode for the PaletteEditor widget
These are "todo items" pending on the Sprite editor for two years and a half, now. The latest SpriteEditor release is virtually as old, and had no idea what to do with animations present in .spr ... So an update will be required soon so that people can start drawing their *own* 'puppets'. That, plus support for "horizontal flood fill" will make version 0.4, which I hope to make available fairly soon.
Let us also add:
  • [done]a visual hint of which gradient color has been picked last
  • [done]a tool for "reversing" a gradient on the gradient-generator widget (for hues) (that was already available with A/X buttons :P)
  • [wish] a slider for boosting / lowering the contrast for a range of colours.
  • [done]sprite swapping on the grid
  • [wish] colour stencil à la Deluxe paint (possibly using the quickpal widget)

Ideally, both tools will end up integrated into a single binary, for more efficient workflow. That's not yet possible as one is still in prototype stage and the other "in production" ...

mercredi, mai 11, 2011

AnimEditor 0.2 for download !

At last, here you go. Have fun with Mr. Easter Egg. See this post for how to use the editor.

Stay tuned for updates.

Using AnimEDS

1) download it, ensure you've got a DS linker ready.
2) install spritex.spr at the root of your media card
3) place AnimEditor.nds anywhere you like on your media card
4) launch the .nds file with your linker.

  • START-L-X : load the spritex.spr file (other spritesheets can be built with SEDS)
  • Click the limbs on the central area to select them, then move them around with the stylus or the DPAD. press L to de-select the current limb.
  • Press Y to copY the current frame and edit the next (copied) frame.
  • When no limb is selected, press UP or DOWN on the DPAD to move from frame to frame. Press LEFT or RIGHT to move the selected frame around the timeline.
  • Use the limbs miniature on the left to select a limb more accurately or to make its associate spritesheet appearing on the right.
  • Touch one of the sprites on the right sheet to change which image is displayed.
  • press R-R to write back that animation to the "thumb window". When the thumbs window is displayed (pressing R once) on the bottom screen, use DPAD to select an animation slot, A to load it in the editor, R to save the editor's content and L to return to the editor without writing back.
  • press START-R-R to save back your work.
DISCLAIMER:
  • AnimEditor v0.2 is still hard-coded for a specific layout of the .spr file (esp. regarding which page to use for the different limbs). This may result in odd content displayed on screen before you load a file.

dimanche, mai 08, 2011

Une petite vidéo d'AnimEDS 0.1


'Faut que je fasse de la place sur mon appareil photo avant la visite du Keukenhof ... ce qui fait que j'ai retrouvé la petite vidéo de démonstration des possibilités d'AnimEDS 0.1

Evidemment, ç'aurait été mieux d'en faire une nouvelle avec la version courante qui devient progressivement "presqu'utilisable", mais le temps est plus ou moins limité ici.

Better late than never, I hope: two commits ahead of AnimEDS 0.2, I finally uploaded the demo video of AnimEDS 0.1 that demonstrates the basic user interface. Stay tuned.

mercredi, mai 04, 2011

Iteraatooor ... Giv'me Innformationnn.

Donc, se donner un objet représentant "une position dans une séquence" sur lequel il soit possible de faire les opérations habituelles "avancer à l'élément suivant" ou "obtenir le contenu de l'élément actuel" comme si on avait affaire à un "bon vieux pointeur dans un tableau C", c'était l'idée de std::{whatever}::iterator.

Si c'est sympa à la base (surtout pour ceux qui n'ont jamais fait de programmation fonctionnelle et pour qui les manipulations de listes à coup de grep ou map semblent occultes), en revanche, ça donne parfois des effets troublants dans la mesure où l'itérateur risque (s'il y a la moindre faille dans votre vigilance) de parcourir un objet qui n'existe plus.

Du moins, c'est l'explication la plus probable des fantaisies que j'observe dans mon éditeur d'animations.

lundi, mai 02, 2011

AnimShow -- le retour.

At last, I can preview the animation in the animation editor. That should bring release 0.2 one step closer. Now I only need to do some polish ... and get some sleep :P

Et voilà. Enfin des animations animées dans mon éditeur d'animations. Je vais devoir vous demander d'attendre encore un peu -- un minimum de polish et de tests en live sur DS -- avant de vous proposer la release 0.2 et son Easter Egg ...