Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    Extracting UV map from multipass render

    Scheduled Pinned Locked Moved PYTHON Development
    3 Posts 0 Posters 224 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      On 10/02/2014 at 05:31, xxxxxxxx wrote:

      Using Cinema R15 on OSX; I am trying to using the python API extract a UV map from a mulipass-render.

      This can be done none programatically by going into [ render -> edit render settings ] then enabling multipass and then adding and enabling 'Material UVW'

      The problem is that can't get this to reliably work programatically. Below is the code I trying:

      def test(doc) :
          #creates a new render data object	
          rd1=c4d.documents.RenderData()
          #add multipass
          vuvw=c4d.BaseList2D(c4d.Zmultipass) 
          vuvw.GetDataInstance()[c4d.MULTIPASSOBJECT_TYPE] = c4d.VPBUFFER_MAT_UV 
          rd1.InsertMultipass(vuvw)
          rd=rd1.GetDataInstance()	
          rd[c4d.RDATA_MULTIPASS_ENABLE]=True
          #det dimensions
          xres=800
          yres=800
          rd[c4d.RDATA_XRES]=float(xres)
          rd[c4d.RDATA_YRES]=float(yres)
          #set output
          bmp = c4d.bitmaps.MultipassBitmap(xres, yres, c4d.COLORMODE_RGBw)
          res = c4d.documents.RenderDocument(doc, rd, bmp)
          if res!=c4d.RENDERRESULT_OK:
              print 'Render Failed!!!'
              return False
          else:
              print 'Render Success!!!'
          #print layer names
          for i in range(bmp.GetLayerCount()) :
              print bmp.GetLayerNum(i).GetParameter(c4d.MPBTYPE_NAME)
      

      This code just prints out 'Background' instead of Background and 'Material UV'. (This is confirmed by writing the layers out to a file).

      I am not really sure what I am doing wrong, of course please ask if there is any additional information I can provide.
      Thanks for any help in advance!

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 10/02/2014 at 11:03, xxxxxxxx wrote:

        Give this one a try:

        #This script creates a new render preset and sets it to create an RGB & Material UV pass image to your desktop  
        #IMPORTANT!!: Make sure you rememebr to add a matrerial to your objects or the Material UV image will be black!!  
          
        import c4d, os  
        from c4d import bitmaps, documents  
        def main() :  
            
          firstRd = doc.GetFirstRenderData()  
          if not firstRd: return False  
            
          #If our custom render settings already exhist  
          #Use it..Don't create another one  
          if firstRd.GetName() == "Material UV pass":          
              xres = 800  
              yres = 800  
              firstRd[c4d.RDATA_XRES] = float(xres)  
              firstRd[c4d.RDATA_YRES] = float(yres)          
              bmp = bitmaps.BaseBitmap()  
              bmp.Init(int(xres), int(yres), firstRd[c4d.RDATA_FORMATDEPTH])  
              data = doc.GetActiveRenderData().GetData()  
              res = documents.RenderDocument(doc, data, bmp, c4d.RENDERFLAGS_EXTERNAL)  
          
              if res!=c4d.RENDERRESULT_OK:  
                  print 'Render Failed!!!'  
                  return False  
              else:  
                  print 'Render Success!!!'          
                
          #If our custom render settings don't already exhist  
          #Create it first..then render the images  
          else:         
            
              myRd = c4d.documents.RenderData()  
              myRd.SetName("Material UV pass")  
              doc.InsertRenderData(myRd)      
              doc.SetActiveRenderData(myRd)  
          
              xres = 800  
              yres = 800  
              myRd[c4d.RDATA_XRES] = float(xres)  
              myRd[c4d.RDATA_YRES] = float(yres)  
            
              fn = c4d.storage.GeGetC4DPath(c4d.C4D_PATH_DESKTOP)  
              path = os.path.join(fn,'render')      
              myRd[c4d.RDATA_PATH] = path  
            
              #Enable the Multi-Pass option  
              myRd[c4d.RDATA_MULTIPASS_ENABLE]=True  
            
              #Assign the passes container list of options to a variable  
              uvPass = c4d.BaseList2D(c4d.Zmultipass)      
            
              #Get the Material UV pass option      
              uvPass.GetDataInstance()[c4d.MULTIPASSOBJECT_TYPE] = c4d.VPBUFFER_MAT_UV  
            
              #Add the Material UV pass option to the render settings dialog  
              myRd.InsertMultipass(uvPass)  
            
              #Enable the Save Multi-Pass Image option  
              myRd[c4d.RDATA_MULTIPASS_SAVEIMAGE]=True  
          
              #Set the file path where to put the Material UV pass image  
              fn = c4d.storage.GeGetC4DPath(c4d.C4D_PATH_DESKTOP)  
              path = os.path.join(fn,'uv')   
              myRd[c4d.RDATA_MULTIPASS_FILENAME] = path  
          
          
              #Set the output format to .png  
              myRd[c4d.RDATA_MULTIPASS_SAVEFORMAT] = c4d.FILTER_PNG  
              bmp = bitmaps.BaseBitmap()  
              bmp.Init(int(xres), int(yres), myRd[c4d.RDATA_FORMATDEPTH])  
          
              data = doc.GetActiveRenderData().GetData()  
              res = documents.RenderDocument(doc, data, bmp, c4d.RENDERFLAGS_EXTERNAL)  
          
              if res!=c4d.RENDERRESULT_OK:  
                  print 'Render Failed!!!'  
                  return False  
              else:  
                  print 'Render Success!!!'  
          
            
          c4d.EventAdd()  
          
        if __name__=='__main__':  
          main()
        

        -ScottA

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 10/02/2014 at 15:20, xxxxxxxx wrote:

          Thanks, I'll give it a go in the morning and report back!

          1 Reply Last reply Reply Quote 0
          • First post
            Last post