local


fonction locale (comportement)

Principe
obj
utilisation
exemples
Voir aussi

Principe:

        Des "fonctions locales" peuvent être définies sur les objets pour constituer de véritables programmes intérieurs à l´objet et définissant son "comportement".
Ces fonctions peuvent communiquer entre elles, avec les autres objets ou le monde extérieur (voir exec local). Des variables automatiques, statiques, externes et globales à l´objet peuvent être définies. Les variables globales sont connues dans toutes les fonctions locales à cet objet et sont inconnues à l´extérieur.
        Plusieurs objets ayant les mêmes fonctions locales ne se comportent pas nécessairement de la même façon selon le contexte. Cette méthode permet donc de définir des "acteurs" munis de comportements autonomes.
       La première fonction locale d´un objet est exécutée lors de son affichage si yes local est actif.

Remarques importantes:
1) Lorsque des fonctions locales sont ajoutées à un objet elles sont automatiquement dupliquées et compilées à l´intérieur de l´objet.
Cependant il sera nécessaire de faire link local obj afin que soient résolues tous les indéfinis.
2) Par défaut les locales sur un objet id de type obj sont inhibées.
On peut les activer par: validate local obj(id)=1.
On peut les inhiber par: validate local obj(id)=0.

local obj

local(id_loc) obj(id_obj)

        Retourne le texte de la fonction locale id_loc de l´objet id_obj.

local(id_loc)compile obj(id_obj)

        Imprime la compilation de la fonction locale id_loc de l´objet id_obj.

local(id_loc)obj(id_obj)="f"

        Affecte la fonctiuon f() comme fonction locale id_loc de l´objet id_obj.

local(0)obj(id_obj)="f"

        Ajoute la fonction locale f() à l´objet id_obj.

local(0)obj(id_obj)=num

        La 1ère tion locale de l´objet id_obj correspond au case num: (num >= 0) de la fonction EXEC_OBJ_C(struct Objet *p_obj, long num) du fichier utilb.c

Remarques:

       Lors d´un affichage (si yes local a été activé) la 1ère fonction locale sera exécutée juste avant l´affichage de ce volume.
Utile pour attacher des propriétés dynamiques à un volume donné (par exemple une lvue ou une lumière particulière).
       L´une des fonctions number local ou name local retourne l´identificateur de l´objet dont une fonction locale est actuellement exécutée et peut être utilisée dans une telle fonction pour le modifier.
       A chaque calcul de perspective la 1ère fonction locale de la lvue (si elle existe) est exécutée. Dans une telle fonction on peut redéfinir la lvue (eye, aim, focale, roulis) en fonction du point calculé qui est retourné par poi. Utile pour créer une perspective adaptative (c´est à dire dépendant du point regardé).

Utilisation

Affecter une fonction locale à un objet

1) Écrire une fonction f(){...}
2) L´affecter comme fonction locale à plusieurs objets id1, id2, .. par:
local(0)obj(id1)="f";
local(0)obj(id2)="f";
...
3)Activer les les locales par: yes local.
Tous les objets id1,id2,..., munis d´un même comportement f, se comporteront différemment selon le contexte (puisqu´ils sont munis de programmes identiques mais s´éxecutant différemment).

Appels et variables

        Une variable déclarée local dans une fonction locale d´un objet sera considérée externe à toutes les fonctions locales de cet objet mais inconnue à l´extérieure.
        Les variables statiques declarées dans une fonction locale sont spécifiques à cette fonction et à l´objet concerné.
        Dans une fonction local, on peut appeler une autre fonction local du même objet simplement en l´invoquant par son nom.
        Pour appeler une fonction locale d´un objet spécifique id, faire:
exec local(id_loc) object(id_obj) var(x1) var(x2) ...,; avec:
        x1, x2, ...: paramètres d´appel.
        La première fonction locale d´un objet est executée lors de son utilisation (si ´yes local´ est actif).
        On peut compiler et linker une fonction locale particulière d´un objet id par:
compile local.
link local.

Exemples

Vue adaptative

Pour associer une lvue à un volume il suffit d´écrire une fonction locale à ce volume définissant les paramètres de la lvue en fonction des caractéristiques de ce volume.
Par exemple, pour voir le volume 1 toujours de face (même si on le fait tourner par exemple en faisant roty(.2*PI)vol(1);):
cube(1);local(0)vol(1)="f";generate axis vol(1);
f()
{
self=number local; /* Recupérer l´identificateur du volume */
cg=CG matrix vol(self); /* CG du volume */
ax=axis vol(self);x=ax{0}; /* Axe x du volume */
r=radius vol(self); /* Rayon du volume */
eye(cg+3*r*x); /* L´oeil est sur x a la distance 3*r */
}

local(0)vol(1)="f";yes local;

Voir aussi:

compile local
edit local
exec local
no local
rem local
validate local
yes local