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:
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.
On 31/03/2012 at 10:19, xxxxxxxx wrote:
On 31/03/2012 at 11:12, xxxxxxxx wrote:
But it doesn't help me learn how to make it myself.
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)
if (!snap) return FALSE;
snap->Init(doc, bd, NULL, Vector(), 0, FALSE, TRUE, TRUE);
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;
On 02/04/2012 at 11:53, xxxxxxxx wrote:
Sorry for being stupid.
But when I use that code in a tool plugin. Nothing happens.
On 02/04/2012 at 14:13, xxxxxxxx wrote:
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
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);
AutoAlloc<DetectSnapping>snap; // alloc the snap
if (!snap) return FALSE;
snap->Init(doc, bd, NULL, Vector(), 0, FALSE, TRUE, TRUE); // initialize snap
while (win->MouseDrag(&dx;,&dy;,&device;)==MOUSEDRAGRESULT_CONTINUE) // start drag
// increment mouse position during drag
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
i hope this help
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?