Format .MAP

 
 
Le fichier map standard est utilisé par les éditeurs pour les jeux basés sur le moteur de Quake et ses dérivés.
 
C'est un format qui permet d'enregistrer un niveau dans un format non compilé qui permet d'être utilisé par divers éditeurs et pour divers jeux.
 
C'est un fichier texte séparé en deux parties distinctes, la partie consacrée aux polyèdres fixes du monde du jeu "worldspawn" et une autre partie consacrée aux entités placées dans la carte. En fait le worldspawn est une entité lui-même.
 
Le commentaires ou les informations propres à l'éditeur sont précédées de //, ces informations ne sont pas prises en compte pour la géométrie réelle du niveau. Ces informations servent à classer les polyèdre par groupe par exemple.
Chaque élément de la map est défini comme une entité avec un classname qui est le nom de l'entité, par exemple worldspawn ou light etc...
Chaque élément est contenu entre deux parenthèses { }, chaque polyèdre dans un élément est contenu également entre deux parenthèses { }.
 
Chaque polyèdre ou "Brush" est défini par les surfaces qui le composent, chaque surface est définie par 3 sommets, par le nom de la texture, l'offset de la texture, l'angle de la texture et son échelle sur les deux axes. Il y a encore des valeurs possibles pour des informations sur le contenu, les flags, et une autre valeur.
 
 
Si on regarde les valeurs des trois sommets on sera surpris car seul le premier correspond à un véritable sommet du polyèdre. En effet, chaque surface n'est pas définie par tous ses sommets comme la logique le voudrais, mais par trois sommets seulement. Pour définir une surface plane, on a besoin en fait que de trois sommets, c'est l'éditeur de map qui va ensuite calculer les intersections entre tous les plans du polyèdre et définir tous les sommets.
Je pense que ce choix a été fait pour limiter au maximum la taille des fichier map et simplifier leur manipulation.
Mais simplement définir trois points n'est pas suffisant, car il faut également définir quel est l'extérieur du polyèdre, sinon l'éditeur ne saura pas comment créer ce polyèdre.
C'est l'ordre dans lequel les sommets sont définis qui fait basculer la normale de la surface. La normale étant un vecteur perpandiculaire à la surface, si la normale pointe vers l'extérieur du polyèdre la surface sera visible et le polyèdre sera fermé et valide.
 
Il faut bien rappeler que seules les surfaces planes sont valides et seuls les polyèdres convexes le sont également. Un polyèdre convexe est un polyèdre où chaque point qui le constitue peut avoir tous les autres point en vue directe depuis l'intérieur. Par exemple dans une sphère on peut voir nimporte quel autre point de la sphère, mais si on lui fait une bosse certains endroit ne seront plus visibles de partout et le volume ne sera plus convexe.
 
Le premier sommet défini est toujours un sommet du polyèdre, les deux autres sont simplement calculés pour être dans le bon plan et dans l'ordre voulu pour que la normale soit dans le bon sens.
 
Pour connaître l'ordre dans lequel placer les deux autre sommets, on commence par définir la normale à la surface, cette normale est obtenue par calcul vectoriel simple. En effet un polyèdre doit absolument être un voulme convexe, ce qui signifie que pour trouver le sens de la normale à un sommet, il suffit de se référer au centre du polyèdre.
On trace un vecteur du sommet vers le centre, et on le compare avec le produit vectoriel obtenus avec les deux vecteur qu'on obtient à partir des trois sommets de la surface. Si les deux vecteurs ont des directions opposées on sait dans quel ordre placer les sommets, l'ordre est une question de convention du format map.
 
Le reste des informations sur la surface, c'est le nom de la texture, puis les coordonnées de placement de la texture sur la surface.
On a tout d'abord l'offset (décalage) (x, y) entre l'origine de la surface et l'origine de la texture (basé sur le premier sommet)
Puis on a l'angle d'orientation de la texture (-180° à 180°)
La troisième information, c'est l'échelle de la texture sur les deux axes.
 
Les dernières valeurs ne sont pas communes à tous les jeux, il peut y avoir une information sur le contenu (par exemple de l'eau) ou sur des flags divers qui vont donner des indication sur le comportement de la surface selon les conditions du jeu.
 
Les jeux les plus anciens avaient recours à ces valeurs qui ne sont plus utilisées aujourd'hui avec Quake 3 et l'introduction les shaders qui contiennent ces informations. C'est bien plus pratique, car on peut modifier les shaders sans avoir à toucher au fichier map polyèdre après polyèdre et on peut même modifier le comportement d'une surface sans avoir à recompiler la map. Le shaders sont lus par le moteur du jeu et peuvent être modifiés en tout temps une fois le niveau terminé.