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

    Copy Overrides to other objects

    SDK Help
    0
    7
    749
    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
      Helper
      last edited by

      On 11/08/2017 at 02:38, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   18 
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      Hi there,

      I'm trying to copy some Overrides to another object (they are not of the same type, but base properties are still the same, as they derive from Obase)

      The following code actually works to some extent, but not for all takes.

      I'm pretty sure that I made a mistake here. Also, I don't fully understand the sub-takes yet. Just started  with them. 🙂




      Here's some example code:

          inline void TransferTakeOverrides(BaseObject* srcObj, BaseObject* tgtObj, BaseDocument* doc)
          {
              // Get doc's take data
              TakeData* takeData = doc->GetTakeData();
        
              if (!takeData)
                  return;
        
        
              // Get main take to start from
              BaseTake* currentTake = takeData->GetMainTake();
        
              // Set main take active as we need the parameters in "backup state"
              //takeData->SetCurrentTake(takeData->GetMainTake());
        
        
              // TODO: Disable Auto-Take / Set Mode to manual
        
              // Iterate over all other takes
              while (currentTake)
              {
        
                  // skip main take
      	    // ...
        
                  // Check all overrides for object in current take
                  BaseOverride* srcOverride = currentTake->FindOverride(takeData, srcObj);
        
                  while (srcOverride)
                  {
                      maxon::BaseArray<DescID> srcDescIDs;
                      srcOverride->GetAllOverrideDescID(srcDescIDs);
        
                      for (auto descID : srcDescIDs)
                      {
                          GeData overrideValue;
        
                          srcOverride->GetParameter(descID, overrideValue, DESCFLAGS_GET_0);
        
                          BaseOverride* tgtOverride = currentTake->FindOrAddOverrideParam(takeData, tgtObj, descID, overrideValue);
                          tgtOverride->UpdateSceneNode(takeData, descID);
                      }
        
                       srcOverride = static_cast<BaseOverride*>(GetNextNode(static_cast<GeListNode*>(srcOverride)));
                  }
        
                   currentTake = static_cast<BaseTake*>(GetNextNode(static_cast<GeListNode*>(currentTake)));
              }
          }
      
      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 13/08/2017 at 11:39, xxxxxxxx wrote:

        Probably can answer this myself.

        I simply retrieved the "Backup"-value via FindOverrideCounterPart() and provided this as the backupValue Parameter to FindOrAddOverrideParam().

        However, I'm pretty sure there's a more elegant way?

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

          On 18/08/2017 at 00:46, xxxxxxxx wrote:

          Sorry for bumping this thread, but I would be very thankful for some feedback, if this is the right way. 🙂

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

            On 18/08/2017 at 09:15, xxxxxxxx wrote:

            Hi,

            I'm terribly sorry, when you said, you could answer it yourself, I thought you had a working solution and considered the thread more or less done.

            In general it works the way you describe, not sure you would want to skip the Main Take (as the comment in your code suggests), but that's probably a question of the desired final result.

            If there's a more elegant way to achieve the same result, to be honest I don't know, yet. I will discuss it on Monday with the rest of the team.

            One more note: As BaseOverride and BaseTake are both derived from GeListNode, there's no need for the cast, when passing them to your GetNextNode() as parameters. Might make the code a bit more readable without.

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

              On 18/08/2017 at 10:30, xxxxxxxx wrote:

              Thanks Andreas, looking forward to your findings.

              The cast in the end was from a temporary code. I now use a generic "walker". So, no need to adress it. 🙂

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

                On 21/08/2017 at 10:50, xxxxxxxx wrote:

                Hi,

                we discussed the question this morning, but we didn't come up with a more elegant solution.

                So I will just add the link to the Take System Overview page, I had forgotten so far. Don't miss the manual child pages!

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

                  On 22/08/2017 at 05:20, xxxxxxxx wrote:

                  Yay, thanks! 🙂

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