Bonjour Tiny !

Tiny, mascotte fort connue des programmeurs DirectX fait son entrée chez nous.

060618-objetxanime-1

Tiny est un fichier X animé, en me basant sur le code du SDK de DirectX + de l’ajout HLSL traduit du C++ vers le C# par Steve Lanuit + de mes ajouts pour le choix des animations, j’ai pu l’introduire parmis nous.

Mes améliorations du code ne sont qu’a leur début car cette classe ObjetXanime a besoin de beaucoup de modification pour la rendre générique.

De plus je vais réécrire Lobj de la librairie Libesstein et réunir objet simple et objet animé sous une seule classe mère dans LibK si possible (car la structure des objets animés est fort fermée) : gérer leurs textures de manière à opérer des modifications facilement et gérer leur ombres (d’ailleurs pour les objets animés ça va pas être facile)

Voilà le menu des opérations, Lobj sera une descendance de la classe mere et plus directement d’ObjetX.

Retournement de matrice

C’est grâce à Flip que notre fouttu probleme d’ombre qui se projettait n’importe où a été réglé…

En fait moi je transformais les matrices dans l’ordre -X -Y -Z, comme quand je fait le rendu (mais en inverse : X Y Z) alors qu’il fallais également inverser l’ordre des matrices et donc obtenir -Z -Y -X… c’est con mais important.

Merci Flip.

Prochainement je publierais un article conssacré aux ombres AVEC les transformations. A venir donc…

Je ne suis que l’ombre de moi même

Crevé, exténué… 1 semaine de fouille, de retournement de code, de forums et autres brols pour enfin y arriver…

Remontons le temps et resituons nous en main 2005 (stage à l’INPRES) ou je devais faire le moteur de rendu d’animations truc bidul « Animator 4D »…

J’ai pleuré en voyant le code de Jack Hoxley en c++, bric à brol illisible… 2 jours m’ont dégouté de ce code et j’ai donc échoué/abandonné… c’est aussi a cette époque que j’ai voulu faire une bounding box qui tenait compte des rotations/proportions (ce que j’ai réussi il y a peu).

Vendredi passé, après une nuit tourmentée à réver de tout ça, je me suis dit, même si la liste des chose à faire était longue et aux priorités variables : « tampis, le prochain Graal sera ces fouttues ombres !!! »

Et vlan en avant pour relire le code d’Hoxley, de théorie sur gamedev.net et autres, puis un autre code barbare qui fonctionnait bien aussi, tjr en c++6, avec des lectures de données et interpretations perso… la folie pour retirer un truc générique… Pour finir je reprend ma classe ShadowVolume d’Animator 4D, je trouve 1-2 erreurs, qui découle des debuggage intensif mais le résultat… c’est pas vraiment ça…

060615011107

Dans la foulée je trouve sur mdxinfo.com un code d’ombre simple, c’est l’adaptation un peu modifiée du code d’Hoxley… je vérifie avec mon code… aucunes erreurs apparentes : le problème ? la compilation des projets foirait + les transformation et préparation des vecteurs concernant la lumière…

060615101113

Ensuite est venu, pour parfaire le rendu, la définition d’une lumière, comprendre son mécanisme pour jouer sur la précision de son atténuation, etc… La encore il aura fallu quelques heure de debug car le paramétrage du device n’était pas conforme et on avait des trucs du genre :

060615005814 060615162645

Apres donc 1 semaine d’insomnie et de prise de tête nous y sommes enfin.

Voici le résultat actuel :

06-06-15-ombres-006-06-15-ombres-1 06-06-15-ombres-206-06-15-ombres-3 06-06-15-ombres-406-06-15-ombres-5

Il subsiste toutefois une erreur.

La transformation sur l’axe Y (en rotation) fonctionne, le positionnement aussi… mais la rotation sur X et Z donne des résultats incohérent :

060615-b-0
060615-p-2

Je cherche toujours donc… en attendant il serait temps de reprendre l’éditeur de Liebesstein et de finir l’implémentation des objets…

Objets mondialisés

L’éditeur est capable de lire la nouvelle version des fichiers monde (fml), cad qu’ils prennent en compte les objets.

Lecture/sauvegarde et affichage sont fait et se portent bien, reste à pouvoir ajouter/supprimer/modifier les objets… encore un bazard prise de tête en perspective lol

A l’étroit

Voici 2 captures :

06-06-07-bbox 06-06-07-bsphere

Ceci illustre les englobants, ce qui permet de détecter les collisions entre-autres, ou si on est prêt d’une porte pour l’ouvrir.

La détection de collision est normallement bonne (restera à ajouter les modifications d’échelle un jour quand on en aura besoin)

Attaquons la suite…

Objection !!!

