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
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Problem with baking ambient occlusion

    Scheduled Pinned Locked Moved PYTHON Development
    8 Posts 0 Posters 833 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 02/02/2017 at 06:24, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R18 
      Platform:   Windows  ;   
      Language(s) :       PYTHON  ;

      ---------
      Hi,
      i am trying to bake ambient occlusion maps using python in cinema 4d R18.
      I do get a file written to disk and it looks ok, but it contains the diffuse color and shading of the surface instead of the ambient occlusion.

      Here is the code:

      bakeSettings = c4d.BaseContainer()
       
        bakeSettings.SetInt32(c4d.BAKE_TEX_WIDTH, int(options.option_width))
        bakeSettings.SetInt32(c4d.BAKE_TEX_HEIGHT, int(options.option_height))
        bakeSettings.SetInt32(c4d.BAKE_TEX_PIXELBORDER, int(options.option_pixelborder))
        bakeSettings.SetInt32(c4d.BAKE_TEX_SUPERSAMPLING, int(options.option_ss))
        bakeSettings.SetVector(c4d.BAKE_TEX_FILL_COLOR, options.option_bg_color['color'])
        bakeSettings.SetBool(c4d.BAKE_TEX_AMBIENT_OCCLUSION, True)

      bmp = c4d.bitmaps.BaseBitmap()
       
        bmp.Init(int(options.option_width), int(options.option_height))

      ret = c4d.utils.InitBakeTexture(doc, textureTag, uvwTags[0], uvwTags[0], bakeSettings)
       
        c4d.utils.BakeTexture(ret[0], bakeSettings, bmp, None, progressCallback)
       
        bmp.Save(filename, c4d.FILTER_PNG)

      Thanks,
      Per

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

        On 03/02/2017 at 06:02, xxxxxxxx wrote:

        Hi Per,

        welcome to the Plugin Café forums 🙂

        Unfortunately the Python documentation is a bit inaccurate here (one could also say it's wrong).
        You need to pass a MultipassBitmap in order to make work.

        Edit: I moved this post to the Python sub-forum.

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

          On 06/02/2017 at 01:04, xxxxxxxx wrote:

          Hi again,

          I changed the bitmap creation, the code looks like this now:

          bakeSettings = c4d.BaseContainer()
           
            bakeSettings.SetInt32(c4d.BAKE_TEX_WIDTH, int(options.option_width))
            bakeSettings.SetInt32(c4d.BAKE_TEX_HEIGHT, int(options.option_height))
            bakeSettings.SetInt32(c4d.BAKE_TEX_PIXELBORDER, int(options.option_pixelborder))
            bakeSettings.SetInt32(c4d.BAKE_TEX_SUPERSAMPLING, int(options.option_ss))
            bakeSettings.SetVector(c4d.BAKE_TEX_FILL_COLOR, options.option_bg_color['color'])
            bakeSettings.SetBool(c4d.BAKE_TEX_AMBIENT_OCCLUSION, True)

          bmp = c4d.bitmaps.MultipassBitmap(int(options.option_width), int(options.option_height), c4d.COLORMODE_ARGB)

          ret = c4d.utils.InitBakeTexture(doc, textureTag, uvwTags[0], uvwTags[0], bakeSettings)
           
            c4d.utils.BakeTexture(ret[0], bakeSettings, bmp, None, progressCallback)
           
            bmp.Save(filename, c4d.FILTER_PNG)

          But it does not work, now I get an image that is filled with the background color only.

          Any ideas?

          Thanks,

          Per

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

            On 06/02/2017 at 04:35, xxxxxxxx wrote:

            Hm? Except that I do not use a progress hook and that I fill the BaseContainer with constant values, I use pretty much your code and it seems to work fine for me. Perhaps you can reduce your code to a complete example, I can throw into the Script Manager in order to reproduce your issue?

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

              On 07/02/2017 at 01:43, xxxxxxxx wrote:

              Hi again,

              here is the full script:

                
              import c4d  
              import os  
              from c4d import gui  
                 
              LBL_INFO1 = 1000  
              LBL_INFO2 = 1001  
              LBL_INFO3 = 1003  
              LBL_INFO4 = 1004  
              LBL_INFO5 = 1005  
              LBL_INFO6 = 1006  
                
              TXT_WIDTH = 10001  
              TXT_HEIGHT = 10002  
              TXT_SS = 10003  
              TXT_FILEPATH = 10004  
              TXT_PIXELBORDER = 10005  
              COLOR_FIELD_ID = 10006  
                
              GROUP_OPTIONS = 20000  
              BTN_OK = 20001  
              BTN_CANCEL = 20002  
                 
              class OptionsDialog(gui.GeDialog) :  
                def CreateLayout(self) :  
                self.SetTitle('Bake objects')  
                
                self.AddStaticText(LBL_INFO1, c4d.BFH_LEFT, name='Width:')   
                self.AddEditText(TXT_WIDTH, c4d.BFH_SCALEFIT)  
                self.SetString(TXT_WIDTH, '1024')    
                
                self.AddStaticText(LBL_INFO2, c4d.BFH_LEFT, name='Height:')   
                self.AddEditText(TXT_HEIGHT, c4d.BFH_SCALEFIT)  
                self.SetString(TXT_HEIGHT, '1024')    
                
                self.AddStaticText(LBL_INFO3, c4d.BFH_LEFT, name='Supersampling:')   
                self.AddEditText(TXT_SS, c4d.BFH_SCALEFIT)  
                self.SetString(TXT_SS, '0')    
                
                self.AddStaticText(LBL_INFO5, c4d.BFH_LEFT, name='Pixel border:')   
                self.AddEditText(TXT_PIXELBORDER, c4d.BFH_SCALEFIT)  
                self.SetString(TXT_PIXELBORDER, '2')    
                
                self.AddStaticText(LBL_INFO6, c4d.BFH_LEFT, name='Background color:')   
                self.AddColorField(COLOR_FIELD_ID, c4d.BFH_SCALEFIT)  
                self.SetColorField(COLOR_FIELD_ID, c4d.Vector(1), 1, 1, 1)  
                
                self.AddStaticText(LBL_INFO4, c4d.BFH_LEFT, name='File output path:')   
                self.AddEditText(TXT_FILEPATH, c4d.BFH_SCALEFIT)  
                self.SetString(TXT_FILEPATH, 'c:\\temp')    
                  
                self.GroupBegin(GROUP_OPTIONS, c4d.BFH_CENTER, 2, 1)  
                self.AddButton(BTN_OK, c4d.BFH_SCALE, name='OK')  
                self.AddButton(BTN_CANCEL, c4d.BFH_SCALE, name='Cancel')  
                self.GroupEnd()  
                self.ok = False  
                return True  
                 
                def Command(self, id, msg) :  
                if id==BTN_CANCEL:  
                  self.Close()  
                elif id==BTN_OK:  
                  self.ok = True  
                  self.option_width = self.GetString(TXT_WIDTH)  
                  self.option_height = self.GetString(TXT_HEIGHT)  
                  self.option_ss = self.GetString(TXT_SS)  
                  self.option_pixelborder = self.GetString(TXT_PIXELBORDER)  
                  self.option_filepath = self.GetString(TXT_FILEPATH)  
                  self.option_bg_color = self.GetColorField(COLOR_FIELD_ID)  
                  self.Close()  
                return True  
                 
                
              progressStatus=dict()  
              progressStatus[c4d.BAKE_STATE_NONE]="None"  
              progressStatus[c4d.BAKE_STATE_PREPARE]="Prepare"  
              progressStatus[c4d.BAKE_STATE_GI_PREPASS]="GI prepass"  
              progressStatus[c4d.BAKE_STATE_FILL_IMAGE]="Fill image"  
              progressStatus[c4d.BAKE_STATE_COMPLETE]="Complete"  
              progressStatus[c4d.BAKE_STATE_INITIALIZE]="Initialize"  
              progressStatus[c4d.BAKE_STATE_RESIZENOTIFY]="Resize notify"  
                  
              def progressCallback(status) :      
                print("state:" + progressStatus[status['state']] + "   progress:"+str(100*status['r'])+"%")  
                
              def doBake(doc, obj, options) :    
                
                # find texture and uv tags  
                textureTag = None  
                uvwTags = []  
                
                for tag in obj.GetTags() :  
                if type(tag) == c4d.TextureTag and textureTag == None:  
                  textureTag = tag  
                
                if type(tag) == c4d.UVWTag:  
                  uvwTags.append(tag)  
                
                bakeSettings = c4d.BaseContainer()  
                bakeSettings.SetInt32(c4d.BAKE_TEX_WIDTH,int(options.option_width))  
                bakeSettings.SetInt32(c4d.BAKE_TEX_HEIGHT,int(options.option_height))  
                bakeSettings.SetInt32(c4d.BAKE_TEX_PIXELBORDER, int(options.option_pixelborder))  
                bakeSettings.SetInt32(c4d.BAKE_TEX_SUPERSAMPLING, int(options.option_ss))  
                bakeSettings.SetVector(c4d.BAKE_TEX_FILL_COLOR, options.option_bg_color['color'])  
                bakeSettings.SetBool(c4d.BAKE_TEX_AMBIENT_OCCLUSION, True)  
                
                bmp = c4d.bitmaps.MultipassBitmap(int(options.option_width), int(options.option_height), c4d.COLORMODE_ARGB)  
                
                ret = c4d.utils.InitBakeTexture(doc, textureTag, uvwTags[0], uvwTags[len(uvwTags)-1], bakeSettings)  
                  
                ret2 = c4d.utils.BakeTexture(ret[0], bakeSettings, bmp, None, progressCallback)   
                  
                filename = os.path.join(options.option_filepath,obj.GetName()+".png")  
                
                ret3 = bmp.Save(filename, c4d.FILTER_PNG)  
                
                print("wrote: "+filename)  
                
                  
              def main() :  
                # Get the selected objects, including children.  
                selection = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)  
                 
                if len(selection) <= 0:  
                gui.MessageDialog('Must select objects!')  
                return  
                 
                dlg = OptionsDialog()  
                dlg.Open(c4d.DLG_TYPE_MODAL, defaultw=300, defaulth=50)  
                  
                if not dlg.ok:  
                return  
                 
                  
                for i in range(0,len(selection)) :  
                sel = selection[i]  
               _     _doBake(doc,sel,dlg)  
               _     _  
              if __name__=='__main__':  
                main()  
              
              

              Edit: Added code tags, see BBcodes[URL-REMOVED] below edit field


              [URL-REMOVED] @maxon: This section contained a non-resolving link which has been removed.

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

                On 08/02/2017 at 02:34, xxxxxxxx wrote:

                Sorry,
                there was an error in the code in the last post.

                i have updated it so it should run. But the baked texture still looks wrong.

                Cheers,

                Per

                __

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

                  On 08/02/2017 at 06:00, xxxxxxxx wrote:

                  Hm, maybe we have different expectations, what the result should look like. Even with your code I get the result I expect here.
                  Just to make sure, the UVs are layed out correctly?

                  Or maybe there's something special in your scene, which triggers an issue. Can you please provide me the scene and a description, what you expect to get as an result? You can email it to sdk_support.

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

                    On 08/02/2017 at 06:44, xxxxxxxx wrote:

                    Hi Andreas.

                    It was the geometry that was wrong, I was confused about what uv set was actually being used when calling InitBakeTexture. The geometry had multiple uv sets and the one that was actually used when baking was broken.

                    It works fine now, thanks a lot for the help.

                    Cheers,

                    Per

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