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

    SceneHooks and AM modes

    Scheduled Pinned Locked Moved SDK Help
    8 Posts 0 Posters 632 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

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 05/07/2010 at 19:58, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   11 
      Platform:      Mac OSX  ; 
      Language(s) :     C++  ;

      ---------
      Hey all,

      I'm building a combo plugin that includes an object, a tag, and a scenehook.  There are some global settings associated with the scenehook that I want to be available for the user to alter if necessary.

      So, I was wondering how I could get AM parameters for the hook, but it's not something that's "selectable" like an object or a tag so there's no way to display it in the AM.  Then there's a dialog, but I don't feel like going that route.  Then I remembered the new document mode in the AM in R11.5 and wondered if I could create my own mode and tie it to my hook.

      A quick look through the sdk, and I find lib_activeobjectmanager.  Woohoo, it looks like I can create my own AM mode, and it's available all the way back to R10, perfect:D  But it seems like it's a bit of a different beast than most of the other stuff I've seen in the SDK, so I thought I'd ask a couple of questions before diving in:)

      1.It looks like a class, but it's categorized as a "global", so is there any special way to deal with it? (ducks for cover in case that's a stupid noob question).

      2. It almost seems like it's designed for scenehooks... Like, it is the quintessential answer to my overall problem of adding parameters to a scenehook plugin.  Is that correct?  The function to register a new mode has a variable for a MESSAGEHOOK *hook, is that where I put my scenehook plugin to tie that mode to my scenehook?  And if so, how do I handle the description resource in this case?

      thanks!

      -kvb

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

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 07/07/2010 at 03:03, xxxxxxxx wrote:

        Since R11.5 you can set the PLUGINFLAG_SCENEHOOK_SUPPORT_DOCUMENT_DESCRIPTION flag when you register the scene hook. This will cause the scene hook to appear in the document settings, just like the MoDynamics global settings for instance.

        Here is a simple example:

          
        #include "c4d.h"  
        #include "c4d_symbols.h"  
        #include "smyscenehook.h"  
          
          
        class MySceneHook : public SceneHookData  
        {  
          public:  
              static NodeData *Alloc(void) { return gNew MySceneHook; }  
        };  
          
          
        // be sure to use a unique ID obtained from www.plugincafe.com  
        #define ID_MYSCENEHOOK 1025181  
          
        Bool RegisterMySceneHook(void)  
        {  
          return RegisterSceneHookPlugin(ID_MYSCENEHOOK,GeLoadString(IDS_MYSCENEHOOK),PLUGINFLAG_SCENEHOOK_SUPPORT_DOCUMENT_DESCRIPTION,MySceneHook::Alloc,EXECUTION_EXPRESSION,0,NULL);  
        }  
        

        You can use standard description resource files, just remember to register the scene hook's description files.

          
        Bool PluginMessage(LONG id, void *data)  
        {  
          ...  
            
          switch (id)  
          {  
              case C4DPL_INIT_SYS:  
                  if (!resource.Init()) return FALSE; // don't start plugin without resource  
          
                  if (!RegisterDescription(ID_MYSCENEHOOK, "Smyscenehook", NULL)) return FALSE;  
                    
                  return TRUE;  
                    
          ...  
        }  
        

        cheers,
        Matthias

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

          THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

          On 07/07/2010 at 12:20, xxxxxxxx wrote:

          Thanks Matthias,

          But what about all the pre-R11.5 versions of my plugin?  I need a solution that will work for R10+.  Does that mean I can't create my own AM mode for use with my plugin in pre-11.5 versions of c4d?

          thanks,
          kvb

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

            THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

            On 08/07/2010 at 02:48, xxxxxxxx wrote:

            If you want to create a new AM mode you have to register it first. The best place to do this is probably C4DPL_STARTACTIVITY because all plugins have been already registered at this point. You have to pass a function pointer for a message hook to ActiveObjectManager_RegisterMode(). In this message hook you can pass the scene hook over to the AM.

            Here is some sample code for the AM mode registration, this goes into the main.cpp.

              
            #define ID_MYSCENEHOOK 1025181  
            #define ID_SCENEHOOKMODE 1025002  
              
            GeData SceneHookMessageHook(const BaseContainer &msg, void *data)  
            {  
              switch (msg.GetId())  
              {  
                  case AOM_MSG_ISENABLED:  
                  return TRUE;  
              
                  case AOM_MSG_GETATOMLIST:  
                  {  
                      BaseDocument *doc = GetActiveDocument(); if (!doc) break;  
                      PluginSceneHook *sh = doc->FindSceneHook(ID_MYSCENEHOOK); if (!sh) break;  
                      ((AtomArray* )data)->Append(sh);  
                      return TRUE;  
                  }  
                  break;  
              }  
              return FALSE;  
            }  
                
              
            Bool PluginMessage(LONG id, void *data)  
            {  
              switch (id)  
              {  
                  ...  
                    
                  case C4DPL_STARTACTIVITY:  
                      if (!ActiveObjectManager_RegisterMode((ACTIVEOBJECTMODE)ID_SCENEHOOKMODE, "Scene Hook", SceneHookMessageHook)) return FALSE;  
                      return TRUE;  
                        
                  ...  
              }  
              
              return FALSE;  
            }  
            

            This should work from R10.x up to 11.5x.

            cheers,
            Matthias

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

              THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

              On 08/07/2010 at 19:45, xxxxxxxx wrote:

              thanks Matthias:D

              -kvb

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

                THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                On 17/10/2010 at 20:39, xxxxxxxx wrote:

                If I may, I have a follow-up question regarding this:

                How do I then give this new AM mode an icon?

                thanks,
                kvb

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

                  THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                  On 18/10/2010 at 02:55, xxxxxxxx wrote:

                  You can change the icon by waiting for the MSG_GETCUSTOMICON message. Fill the passed GetCustomIconData structure with your own icon.

                  cheers,
                  Matthias

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

                    THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                    On 18/10/2010 at 05:35, xxxxxxxx wrote:

                    Thanks (yet again) Matthias:)  Working perfectly:)

                    btw... you should have a donate button on your site... I just went to go click it if it existed... but it didn't:(

                    -kvb

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