SceneHooks and AM modes

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

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

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

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

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

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

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

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