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

    SplineData Callbacks

    SDK Help
    0
    12
    985
    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 30/07/2013 at 00:52, xxxxxxxx wrote:

      The SplineDataCallback function type returns Bool not void. Also, you do not need to allocated a
      SplineDataCallbackCursorInfo object, a pointer will be passed to the SplineDataCallback. It is just like the
      Message system of Cinema 4D nodes.

      Bool MySplineCallback(LONG type, void* p_data) {
          switch (type) {
              case SPLINE_CALLBACK_CURSORINFO: {
                  auto data = (SplineDataCallbackCursorInfo* ) p_data;
                  if (!data) return FALSE;
        
                  GePrint("Mouse Pos: " + LongToString(data->x) + ", " LongToString(data->y));
                  break;
              } 
          }
          return TRUE;
      }
      

      I've never used the Spline callbacks myself though and the code is not tested.

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

        On 30/07/2013 at 08:09, xxxxxxxx wrote:

        Thanks Nik,

        I gave it a shot. But I'm getting a similar error.
        Only this time it's this:
        Error: cannot convert parameter 1 from 'Bool (__cdecl * )(LONG,void * )' to 'SplineDataCallback'

          
        //The CallBack method  
        Bool mySplineCallBack(LONG id, void *p_data)  
        {  
          switch (id)  
          {  
              case SPLINE_CALLBACK_CURSORINFO:  
                  {  
                  auto data = (SplineDataCallbackCursorInfo* ) p_data;  
                  if (!data) return FALSE;  
          
                  GePrint("Mouse Pos: " + LongToString(data->x) + ", " + LongToString(data->y));  
                  break;  
                 }   
          }  
          return TRUE;  
        }  
          
        .........  
          
        //Calling the callback method  
        EXECUTIONRESULT SplineTag::Execute(BaseTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, EXECUTIONFLAGS flags)  
        {  
          GeData d;                                                          //Create a variable to hold the data we will get using GetParameter() below  
          if (tag->GetParameter(DescLevel(MY_SPLINE), d, DESCFLAGS_GET_0))   //If the tag with the spline GUI exists  
          {  
              SplineData *myspline = (SplineData* )d.GetCustomDataType(CUSTOMDATATYPE_SPLINE); //Assign a variable to the spline's container so we can access & edit them later on  
              if(myspline)  
               {   
                 CustomSplineKnot *knot1 = myspline->GetKnot(0);      //Get the first spline's knot in the spline GUI  
                 CustomSplineKnot *knot2 = myspline->GetKnot(1);      //Get the second spline's knot in the spline GUI  
                 if (knot2)  
                  {  
                   Vector knot1pos = knot1->vPos;                     //Get the position of the first spline's knot and assign it to a variable      
                   Vector knot2pos = knot2->vPos;                     //Get the position of the second spline's knot and assign it to a variable  
          
                   myspline->SetUserCallback(mySplineCallBack, NULL);   
                  }  
           }  
            
          return EXECUTIONRESULT_OK;  
        }
        

        -ScottA

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

          On 30/07/2013 at 08:27, xxxxxxxx wrote:

          is MySplineCallback / mySplineCallback intentional ?

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

            On 30/07/2013 at 08:32, xxxxxxxx wrote:

            ^LoL. You caught me before I could update my post. You guys are too quick. 😂
            I fixed it. But still I'm having problems getting it to work.

            -ScottA

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

              On 30/07/2013 at 08:52, xxxxxxxx wrote:

              1. Why do you only test for knot2 but not knot1? It could be NULL too.
              2. What are the new problems you are facing?
              3. I think you should only call SetUserCallback() once in SplineTag::Init() where you initialize the Spline GUI

              Cheers,
              -Nik

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

                On 30/07/2013 at 08:59, xxxxxxxx wrote:

                My problem is getting the callback code to complie and work.
                It doesn't work for me as  a Bool type either.

                Error: cannot convert parameter 1 from 'Bool (__cdecl * )(LONG,void * )' to 'SplineDataCallback'

                -ScottA

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

                  On 30/07/2013 at 09:37, xxxxxxxx wrote:

                  I overlooked this as well: The docs say that the second argument is const void* not void*.

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

                    On 30/07/2013 at 10:00, xxxxxxxx wrote:

                    Thanks. That fixed it.

                    It compiles now. However I'm not getting any results from it.
                    I wonder if we have to use GetUserCallback() in combination with this to get a result?

                    -ScottA

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

                      On 30/07/2013 at 10:52, xxxxxxxx wrote:

                      Never mind. I've got it working.

                      Apparently you have to call to your spline callback from within the Init() method.
                      In my mind that seem rather strange. Because it should make it run only once when the tag is created. Then not run anymore.
                      That's how using the Init() method usually works.

                      But in this case. I guess the callback uses the Init() method to start it up.
                      And then once it's been started, it will keep on running in the background. And feedback the mouse positions.

                      Thanks a lot for your help Niklas,
                      -ScottA

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

                        On 30/07/2013 at 11:23, xxxxxxxx wrote:

                        Originally posted by xxxxxxxx

                        Apparently you have to call to your spline callback from within the Init() method.
                        In my mind that seem rather strange. Because it should make it run only once when the tag is created. Then not run anymore.
                        That's how using the Init() method usually works.

                        By "call to your spline callback from within the Init() method", do you mean the following?

                        myspline->SetUserCallback(mySplineCallBack, NULL);
                        

                        You do not call your function here. You only pass it as a parameter and the SplineGUI will call
                        this method at a later point. Calling your function would look like

                        SplineDataCallbackDraw data;
                        // fill the data
                        mySplineCallBack(SPLINE_CALLBACK_DRAW, &data);
                        

                        but you should not do this. The SplineGUI is doing this, but doing this yourself makes no sense.

                        -Nik

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

                          On 30/07/2013 at 11:35, xxxxxxxx wrote:

                          Originally posted by xxxxxxxx

                          By "call to your spline callback from within the Init() method", do you mean the following?

                          myspline->SetUserCallback(mySplineCallBack, NULL);
                          

                          Yes.

                          The other Callbacks I've used don't work this way.
                          I have to place them within an Execute, or Message method so that they will continuously update.
                          But this one acts more a like a windows service. Where once you start it. It will continue to run and update on it's own.

                          CallBacks in general always trip me up.
                          I'm not very good with them.

                          -ScottA

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