Manuel de maintenance du Surfelizer
Bruno FISCHEL - Karine NGUYEN - Vincent THOREL - Pierre-Jean TURPEAU - Frédéric VIDIL
15 juin 2001
Le manuel de maintenance est un outil d'aide à la
compréhension du code source du Surfelizer. Ce manuel sera
utile dans les cas suivants:
- Lecture et analyse du code source.
- Maintenance du code source pour les besoins du client en vue
d'ajouter de nouvelles fonctionnalités au logiciel.
- Mise à jour et correction des éventuels bugs.
Ce programme de surfelisation a été implémenté en langage C.
Les modules. Donc ce programme est portable sur toute les
architectures ou notre version de PovRay (la 3.1) à été testé:
Linux, Unix, DOS, Windows, Amiga et Macintosh.
Les répertoires du Surfelizer sont organisés comme suit:
- include: Contient les sources les fichiers .h
propre à PovRay. En effet, comme chaque fichier .h inclu une
vingtaine d'autres fichiers .h, nous somme contraint
d'inclure ici la totalité des fichiers header de PovRay, de plus le
fichier frame.h et d'autres probablement, contiennent des
variables globales. C'est pour cela que sont livrés tous les fichiers
header de PovRay.
- interface: Ce module sert d'interface entre les
fonctionnalités de PovRay et les routines nécessaires au Surfelizer.
C.à.d. que tous les appels réalisés par le programme de surfelisation
à la librairie de PovRay passent systématiquement par cette interface.
- lib-builder: Contient un programme autonome permettant de
compiler puis de générer une librairie libpov.a contenant
toutes les fonctions publiques de PovRay. Lors de la génération de
cette librairie, le code source de PovRay sera directement téléchargé
à partir du site officiel pour une mise à jour éventuelle. Néanmoins,
comme nous somme tributaires des équipes de dévelopement du logiciel
PovRay, une modification de celui-ci peut causer des
disfonctionnements plus ou moins sévères du Surfelizer. Il convient de
conserver une copie de sauvegarde (fournit) de la version 3.1 de
PovRay qui est la base sur laquelle nous avons travaillé.
- main: Contient les sources du Surfelizer, ils ont besoins
pour fonctionner d'utiliser: libpov.a et les fichiers
d'inclusion de PovRay.
- viewer: Contient un visualiseur d'objets surfelisés. Il
gère entre autre: librairie OpenGL, mouvement de caméra à la souris,
une source de lumière. Il fonctionne sous Linux et Unix(Solaris).
Dans notre Surfelizer, nous avons utilisé les sources de
PovRay. Les structures et les méthodes permettant de les
allouer en mémoire nous étant inconnues, nous avons choisi
cette solution:
Dans l'imposant main() de PovRay il apparaît les
phases suivantes:
- Initialisation des structures internes de PovRay. PovRay
redéfinit toutes les fonctions de gestion mémoire dans le module
mem.c en leur ajoutant des fonctionnalités, notamment la
possibilté de désallouer toute la mémoire utilisée depuis le lancement
du programme mem_release_all() ou seulement la mémoire,
allouée après l'appel de la fonction mem_mark() avec
mem_release(). L'allocation mémoire se fait par les appels
pov_malloc(), pov_calloc(), pov_realloc() et prend en dernier
paramètre une chaîne de caractères (msg) affichée sur la
sortie standard si l'allocation échoue. Attention!! La routine
pov_pre_init() du module povray.c doit être appelée
une seule fois AVANT tout appel à une fonction de type
pov_malloc().
- Chargement d'un fichier scène .pov. L'analyse et
l'initialisation des structures en mémoire se fait dans la fonction
Parse() du module parse.c.
- Calcul du rendu de cette scène.
- Enregistrement de l'image calculée.
- Libération de toutes les structures de PovRay.
Afin d'avoir notre propre main() et pour effectuer
des opérations conforme aux attentes des fonctions de PovRay,
voici les dispositions qui ont été prises:
- La fonction main() de PovRay a été désactivée.
- Les tâches suivantes ont été intégrées au surfelizer dans une
fonction d'initialisation du fichier pov_main.c:
initialisation des structures internes de PovRay et chargement d'un
fichier scène .pov.
- La tâche suivante a été intégrée au surfelizer dans une fonction
de libération du fichier pov_main.c: Libération de toutes
les structures de PovRay.
- Les tâches suivantes ont été tronquées pour le programme final:
calcul du rendu de la scène et enregistrement de l'image calculée.
La surfélisation d'une scène est réalisé dans le fichier
main.c du Surfelizer, les 2 modes de surfélisations
sont les suivants:
- Par objet: on tire 3 grilles de rayons dans les directions X, Y
et Z.
- Par triangle: pour chaque triangle est défini un repère servant
à répartir uniformément les surfels.
Cette partie gère le principal objectif du projet et se trouve
dans la fonction three_waves_surfelization(), en
voici le code LDA:
(XMin, XMax, YMin, YMax, ZMin, ZMax)
BoiteEnglobante ( Scène )
(XStep, YStep, ZStep)
calculPas(parametresUtilisateur);
Pour x de XMin à XMax par XStep faire
Pour y d YMin à YMax par YStep faire
Rayon
rayonNouveau ( ... )
Calculer les intersections, leurs normales, et leurs couleurs
et les enregistrer: throw_ray ( ... ).
Fin pour
Fin pour
Ce traitement est réalisé dans
triangles_surfelization(), l'algorithme est le
suivant:
Pour tout x étant donné un objet ``triangle'' de la scène faire
b
calculerBarycentre(x);
repère
calculerRepèreCalquéSurTriangle(x)
(UMin, UMax, VMin, VMax)
calculerRectEnglob(x,repere)
Pour u de UMin à UMax par Step
Pour v de VMin à VMax par Step
Rayon
rayonNouveau ( ... )
Calculer l'intersection, sa normale, sa couleur
et l'enregistrer.
Fin pour
Fin pour
Fin pour
Remarquons que le parcours des objets en triangle d'une scène
PovRay est plus compliqué qu'il n'y paraît: la structure des
objets étant une arborescence, ce parcours est en réalité un
parcours en profondeur d'un arbre avec élimination des objets
non triangulaires. Les fonctions réalisant ce parcours sont
les suivantes:
pov_deep_course_init() et
pov_deep_course_get_next().
Durant le calcul d'un surfel, dans le cas des objets CSG, sa
normale peut pointer vers l'interieur de l'objet.
Le cahier des charges imposant que les surfels soient
orientés vers l'exterieur, nous avons fait appel à la fonction
inside() qui permet de corriger leur orientation.
Cette correction s'effectue dans la fonction
pov_compute_normal_vector() du fichier
pov_interface.c. Après chaque calcul d'intersection,
nous appelons cette fonction qui corrige
l'orientation de la normale si besoin est. La figure suivante
illustre nos propos:
Figure 3.1:
Orientation des normales à un objet
|
|
Si une éventuelle mise à jour de PovRay le rend incompatible avec le
surfelizer, alors le module pov_interface.c permet de
réécrire le corps des fonctions appelées par le Surfelizer
sans modifier leur signature.
De plus, le site web http://tag.povray.org/ est mis à
disposition pour tout problème concernant les techniques et
algorithmes employés dans PovRay.
Pierre-Jean
2002-04-01