Jump to content
Luc S.

Issue with SpareParms and callback functions

Recommended Posts

Greetings!

I have recently started using the hdk to build a custom plug-in (which consist of a SOP Node that modify a heightfield) and I have encountered a deadend (actually more than one, but this forum provided me a lot of help ^^)

In a few words, I am creating a SpareParm by getting the OP_Director (OPgetDirector()) and adding a PRM_Template with method addNodeSpareParm(). My issue is that if I provide a callback function, it is not called back (no result and in debug mode, any breakpoints in the callback function are never reached). I have no issue with parameters normally given when creating the node (I mean when using the newSopOperator() function, a button parameter call back its function correctly).

To fully explain my process: I am creating a node with a path parameter (PRM_File) where I can provide a custom file. This custom file is read and depending on its content, I need to add parameters to the node. From my researches, SpareParms were the only approach suitable. Maybe I am wrong and I will be grateful if you can point me in the direction of a better method.

For instance, this file could give me the parameter ‘width’ with a range and the node would create an integer parameter that would make possible to change the width of the input heightfield.

But the SpareParms that are created do not seem to call the cookMySop() function when modified and adding a callback function that would use the forceRecook() function is not called (as explain above).

Does this issue ring any bell?

Thanks in advance

Luc

Share this post


Link to post
Share on other sites

Up ! ^^

I went to write a small SOP node that show my issue. It should be ok to compile it with hcustom. This SOP simply has a button (Button1), that when clicked create a new button (Button2, as a SpareParm) with a callback method to create a new buton (button3). But Button3 is never created.

void
newSopOperator(OP_OperatorTable* table)
{
    table->addOperator(new OP_Operator(
        "testSpareParm",
        "TestSpareParm",
        SOP_TestSpareParm::myConstructor,
        SOP_TestSpareParm::myTemplateList,
        1,
        1,
        NULL));
}

static int buttonCallBack2(void* data, int index, fpreal t, const PRM_Template*)
{
    SOP_TestSpareParm* me = static_cast<SOP_TestSpareParm*>(data);

    if (!me)
        return 0;

    OP_Director* director = OPgetDirector();

    PRM_Name bn = PRM_Name("button3", "Button3");
    PRM_Template button = PRM_Template(PRM_CALLBACK, 1, &bn, 0, 0, 0);
    director->addNodeSpareParm(me, &button);

    return 1;
}

static int buttonCallBack(void* data, int index, fpreal t, const PRM_Template*)
{
    SOP_TestSpareParm* me = static_cast<SOP_TestSpareParm*>(data);

    if (!me)
        return 0;

    OP_Director* director = OPgetDirector();

    PRM_Name bn = PRM_Name("button2", "Button2");
    PRM_Template button = PRM_Template(PRM_CALLBACK, 1, &bn, 0, 0, 0, buttonCallBack2);
    director->addNodeSpareParm(me, &button);
    
    return 1;
}

static PRM_Name names[] = {
    PRM_Name("button1",    "Button1"),
};

PRM_Template SOP_TestSpareParm::myTemplateList[] = {

    PRM_Template(PRM_CALLBACK,    1, &names[0], 0, 0, 0, buttonCallBack),
    PRM_Template(),
};

OP_Node* SOP_TestSpareParm::myConstructor(OP_Network* net, const char* name, OP_Operator* op)
{
    return new SOP_TestSpareParm(net, name, op);
}

SOP_TestSpareParm::SOP_TestSpareParm(OP_Network* net, const char* name, OP_Operator* op) : SOP_Node(net, name, op)
{
    mySopFlags.setManagesDataIDs(true);
}

SOP_TestSpareParm::~SOP_TestSpareParm() {}

OP_ERROR SOP_TestSpareParm::cookMySop(OP_Context& context)
{
    OP_AutoLockInputs inputs(this);
    if (inputs.lock(context) >= UT_ERROR_ABORT)
        return error();

    fpreal now = context.getTime();

    return error();
}

 

Do you see something wrong with theses few lines ?

Cheers !

SOP_TestSpareParm.C

SOP_TestSpareParm.h

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×