Light Exclusion

Description Explications


Bon alors chose promise chose dûe, je vais détailler le script:
Premiere chose, la composition du script en lui-même

En gros ya 2 parties principales dans le script: la première on où déclare tout ce qui touche à l'interface graphique du script: boutons, texte, .... et la deuxième partie qui contient les procédures correspondant aux actions à effectuer lorsqu'on clique sur tel bouton, qu'on change telle valeur...etc

Pour la première partie, ya pas à s'en faire c'est généré tout seul par visual Maxscript: la fenêtre représentant le rollout s'affiche et ya plus qu'à placer ses boutons où on veut. une fois que c'est fait on ferme la fenêtre et le code correspondant est généré tout seul. (ya même possibilté d'écrire tout le code directement dans depuis visual maxscript mais j'aime pas parcequ'on voit pas tout ce qu'on fait. Mais bon c'est chacun selon ses gouts.

Tout d'abord on définit une fonction:

fn filtre_l ob = superClassOf(ob)==light

Cette fonction filtre_l teste si l'objet ob est de type (superClassOf) light;
C'est cette fonction qui servira de filtre au bouton suivant qui permet de choisir sa lumière dans la scène en cliquant dessus:

pickbutton pick_l "Light:" pos:[6,8] width:148 height:20 filter:filtre_l

le bouton qui permettra de choisir la lumière dans la scène: il s'appelle pick_l et il est de type pickbutton, ie qu'après avoir cliqué dessus, il attend que l'on clique sur un élément de la scène. On peut en plus filtrer les objets sur lesquels on peut cliquer, ce qui est fait ici avec la fonction filtre_l qui n'autorise que les lights.

button btne "Exclure" pos:[6,228] width:148 height:26 enabled:false

déclaration simple d'un bouton, nom btne, de titre (ou caption) "exclure", paramètres de position, de taille et enfin enabled:false, ie que par défaut il n'est pas cliquable.

global lum=undefined
global sel=undefined


déclaration de deux variables globales lum et sel qui contiendront respectivement la lumiere qui nous interesse et la liste des objets à garder.

listBox listb "A illuminer:" pos:[18,48] width:124 height:8
groupBox grp1 "Selection" pos:[8,34] width:146 height:180
button btn_def "Définir" pos:[20,182] width:120 height:20


déclarations d'une listbox, qui affichera les noms des éléments à garder, d'une groupbox (n'intervient que pour l'interface graphique, aucun interet en soi) et d'un autre bouton.
Voila pour la première partie...


Maintenant la deuxième, le "vrai" script en lui-même:
on commence par une fonction liste selc qui sert à remplir la listbox avec les noms des objets de selc

fn liste selc =
(
if (selc.count != 0) then
(
listb.items=#(selc[1].name)
for i=2 to selc.count do listb.items=listb.items + #(selc[i].name)
)
)

si la liste n'est pas vide (son nombre d'élèments est différent de 0) on ajoute le nom du premier élèment de selc à la liste des objets de listb -> tout est sous forme de liste d'où les #() qui indiquent qu'il s'agit de tableaux donc listb.items=#(selc[1].name) ensuite du deuxième élèment au dernier, on ajoute à la liste des objets le i-ième.
mais il y a moyen de faire légèrement plus court en utilisant, à la place de
listb.items=listb.items + #(selc[i].name)
la construction listb.items+=#(selc[i].name) qui revient exactement au même.

Ici, on choisit la lumière de la scène qui nous interesse:

on pick_l picked objl do
(
btne.enabled=true
pick_l.caption="Light: " + objl.name
lum=objl
)

lorsque le bouton pick_l est enfoncé, objl contenant l'objet de la scène sur lequel on a cliqué,
  • on active le bouton btne (enabled=true)
  • on change le titre (ou caption) du bouton pick_l par "Light: " + le nom de l'objet
  • et enfin on affecte à la variable lum l'objet en question.


Même principe mais cette fois pour ce qui est des objets à garder:

on btn_def pressed do
(
sel=selection as array
liste sel
)


lorsqu'on clique sur le bouton btn_def, la sélection en cours d'objets de la scène est affectée à la variable sel en tant que tableau (as array).
Ensuite on appelle la fonction liste qu'on a définie plus haut pour remplir la listbox avec les noms de la sélection.

Vient en fin la proocédure principale:

on btne pressed do
(
undo on "Exclusion"
(
select $*
deselect lights
deselect sel
lum.excludeList=(selection as array)
deselect $*
)
)

Il apparait ici la structure undo on "Exclusion" ( ... ). Elle permet simplement de pouvoir anuler, sous le nom d'i>Exclusion, tout ce qui est entre parenthèses en passant par le menu edit de max.
Tout d'abord, on sélectionne tous les objets de la scène grâce à select $* (on peut tout aussi bien selectionner uniquement les objets dont le nom commence par "xyz" en faisant select $xyz*, ...etc)
Puis, on déselectionne tous les objets de type light: deselect lights
Enfin, on déselectionne les objets que l'on voulait garder qui sont sotckés dans la variable sel: deselect sel.
A ce niveau-là, tous les objets de la scène sont selectionnés sauf les lumières et ceux qu'on veut garder. Tous ceux qui sont selectionnés sont donc à exclure de l'illumination de la lumière lum, ce qui est fait par: lum.excludeList=(selection as array).
Pour finir, on déselectionne tout: deselect $*.

Et voila.


haut