ViewportSelect

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

On 02/08/2011 at 11:00, xxxxxxxx wrote:

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

---------
Is it okay to use ViewportSelect in Draw() in a tooldata plugin?

I am trying to implement the following code but vps->Init() keeps returning FALSE.

  
  BaseObject* op = doc->GetActiveObject();  
  if(!op) return TOOLDRAW_0;  
  
  //CONVERT TO POLYGON OBJECT  
  PolygonObject *objPoly = ToPoly(op);  
  if(!objPoly) return TOOLDRAW_0;  
  
  //HELPER VARIABLES  
  //=============================================//  
    
  //Viewport Dimensions  
  LONG left, top, right, bottom, width, height;  
  bd->GetFrame(&left, &top, &right, &bottom);  
  width                    = right - left + 1;  
  height                    = bottom - top + 1;      
  
  LONG editorMode            = doc->GetMode();  
  Vector * points            = objPoly->GetPointW();  
  EditorWindow *win        = bd->GetEditorWindow();  
  
  Real radius                = 50;  
  Vector color            = Vector(1,1,1);  
    
  LONG x = cursorX;  
  LONG y = cursorY;  
  
  GePrint("X: " + LongToString(x) + " Y: " + LongToString(y));  
    
  //Viewport Select Variables  
  AutoAlloc<ViewportSelect> vps;  
  GePrint("1");  
  
#ifdef C4D_R12  
  if (!vps || !vps->Init(width, height, bd, objPoly, editorMode, TRUE, VIEWPORTSELECTFLAGS_0))  
  {  
      GePrint("NO INIT");  
      return TOOLDRAW_0;  
  }  
#else  
  if (!vps || !vps->Init(width, height, bd, objPoly, editorMode, TRUE, 0)) return TOOLDRAW_0;  
#endif     
  
  vps->SetBrushRadius(radius);  
  bd->SetPen(color);  
  
  bd->SetMatrix_Matrix(objPoly, Matrix());  
  vps->ShowHotspot(win, x, y);  
  
  ViewportPixel *vpPoint    = vps->GetNearestPoint(objPoly, x, y, radius, FALSE, NULL, NULL);  
  
  //DeSelect based on pixel radius  
  LONG xmin = x - radius;  
  LONG xmax = x + radius;  
  LONG ymin = y - radius;  
  LONG ymax = y + radius;  
  
  LONG            iy;  
  ViewportPixel*    vp            = NULL;  
  Vector            origin        = Vector(x, y, 0);  
  Vector            current;  
  Vector            dist;  
  Real            dis;  
  
  for(LONG ix = xmin; ix < xmax; ++ix)  
  {  
      for(iy = ymin; iy  < ymax; ++iy)  
      {  
          current        = Vector(ix, iy, 0);  
          dist        = origin - current;  
          dis            = Len(dist);  
  
          if (dis < radius)  
          {  
                  vp = vps->GetPixelInfoPoint(ix, iy);  
                  bd->DrawHandle(points[vp->i], DRAWHANDLE_BIG, NOCLIP_Z);  
                  GePrint("DRAW HANDLE");  
          }  
      }  
  }  
  
  return    TOOLDRAW_AXIS|TOOLDRAW_HANDLES;  

Thanks,  Shawn

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

On 11/08/2011 at 06:08, xxxxxxxx wrote:

I think it's a bad idea to do this in Draw(). You can always store the data obtained by ViewPortSelect in member variables of your tool class and trigger a viewport redraw with DrawViews. Draw will be called then.

cheers,
Matthias