Blender (jusqu'à 2.49)
|
Materiaux
et Textures
Activer
tous les canaux Mapto
|
|
Quelques explications
sur la méthode d'activation des canaux Mapto
Activer
from Blender import Texture,Image,Material
mat = Material.Get('Material')
mtextures = mat.getTextures()
for mtex in mtextures:
if mtex!=None:
for n in range(0,13):
mtex.mapto|=1<<n |
mtex.mapto est une variable de type
"drapeau", c'est-à-dire que chaque bit correspond à un état
des canaux : [COL, NOR, CSP, CMIR, REF, SPEC, HARD, ALPHA, EMIT,...]
13
en tout . Donc 13 bits activables mais tous à zéro
au départ : 00000000000 .
Pour les activer, on utilise l'opérateur
"|" qui effectue un "ou" logique sur les bits de deux variables
. Si un bit est égal à zero et le bit correspondant
égal à 1, alors il renvoie 1 . Le bit pour COL est
le premier à droite . Pour l'activer il faut faire :
mtex.mapto|=1
ou mtex.mapto = mtex.mapto | 1
Le résultat vaut :
00000000001
= 00000000000 | 00000000001
La boucle :
...
for n in range(0,13):
mtex.mapto|=1<<n
... |
déplace le bit 1 tout à droite
de 13 places vers la gauche en utilisant l'operateur de rotation de bit
: <<
00000000011
= 00000000001 | 00000000010 : 1<<n, n vaut 1
00000000111
= 00000000011 | 00000000100 : 1<<n, n vaut 2
00000001111
= 00000000111 | 00000001000 : 1<<n, n vaut 3
...
Pour activer nominativement les canaux
mapto, on utilise un dictionnaire qui contient ces valeurs : Blender.Texture.MapTo
.
{'DISP': 4096, 'CSP': 4, 'AMB': 2048, 'EMIT': 64, 'HARD':
256, 'COL': 1, 'TRANSLU': 1024, 'RAYMIR': 512,
'ALPHA': 128, 'CMIR': 8, 'REF': 16, 'SPEC': 32, 'NOR':2}
...
mtex.mapto|= Blender.Texture.MapTo['COL']
.... |
est équivalent à :
Désactiver
Pour désactiver un canal mapto,
on fait une inversion des bits suivi d'un ET
logique avec les opérateurs "~&"sur le bit correspondant
.
...
mtex.mapto &=~ Blender.Texture.MapTo['COL']
.... |
Pour comprendre le processus utilisez
le bout de code suivant pour faire apparaître les bits du canal CSP,
soit 4 :
a=4
for b in [(a & 1<<n)>>n for n in range(15,-1,-1)]:print
b, |
Résultat :
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 (4)
Modifiez la variable a en utilisant
l'opérateur d'inversion
a=~4
for b in [(a & 1<<n)>>n for n in range(15,-1,-1)]:print
b, |
vous obtiendrez :
1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
(-5)
Superposez les deux résultats et
effectuez le calcul et sachant que
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0
ET
1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
1
donne
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0
Pour résumer l' inversion
des bits crée un masque qui protège tous les autres
bits de mapto et permet de n'atteindre que le seul et unique bit
du bouton CSP . |
Tester si un canal
est actif
...
if mtex.mapto & Texture.MapTo['COL']==Texture.MapTo['COL']:
.... # |
Combiner
les canaux sur une texture en particulier
import Blender
mat = Blender.Material.Get('bar')
# masque d'effacement
nonMT=0
for mt in dir(Blender.Texture.MapTo):
nonMT|=Blender.Texture.MapTo[mt]
mtextures = mat.getTextures()
if mtextures[0]!=None:
mtextures[0].mapto&=~nonMT
mtextures[0].mapto|=Blender.Texture.MapTo['COL']
if mtextures[1]!=None:
mtextures[1].mapto&=~nonMT
mtextures[1].mapto|=Blender.Texture.MapTo['NOR'] |\
Blender.Texture.MapTo['SPEC']
if mtextures[2]!=None:
mtextures[2].mapto&=~nonMT
mtextures[2].mapto|=Blender.Texture.MapTo['ALPHA'] |
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|