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

    Snap mouse pointer to object?

    Scheduled Pinned Locked Moved SDK Help
    7 Posts 0 Posters 573 Views
    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 Offline
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 31/03/2012 at 09:44, xxxxxxxx wrote:

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

      ---------
      I've long wished for bezier spline tools in C4D. So that we can paint smooth accurate custom curves.
      The only way I see to draw a custom curved paint stroke in C4D is to use the spline shader. Which relies on UV's. Making it not very predictable or interactive.

      Is there a way to make the mouse pointer snap to a spline in the API?
      Or maybe a way to turn an object into a paintbrush somehow?
      If an object could be used to paint another object. Then I could snap that object to a spline path and create smooth custom paint strokes that way.

      -ScottA

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

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 31/03/2012 at 10:19, xxxxxxxx wrote:

        http://www.blackstar-solutions.de/index.php?id=11917

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

          THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

          On 31/03/2012 at 11:12, xxxxxxxx wrote:

          That's cool.
          But it doesn't help me learn how to make it myself.

          -ScottA

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

            THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

            On 02/04/2012 at 10:29, xxxxxxxx wrote:

            You may check the Snapping library and its main class, DetectSnapping.
            If you want to use it in a tool plugin, here is how to initialize and invoke this class in ToolData::MouseInput() :

            Bool MyToolData::MouseInput(BaseDocument* doc, BaseContainer& data, BaseDraw* bd, EditorWindow* win, const BaseContainer& msg)
            {
                AutoAlloc<DetectSnapping> snap;
                if (!snap) return FALSE;
                snap->Init(doc, bd, NULL, Vector(), 0, FALSE, TRUE, TRUE);
              
                Vector delta;
                Vector pos = bd->SW(Vector(Real(msg.GetLong(BFM_INPUT_X)), Real(msg.GetLong(BFM_INPUT_Y)), RCO 0));
              
                if (snap->SnapTo(pos, &delta))
                {
                    pos += delta;
                }
              
                return TRUE;
            }
            
            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

              On 02/04/2012 at 11:53, xxxxxxxx wrote:

              Thanks Yannick.

              Sorry for being stupid.
              But when I use that code in a tool plugin. Nothing happens.

              -ScottA

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

                THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                On 02/04/2012 at 14:13, xxxxxxxx wrote:

                Hi,
                Yannick code is fine you only have to apply it in your case.
                here a little example try to put it in liquid tool in c4dsdk example and remember to turn on and set snap settings:

                Bool LiquidToolData::MouseInput(BaseDocument *doc, BaseContainer &data;, BaseDraw *bd,EditorWindow *win, const BaseContainer &msg;)   
                {   
                     //get mouse position   
                     Real                    mx = msg.GetReal(BFM_INPUT_X);   
                     Real                    my = msg.GetReal(BFM_INPUT_Y);   
                  
                     Vector               pos = bd->SW(Vector(mx, my, 500)); // bring mouse pos in world space   
                     Vector               delta = Vector();   
                     BaseObject     *active = doc->GetActiveObject(); // get the active object   
                        
                     LONG                    button;   
                     switch (msg.GetLong(BFM_INPUT_CHANNEL))   
                     {   
                          case BFM_INPUT_MOUSELEFT : button=KEY_MLEFT; break;   
                          case BFM_INPUT_MOUSERIGHT: button=KEY_MRIGHT; break;   
                          default: return TRUE;   
                     }   
                        
                     if (!active) // if no active object create a new sphere and inser it in document   
                     {   
                          active = BaseObject::Alloc(Osphere);   
                          if (!active) return FALSE;   
                          doc->InsertObject(active, NULL, NULL, TRUE);   
                          active->SetAbsPos(pos);   
                     }   
                        
                     AutoAlloc<DetectSnapping>snap; // alloc the snap   
                     if (!snap) return FALSE;   
                     snap->Init(doc, bd, NULL, Vector(), 0, FALSE, TRUE, TRUE); // initialize snap   
                        
                     Real                         dx,dy;   
                     BaseContainer bc;   
                     BaseContainer device;   
                     win->MouseDragStart(button,mx,my,MOUSEDRAGFLAGS_DONTHIDEMOUSE|MOUSEDRAGFLAGS_NOMOVE);   
                     while (win->MouseDrag(&dx;,&dy;,&device;)==MOUSEDRAGRESULT_CONTINUE) // start drag   
                     {   
                          // increment mouse position during drag   
                          mx+=dx;   
                          my+=dy;   
                          pos = bd->SW(Vector(mx, my, 500)); // update pos   
                          if (snap->SnapTo(pos, δ)) // if point snap anywhere   
                    {   
                               pos += delta; // pos will be updated with snapped delta   
                    }             
                             
                          if (active) active->SetAbsPos(pos); // set the object position to the new one!   
                             
                          DrawViews(DRAWFLAGS_ONLY_ACTIVE_VIEW|DRAWFLAGS_NO_THREAD|DRAWFLAGS_NO_ANIMATION); //update viewport   
                     }   
                        
                     win->MouseDragEnd(); // reset viewport status   
                        
                     EventAdd();        
                     return TRUE;   
                }
                

                i hope this help
                Franz

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

                  THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                  On 02/04/2012 at 15:24, xxxxxxxx wrote:

                  Thank you Franz. That does make it more clear.🍺

                  That gives me a way to snap an object to a spline. While also staying attached to the mouse cursor.
                  Acting like a brush.
                  But now I have to somehow paint with that object. Like that paint shader does.

                  Any ideas how I would accomplish that?

                  -ScottA

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