[Vidéo #2 disponible]
Attention où vous marchez !!!

Bah oui y a une baballe maintenant au sol de notre pièce, et y a pas qu’elle. On a une pierre et 2 portes dont une avec fermeture automatique.

Alors c’est bien joli mais ça ne suffit pas, listons les nouveautés :

  • Collision perso/murs et perso/objets
  • Collision objet/objets et objet/mur
  • Ciblage de l’objet devant nous pour interragir (les portes)
  • Collisionner quelque choses = peut-être qu’il faut le déplacer => déplacement avec quelques notions physique, la balle en est un bon exemple
  • Distinction entre objet solide (pierre) et objet balle (la balle)
  • Capture des mouvement de la souris

Le système de collision est V2 mais sera corrigé concernant un dernier probleme de rotation d’objet.

La suite ? arf… les exams, le boulot.. bon ok : modifier l’éditeur de niveaux pour tenir compte des objets et sauver/charger la liste de ceux-ci. Puis on s’attaquera peut-être à l’affichage des jauges, armes, etc… Y a la fin de niveau aussi à détecter et le scriptage des objets des niveaux à faire…

Pierre qui tourne n’amasse pas mousse

Dernière capture :

06-06-04-menu-pierre-0

Correction du bug :

06-06-04-menu-pierre-106-06-04-menu-pierre-2

A part un nouveau bug découvert (modif de texture sans alpha concervé), j’ai commencé l’ajout des fonctionnalités liées aux objets 3D, ainsi LibK sait lire un fichier X simple, optimise le chargement des textures et s’occupe du rendu.

A la suite d’une aprem de codage sur les objets animés qui depuis l’année passée s’acharnent sur moi et suite à mes précédentes idées de contrôle absolu sur les objets le + possible : la gestion des objets composés et animés se fera via nos systèmes.

Le système de boucle des musiques avait une faille qui a été corrigée. (quand un CR se charge et ajoute une musique à la liste et qu’en même temps GRAK veut vérifier les musiques à boucler…)

Un menu en cache un autre

J’ai continué le menu du jeu, quand on clic sur Jouer on arrive plus directement dans le CR jeu, on passe par un sous-menu [Nouveau, charger, sauver, retour] et si on clic sur nouveau alors zou choix de la difficulté [facile, moyen, difficile, retour] J’ai un peu regardé également directInput pour avoir des infos utiles sur la souris et donc je pense faire une bloc pour ça accessible par l’interface de GRAK qui permettrait au CR d’avoir ces infos ou alors les envoyer via les événement mousemouve, ou faire un peu des 2…, mais bon… on verra bien

bric-à-brol

Concernant la réduction de face pour le 320*240, on oublie, faudra voir ça avec le bloc effet.

La musique est bouclée (loop), les événements de directsound ne se lançaient pas alors j’ai refait le système à ma sauce et lui fonctionne. Ca permettra aussi d’ajouter des fonctionnalités (délais, effets [fondu, …], …)

Le CR charge était buggé par ma faute, je l’ai réparé (vive les backups)

J’ai aussi déterminé l’origine d’une exception (erreur) mais qui sera à mon avis inévitable (chargement/déchargement simultané, données supprimées alors que d’autres les appelles => exception (ceci souvent en cas d’erreur [cas du CR harge]))

Résolution alternative

En voulant faire la vidéo je me suis rendu compte d’un bete truc, pour faire une vidéo le + fluide possible, il faut la faire en bonne taille (320*240). J’ai donc dit à GRAK de démarrer dans cette résolution et là… catastrophe !

Le menu déborde et est en dehors de la fenêtre, pareil pour le générique, bref pareil pour tout ce qui est 2D… car la 3D, elle, reste identique bien proportionnée par rapport à l’écran.

C’est normal vu que une image appliquée à l’écran ne va pas changer subitement de taille du fait que notre fenêtre elle change de taille.

LE problème est donc la proportion et ceci est lié à l’idée de projection. La 3D est projetée dans l’espace par rapport à la vue et donc restera proportionnel à la taille de l’écran (ici je schématise très fort). La 2D elle n’est pas et ne sera pas projetée.

A l’époque c’était facile les jeux n’avaient qu’un seul mode graphique/résolution. Puis on a varier, donc que faisait-on ? On prévoyait le jeu pour la résolution minimum, mais je me vois mal faire le jeu pour du 320*240, je le ferais plutôt pour du 800*600, mais les vidéos elle sont capturée en 320*240.

Il nous faut donc une solution : une résolution alternative pour le rendu.

En travaillant avec des rendu-textures, celles-ci sont projettées sur une face à l’écran pour être vue.

Actuellement, si on lance le jeu en 800*600, nous projettons le rendu (le monde) et la 2D dans une texture de rendu établie en 800*600 qui sera à son tour projetée sur une face.

Si maintenant on désire garder une proportion minimum de l’ensemble lorsque l’on diminue la résolution il va falloir jouer sur le seul élément variable dans ce cas : la texture de rendu : sa taille.

Nous démarrons donc en 320*240, notre jeu est fait pour du 800*600 et la carte graphique est ok pour cette résolution en mémoire. Nous créerons la texture de rendu non pas en 320*240 comme au démarrage mais en 800*600. Ce rendu sera donc projetée sur une face 320*240 ce qui écrasera l’image (sans pertes dans ce cas là) et nous auront notre porportion concervée.

Ceci est fort technique je l’avoue mais comme ça vous savez un truc en + qui sera dans GRAK 🙂 Tout ça juste pour faire des vidéos en gros lol

Ceci sera prochaînement mis au point et enfin on pourra faire une vidéo intégrale de ce qui existe actuellement.