- updating some bundled scripts, thanks to authors Jean-Michel Soler, Campbell Barton and Anthony D'Agostino.

BPython:
- removing wrong fix from BGL.c's glDrawPixels.

note: applied guitargeek's setName patch to Blender.Key, but saw that he updated it with more functionality and assigned to stivs, so I won't commit this old version.
This commit is contained in:
2005-10-11 02:32:58 +00:00
parent 93a4f6a876
commit b970eadedf
12 changed files with 3994 additions and 1553 deletions

View File

@@ -2,7 +2,7 @@
""" Registration info for Blender menus: <- these words are ignored
Name: 'Dispaint'
Blender: 233
Blender: 237
Group: 'Mesh'
Tip: 'use vertex paint color value to modify shape displacing vertices along normal'
"""
@@ -11,7 +11,7 @@ __author__ = "Jean-Michel Soler (jms)"
__url__ = ("blender", "elysiun",
"Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_displacementpainting.htm",
"Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender")
__version__ = "233i"
__version__ = "237"
__bpydoc__ = """\
This script displaces mesh vertices according to vertex color values.
@@ -81,6 +81,7 @@ from Blender.Draw import *
from Blender.BGL import *
from Blender.Noise import *
from Blender.Scene import *
from Blender.Window import *
sc=Scene.getCurrent()
# niveau du deplacement
@@ -117,6 +118,7 @@ E_AXESELX = 46
E_AXESELY = 47
E_AXESELZ = 48
E_NOISEME = 49
E_NOISEH = 50
E_NOISELAC = 51
@@ -126,10 +128,28 @@ E_NOISEBAS = 54
E_NOISEVAL=[E_NOISEH,E_NOISELAC,E_NOISEOCT,E_NOISEOFF,E_NOISEBAS]
E_NOISEDIM = 55
E_GETCOLORS = 56
E_UVCOLORS = 57
E_SAVECOLORS = 58
B_SAVECOLORS = 0
E_RESTCOLORS = 60
V_RESTCOL=0
F_RESTCOL=0
BUF_COLORS=[]
RVBA_VALUE=61
RVBA_VERTICES=62
RVBA_FACES=63
ExitTIP="Exit from this script session "
CreateTIP="Create a new copy of the selected shape"
ActionTIP="Do the current selected actions"
UVCOLORSTIP="Get colrs from first available UV image "
GETCOLORSTIP="Get color from textures "
REPEATTIP="Replay the same action with new values ."
def copy_transform(ozero,Obis):
Obis.setSize(ozero.getSize());
@@ -298,9 +318,23 @@ def DOCMat_list(TMATList):
TMATList[0]=0
return TMATList
MOname = "MODE MENU %t|Normal %x1|Material %x2|Selected %x3"
MOname = "MODE MENU %t|Normal %x1|Material %x2|Selected %x3| Find color %x4"
MOname_doc=["",
"Displace all vertices",
"Displace vertices only on selected materials . ",
"Displace only selected vertices .",
"Try to find and set selected the vertices with this color."]
ORname = "ORIENT MENU %t|From Normal %x1|Local Axes %x2| Noise %x3"
NOname = "NOISE MENU %t|BLENDER %x1|STDPERLIN %x2|NEWPERLIN %x3|VORONOI_F1%x4|VORONOI_F2%x5|VORONOI_F3%x6|VORONOI_F4%x7|VORONOI_F2F1%x8|VORONOI_CRACKLE%x9|CELLNOISE%x10|HETEROTENOISE%x11"
ORname_doc=["",
"Use normal orientation to calculate displacement",
"Use selected axes value to calculate displacement",
"Blend the color value with Nosie values to calculate the displacement"]
NOname = "NOISE MENU %t|BLENDER %x1|STDPERLIN %x2|\
NEWPERLIN %x3|VORONOI_F1%x4|VORONOI_F2%x5|\
VORONOI_F3%x6|VORONOI_F4%x7|VORONOI_F2F1%x8|\
VORONOI_CRACKLE%x9|CELLNOISE%x10|HETEROTENOISE%x11"
MODEMenu = Create(1)
ORIENTMenu = Create(1)
@@ -351,48 +385,190 @@ glCl3=glColor3f
glCl4=glColor4f
glRct=glRectf
def triangle(a,b,c):
glBegin(GL_TRIANGLES);
glColor3f(a[2],a[3],a[4])
glVertex2f(a[0],a[1]);
glVertex2f(b[0],b[1]);
glVertex2f(c[0],c[1]);
glEnd();
def triangleFcolor(a,b,c):
glBegin(GL_TRIANGLES);
glColor4f(a[2],a[3],a[4],a[5])
glVertex2f(a[0],a[1]);
glColor4f(b[2],b[3],b[4],a[5])
glVertex2f(b[0],b[1]);
glColor4f(c[2],c[3],c[4],a[5])
glVertex2f(c[0],c[1]);
glEnd();
def Ltriangle(a,b,c,LC=0.5):
TL=[a,b,c,a]
for v in [0,1,2] :
glBegin(GL_LINES);
glColor3f(LC,LC,LC)
glVertex2f(TL[v][0],TL[v][1]);
glVertex2f(TL[v+1][0],TL[v+1][1]);
glEnd();
def carreFcolor(a,b,c,d):
triangleFcolor(a,b,c)
triangleFcolor(a,c,d)
RVBA=[Create(255),Create(255),Create(255),Create(255),Create(0)]
# _*_ p1
# _/ \_
# _/ \_
# / \_
# p0*_ /* p2
# | \_ _/ |
# | \_ _/ |
# | \_ _/ |
# | * p3 |
# | | |
# *_ | /* p4
# p6 \_ | _/
# \_ | _/
# \_|_/
# * p5
def flatcolorcube(r,g,b,a,m,x,y):
h0=60
v0=40
A=[x, y, (r-m)/255.0,g/255.0,b/255.0,a/255.0] #p0
B=[x+h0,y-v0, r/255.0,g/255.0,b/255.0,a/255.0] #p3
c=[x+h0*2,y, r/255.0, g/255.0, (b-m)/255.0,a/255.0] #p2
d=[x+h0,y+v0, (r-m)/255.0,g/255.0,(b-m)/255.0,a/255.0] #p1
carreFcolor(A,B,c,d)
A=[x,y,(r-m)/255.0,g/255.0,b/255.0,a/255.0] #p0
B=[x+h0,y-v0,r/255.0,g/255.0,b/255.0,a/255.0] #p3
c=[x+h0,y-v0*2.5, r/255.0, (g-m)/255.0, b/255.0,a/255.0] #p5
d=[x,y-v0*1.5,(r-m)/255.0,(g-m)/255.0,b/255.0,a/255.0] #p6
carreFcolor(A,B,c,d)
d=[x+h0,y-v0,r/255.0,g/255.0,b/255.0,a/255.0] #p3
A=[x+h0*2,y,r/255.0,g/255.0,(b-m)/255.0,a/255.0] #p2
B=[x+h0*2,y-v0*1.5, r/255.0, (g-m)/255.0,(b-m)/255.0,a/255.0] #p4
c=[x+h0,y-v0*2.5,r/255.0,(g-m)/255.0,b/255.0,a/255.0] #p5
carreFcolor(A,B,c,d)
def col_egal2col(col,RVBA):
eps=RVBA[4].val
if ( (RVBA[0].val-col[0]>=0 and RVBA[0].val-col[0]<=eps) and
(RVBA[1].val-col[1]>=0 and RVBA[1].val-col[1]<=eps) and
(RVBA[2].val-col[2]>=0 and RVBA[2].val-col[2]<=eps) and
(RVBA[3].val-col[3]>=0 and RVBA[3].val-col[3]<=eps) ) :
#print 'ok',col, [RVBA[n].val-col[n] for n in 0,1,2,3]
return 1
else:
#print 'not',col, [RVBA[n].val-col[n] for n in 0,1,2,3]
return 0
def select_bycolors(TYPE,RVBA):
global RVBA_VERTICES, RVBA_FACES
SEL = Blender.NMesh.FaceFlags['SELECT']
try:
ME=Blender.Scene.getCurrent().getActiveObject().getData()
VC={}
for f in ME.faces:
for v in f.v:
try:
VC[v].append(f)
except:
VC[v]=[f]
#print '.',
for C in VC.iteritems():
color=[0,0,0]
for f in C[1]:
col=f.col[f.v.index(C[0])]
col=[col.r,col.g,col.b,col.a]
if col_egal2col(col,RVBA):
if TYPE== RVBA_VERTICES:
C[0].sel=1
else:
f.sel=1
f.flag |= SEL
#VC[C[0]].append(color[:])
ME.update()
except:
pass
def draw():
global MODEMenu, NSIZE, TDOCMat,TMATList, TAXEList
global mat, ORIName, NEWName, ORIENTMenu
global NRepeat, ERROR, TextERROR , NOISE, NOISEMenu, NOISEDIMbout,NOISEDIM
global NRepeat, ERROR, TextERROR , NOISE, NOISEMenu
global NOISEDIMbout,NOISEDIM, RVBA,RVB_VALUE, RVBA_VERTICES
global HBout,lacunarityBout,octavesBout,offsetBout,basisBout
global noiseTYPE, ExitTIP, CreateTIP, ActionTIP
global noiseTYPE, ExitTIP, CreateTIP, ActionTIP, E_GETCOLORS
global E_UVCOLORS, UVCOLORSTIP, GETCOLORSTIP, REPEATTIP,RVBA_FACES
global E_SAVECOLORS, B_SAVECOLORS, E_RESTCOLORS, MOname_doc, ORname_doc
size=Buffer(GL_FLOAT, 4)
glGetFloatv(GL_SCISSOR_BOX, size)
size= size.list
for s in [0,1,2,3]: size[s]=int(size[s])
glClearColor(0.72,0.72,0.72,1.0)
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(0.0,0.0,0.0)
glRectf(4,size[3],534,size[3]-32 )
glColor3f(0.66,0.66,0.66)
glRectf(4,size[3]-4,404,size[3]-32 )
glColor3f(0.76,0.76,0.76)
glRectf(4,size[3]-32,404,size[3]-294 )
triangle([4+9,size[3],0.72,0.72,0.72],
[4,size[3],],
[4,size[3]-9])
triangle([404-9,size[3],0.72,0.72,0.72],
[404,size[3],],
[404,size[3]-9])
triangle([404,size[3]-294,.72,0.72,0.72],
[404,size[3]-294+9,],
[404-9,size[3]-294])
triangle([4,size[3]-294,.72,0.72,0.72],
[4,size[3]-294+9,],
[4+9,size[3]-294])
glColor3f(1.0,1.0,1.0)
glRasterPos2f(20, size[3]-15)
Text("Script Python de displacement paintingt")
Text("Script Python de displacement painting")
glRasterPos2f(20, size[3]-28)
Text("Jean-michel Soler, juillet 2004")
Text("Jean-michel Soler, Aout 2005")
n0=70
n1=55
if MODEMenu.val<4 :
Button("Create" ,E_CREATE ,5 ,size[3]-n0+11 ,60 ,20,CreateTIP)
Button("Action" ,E_ACTION ,5 ,size[3]-n0-11 ,60 ,20,ActionTIP)
NRepeat=Number("repeat" ,E_REPEAT ,5 ,size[3]-n0-56 ,75 ,20, NRepeat.val,1,10,REPEATTIP)
Button("Exit" ,E_EXIT ,5 ,size[3]-n0-32 ,60 ,20,ExitTIP)
Button("Tex colors" ,E_GETCOLORS ,5 ,size[3]-n0-80 ,75 ,20,GETCOLORSTIP)
Button("UV colors" ,E_UVCOLORS ,5 ,size[3]-n0-102 ,75 ,20,UVCOLORSTIP)
if B_SAVECOLORS :
Button("Rest colors" ,E_RESTCOLORS ,5 ,size[3]-n0-146 ,75 ,20,UVCOLORSTIP)
else:
Button("Save colors" ,E_SAVECOLORS ,5 ,size[3]-n0-124 ,75 ,20,GETCOLORSTIP)
Button("Create" ,E_CREATE ,5 ,size[3]-n0+16 ,60 ,20,CreateTIP)
Button("Action" ,E_ACTION ,5 ,size[3]-n0-4 ,60 ,20,ActionTIP)
Button("Exit" ,E_EXIT ,5 ,size[3]-n0-24 ,60 ,20,ExitTIP)
NRepeat=Number("repeat" ,E_REPEAT ,5 ,size[3]-n0-50 ,75 ,20, NRepeat.val,1,10)
glColor3f(0.0,0.0,0.0)
glRasterPos2f(80 ,size[3]-n0+24)
Text("MODE")
MODEMenu= Menu(MOname, E_MODE ,80 ,size[3]-n0 ,100,20, MODEMenu.val, "MODE menu.")
MODEMenu= Menu(MOname, E_MODE ,80 ,size[3]-n0 ,100,20, MODEMenu.val, MOname_doc[MODEMenu.val])
if MODEMenu.val==2:
TDOCMat=Toggle("Doc Mat" ,E_DOCMAT ,180 ,size[3]-n0 ,60 ,20,TDOCMat.val)
@@ -402,14 +578,22 @@ def draw():
glCl3(TMATList[1][t][0],
TMATList[1][t][1],
TMATList[1][t][2])
glRct(80+t*40,
size[3]-n0-60,
80+t*40+40,
size[3]-n0-60+40)
TMATList[2][t]=Toggle("%s"%t , 32+t ,80+t*40+5 ,size[3]-n0-50 ,30 , 20,TMATList[2][t].val)
if t<=7:
glRct(80+t*40,
size[3]-n0-60,
80+t*40+40,
size[3]-n0-60+40)
TMATList[2][t]=Toggle("%s"%(t+1) , 32+t ,80+t*40+5 ,size[3]-n0-50 ,30 , 20,TMATList[2][t].val)
else:
glRct(80+(t-8)*40,
size[3]-n0-50-50,
80+(t-8)*40+40,
size[3]-n0-60)
TMATList[2][t]=Toggle("%s"%(t+1) , 32+t ,80+(t-8)*40+5 ,size[3]-n0-45*2 ,30 , 20,TMATList[2][t].val)
glColor3f(1.0,0.3,0.0)
glRasterPos2f(80+40+5 ,size[3]-n0-80)
glRasterPos2f(80+40+5 ,size[3]-n0-110)
if ERROR>1:
Text('Last error : '+TextERROR)
else:
@@ -417,35 +601,66 @@ def draw():
glColor3f(0.0,0.0,0.0)
glRasterPos2f(240 ,size[3]-n0+24)
Text("ORIENTATION")
ORIENTMenu= Menu(ORname, E_ORIENT ,240 ,size[3]-n0 ,100,20, ORIENTMenu.val, "ORIENT menu.")
if ORIENTMenu.val==2 :
for t in range(3):
TAXEList[1][t]=Toggle("%s"%TAXEList[0][t],
E_AXESEL+t,
240+100+t*30 , size[3]-n0 ,30 , 20,
TAXEList[1][t].val)
if ORIENTMenu.val==3 :
glRasterPos2f(240 ,size[3]-n0-90-4)
Text("NOISE")
NOISEMenu= Menu(NOname, E_NOISEME , 240 ,size[3]-n0-118 ,110,20, NOISEMenu.val, "NOISE menu.")
NOISEDIMbout=Number(" Dim: " ,E_NOISEDIM , 240 ,size[3]-n0-138 ,110,20, NOISEDIMbout.val, 1,100)
if NOISEMenu.val==11:
basisBout=Slider(noiseTYPE[basisBout.val],
E_NOISEBAS ,40 ,size[3]-n0-118 ,175,20, basisBout.val, 0,9,)
HBout= Slider("H", E_NOISEH ,40 ,size[3]-n0-138 ,175,20, HBout.val, -2.0,+2.0,0,)
lacunarityBout=Slider("lacunarity", E_NOISELAC ,40 ,size[3]-n0-158 ,175,20, lacunarityBout.val, -4.0,+4.0,0,)
octavesBout=Slider("octave", E_NOISEOCT ,40 ,size[3]-n0-178 ,175,20, octavesBout.val, -10.0,+10.0,0,)
offsetBout=Slider("offset", E_NOISEOFF ,40 ,size[3]-n0-198 ,175,20, offsetBout.val, -5.0,+5.0,0,)
NSIZE= Slider("Disp Size", E_NSIZE ,80 ,size[3]-n0-20 ,260,20, NSIZE.val, -4.0,+4.0,0,"SIZE.")
if MODEMenu.val<4:
Text("ORIENTATION")
ORIENTMenu= Menu(ORname, E_ORIENT ,240 ,size[3]-n0 ,100,20, ORIENTMenu.val, ORname_doc[ORIENTMenu.val])
if ORIENTMenu.val==2 :
for t in [0,1]:
TAXEList[1][t]=Toggle("%s"%TAXEList[0][t],
E_AXESEL+t,
240+100+t*30+2 , size[3]-n0+10 ,28 , 18,
TAXEList[1][t].val)
TAXEList[1][2]=Toggle("%s"%TAXEList[0][2],
E_AXESEL+2,
int(240+100+.5*30+2) , size[3]-n0-10 ,28 , 18,
TAXEList[1][2].val)
if ORIENTMenu.val==3 :
glRasterPos2f(240 ,size[3]-n0-120-4)
Text("NOISE")
NOISEMenu= Menu(NOname, E_NOISEME , 240 ,size[3]-n0-148 ,110,20, NOISEMenu.val, "NOISE menu.")
NOISEDIMbout=Number(" Dim: " ,E_NOISEDIM , 240 ,size[3]-n0-172 ,110,20, NOISEDIMbout.val, 1,100)
if NOISEMenu.val==11:
basisBout=Slider(noiseTYPE[basisBout.val],
E_NOISEBAS ,40 ,size[3]-n0-178 ,175,20, basisBout.val, 0,9,)
HBout= Slider("H", E_NOISEH ,40 ,size[3]-n0-198 ,175,20, HBout.val, -2.0,+2.0,0,)
lacunarityBout=Slider("lacunarity", E_NOISELAC ,40 ,size[3]-n0-218 ,175,20, lacunarityBout.val, -4.0,+4.0,0,)
octavesBout=Slider("octave", E_NOISEOCT ,219 ,size[3]-n0-198 ,175,20, octavesBout.val, -10.0,+10.0,0,)
offsetBout=Slider("offset", E_NOISEOFF ,219 ,size[3]-n0-218 ,175,20, offsetBout.val, -5.0,+5.0,0,)
NSIZE= Slider("Disp Size", E_NSIZE ,80 ,size[3]-n0-20 ,260,20, NSIZE.val, -4.0,+4.0,0,"SIZE.")
else:
# degrades de couleurs
glShadeModel(GL_SMOOTH)
#transparence
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
RVBA[0]=Slider("Red :", RVBA_VALUE , 105 ,size[3]-n0-25 ,280,20, RVBA[0].val, 0,255,0,"")
RVBA[1]=Slider("Green :", RVBA_VALUE , 105 ,size[3]-n0-47 ,280,20, RVBA[1].val, 0,255,0,"")
RVBA[2]=Slider("Blue :", RVBA_VALUE , 105 ,size[3]-n0-69 ,280,20, RVBA[2].val, 0,255,0,"")
RVBA[3]=Slider("Alpha :", RVBA_VALUE , 105 ,size[3]-n0-91 ,150,20, RVBA[3].val, 0,255,0,"")
RVBA[4]=Slider("margin :", RVBA_VALUE , 105 ,size[3]-n0-113 ,150,20, RVBA[4].val, 0,255,0,"")
flatcolorcube(RVBA[0].val,
RVBA[1].val,
RVBA[2].val,
RVBA[3].val,
RVBA[4].val,
270,size[3]-n0-120)
Button("Vertex" ,RVBA_VERTICES ,5 ,size[3]-n0-148 ,75 ,20,CreateTIP)
Button("Faces" ,RVBA_FACES ,5 ,size[3]-n0-169 ,75 ,20,ActionTIP)
def on_MESH():
Me=Object.GetSelected()
if Me!=[] and Me[0].getType()=='Mesh':
editmode = Window.EditMode()
if editmode: Window.EditMode(0)
return 1,Me[0].getData()
else:
return 0, None
def event(evt, val):
if (evt== QKEY and not val): Exit()
@@ -455,21 +670,20 @@ def bevent(evt):
global mat, ORIENTMenu, NRepeat, TAXEList
global ERROR,TextERROR, NOISE, NOISEMenu, NOISEDIMbout,NOISEDIM
global HBout,lacunarityBout,octavesBout,offsetBout,basisBout
global H,lacunarity,octaves,offset,basis
global H,lacunarity,octaves,offset,basis, E_RESTCOLORS, RVBA_VERTICES
global E_GETCOLORS, E_UVCOLORS, E_SAVECOLORS, B_SAVECOLORS
global V_RESTCOLORS, F_RESTCOLORS, BUF_COLORS, RVBA, RVBA_FACES
if (evt== E_EXIT):
Exit()
elif (evt== E_ACTION):
for n in range(NRepeat.val):
paint()
elif (evt== E_NSIZE):
ng=NSIZE.val
elif (evt== E_DOCMAT) or (evt in E_MATVAL):
Me=Object.GetSelected()
if Me!=[]:
if Me[0].getType()=='Mesh':
TMATList=DOCMat_list(TMATList)
@@ -484,29 +698,68 @@ def bevent(evt):
else:
ERROR=1
TextERROR='No Selected Object.'
elif (evt== E_CREATE):
NEWMEcreation(Blender.Object.GetSelected()[0])
Blender.Draw.Redraw()
ERROR=1
TextERROR='No Selected Object.'
elif (evt== E_NOISEME):
NOISE=NOISEMenu.val-1
elif (evt in E_NOISEVAL):
H=HBout.val
lacunarity=lacunarityBout.val
octaves=octavesBout.val
offset=offsetBout.val
basis=basisBout.val
elif (evt== E_NOISEDIM):
NOISEDIM=NOISEDIMbout.val
elif (evt == E_GETCOLORS):
OK,MESH=on_MESH()
if OK: MESH.update(1,0,1)
elif (evt == E_UVCOLORS):
OK,MESH=on_MESH()
if OK and MESH.hasFaceUV():
for f in MESH.faces:
if f.image:
im=Blender.Image.Get(f.image.name)
break
imX,imY = im.getMaxXY()
for f in MESH.faces:
for uv in f.uv:
color=[int(c*255.0) for c in im.getPixelF(abs(uv[0]*imX%imX), abs(uv[1]*imY%imY))]
f.col[f.uv.index(uv)].r=color[0]
f.col[f.uv.index(uv)].g=color[1]
f.col[f.uv.index(uv)].b=color[2]
f.col[f.uv.index(uv)].a=color[3]
MESH.update()
elif (evt == E_SAVECOLORS):
OK,MESH=on_MESH()
print OK, MESH
if OK and (MESH.hasFaceUV() or MESH.hasVertexColours()):
F_RESTCOLORS=1
for f in MESH.faces:
b=[MESH.faces.index(f)]
for c in f.col:
b.append([c.r,c.g,c.b,c.a])
BUF_COLORS.append(b)
B_SAVECOLORS = 1
else:
B_SAVECOLORS = 0
elif (evt == E_RESTCOLORS):
OK,MESH=on_MESH()
print F_RESTCOLORS, len(BUF_COLORS),len(MESH.faces)
if OK and F_RESTCOLORS==1 and len(BUF_COLORS)==len(MESH.faces):
for b in BUF_COLORS:
ncol=0
for c in MESH.faces[b[0]].col :
print b[ncol+1]
c.r,c.g,c.b,c.a= b[ncol+1]
ncol+=1
F_RESTCOLORS=0
B_SAVECOLORS = 0
BUF_COLORS=[]
MESH.update()
elif (evt == RVBA_VERTICES or evt == RVBA_FACES):
select_bycolors(evt,RVBA)
Blender.Draw.Redraw()
Register(draw, event, bevent)