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

    plugins.ObjectData and renderer

    Scheduled Pinned Locked Moved PYTHON Development
    4 Posts 0 Posters 419 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 13/05/2013 at 13:39, xxxxxxxx wrote:

      I'm still confused about the cache stuff.
      I have following code, creating a cloner with a sphere as a child.
      I then set the p.x (c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_X]) to the frame number to have some animation.
      In the editor it works perfectly, but when i render out to the picture viewer, there is no animation.
      Just the current frame animation is rendered. All frames are the same.

      import c4d, os, sys
      from c4d import bitmaps, documents, gui, modules,  plugins
      from c4d.modules import mograph
        
      RADIUS                  = 1002
      HALFTONESETTINGS        = 1000
      XNUMBER                 = 1005
      ENABLE                  = 1007
      DUMMY                   = 1010
        
      class halftone(plugins.ObjectData) :
          def __init__(self) :
              self.lastframe = None
        
          def Init(self, op) :
              op[XNUMBER] = 3
              op[RADIUS] = 10.0
              op[ENABLE] = False
              return True
              
          def GetVirtualObjects(self, node, hierarchyhelp) :
        
              doc = documents.GetActiveDocument()
              frame = doc.GetTime().GetFrame(doc.GetFps())
              node[DUMMY] = frame
        
              if (not frame == self.lastframe) :
                  node.SetDirty(c4d.DIRTY_DATA)
                  self.lastframe = frame
        
              #if (not c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING)) :
              dirty = node.CheckCache(hierarchyhelp) or node.IsDirty(c4d.DIRTY_DATA)
              if dirty is False: 
                  print "return"
                  return node.GetCache(hierarchyhelp)
                  
              if (not node[ENABLE]) : return None
        
              null = c4d.BaseObject(c4d.Onull)        #hulp null 
              null[c4d.ID_BASELIST_NAME] = "HNull"
              #doc.InsertObject(null)
              
              cloner2 = c4d.BaseObject(1018544)        #insert cloner           
              cloner2[c4d.ID_BASELIST_NAME] = "cloner2"
              cloner2[c4d.MG_LINEAR_COUNT] = node[XNUMBER]     
              cloner2[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_X] = frame
              cloner2.InsertUnder(null)
        
              sphere = c4d.BaseObject(c4d.Osphere)    #Sphere
              sphere[c4d.PRIM_SPHERE_RAD] = node[RADIUS]
              sphere[c4d.PRIM_SPHERE_SUB] = 4
              sphere.InsertUnder(cloner2)
                      
              return null
        
      if __name__ == "__main__":
        
          pluginstr = "Htest v043"
        
          path, file = os.path.split(__file__)
          bmp = bitmaps.BaseBitmap()
          bmp.InitWith(os.path.join(path, "res", "halftone.png"))
                                      
          okyn = plugins.RegisterObjectPlugin(id          = 10297362, 
                                       str         = pluginstr,
                                       g           = halftone,
                                       description = "halftone", 
                                       icon        = bmp,
                                       info        = c4d.OBJECT_GENERATOR)
        
          if (okyn) : 
              print pluginstr + " initialized."
          else: print "Error initializing " + pluginstr
      

      Adding a check whether the external renderer is working (CHECKISRUNNING_EXTERNALRENDERING) does not help.

      So, is the cache handled differently when rendering?

      Note: I do not use self.SetOptimizeCache(True), because I want to detect is the frame has changed.

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

        On 13/05/2013 at 15:09, xxxxxxxx wrote:

        i am not 100% sure, but i think the culprit is doc = documents.GetActiveDocument(). for rendering 
        the document is being cloned, which will mess up your frame based dirty calculations as the current 
        frame in the active document won't change while rendering. use the passed node to get your 
        document. you should also overwrite NodeData.CheckDirty() instead of fiddling with the dirty flag 
        from GVO. it does work from GVO, but under certain circumstances things can go wrong.

        def GetVirtualObjects(self, node, hh) :
        	doc = node.GetDocument()
        

        you also do not need to redefine your description symbols. you can use them directly.

        node[c4d.XNUMBER] = someValue

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

          On 13/05/2013 at 23:31, xxxxxxxx wrote:

          Yes, it works now (doc = node.GetDocument())
          Thanks for the solution and the explanation.

          Do you have an example of overwriting NodeData.CheckDirty()?

          Regards, Pim

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

            On 14/05/2013 at 04:16, xxxxxxxx wrote:

            hi,

            I have to correct myself. CheckDirty() is not a member of NodeData, but of ObjectData.
            Here is the example from the docs.

            def CheckDirty(self, op, doc) :
                frame = doc.GetTime().GetFrame(doc.GetFps())
                if frame != lastFrame:
                    lastFrame = frame
                    op.SetDirty(c4d.DIRTYFLAGS_DATA)
            
            1 Reply Last reply Reply Quote 0
            • First post
              Last post