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():

{
// 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);
}
Definition: c4d_basedraw.h:40
const Matrix & GetMg(void)
Definition: c4d_basedraw.h:85
Definition: c4d_basedraw.h:754
void DrawLine(const Vector &p1, const Vector &p2, Int32 flags)
Definition: c4d_basedraw.h:1215
void SetDrawParam(Int32 id, const GeData &data)
Definition: c4d_basedraw.h:1503
GeData GetDrawParam(Int32 id) const
Definition: c4d_basedraw.h:1511
void SetMatrix_Matrix(BaseObject *op, const Matrix &mg)
Definition: c4d_basedraw.h:1107
void SetPen(const Vector &col, Int32 flags=0)
Definition: c4d_basedraw.h:987
Definition: c4d_baseobject.h:225
Definition: c4d_gedata.h:83
maxon::Vec3< maxon::Float64, 1 > Vector
Definition: ge_math.h:145
#define DRAW_PARAMETER_LINEWIDTH
Float Line width in pixels. (OpenGL only.)
Definition: c4d_basedraw.h:1516
DRAWPASS
Definition: ge_prepass.h:3487
DRAWRESULT
Definition: ge_prepass.h:4337
#define NOCLIP_D
Clip against the view border.
Definition: c4d_basedraw.h:1136
PyObject * op
Definition: object.h:520

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
const LayerData* ld = op->GetLayerData(doc);
// check if not visible in the editor
if (ld && (!ld->view))
Definition: c4d_basedocument.h:498
BaseDocument * GetDocument(void)
Definition: c4d_basedraw.h:73
@ SKIP
There was nothing to draw in this pass.
const char * doc
Definition: pyerrors.h:226
Definition: c4d_basedocument.h:319
Bool view
Visible in editor view.
Definition: c4d_basedocument.h:353

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)
maxon::Bool Bool
Definition: ge_sys_math.h:55

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