Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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

    Sometimes, IRR stops working when my plugin is placed on a scene.

    Cinema 4D SDK
    python
    2
    11
    1.4k
    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.
    • R
      rui_mac
      last edited by

      What could cause the IRR to stop working when an ObjectPlugin is generating geometry?

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

        Hi,

        We want you to use the forum tool to mark your thread as a question. Try to think about it for the next thread.

        Your question and the information you are giving us is too vague to have a precise answer. Try to reproduce the issue in a way that is failing all the time or define what do you mean with "Sometimes". Give us more information about what your plugin is in the scene (generator, deformer, tag etc..) and what it is supposed to do (created an object, use another object as input...). Also, what do you call "stop working"? Does the render stopped and start again over and over? Is it just black? Does only your plugins is not working?

        Like this, i would say that your object plugin is a generator, and you are not checking if you can re-use the cache, so your object is always dirty, and the render restart from the beginning over and over.

        Whenever it is possible try to reproduce the issue with the minimum amount of code so we can reproduce the issue on our system and check what is going wrong.

        Cheers,
        Manuel

        MAXON SDK Specialist

        MAXON Registered Developer

        1 Reply Last reply Reply Quote 0
        • R
          rui_mac
          last edited by

          I will try to create a way to reproduce it.
          But I'm checking if I can re-use a cached version. And I only set it as dirty when parameters change.

          1 Reply Last reply Reply Quote 0
          • R
            rui_mac
            last edited by

            Here is a demonstration of the problem with the IRR, using my plugin:

            Download movie

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

              hi;

              do you have any message on the console?

              Are you using GetContour to generate the spline? If so, how do you check if you can re-use the cache already generated?

              Cheers,
              Manuel

              MAXON SDK Specialist

              MAXON Registered Developer

              1 Reply Last reply Reply Quote 0
              • R
                rui_mac
                last edited by

                Yes, I'm using GetContour. And I'm just adjusting the "dirtyness" of the object, with this:

                	def CheckDirty(self, op, doc):
                
                		v1 = op[FR_STARTPOINT]
                		v2 = op[FR_ENDPOINT]
                		v3 = op.GetDown()
                		d1 = d2 = d3 = d4 = d5 = False
                
                		# d5 signals that the playhead has moved and the animation is to be taken into account
                		frame = doc.GetTime().GetFrame(doc.GetFps())
                		if self.old_frame != frame:
                			self.old_frame = frame
                			d5 = op[FR_TIME_CHANGE] == 1
                
                		# d1 signals that the starting point was changed
                		if v1 is not None:
                			d1 = v1.GetDirty(c4d.DIRTYFLAGS_DATA) > self.dirty1a or v1.GetDirty(c4d.DIRTY_MATRIX) > self.dirty1b
                			if d1:
                				self.dirty1a = v1.GetDirty(c4d.DIRTYFLAGS_DATA)
                				self.dirty1b = v1.GetDirty(c4d.DIRTY_MATRIX)
                
                		# d2 signals that the end point was changed
                		if v2 is not None:
                			d2 = v2.GetDirty(c4d.DIRTYFLAGS_DATA) > self.dirty2a or v2.GetDirty(c4d.DIRTY_MATRIX) > self.dirty2b
                			if d2:
                				self.dirty2a = v2.GetDirty(c4d.DIRTYFLAGS_DATA)
                				self.dirty2b = v2.GetDirty(c4d.DIRTY_MATRIX)
                
                		# d3 signals that a child was added to the object and there are no starting and ending points
                		if v1 is None and v2 is None and v3 is not None:
                			d3 = v3.GetDirty(c4d.DIRTYFLAGS_DATA) > self.dirty3a or v3.GetDirty(c4d.DIRTY_MATRIX) > self.dirty3b or op.GetDirty(c4d.DIRTY_CHILDREN) > self.dirty_child
                			if d3:
                				self.dirty3a = v3.GetDirty(c4d.DIRTYFLAGS_DATA)
                				self.dirty3b = v3.GetDirty(c4d.DIRTY_MATRIX)
                				self.dirty_child = op.GetDirty(c4d.DIRTY_CHILDREN)
                
                		# check if the added child is a spline
                			d3 = d3 and ((v3.GetInfo() & c4d.OBJECT_ISSPLINE) != 0)
                
                		# compare the previous state of having a child or not with the new state.
                		has_child_now = v3 is not None
                		if has_child_now != self.has_child:
                			self.has_child = has_child_now
                
                		# if any of the conditions is True, set the object as Dirty
                		if d1 or d2 or d3 or d4 or d5:
                			op.SetDirty(c4d.DIRTYFLAGS_DATA)
                			c4d.EventAdd()
                
                1 Reply Last reply Reply Quote 0
                • ManuelM
                  Manuel
                  last edited by Manuel

                  @rui_mac said in Sometimes, IRR stops working when my plugin is placed on a scene.:

                  c4d.EventAdd()

                  That is not a good idea in the CheckDirty function.

                  you can have a look at this example on github that use both GetVirtualObject and GetCountour and CheckDirty.

                  you are storing data in 'self' but i cannot be sure that they are not modified somewhere else.
                  I got the feeling that this is an issue with the cache of your object. That is why i recommend simplifying as much as possible your code.

                  Cheers,
                  Manuel

                  MAXON SDK Specialist

                  MAXON Registered Developer

                  1 Reply Last reply Reply Quote 0
                  • R
                    rui_mac
                    last edited by

                    I will look into the example.
                    However, if I do have to check old values for changes, what is the best way? Those variables inside the class (the 'self' ones) are any used inside the CheckDirty.

                    1 Reply Last reply Reply Quote 0
                    • R
                      rui_mac
                      last edited by rui_mac

                      It is working fine now 😄
                      Thank you so much.

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

                        The problem is not to use self.xxxx to store data, the problem was that i could not see if they were modified somewhere else or not.

                        Could you share what was the issue so other people (including myself) could benefit from your experience?

                        I am happy that the problem is solved.

                        Cheers,
                        Manuel

                        MAXON SDK Specialist

                        MAXON Registered Developer

                        1 Reply Last reply Reply Quote 0
                        • R
                          rui_mac
                          last edited by

                          Since I know exactly what methods access/check/change the self.xxxx variables, it is a risk I'm willing to take 😉
                          As for the solution, I removed the c4d.EventAdd() and at the GetContour method I was simply calling the function that was creating the spline. Now I perform a few checks for "dirtyness" and only after they show that something is dirty, I call the function to produce the spline.

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