THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 13/06/2012 at 10:28, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 12
Platform: Windows ;
Language(s) : C++ ;
---------
Hi,
I've managed to create a tool plugin that highlights the polygons when the mouse is hovering over them. But I don't know how to actually select the polygon when the mouse is clicked on it.
I'm using the LiquidTool as the base for the plugin.
Here's the code:
#include "c4d.h"
#include "c4d_symbols.h"
#define ID_LIQUIDTOOL 1000973
class LiquidToolData : public ToolData
{
public:
virtual Bool MouseInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, EditorWindow *win, const BaseContainer &msg);
virtual Bool KeyboardInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, EditorWindow *win, const BaseContainer &msg);
virtual LONG GetState(BaseDocument *doc);
virtual Bool GetCursorInfo(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, Real x, Real y, BaseContainer &bc);
virtual TOOLDRAW Draw(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, BaseDrawHelp *bh, BaseThread *bt,TOOLDRAWFLAGS flags);
virtual SubDialog* AllocSubDialog(BaseContainer* bc);
private:
LONG polygonid;
Bool highlight;
};
TOOLDRAW LiquidToolData::Draw(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, BaseDrawHelp *bh, BaseThread *bt,TOOLDRAWFLAGS flags)
{
if (!(flags & TOOLDRAWFLAGS_HIGHLIGHT))
return TOOLDRAW_0;
if (doc->GetMode() != Mpolygons)
return TOOLDRAW_0;
if (!highlight)
return TOOLDRAW_0;
BaseObject *op = doc->GetActiveObject();
if (op && op->GetType() == Opolygon)
{
const CPolygon *polys = ToPoly(op)->GetPolygonW();
const Vector *points = ToPoly(op)->GetPointW();
Vector *p = bNew Vector[4];
p[0] = points[polys[polygonid].a];
p[1] = points[polys[polygonid].b];
p[2] = points[polys[polygonid].c];
p[3] = points[polys[polygonid].d];
Vector *f = bNew Vector[4];
f[0] = 1.0;
f[1] = 1.0; //The color of the selected polygon?
f[2] = 1.0;
f[3] = 1.0;
bd->SetMatrix_Matrix(NULL, op->GetMg(), 3);
bd->DrawPolygon(p,f,TRUE);
bd->LineZOffset(0);
bDelete(p);
bDelete(f);
}
highlight = FALSE;
return TOOLDRAW_0;
}
LONG LiquidToolData::GetState(BaseDocument *doc)
{
if (doc->GetMode()==Mpaint) return 0;
return CMD_ENABLED;
}
Bool LiquidToolData::KeyboardInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, EditorWindow *win, const BaseContainer &msg)
{
LONG key = msg.GetData(BFM_INPUT_CHANNEL).GetLong();
String str = msg.GetData(BFM_INPUT_ASC).GetString();
if (key == KEY_ESC)
{
// do what you want
// return TRUE to signal that the key is processed!
return TRUE;
}
return FALSE;
}
Bool LiquidToolData::MouseInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd,EditorWindow *win, const BaseContainer &msg)
{
Real mx = msg.GetReal(BFM_INPUT_X);
Real my = msg.GetReal(BFM_INPUT_Y);
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;
}
DrawViews(DRAWFLAGS_ONLY_ACTIVE_VIEW|DRAWFLAGS_NO_THREAD|DRAWFLAGS_NO_ANIMATION);
if (win->MouseDragEnd()==MOUSEDRAGRESULT_ESCAPE)
{
doc->DoUndo(TRUE);
}
EventAdd();
return TRUE;
}
Bool LiquidToolData::GetCursorInfo(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, Real x, Real y, BaseContainer &bc)
{
LONG left, top, right, bottom, width, height;
bd->GetFrame(&left, &top, &right, &bottom);
width = right - left + 1;
height = bottom - top + 1;
LONG mode = doc->GetMode();
BaseObject *op = doc->GetActiveObject();
if (!op || op->GetType() != Opolygon) return TRUE;
AutoAlloc<ViewportSelect> vs;
if (!vs || !vs->Init(width,height,bd,op,mode,TRUE,VIEWPORTSELECTFLAGS_0)) return FALSE;
if (mode == Mpolygons)
{
highlight = TRUE;
ViewportPixel *vpp = NULL;
LONG mx = x;
LONG my = y;
vpp = vs->GetNearestPolygon(op, mx, my, MAXLONGl, FALSE, NULL, 0);
if (vpp)
{
polygonid = vpp->i;
DrawViews(DRAWFLAGS_ONLY_ACTIVE_VIEW|DRAWFLAGS_NO_THREAD|DRAWFLAGS_NO_ANIMATION, bd);
}
}
return TRUE;
}
class LiquidToolDialog: public SubDialog
{
public:
virtual Bool CreateLayout(void);
virtual Bool InitValues(void);
virtual Bool InitDialog(void);
virtual Bool Command(LONG id,const BaseContainer &msg);
};
Bool LiquidToolDialog::CreateLayout(void)
{
return TRUE;
}
Bool LiquidToolDialog::InitValues(void)
{
return InitDialog();
}
Bool LiquidToolDialog::InitDialog(void)
{
BaseContainer *bc=GetToolData(GetActiveDocument(),ID_LIQUIDTOOL);
if (!bc) return FALSE;
return TRUE;
}
Bool LiquidToolDialog::Command(LONG id,const BaseContainer &msg)
{
return TRUE;
}
SubDialog* LiquidToolData::AllocSubDialog(BaseContainer* bc)
{
return gNew LiquidToolDialog;
}
Bool RegisterPrimitiveTool(void)
{
return RegisterToolPlugin(ID_LIQUIDTOOL,GeLoadString(IDS_PRIMITIVETOOL),0,AutoBitmap("liquid.tif"),"C++ SDK Liquid Painting Tool",gNew LiquidToolData);
}
-ScottA