Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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

    calling CustomDataTypeClass::Calculate() [SOLVED]

    SDK Help
    0
    4
    744
    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 27/07/2016 at 03:40, xxxxxxxx wrote:

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

      ---------
      Hi! I'm trying to interpolate between two GeData values. But when I call CustomDataTypeClass::Calculate(),
      it always gives me GV_CALC_ERR_UNDEFINED . Does someone know what I'm doing wrong?

      Thanks a lot in advance,

      -Niklas

      GeData InterpolateValues(GeData const& left, GeData const& right, BaseList2D* node, Float w) {
        Int32 const type = left.GetType();
        if (type != right.GetType()) return left;
        
        // Load the CustomDataTypeClass plugin for this datatype.
        CUSTOMDATATYPEPLUGIN* plug = FindCustomDataTypePlugin(left.GetType());
        if (!plug) return left;
        auto data = static_cast<CustomDataTypeClass*>(plug->adr);
        if (!data) return left;
        
        
        GeData res = left;
        GvError err = (data->*plug->Calculate)(
          GV_CALC_MIX,
          left.GetCustomDataType(type),
          right.GetCustomDataType(type),
          res.GetCustomDataType(type),
          w);
        
        if (err != GV_IO_ERR_NONE) {
          // Always gets here with err == GV_CALC_ERR_UNDEFINED
          GePrint("Oh Noes! " + String::IntToString(err));
        }
        
        return res;
      }
      
              // Calling example
      	GeData l(10);
      	GeData r(50);
      	GeData res = InterpolateValues(l, r, nullptr, 0.5);
      	Int32 val = res.GetInt32();
      
      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 28/07/2016 at 08:22, xxxxxxxx wrote:

        Hi Niklas,

        I'm terribly sorry, I haven't found as much time to investigate it, as I had planned and wished.
        Just wanted to let you know, I'm on it.
        What I found so far: Your Calculate() call ends up in the "base implementation" of that function, which does nothing more than returning GV_CALC_ERR_UNDEFINED. So actually under the given circumstances, the result is actually correct 😉
        I'll continue with this tomorrow.

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

          On 29/07/2016 at 08:58, xxxxxxxx wrote:

          Hi Niklas,

          the reason is quite simple: Only very few custom data types implement Calculate(). From the public ones, SplineData is actually the only one (and even this implements only GV_CALC_CLR, GV_CALC_ADD and GV_CALC_MIX).
          So actually your example is correct, but it works only on data types that implemented Calculate()... SplineData that is. 😊

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

            On 29/07/2016 at 10:51, xxxxxxxx wrote:

            Thank you for your time and effort, Andreas. 🙂 Originally I didn't expect FindCustomDataTypePlugin()
            to actually return not-null for any of the standard datatypes (LONG, REAL, etc.), but since it did, I
            expected it to be implemented for these types as well.

            Anyway, now that I know I just do some special handling for the datatypes that I want to support
            proper interpolation for, and eventually use the CustomDataTypePlugin for any ID that I don't know
            or don't handle.

            Thanks again!
            Niklas

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