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

    SplineObject in Draw()

    SDK Help
    0
    9
    1.5k
    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 03/01/2018 at 00:36, xxxxxxxx wrote:

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

      ---------
      Hi folks,

      think I'm missing something simple here - how do I draw a SplineObject in an objectdata's Draw() function? Everything I try results in the base draw returning DRAWRESULT_SKIP.

      // Init function - allocate class level variable
      Bool My_Object::Init(GeListNode *node)
      {
          Spline = SplineObject::Alloc(2,SPLINETYPE_LINEAR);
          Vector *pnt = Spline->GetPointW();
          pnt[0] = Vector(0.0,100.0,0.0);
          pnt[1] = Vector(0.0,100.0,-100.0);
          Spline->Message(MSG_UPDATE);
        
          return TRUE;
      }
        
      // Draw function
      DRAWRESULT My_Object::Draw(BaseObject *op,DRAWPASS drawpass,BaseDraw *bd,BaseDrawHelp *bh)
      {
          if(drawpass == DRAWPASS_OBJECT)
          {
              Vector col = Vector(0.0,1.0,1.0);
              bd->SetMatrix_Matrix(nullptr,bh->GetMg());
              Spline->SetMg(bh->GetMg());
              Spline->SetAbsPos(Vector(0.0,100.0,0.0));
              DRAWRESULT res = bd->DrawObject(bh,Spline,DRAWOBJECT_FORCEPOINTS|DRAWOBJECT_USE_OBJECT_COLOR,drawpass,op,col);
        
              if(res == DRAWRESULT_OK)
              {
                  GePrint("Success!!"); // never called        
              }
              else if(res == DRAWRESULT_SKIP)
              {
                  GePrint("Skipped.."); // always called
              }
          }
        
          return SUPER::Draw(op,drawpass,bd,bh);
      }
        
      // Spline is freed in plugin object's Free()
      

      Always prints "Skipped..". Cheers,

      WP.

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

        On 03/01/2018 at 01:58, xxxxxxxx wrote:

        You must retrieve LineObject. A good read for you https://c4dprogramming.wordpress.com/2012/11/21/drawing-a-spline-in-the-viewport/

        Hope it's help 🙂

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

          On 03/01/2018 at 02:21, xxxxxxxx wrote:

          I missed the LineObject. Page bookmarked. Thanks gr4ph0s!

          WP.

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

            On 03/01/2018 at 07:47, xxxxxxxx wrote:

            Thanks gr4ph0s for getting here fast and precise!

            As a side note, consider that the SplineObject::GetLineObject() has changed compared to that used in the blog post and appreciable changes in terms of spline curve tessellation can be obtained with LOD ranging between 0.1 and 1.

            Best, Riccardo

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

              On 03/01/2018 at 23:25, xxxxxxxx wrote:

              Hi knickknack,

              could you explain the spline curve tessellation a little more?

              WP.

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

                On 04/01/2018 at 02:18, xxxxxxxx wrote:

                Hi WickedP, thanks for writing back.

                Since we need to represent lines rather than pure spline curves using the ObjectData::Draw() function, we need to approximate the real curve to a sequence of segments whose distance from the curve represent the level of approximation desired. Using the LOD parameter you're able to change this approximation where a value of 0 basically create straight lines among the points building the spline whilst greater values create smaller line pieces approximating better and better the spline itself.

                Make sense?

                Best, Riccardo

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

                  On 04/01/2018 at 02:40, xxxxxxxx wrote:

                  So it's to do with the quality of the curve line draw between points? Assuming there's a curve between points, a value closer to 1.0 draws a more precise curve line?

                  WP.

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

                    On 04/01/2018 at 05:18, xxxxxxxx wrote:

                    Exactly!

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

                      On 04/01/2018 at 13:32, xxxxxxxx wrote:

                      Gotchya! Thanks,

                      WP.

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