[Bf-python] scripts bundle : transform 3d coords of the mesh in its UV coords, v2.0

jmsoler jmsoler at free.fr
Sat Jul 31 17:33:12 CEST 2004


#!BPY

""" Registration info for Blender menus: <- these words are ignored
Name: 'Replace MESH 3D coords to UV coords'
Blender: 233
Group: 'Mesh'
Tip: 'Help to bake  procedural textures in uvmapped picture.'
"""
#----------------------------------------------
#   jm soler  07/2004 :  'Procedural Texture Baker'
#  (c)  jm soler  07/2004 :  'Procedural Texture Baker'
#        Based on  a Theeth's really good idea .
#        It makes a rvk with uv coords of the mesh
#        released unde BlenderArtistic Licence
#----------------------------------------------
# Official Page :
#   http://jmsoler.free.fr/util/blenderfile/py/3d2uvbaker.py
# For problems and  errors:
#   http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
#---------------------------------------------

import Blender
from Blender import NMesh,Draw,Object,Scene,Camera

FRAME=100
XYLIMIT=[0.0,0.]
OBJPOS=0.0

def GET_newobject(TYPE):
     SCENE=Blender.Scene.getCurrent()
     OBJECT=Blender.Object.New(TYPE)
     SCENE.link(OBJECT)
     return OBJECT,SCENE

def SAVE_image(rc,name,FRAME):
     MYDIR=''
     RENDERDIR=rc.getRenderPath()
     rc.setRenderPath(RENDERDIR+MYDIR)
     print RENDERDIR+MYDIR
     IMAGETYPE=Blender.Scene.Render.PNG
     rc.setImageType(IMAGETYPE)
     NEWFRAME=FRAME
     OLDEFRAME=rc.endFrame()
     OLDSFRAME=rc.startFrame()
     rc.startFrame(NEWFRAME)
     rc.endFrame(NEWFRAME)
     rc.renderAnim()
     try :
      import nt
      os=nt
     except:
      import posix
      os=posix
     FILENAME= "%04d"%NEWFRAME
     FILENAME=FILENAME.replace(' ','0')
     FILENAME=RENDERDIR+MYDIR+FILENAME
     try:
       TRUE=os.stat(FILENAME)
       os.rename(FILENAME,RENDERDIR+MYDIR+name+'.png')
     except:
       pass
     rc.endFrame(OLDEFRAME)
     rc.startFrame(OLDSFRAME)
     rc.setRenderPath(RENDERDIR)

def SHOOT(XYlimit,frame,obj,name,FRAME):
     try:
       CAM=Blender.Object.Get('UVCAMERA')
       Cam=CAM.getData()
       SC=Blender.Scene.getCurrent()
     except:
       Cam=Blender.Camera.New()
       Cam.name='UVCamera'
       CAM,SC=GET_newobject('Camera')
       CAM.link(Cam)
       CAM.setName('UVCAMERA')
       Cam.lens=30
       Cam.name='UVCamera'

     CAM.setLocation(obj.getLocation())
     CAM.LocX+=XYlimit[0]/2.0
     CAM.LocY+=XYlimit[1]/2.0
     CAM.LocZ+=max(XYlimit[0],XYlimit[1])
     CAM.setEuler(0.0,0.0,0.0)

     try:
       #lampe=Blender.Lamp.Get('lumin')
        LAMP=Blender.Object.Get('Eclairage')
        lampe=LAMP.getData()
        SC=Blender.Scene.getCurrent()
     except:
       lampe=Blender.Lamp.New()
       lampe.name='lumin'
       LAMP,SC=GET_newobject('Lamp')
       LAMP.link(lampe)
       LAMP.setName('Eclairage')

     LAMP.setLocation(obj.getLocation())
     LAMP.LocX+=XYlimit[0]/2.0
     LAMP.LocY+=XYlimit[1]/2.0
     LAMP.LocZ+=max(XYlimit[0],XYlimit[1])
     LAMP.setEuler(0.0,0.0,0.0)
     context = SC.getRenderingContext()
     Camold=SC.getCurrentCamera()
     SC.setCurrentCamera(CAM)
     OLDy=context.imageSizeY()
     OLDx=context.imageSizeX()
     context.imageSizeY(400)
     context.imageSizeX(400)
     SAVE_image(context,name,FRAME)
     context.imageSizeY(OLDy)
     context.imageSizeX(OLDx)
     SC.setCurrentCamera(Camold)
     Blender.Set('curframe',frame)

def Mesh2UVCoord():
       try:
         MESH3D=Object.GetSelected()[0]
         if MESH3D.getType()=='Mesh':

            MESH=MESH3D.getData()
            MESH2=Blender.NMesh.GetRaw()

            for f in MESH.faces:
                 f1=Blender.NMesh.Face()
                 for v in f.v:
                   v1= Blender.NMesh.Vert(v.co[0],v.co[1],v.co[2])
                   MESH2.verts.append(v1)
                   f1.v.append(MESH2.verts[len(MESH2.verts)-1])

                 MESH2.faces.append(f1)
                 f1.uv= f.uv[:]
                 f1.col=f.col[:]
                 f1.smooth=f.smooth
                 f1.mode=f.mode
                 f1.flag=f.flag
                 f1.mat=f.mat

            MESH2.materials=MESH.materials[:]

            NewOBJECT, CurSCENE=GET_newobject('Mesh')
            NewOBJECT.link(MESH2)

            NewOBJECT.setLocation(OBJPOS,OBJPOS,0.0)
            NewOBJECT.setEuler(0.0,0.0,0.0)

            MESH2.removeAllKeys()

            MESH2.update()
            MESH2.insertKey(1,'absolute')
            MESH2.update()

            for f in MESH2.faces:
                     for v in f.v:
                        for n in [0,1]:
                            v.co[n]=f.uv[f.v.index(v)][n]
                            exec "if v.co[%s]>XYLIMIT[%s]:XYLIMIT[%s]=v.co[%s]"%(n,n,n,n)
                        v.co[2]=0.0

            print XYLIMIT

            MESH2.update()
            MESH2.insertKey(FRAME,'absolute')
            MESH2.update()
            imagename='uvtext'

            name = "Change image name ? %t|Replace yes | no"
            result = Draw.PupMenu(name)
            if result ==1:
                 imagename=Draw.PupStrInput('Image Name:', imagename, 32)

            SHOOT(XYLIMIT, FRAME,NewOBJECT,imagename,FRAME)
            Blender.Redraw()
         else:
             name = "problem  : not a mesh or no uv %t"
             result = Draw.PupMenu(name)
             print 'problem  : not object selected or not mesh'
       except:
         name = "problem  : not object selected or not a mesh %t"
         result = Draw.PupMenu(name)
         print 'problem  : not object selected or not mesh'

Mesh2UVCoord()



More information about the Bf-python mailing list