How to Handle Handles



  • 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.

    Dan


Log in to reply