Draw Manual

About

Many classic plugin classes can implement a "Draw" function that allows to draw something in the editor viewport. These "Draw" functions differ from class to class.

Draw

A "Draw" function can be found in the following classic base classes:

Note
To avoid drawing order problems the drawing operations of multiple objects or tags can be replaced by the use of the "Draw" function in a SceneHookData plugin.

Usage

A "Draw" function is typically called multiple times during the drawing process for different draw passes and for each open viewport window. The given BaseDraw object represents a viewport window and is used to draw in that window.

This is an example implementation of ObjectData::Draw():

DRAWRESULT Draw(BaseObject* op, DRAWPASS drawpass, BaseDraw* bd, BaseDrawHelp* bh)
{
// only draw in the DRAWPASS_OBJECT
if (drawpass != DRAWPASS_OBJECT)
return SUPER::Draw(op, drawpass, bd, bh);
// set the matrix / space for the following drawing operations
// in this case, use the object's matrix
const Matrix& mg = bh->GetMg();
bd->SetMatrix_Matrix(op, mg);
// set line width
// draw lines
bd->SetPen(Vector(1.0, 0.0, 0.0));
bd->DrawLine(Vector(-100, 0, 0), Vector(100, 0, 0), NOCLIP_D);
bd->SetPen(Vector(00, 1.0, 0.0));
bd->DrawLine(Vector(0, 100, 0), Vector(0, -100, 0), NOCLIP_D);
bd->SetPen(Vector(0.0, 0.0, 1.0));
bd->DrawLine(Vector(0, 0, 100), Vector(0, 0, -100), NOCLIP_D);
// reset parameters
return SUPER::Draw(op, drawpass, bd, bh);
}

Typical tasks in a "Draw" function are:

  • Check the current draw pass to avoid unnecessary operations.
  • Check if the assigned layer of the object, tag or material disables viewport drawing.
  • Set the reference coordinate system for the following drawing operations.
  • Set the drawing parameters for the following drawing operations.
  • Perform drawing operations.
  • Reset the drawing parameters.

How to use a BaseDraw object is described in BaseView / BaseDraw Manual.

Examples

For objects that can be assigned to layers it might be necessary to check if the assigned layer forbids viewport drawing. See Layer Manual.

// check if the assigned layer disables drawing
BaseDocument* doc = bh->GetDocument();
const LayerData* ld = op->GetLayerData(doc);
// check if not visible in the editor
if (ld && (!ld->view))

If the drawing operations should only be applied to the currently selected viewport window it is needed to check if the given BaseDraw represents the selected viewport.

// This example checks if the current BaseDraw is the active BaseDraw.
BaseDraw* const activeBD = doc->GetActiveBaseDraw();
const Bool isActiveBD = bd && (bd == activeBD);
if (!isActiveBD)

It is also possible to enable or disable several viewport filters that define what should be visible in the viewport.

// This example checks if "Null" objects should be drawn in the viewport.
// If not, the drawing is skipped.
// check display filter for "Null" objects
if (!(bd->GetDisplayFilter() & DISPLAYFILTER::NONE))

Further Reading

DISPLAYFILTER::NONE
@ NONE
None.
BaseDraw::GetDrawParam
GeData GetDrawParam(Int32 id) const
Definition: c4d_basedraw.h:1505
BaseDrawHelp
Definition: c4d_basedraw.h:31
BaseObject
Definition: c4d_baseobject.h:220
maxon::Mat3< maxon::Vector64 >
BaseDraw::SetDrawParam
void SetDrawParam(Int32 id, const GeData &data)
Definition: c4d_basedraw.h:1497
BaseDocument::GetActiveBaseDraw
BaseDraw * GetActiveBaseDraw(void)
NOCLIP_D
#define NOCLIP_D
Clip against the view border.
Definition: c4d_basedraw.h:1130
DRAWRESULT::SKIP
@ SKIP
There was nothing to draw in this pass.
BaseDraw
Definition: c4d_basedraw.h:747
BaseDraw::SetPen
void SetPen(const Vector &col, Int32 flags=0)
Definition: c4d_basedraw.h:981
LayerData::view
Bool view
Visible in editor view.
Definition: c4d_basedocument.h:336
DRAWPASS
DRAWPASS
Definition: ge_prepass.h:3218
LayerData
Definition: c4d_basedocument.h:301
BaseDrawHelp::GetDocument
BaseDocument * GetDocument(void)
Definition: c4d_basedraw.h:65
DRAWRESULT
DRAWRESULT
Definition: ge_prepass.h:4055
BaseDraw::DrawLine
void DrawLine(const Vector &p1, const Vector &p2, Int32 flags)
Definition: c4d_basedraw.h:1209
GeData
Definition: c4d_gedata.h:77
DRAW_PARAMETER_LINEWIDTH
#define DRAW_PARAMETER_LINEWIDTH
Float Line width in pixels. (OpenGL only.)
Definition: c4d_basedraw.h:1510
BaseDrawHelp::GetMg
const Matrix & GetMg(void)
Definition: c4d_basedraw.h:77
BaseDraw::SetMatrix_Matrix
void SetMatrix_Matrix(BaseObject *op, const Matrix &mg)
Definition: c4d_basedraw.h:1101
Vector
maxon::Vec3< maxon::Float64, 1 > Vector
Definition: ge_math.h:133
Bool
maxon::Bool Bool
Definition: ge_sys_math.h:40
BaseDocument
Definition: c4d_basedocument.h:479
BaseList2D::GetLayerData
const LayerData * GetLayerData(BaseDocument *doc, Bool rawdata=false)