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]))