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

    Blip before Correctly Updating

    Cinema 4D SDK
    c++ r20 sdk
    3
    16
    1.9k
    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.
    • ferdinandF
      ferdinand
      last edited by ferdinand

      Hi,

      first of all: It is unclear to me what you mean by "the points of a Matrix". Do you actually interpret the components of a matrix as points, or do you mean by that the vertices of a PointObject which are influenced by the matrix of that BaseObject (i.e. the PointObject)?

      How would I know if I should update the Matrix in the first GVO call?

      Technically you could clone the whole document and the execute the passes on that document. But I agree, this would be wildly inefficient.

      How would I delay the GVO call in Execution?

      You could of course just simply return the cache while certain conditions are not met (e.g. that PointObject not being dirty). But @m_magalhaes probably meant here, that you should register your generator with OBJECT_CALL_ADDEXECUTION and then overwrite ObjectData.AddToExecution to tell Cinema that that object type should be evaluated after all other generators (via EXECUTIONPRIORITY_GENERATOR).

      Cheers,
      zipit

      MAXON SDK Specialist
      developers.maxon.net

      1 Reply Last reply Reply Quote 0
      • D
        d_schmidt
        last edited by

        first of all: It is unclear to me what you mean by "the points of a Matrix". Do you actually interpret the components of a matrix as points

        Correct, I'm getting them from the MoData.

        you should register your generator with OBJECT_CALL_ADDEXECUTION and then overwrite ObjectData.AddToExecution to tell Cinema that that object type should be evaluated after all other generators (via EXECUTIONPRIORITY_GENERATOR).

        I'm unsure how to do this part.
        Adding to the PriorityList is easy enough, but from my testing it seems like using AddToExecution() only effects when Execute is called. Should I be doing this in Execute then?

        1 Reply Last reply Reply Quote 0
        • ManuelM
          Manuel
          last edited by

          hi,

          sorry it was not very clear.

          I was trying to say that you can probably check the state of the matrix on your execute passe (the Initial priority maybe or one that could work for you)
          and set your generator to dirty. That will "force" the recalculation of your generator with the modified matrix.

          But maybe in your case that will not make a big difference

            def AddToExecution(self, op, list):
                  list.Add(op, c4d.EXECUTIONPRIORITY_INITIAL, 0)
                  return True
          
              def Execute(self, op, doc, bt, priority, flags):
                  if priority == c4d.EXECUTIONPRIORITY_INITIAL:
                      
                      print ("priority init")
                      #Gets child 
                      child = op.GetDown()
                      if child is None:
                          return c4d.EXECUTIONRESULT_OK
                      if self.lastdirty != child.GetDirty(c4d.DIRTYFLAGS_DATA):
                          self.lastdirty = child.GetDirty(c4d.DIRTYFLAGS_DATA)
                          op.SetDirty(c4d.DIRTYFLAGS_ALL)
                 
                  return c4d.EXECUTIONRESULT_OK
          
              # Override method, should generate and return the object.
              def GetVirtualObjects(self, op, hierarchyhelp):
                  print ("GVO")
                  #force the update of object 
                  child = op.GetDown()
                  if child:
                      print "child", child
                      moData = c4d.modules.mograph.GeGetMoData(child)
                      if moData is not None:
                          cnt = moData.GetCount()
                          print cnt
                  return c4d.BaseObject(c4d.Ocube)
          
          

          Cheers,
          Manuel

          MAXON SDK Specialist

          MAXON Registered Developer

          1 Reply Last reply Reply Quote 0
          • D
            d_schmidt
            last edited by

            Hi Manuel,

            I implemented that and didn't notice a difference in my error though.

            To be clear this is the sort of error I'm getting as shown with the Voronoi Fracture.

            image001.gif

            When the Matrix is above or a child of the Voronoi Fracture it updates correctly. When after the Voronoi Fracture it doesn't, there's a blip, that makes sense to me.

            The difference is that in my plugin having the Matrix as a child of my plugin still has the blip where the Voronoi Fracture doesn't.

            1 Reply Last reply Reply Quote 0
            • ManuelM
              Manuel
              last edited by Manuel

              hi,

              the voronoi object is registered with the flag OBJECT_INPUT.
              The voronoi is a really special object generator with many line of code, it really take a lof of cases into account.

              I'm going to find out what it's really doing with the matrix object in case you have it in the in/exclude list and as a child of the generator. But i just thing that as the generator is waiting for an input object and updating its cache. Even if it's a matrix, this matrix is updated during this process.

              Cheers,
              Manuel

              MAXON SDK Specialist

              MAXON Registered Developer

              D 1 Reply Last reply Reply Quote 0
              • D
                d_schmidt @Manuel
                last edited by

                Sorry about the delayed reply!

                the voronoi object is registered with the flag OBJECT_INPUT.

                I have this set as well, and I've swapped to taking the child matrix in as a child and I'm still having the same blip.

                1 Reply Last reply Reply Quote 0
                • ManuelM
                  Manuel
                  last edited by

                  hi,

                  you can check this thread it could help.

                  Touching the matrix could be the issue.

                  We are doing a lot of guessing here.

                  If you could send us your code that would probably help us a lot to find why it's not working properly. The voronoi object isn't a simple one and neither the matrix object.

                  Cheers,
                  Manuel

                  MAXON SDK Specialist

                  MAXON Registered Developer

                  D 1 Reply Last reply Reply Quote 0
                  • D
                    d_schmidt @Manuel
                    last edited by

                    Hi Manuel,

                    I was going to post my code but at the moment it looks as if the linked thread is giving the results I need with the matrix object, the blip is gone! using Current State to Object.

                    I'm not sure if you'd prefer for me to make a new thread for this question, but I've had similar 'blip' issue with Generators returning Polygon or Spline objects in both GVO and GetContour.

                    Using GetCache I'm able to browse and get the actual Polygon and Spline object, but when they're a child or further down the Object Manager Hierarchy than my plugin, I'm getting the previous cache, not the new one.

                    I know there are plenty of ways to rebuild the cache but is there a best practice method that offers the least overhead?

                    Dan

                    1 Reply Last reply Reply Quote 0
                    • ManuelM
                      Manuel
                      last edited by

                      where are you calling that "getcache" ? Inside the GetContour function ?

                      MAXON SDK Specialist

                      MAXON Registered Developer

                      D 2 Replies Last reply Reply Quote 0
                      • D
                        d_schmidt @Manuel
                        last edited by d_schmidt

                        @m_magalhaes

                        Yes, or in GVO() depending if I'm returning a spline or not.

                        1 Reply Last reply Reply Quote 0
                        • D
                          d_schmidt @Manuel
                          last edited by

                          @m_magalhaes

                          Hi! I don't mean to be a bother but I'm just giving this a bump in hope of a response!

                          Dan

                          1 Reply Last reply Reply Quote 0
                          • ManuelM
                            Manuel
                            last edited by

                            hi,

                            you are never bothering us, sorry if you have that feeling.

                            There's "no one" way to go. That depend a lot of what you are doing (this is still a bit blurry to me).
                            You often have to write specific code for specific cases.

                            The problem here is that it's a bit hard to answer you without having your code.

                            Cheers,
                            Manuel

                            MAXON SDK Specialist

                            MAXON Registered Developer

                            D 1 Reply Last reply Reply Quote 0
                            • D
                              d_schmidt @Manuel
                              last edited by

                              @m_magalhaes

                              Sorry about the late reply again! I went to build some simplified code to post and I might have figured it out in the process.

                              It seems that if I correctly mark the children with AddDependence then GetCache returns the cache I expect. Having the object lower in the object manager than mine causes it to lag behind slightly, but that seems consistent with other Cinema objects.

                              Dan

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