Ceci est une ancienne révision du document !


Gestion des textures pour les avatars

Dans le jeu, les créatures (monstres ou animaux) utilisent tous des textures d’une taille de 256×256 pixels. Suivant la complexité de la créature et sa taille, on trouvera sur un fichier BMP de 1 à plusieurs créatures.

Pour les personnages, là on trouve dans le répertoire meshes une multitude de petits fichiers BMP, l’un étant la texture d’un bras, l’autre le pantalon, etc …

Chose étonnante, leur tailles qui n’ont rien à voir avec les valeurs puissance 2 (comme on le voit beaucoup en informatique). En fait cela cache une astuce que nous allons découvrir ici.

Cet article a été tiré à l’origine de l’ancien blog d’Etory (Terd Seglet). Il est à compléter et à corriger si besoin est.

Les textures des objets Cal3D dans LE

La plupart des cartes graphiques 3D permettent de gérer des textures que l’on applique sur les triangles composant les meshes. Pour cela on aplatit le maillage pour pouvoir indiquer les textures de chaque triangle. Pour ceux qui seraient intéressés, cette technique est appelée UV mapping (lien en anglais). Ces textures ont pour tailles maximales 256×256, 512×512 ou 1024×1024 suivant la puissance de la carte graphique. Il est à noter que si les cartes modernes acceptes des textures de taille différente de 2^X, ce n’est pas la cas des cartes plus anciennes. Dans le jeu, les textures les plus grandes font 256×256 pour fonctionner avec le maximum de carte même plus ancienne mais aussi pour des questions de place mémoire (256×256 prend 4 fois moins de place en mémoire que 512×512 par exemple).

Par exemple la texture pour les tigres est :

Cette texture est commune au deux tigres (normal et des neiges). Chose intéressante également est que la texture sera plaquée de chaque côté du tigre de manière symétrique afin de gagner de la place sur la texture.

Donc chaque créature est décorée comme cela dans le jeu.

Et les avatars et leurs équipements ...

Oui les avatars eux aussi utilisent le même principe de texture mais avec une astuce supplémentaire. Comment faire cohabiter différentes couleurs de peau, différentes armures ou chemises, différents pantalons et bottes, etc … sur une texture de 256×256 pixels.

Les combinaisons sont multiples et si on devait créer une texture pour chacune d’elles, le jeu serait trop gros à télécharger.

D’abord voyons quelles sont les textures qui compose un avatar :

un couvre-chef:
un casque, chapeau
taille 78x27
une tête
taille  
64x64
les cheveux
taille 67x96
le torse
taille 98x107
les bras
taille 80x80
les mains
taille 32x32
les jambes
taille 80x80
les bottes
taille 78x80
l’arme
taille 78x72
le bouclier
taille 78x72
la cape
taille 125x77

Et un jour peut être le carquois de flèches. Les US gère la texture du carquois et des flèches dans l’emplacement du bouclier car il est vrai qu’il est impossible de se servir d’un arc quand on porte un bouclier. Comme pour le tigre, on retrouve ici le principe de symétrie dans les textures. Par exemple le côté gauche du torse est la symétrie du côté droit, pareil pour le visage, le pantalon …

Cela permet de gagner de la place mais au détriment de l’apparence de l’avatar. Par exemple, n’espérez pas mettre un beau blason de lion sur votre torse car celui-ci n’est pas symétrique. Dommage mais bon c’est comme ça.

Oui mais la texture 256x256 c'est où ?

Et bien l’astuce est dans le programme du client, plus exactement dans la fonction load_bmp8_enhanced_actor du fichier textures.c (dans le code source du client).

Cette fonction va, pour chaque avatar affiché à l’écran, reconstituer la texture 256×256 à partir des caractéristiques de l’avatar et de son équipement. En fait la texture reconstituée est la suivante :

Ce programme recrée la texture ci-dessus en plaçant les différents fichiers textures dans les positions suivantes :

  • pantalons (pants) : 78,175
  • bottes (boots) : 0,175
  • torse (torso) : 158,149
  • manches (arms) : 0,96
  • mains (hands) : 67,64
  • tête (head) : 67,0
  • cheveux (hair) : 0,0
  • arme (weapon) : 178,77
  • bouclier (shield) : 100,77
  • casque (helmet) ou chapeau (hat): 80,149
  • cape : 131,0

exemple :

Cela explique la taille de chaque texture individuelle. Il ne reste d’ailleurs plus beaucoup de place (zone blanche) pour rajouter de nouveaux objets sur les avatars. Créer de nouveaux équipements, impose de se conformer à ces tailles de texture. Toutes les armes ou les boucliers, par exemple, devront avoir une texture de 78×72 quelque soit la taille du mesh par rapport au reste de l’avatar.

Ce sont des limitations imposées par le programme et si on devait les modifier, il faudrait modifier cette fonction load_bmp8_enhanced_actor du programme client.