diff options
Diffstat (limited to 'release/scripts/disp_paint.py')
-rw-r--r-- | release/scripts/disp_paint.py | 292 |
1 files changed, 183 insertions, 109 deletions
diff --git a/release/scripts/disp_paint.py b/release/scripts/disp_paint.py index 30bcd9e88f4..01a6da8cc98 100644 --- a/release/scripts/disp_paint.py +++ b/release/scripts/disp_paint.py @@ -1,29 +1,57 @@ #!BPY """ Registration info for Blender menus: <- these words are ignored -Name: 'Dispaint' -Blender: 234 +Name: 'dispaint' +Blender: 233 Group: 'Mesh' -Tip: 'Use vertex paint color value to modify shape displacing vertices along normal' +Tip: 'use vertex paint color value to modify shape displacing vertices along normal' +""" + +__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" + +__bpydoc__ = """\ +This script displaces mesh vertices according to vertex color values. + +Usage: + +Select the mesh, enter Edit Mode and run this script to open its GUI. Options +include setting mode, orientation, size and number of repetitions of the +displacement. You can enter Vertex Paint mode and alternate applying +displacements and painting parts of the mesh. + +Orientation includes vertex normals, local coordinates and noise (you may need +to resize the scripts window to view the noise menu below the "Last Error:" +line. This menu lets you define noise type from the many options available in +Blender. + +Notes:<br> + The "Create" button will make at any time a copy of the active mesh in its +current state, so you can keep it and continue working on the copy;<br> + One of the great possible uses of this script is to "raise" terrain from a +subdivided plane, for example, with good control of the process by setting +options, defining orientation and alternating vertex painting with +displacements. """ -# $Id$ -# #---------------------------------------------- # jm soler, displacement paint 03/2002 - > 05/2004: disp_paintf # Terrain Noise added suugered by Jimmy Haze #---------------------------------------------- # Page officielle : -# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_displacementpainting.htm +# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_displacementpainting.htm # Communiquer les problemes et erreurs sur: -# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender -# -------------------------------------------------------------------------- +# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender +#--------------------------------------------- # ce script est proposé sous licence GPL pour etre associe # a la distribution de Blender 2.33 -# -------------------------------------------------------------------------- +#---------------------------------------------- # this script is released under GPL licence # for the Blender 2.33 scripts package -# -------------------------------------------------------------------------- +#---------------------------------------------- # ***** BEGIN GPL LICENSE BLOCK ***** # # Copyright (C) 2003, 2004: Jean-Michel Soler @@ -46,6 +74,7 @@ Tip: 'Use vertex paint color value to modify shape displacing vertices along nor # -------------------------------------------------------------------------- # 09/07/04 : Noise functions based on a piece of script by Jimmy Haze. # -------------------------------------------------------------------------- + import Blender from Blender import * from Blender.Draw import * @@ -74,6 +103,31 @@ NEWName='' ERROR=0 TextERROR='' +E_EXIT = 1 +E_MODE = 2 +E_ORIENT = 3 +E_NSIZE = 4 +E_REPEAT = 5 +E_ACTION = 16 +E_CREATE = 17 +E_DOCMAT = 24 +E_MATVAL = [32,33,34,35,36,37,38,39,40,41,42,43,44] +E_AXESEL = 45 +E_AXESELX = 46 +E_AXESELY = 47 +E_AXESELZ = 48 + +E_NOISEME = 49 +E_NOISEH = 50 +E_NOISELAC = 51 +E_NOISEOCT = 52 +E_NOISEOFF = 53 +E_NOISEBAS = 54 +E_NOISEVAL=[E_NOISEH,E_NOISELAC,E_NOISEOCT,E_NOISEOFF,E_NOISEBAS] +E_NOISEDIM = 55 + + + def copy_transform(ozero,Obis): Obis.setSize(ozero.getSize()); Obis.setEuler(ozero.getEuler()); @@ -81,7 +135,7 @@ def copy_transform(ozero,Obis): return Obis def traite_face(f): - global vindexm, ng, NOISE + global vindexm, ng, NOISE, NOISEDIM global H,lacunarity,octaves,offset,basis if ORIENTMenu.val==1: @@ -111,10 +165,10 @@ def traite_face(f): for z in range(len(f.v)): c=0.0 if vindex[f.v[z].index]!=0: - nx=f.v[z].co[0]/4 - ny=f.v[z].co[1]/4 - nz=f.v[z].co[2]/4 - nn = ng + noise((nx,ny,nz),NOISE) + nx=f.v[z].co[0]/NOISEDIM + ny=f.v[z].co[1]/NOISEDIM + nz=f.v[z].co[2]/NOISEDIM + nn = ng * noise((nx,ny,nz),NOISE) c=float(f.col[z].r+f.col[z].b+f.col[z].g)/maxcol*nn/vindex[f.v[z].index] else: c=0 @@ -126,10 +180,10 @@ def traite_face(f): for z in range(len(f.v)): c=0.0 if vindex[f.v[z].index]!=0: - nx=f.v[z].co[0]/4 - ny=f.v[z].co[1]/4 - nz=f.v[z].co[2]/4 - nn = ng + cellNoise((nx,ny,nz)) + nx=f.v[z].co[0]/NOISEDIM + ny=f.v[z].co[1]/NOISEDIM + nz=f.v[z].co[2]/NOISEDIM + nn = ng * cellNoise((nx,ny,nz)) c=float(f.col[z].r+f.col[z].b+f.col[z].g)/maxcol*nn/vindex[f.v[z].index] else: c=0 @@ -141,10 +195,10 @@ def traite_face(f): for z in range(len(f.v)): c=0.0 if vindex[f.v[z].index]!=0: - nx=f.v[z].co[0]/4 - ny=f.v[z].co[1]/4 - nz=f.v[z].co[2]/4 - nn = ng + heteroTerrain((nx,ny,nz),H,lacunarity,octaves,offset,basis) + nx=f.v[z].co[0]/NOISEDIM + ny=f.v[z].co[1]/NOISEDIM + nz=f.v[z].co[2]/NOISEDIM + nn = ng * heteroTerrain((nx,ny,nz),H,lacunarity,octaves,offset,basis) c=float(f.col[z].r+f.col[z].b+f.col[z].g)/maxcol*nn/vindex[f.v[z].index] else: c=0 @@ -154,68 +208,60 @@ def traite_face(f): def paint(): - global MODEMenu, vindex,ng, mat, ORIName, NEWName + global MODEMenu, vindex,ng, mat, ORIName, NEWName + global ERROR, TextERROR + Me=Object.GetSelected() if Me!=[]: if Me[0].getType()=='Mesh': - + vindex=[] ORIName=Me[0].getData().name - me1=NMesh.GetRaw(Me[0].getData().name) - - try: - o=Object.Get('newMESH') - me=o.getData() - me=me1 - + me=NMesh.GetRaw(Me[0].getData().name) + + try: + for m in me.verts: + vindex.append(0) + + for f in me.faces: + for v in f.v: + if MODEMenu.val!=2: + if MODEMenu.val==1: + vindex[v.index]+=1 + else: + if v.sel==1: + vindex[v.index]+=1 + else: + #print mat + if f.mat in mat: + vindex[v.index]+=1 + for f in me.faces: + if MODEMenu.val==2: + if f.mat in mat: + traite_face(f) + else: + traite_face(f) + Me[0].link(me) + Me[0].makeDisplayList() except: - o=Object.New('Mesh','newMESH') - sc.link(o) - me=me1 - - name='new.002' - - for m in me.verts: - vindex.append(0) - - for f in me.faces: - for v in f.v: - if MODEMenu.val!=2: - if MODEMenu.val==1: - vindex[v.index]+=1 - else: - if v.sel==1: - vindex[v.index]+=1 - else: - #print mat - if f.mat in mat: - vindex[v.index]+=1 - for f in me.faces: - if MODEMenu.val==2: - if f.mat in mat: - traite_face(f) - else: - traite_face(f) - - - Me[0].link(me) - #o=copy_transform(Me[0],o) - -def NEWMEcreation(name): - nomdelobjet=""; objnumber=-1; namelist=[] - obj=Object.Get() - - for ozero in obj: - if ozero.getType()=='Mesh': - namelist.append(ozero.getData().name) - if ozero.getData().name==name: - objnumber=obj.index(ozero) - - if objnumber!=-1: - ozero=obj[objnumber] + ERROR=2 + TextERROR='No color on this Object.' + +def NEWMEcreation(obj): + + if obj.getType()=='Mesh': + nomdelobjet=""; + objnumber=-1; namelist=[] + OBJ=Object.Get() + + for ozero in OBJ: + if ozero.getType()=='Mesh': + namelist.append(ozero.getData().name) + + ozero=obj nomdelobjet=ozero.getName() Mesh=Blender.NMesh.GetRawFromObject(nomdelobjet) - + name=obj.getData().name n=0; name2=name[:];ok=0 while ok==0: @@ -224,6 +270,7 @@ def NEWMEcreation(name): ok=0;name2=name[0:name.find('.')+1]+'%s'%(n+1) else: ok=1 n+=1 + Mesh.name=name2 Obis = Blender.NMesh.PutRaw(Mesh,name2) copy_transform(ozero,Obis) @@ -265,12 +312,26 @@ octaves=5.0 offset=1.0 basis=3 +NOISEDIM=4 +NOISEDIMbout=Create(NOISEDIM) HBout=Create(H) lacunarityBout=Create(lacunarity) octavesBout=Create(octaves) offsetBout=Create(offset) basisBout=Create(basis) + +noiseTYPE={0:'BLENDER', + 1:'STDPERLIN', + 2:'STDPERLIN', + 3:'NEWPERLIN', + 4:'VORONOI_F1', + 5:'VORONOI_F2', + 6:'VORONOI_F3', + 7:'VORONOI_F2F1', + 8:'VORONOI_CRACKLE', + 9:'CELLNOISE'} + TMATList= [0,[],[]] for t in range(16): @@ -291,8 +352,9 @@ glRct=glRectf def draw(): global MODEMenu, NSIZE, TDOCMat,TMATList, TAXEList global mat, ORIName, NEWName, ORIENTMenu - global NRepeat, ERROR, TextERROR , NOISE, NOISEMenu + global NRepeat, ERROR, TextERROR , NOISE, NOISEMenu, NOISEDIMbout,NOISEDIM global HBout,lacunarityBout,octavesBout,offsetBout,basisBout + global noiseTYPE size=Buffer(GL_FLOAT, 4) glGetFloatv(GL_SCISSOR_BOX, size) @@ -307,7 +369,7 @@ def draw(): glColor3f(1.0,1.0,1.0) glRasterPos2f(20, size[3]-15) - Text("Script Python de displacement painting") + Text("Script Python de displacement paintingt") glRasterPos2f(20, size[3]-28) Text("Jean-michel Soler, juillet 2004") @@ -316,20 +378,20 @@ def draw(): n0=70 n1=55 - Button("Create" ,17 ,5 ,size[3]-n0+16 ,60 ,20) - Button("Action" ,16 ,5 ,size[3]-n0-4 ,60 ,20) - Button("Exit" ,1 ,5 ,size[3]-n0-24 ,60 ,20) + Button("Create" ,E_CREATE ,5 ,size[3]-n0+16 ,60 ,20) + Button("Action" ,E_ACTION ,5 ,size[3]-n0-4 ,60 ,20) + Button("Exit" ,E_EXIT ,5 ,size[3]-n0-24 ,60 ,20) - NRepeat=Number("repeat" ,5 ,5 ,size[3]-n0-50 ,75 ,20, NRepeat.val,1,10) + 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, 2 ,80 ,size[3]-n0 ,100,20, MODEMenu.val, "MODE menu.") + MODEMenu= Menu(MOname, E_MODE ,80 ,size[3]-n0 ,100,20, MODEMenu.val, "MODE menu.") if MODEMenu.val==2: - TDOCMat=Toggle("Doc Mat" ,24 ,180 ,size[3]-n0 ,60 ,20,TDOCMat.val) + TDOCMat=Toggle("Doc Mat" ,E_DOCMAT ,180 ,size[3]-n0 ,60 ,20,TDOCMat.val) if TDOCMat.val==1: #print TMATList for t in range(TMATList[0]): @@ -341,9 +403,10 @@ def draw(): 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) + glColor3f(1.0,0.3,0.0) glRasterPos2f(80+40+5 ,size[3]-n0-80) - if ERROR==1: + if ERROR>1: Text('Last error : '+TextERROR) else: Text('Last error : ') @@ -351,54 +414,57 @@ def draw(): glColor3f(0.0,0.0,0.0) glRasterPos2f(240 ,size[3]-n0+24) Text("ORIENTATION") - ORIENTMenu= Menu(ORname, 3 ,240 ,size[3]-n0 ,100,20, ORIENTMenu.val, "ORIENT menu.") + 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], - 40+t, + E_AXESEL+t, 240+100+t*30 , size[3]-n0 ,30 , 20, TAXEList[1][t].val) if ORIENTMenu.val==3 : - glRasterPos2f(20 ,size[3]-n0-90+24) + glRasterPos2f(240 ,size[3]-n0-90-4) Text("NOISE") - NOISEMenu= Menu(NOname, 45 , 240 ,size[3]-n0-110 ,110,20, NOISEMenu.val, "NOISE menu.") + 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: - HBout= Slider("H", 46 ,110 ,size[3]-n0-190 ,125,20, HBout.val, -2.0,+2.0,0,) - lacunarityBout=Slider("lacunarity",47 ,110 ,size[3]-n0-110 ,125,20, lacunarityBout.val, -4.0,+4.0,0,) - octavesBout=Slider("octave", 48 ,110 ,size[3]-n0-130 ,125,20, octavesBout.val, -10.0,+10.0,0,) - offsetBout=Slider("offset", 49 ,110 ,size[3]-n0-150 ,125,20, offsetBout.val, -5.0,+5.0,0,) - basisBout=Slider("noise", 50 ,110 ,size[3]-n0-170 ,125,20, basisBout.val, 0,9,0,) + 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", 4 ,80 ,size[3]-n0-20 ,260,20, NSIZE.val, -4.0,+4.0,0,"SIZE.") + NSIZE= Slider("Disp Size", E_NSIZE ,80 ,size[3]-n0-20 ,260,20, NSIZE.val, -4.0,+4.0,0,"SIZE.") def event(evt, val): - if ((evt== QKEY or evt== ESCKEY) and not val): Exit() + if (evt== QKEY and not val): Exit() def bevent(evt): global MODEMenu, NSIZE, ng, TMATList global mat, ORIENTMenu, NRepeat, TAXEList - global ERROR,TextERROR, NOISE, NOISEMenu + global ERROR,TextERROR, NOISE, NOISEMenu, NOISEDIMbout,NOISEDIM global HBout,lacunarityBout,octavesBout,offsetBout,basisBout global H,lacunarity,octaves,offset,basis - if (evt== 1): + if (evt== E_EXIT): Exit() - elif (evt== 16): + elif (evt== E_ACTION): for n in range(NRepeat.val): paint() - elif (evt== 4): + elif (evt== E_NSIZE): ng=NSIZE.val - elif (evt== 24) or (evt in [32,33,34,35,36,37,38,39,40,41,42,43,44]): + elif (evt== E_DOCMAT) or (evt in E_MATVAL): Me=Object.GetSelected() if Me!=[]: if Me[0].getType()=='Mesh': @@ -414,21 +480,29 @@ def bevent(evt): else: ERROR=1 TextERROR='No Selected Object.' - - elif (evt== 17): - NEWMEcreation('new.002') + - elif (evt== 45): + 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 [46,47,48,49, 50]): + elif (evt in E_NOISEVAL): H=HBout.val lacunarity=lacunarityBout.val octaves=octavesBout.val offset=offsetBout.val basis=basisBout.val - Blender.Redraw() + elif (evt== E_NOISEDIM): + NOISEDIM=NOISEDIMbout.val + + Blender.Draw.Redraw() -Window.EditMode(0) Register(draw, event, bevent) |