Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
On 21/02/2013 at 09:05, xxxxxxxx wrote:
User Information: Cinema 4D Version: 13 Platform: Mac ; Language(s) : C++ ;
--------- Hello all, I've been experimenting with the Rounded Tube example plugin and I've been trying to figure out how handles work and I think I have a basic understanding of them now. I'm getting stuck thought trying to make a handle that can move on the X and Z axis independently of each other. I swapped the rounded tube out with a plane and I want to control the height and width with a handle in the corner. Which I can do, but it always moves the same on both axises.
I think it has to do with changing something on these two lines in GetHandle(), but I'm not to sure what I need to change.
info.direction = Vector(1.0, 0.0, 0.0); info.type = HANDLECONSTRAINTTYPE_LINEAR;
Any hints would be useful. Thanks!
Dan
On 21/02/2013 at 13:17, xxxxxxxx wrote:
Here are the Handle methods that I use in one of my plugins. Not that the UNFURL_UNFURL_AMOUNT goes from 0.0 to 1.0 (0% to 100%).
// ObjectData.Draw //*---------------------------------------------------------------------------* DRAWRESULT UnfurlObj::Draw(BaseObject* op, DRAWPASS drawpass, BaseDraw* bd, BaseDrawHelp* bh) //*---------------------------------------------------------------------------* { if (!(op && bd && bh)) return DRAWRESULT_DRAWN; if (drawpass == DRAWPASS_HANDLES) { LONG hitid = op->GetHighlightHandle(bd); HandleInfo info; bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT)); bd->SetMatrix_Matrix(op, bh->GetMg()); GetHandle(op, 0L, info); if (hitid == 0L) bd->SetPen(GetViewColor(VIEWCOLOR_SELECTION_PREVIEW)); else bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT)); bd->DrawHandle(info.position, DRAWHANDLE_BIG, 0L); GetHandle(op, 1L, info); bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT)); bd->DrawLine(info.position, Vector(0.0), 0L); bd->SetMatrix_Matrix(NULL, Matrix()); if (hit == 0L) bd->SetPen(GetViewColor(VIEWCOLOR_SELECTION_PREVIEW)); else bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT)); bd->DrawHandle(GetHandle(op, 0L),DRAWHANDLE_BIG,0L); // Line from center to Handle bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT)); bd->DrawLine(GetHandle(op, 1L),m.off,0L); } return SUPER::Draw(op, drawpass, bd, bh); } // ObjectData.GetHandle //*---------------------------------------------------------------------------* void UnfurlObj::GetHandle(BaseObject* op, LONG i, HandleInfo& info) //*---------------------------------------------------------------------------* { BaseContainer* data = op->GetDataInstance(); if (!data) return; info.position.x = data->GetReal(UNFURL_UNFURL_AMOUNT)*125.0; info.direction.x = 1.0; info.type = HANDLECONSTRAINTTYPE_LINEAR; } // ObjectData.DetectHandle //*---------------------------------------------------------------------------* LONG UnfurlObj::DetectHandle(BaseObject* op, BaseDraw* bd, LONG x, LONG y, QUALIFIER qualifier) //*---------------------------------------------------------------------------* { HandleInfo info; GetHandle(op, 0L, info); return (bd->PointInRange(info.position*op->GetMg(),x,y))?0L:NOTOK; } // ObjectData.MoveHandle //*---------------------------------------------------------------------------* Bool UnfurlObj::MoveHandle(BaseObject* op, BaseObject* undo, const Vector& mouse_pos, LONG hit_id, QUALIFIER qualifier, BaseDraw* bd) //*---------------------------------------------------------------------------* { BaseContainer* dst = op->GetDataInstance(); if (!dst) return TRUE; HandleInfo info; Real val = mouse_pos.x; GetHandle(op, hit_id, info); if (bd) { Matrix mg = op->GetUpMg() * undo->GetMl(); Vector pos = bd->ProjectPointOnLine(info.position * mg, info.direction ^ mg, mouse_pos.x, mouse_pos.y); val = (pos * !mg) * info.direction; } if (hit_id != 0L) return TRUE; dst->SetReal(UNFURL_UNFURL_AMOUNT,FCut01(val*0.008)); return TRUE; }
On 06/03/2013 at 10:45, xxxxxxxx wrote:
Thanks a ton Robert, I got distracted by some other projects, cause for the every late response.