local


fonction local (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 local 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 local id_loc de l´objet id_obj.

local(id_loc)compile obj(id_obj)

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

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

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

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

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

local(0)obj(id_obj)=num

        La 1ère tion local 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 local 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 local 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 local 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 local à un objet

1) Écrire une fonction f(){...}
2) L´affecter comme fonction local à 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 local 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 local 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 local 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 local d´un objet est executée lors de son utilisation (si ´yes local´ est actif).
        On peut compiler et linker une fonction local 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 local à 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