Open Search
    Draw Manual

    About

    Many Cinema API 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 Cinema API base classes:

    • ObjectData::Draw(): Is called for each object plugin instance.
    • TagData::Draw(): Is called for each tag plugin instance.
    • ToolData::Draw(): Is called for the tool plugin.
    • SceneHookData::Draw(): Is called for the SceneHook plugin.
    • MaterialData::Draw(): Is called for every object/tag pair that uses the material plugin instance.
    • ShaderData::Draw(): Is called for each shader plugin instance.
    • SnapData::Draw(): Is called for the snap mode plugin.
    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
    const GeData oldValue = bd->GetDrawParam(DRAW_PARAMETER_LINEWIDTH);
    bd->SetDrawParam(DRAW_PARAMETER_LINEWIDTH, GeData { 3.0 });
    // 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
    bd->SetDrawParam(DRAW_PARAMETER_LINEWIDTH, oldValue);
    return SUPER::Draw(op, drawpass, bd, bh);
    }
    #define DRAW_PARAMETER_LINEWIDTH
    ::Float Line width in pixels. (OpenGL only.)
    Definition: c4d_basedraw.h:1519
    DRAWPASS
    Definition: ge_prepass.h:3542
    DRAWRESULT
    Definition: ge_prepass.h:4391
    #define NOCLIP_D
    Clip against the view border.
    Definition: c4d_basedraw.h:1139
    maxon::Mat3< maxon::Vector64 > Matrix
    Definition: ge_math.h:159
    maxon::Vec3< maxon::Float64, 1 > Vector
    Definition: ge_math.h:140
    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
    BaseDocument* doc = bh->GetDocument();
    const LayerData* ld = op->GetLayerData(doc);
    // check if not visible in the editor
    if (ld && (!ld->view))
    SKIP
    Definition: asset_browser.h:0
    const char * doc
    Definition: pyerrors.h:226

    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:46

    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))
    NONE
    Definition: asset_browser.h:1

    Further Reading