Snap mouse pointer to object?



  • 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



  • 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



  • 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



  • 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;
    }
    


  • 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



  • 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



  • 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


Log in to reply