About
A BaseView object represents a viewport window. Such a BaseView can be obtained from the active BaseDocument to get information on the viewport window. The class BaseDraw is based on BaseView. It can be used to draw something in a viewport window via a "Draw" function.
- Warning
- It is only allowed to draw into the viewport inside a "Draw" function. See Draw Manual.
Access
The BaseDraw windows used to display the active BaseDocument can be accessed with:
See BaseDocument Editor Windows.
Such a BaseDraw can be used to access the scene camera.
if (baseDraw == nullptr)
targetPosition.
off = cameraMatrix.
off + (900.0 * cameraMatrix.
sqmat.
v3);
activeObject->
SetMg(targetPosition);
Update
The viewport windows are redrawn if something in the active document changed:
- EventAdd(): Informs Cinema 4D that something in the active document changed. DrawViews() will be called.
- DrawViews(): Manually triggers the scene execution and a viewport redraw. Typically only used directly in ToolData based tools.
See also Core Messages Manual and Cinema 4D Threads Manual.
Properties
The parameters of a given BaseDraw are accessed as usual with C4DAtom::GetParameter() and C4DAtom::SetParameter(). The parameter IDs are defined in dbasedraw.h
const Float newScale = oldScale * 2.0;
A BaseDraw defines also certain display filters that decide what element types are displayed in the viewport windows.
- Note
- To edit the filter settings use the parameters defined in
dbasedraw.h
if (bd == nullptr)
if (displayFilter && editorVisibiliy)
{
}
else
{
}
Rotation
A viewport window with planar projection can be rotated:
for (
Int32 i = 0; i < count; ++i)
{
if (baseDraw == nullptr)
}
Camera
A viewport window with a perspective projection displays the scene from the point of view of a camera. This camera is defined using an object. This can be a scene camera, a scene object or the editor camera.
See also CameraObject Manual.
if (bd == nullptr)
{
if (cam != nullptr)
}
else
{
if (camera == nullptr)
}
Scene Elements
The viewport also displays a background and some global light settings. Both the background and the global seetings are defines using scene elements.
if (envObject)
{
}
if (skyObject)
{
if (tag)
{
if (material)
}
}
GPU Renderer
The GPU renderer of Cinema 4D can render inside a given BaseDraw window.
Drawing
Inside a "Draw" function one can use the following functions to draw into the viewport windows. See Draw Manual.
- Warning
- It is not allowed to draw in any other context.
While drawing one should check if the drawing thread has been aborted:
{
{
err.DiagOutput();
err.DbgStop();
return false;
};
if (node == nullptr || doc == nullptr || bd == nullptr || bh == nullptr)
return true;
Drawing Pass
The viewport is drawn in several passes. One should check if the drawing operation is needed in the current pass. This is especially important for ObjectData::Draw().
Parameters
Several parameters configure the drawing operations that follow.
The parameters are:
- Note
- At the end of the drawing operation these parameters have to be restored.
Settings
The draw settings configure the drawing operations that follow.
- Note
- The color used with BaseDraw::SetPen() may be obtained with GetViewColor(). See also Colors.
for (
Int32 i = 0; i < 100; ++i)
{
const Vector color { r, g, b };
const Vector pos { i* 10.0, 0.0, 0.0 };
}
The light list defines what lights should influence the shading on 3D drawing operations. Typically used to disable lights.
Transparency settings for polygon drawing are defined with:
See also DRAW_PARAMETER_ALPHA_THRESHOLD above.
Matrix
A drawing operation may be performed in screen, camera or world space. Before any drawing operation the operation space must be defined.
const Vector screenPos { 100, 100.0, 0.0 };
const Vector worldPos { 100.0, 100.0, 100.0 };
2D Drawing Operations
These functions perform drawing operations in 2D space:
- Note
- To calculate screen space coordinates see Transformation.
const Vector center { 100, 100, 0 };
const Vector tangentPoint { 150, 100, 0 };
Text can easily be drawn with:
- Note
- These functions are typically used with a scene hook.
{
entryA.
_txt =
"This is the first entry";
entryB.
_txt =
"This is the second entry";
}
General Drawing Operations
Depending on the current transformation matrix these operations can draw in 2D or 3D space.
The z-buffer is configured with:
These clipping flags used with 3D drawing operations:
- NOCLIP_D: Clip against the viewport window.
- NOCLIP_Z: Clip against near and far plane.
The drawing operations are:
if (clipMap)
{
clipMap->
Init(100, 50, 32);
clipMap->
TextAt(0, 11,
"Hello World");
if (bitmap)
{
bd->
DrawTexture(bitmap, positions.GetFirst(), colors.GetFirst(), normals.GetFirst(), uvcoords.GetFirst(), 4, alpha, texture);
}
}
Each BaseDraw::DrawPolygon() puts the polygon into an internal array. The drawing of this array can be triggered with:
A simple shading value is often used with BaseDraw::DrawPoly() and BaseDraw::DrawPolygon():
const Vector color { 1.0, 0.0, 0.0 };
colors[0] = color * bd->
SimpleShade(vertice[0], normals[0]);
colors[1] = color * bd->
SimpleShade(vertice[1], normals[1]);
colors[2] = color * bd->
SimpleShade(vertice[2], normals[2]);
colors[3] = color * bd->
SimpleShade(vertice[3], normals[3]);
Objects
Complete polygon objects can be drawn with:
const Bool docSet = doc !=
nullptr;
if (docSet && isObjectPass)
{
const Bool activeObjectSet = activeObject !=
nullptr;
const Bool activeObjectIsNotOp = activeObject != op;
if (activeObjectSet && activeObjectIsNotOp)
{
{
}
}
}
Line Strip
The line strip functions allow to easily draw line paths:
for (
Int32 i = 0; i < 100; ++i)
{
const Vector color { r, g, b };
}
XOR Lines
XOR lines are used with selection tools in the viewport. Typically one should use the LassoSelection class instead.
- Warning
- These functions have been marked as deprecated.
See also EditorWindow::DrawXORLine().
Colors
Colors can be obtained and converted with:
Frame
The dimensions of a viewport window are accessed with:
PrintFrameSize(cl, ct, cr, cb);
PrintFrameSize(cl, ct, cr, cb);
Stereo
These functions get and change the stereo settings for the given viewport window:
Projection
A viewport window can display the scene using orthogonal or perspective projection:
Transformation
The following functions allow to transform a given point between world, screen and camera space:
if (object)
{
const Vector worldSpacePos =
object->GetMg().off;
const Vector screenSpacePos = bd->
WS(worldSpacePos);
}
if (res && (list->GetCount() > 0))
{
const Float distance = list->GetZ(0);
}
Also sizes can be transformed:
- BaseView::PW_S(): Returns the size in world units for a single pixel at the given Z-depth.
- BaseView::WP_S(): Returns the size in pixels for a single world unit at the given Z-depth.
- BaseView::PW_W(): Returns the size in world units for a single pixel at the given screen space position.
- BaseView::WP_W(): Returns the size in screen space pixels for a single world unit at world position.
These 3D projection functions are typically used to handle mouse input in tools:
if (err == 0)
{
object->SetMg(mg);
}
Testing and Clipping
The following tests can be performed:
{
for (
Int32 i = 0; i < pointCount; ++i)
{
const Vector point = mg * points[i];
const Vector screenSpacePos = bd->
WS(point);
{
}
}
}
A given line define by two points can be clipped:
A view can use near- and far-clipping:
Undo
A BaseDraw has its own undo buffer that stores changes:
for (
Int32 i = 0; i < count; ++i)
{
if (baseDraw == nullptr)
}
Miscellaneous
Further functions are:
maxon::DataDictionary stats;
for (const auto& data : stats)
{
}
BaseDrawHelp
BaseDrawHelp is a utility class that contains useful information. It is mostly used in the context of ObjectData::Draw(). An instance is typically handed over as an argument but can also be created on demand:
The BaseDrawHelp object provides access to these properties:
Information on the BaseObject that is supposed to be drawn:
A BaseObject may be drawn with a specific display mode as defined in Tdisplay.h
.
if (bhelp == nullptr)
bhelp->
SetMg(originalMatrix);
Further Reading
@ BASEDRAW_DATA_PROJECTION
Definition: dbasedraw.h:40
#define Opolygon
Polygon - PolygonObject.
Definition: ge_prepass.h:975
void SetMatrix_Camera()
Definition: c4d_basedraw.h:1089
void DrawPoint2D(const Vector &p)
Definition: c4d_basedraw.h:1144
@ BASEDRAW_SDISPLAY_HIDDENLINE
Definition: dbasedraw.h:221
Definition: c4d_baselist.h:2144
Vector SW(const Vector &p) const
Definition: c4d_basedraw.h:417
C4DAtomGoal * GetLinkAtom(const BaseDocument *doc, Int32 instanceof=0) const
@ BASEDRAW_DATA_SDISPLAYACTIVE
Definition: dbasedraw.h:26
void InsertObject(BaseObject *op, BaseObject *parent, BaseObject *pred, Bool checknames=false)
GeData GetDrawParam(Int32 id) const
Definition: c4d_basedraw.h:1505
Bool GetDrawStatistics(maxon::DataDictionary &statistics) const
Definition: c4d_basedraw.h:1621
Bool IsGPURenderer()
Definition: c4d_basedraw.h:1800
IMAGERESULT Init(Int32 w, Int32 h, Int32 bits)
@ BASEDRAW_DATA_NORMALS_SCALE
Definition: dbasedraw.h:69
void LineStripEnd()
Finishes line strips started with LineStripBegin().
Definition: c4d_basedraw.h:1376
V v3
The Z axis.
Definition: matrix.h:31
maxon::Mat3< maxon::Vector64 > Matrix
Definition: ge_math.h:167
Bool CheckDisplayFilter(BaseObject *op, DISPLAYFILTER filter)
Definition: c4d_basedraw.h:39
BaseObject * GetEnvironmentObject() const
Definition: c4d_basedraw.h:843
Bool CheckEditorVisibility(BaseObject *op)
void GetFrame(Int32 *cl, Int32 *ct, Int32 *cr, Int32 *cb)
@ NO_THREAD
Synchronous call.
#define iferr_throw(ERR)
Definition: resultbase.h:1497
@ FROM_IMAGE
Generates the alpha channel from the RGB image information.
@ TEXTURETAG_MATERIAL
Definition: ttexture.h:29
Definition: c4d_baseobject.h:224
Definition: datatypebase.h:726
Definition: lib_description.h:327
void GetSafeFrame(Int32 *cl, Int32 *ct, Int32 *cr, Int32 *cb)
String _txt
The text to draw to the HUD.
Definition: c4d_basedraw.h:251
void SetInt32(Int32 id, Int32 l)
Definition: c4d_basecontainer.h:505
void SetMg(const Matrix &mg)
Definition: c4d_basedraw.h:97
void EndDrawXORPolyLine(Bool blit)
Definition: c4d_basedraw.h:1450
#define NOCLIP_Z
Z clipping.
Definition: c4d_basedraw.h:1131
Bool InitDrawXORPolyLine()
Definition: c4d_basedraw.h:1398
void SetDisplay(BaseContainer *bc)
Definition: c4d_basedraw.h:109
maxon::Float Float
Definition: ge_sys_math.h:64
DRAWOBJECT
Definition: ge_prepass.h:4387
Int32 GetPointCount(void) const
Definition: c4d_baseobject.h:1439
V v1
The X axis.
Definition: matrix.h:25
DRAWFLAGS
Definition: ge_prepass.h:2598
void SetMg(const Matrix &m)
Definition: c4d_baseobject.h:488
static BaseDrawHelp * Alloc(BaseDraw *bd, BaseDocument *doc)
DISPLAYFILTER
Definition: ge_prepass.h:4279
@ HYPERNURBS
Subdivision Surface.
Bool TestPoint(Float x, Float y)
Definition: c4d_basedraw.h:348
@ XRAY_OFF
Disables X-Ray mode.
void DrawMultipleHUDText(const maxon::BaseArray< HUDTextEntry > &texts)
Definition: c4d_basedraw.h:1763
void DrawCircle(const Matrix &m)
Definition: c4d_basedraw.h:1253
Definition: datatypebase.h:1143
void DrawHandle(const Vector &vp, DRAWHANDLE type, Int32 flags)
Definition: c4d_basedraw.h:1182
Definition: c4d_thread.h:27
Matrix GetMg() const
Definition: c4d_baseobject.h:482
Definition: c4d_basetag.h:46
void SetDrawParam(Int32 id, const GeData &data)
Definition: c4d_basedraw.h:1497
Int32 SAFEINT32(Float32 x)
Definition: apibasemath.h:266
@ USE_CUSTOM_COLOR
Use a custom color.
DRAW_ALPHA
Definition: ge_prepass.h:2745
DRAWPASS GetDrawPass() const
Definition: c4d_basedraw.h:1613
@ NO_EOGL
No Extended OpenGL.
BaseObject * GetSceneCamera(const BaseDocument *doc)
Definition: c4d_basedraw.h:829
#define iferr_return
Definition: resultbase.h:1434
Bool IsMarkedAsGPURenderer()
Definition: c4d_basedraw.h:1793
#define MAXON_SOURCE_LOCATION
Definition: memoryallocationbase.h:66
void DrawXORLine(Int32 x1, Int32 y1, Int32 x2, Int32 y2)
void LineStripBegin()
Definition: c4d_basedraw.h:1371
Bool DrawViews(DRAWFLAGS flags, BaseDraw *bd=nullptr)
Class structure to hold HUD Text for BaseDraw::DrawMultipleHUDText().
Definition: c4d_basedraw.h:246
Definition: basearray.h:366
#define Ocamera
Camera - CameraObject.
Definition: ge_prepass.h:978
Bool GeSyncMessage(Int32 messageid, Int32 destid=0, UInt p1=0, UInt p2=0)
SCENEHOOKDRAW
Definition: ge_prepass.h:3064
DRAWRESULT DrawObject(BaseDrawHelp *bh, BaseObject *op, DRAWOBJECT flags, DRAWPASS drawpass, BaseObject *parent=nullptr, const Vector &col=Vector(.5))
Definition: c4d_basedraw.h:1339
Bool TestBreak()
Definition: c4d_basedraw.h:1721
#define EVMSG_ASYNCEDITORMOVE
The user moved something in the editor window. Managers should update things like position fields.
Definition: ge_prepass.h:2563
BaseDraw * GetActiveBaseDraw(void)
void DrawTexture(const BaseBitmap *bmp, const Vector *padr4, const Vector *cadr, const Vector *vnadr, const Vector *uvadr, Int32 pntcnt, DRAW_ALPHA alphamode, DRAW_TEXTUREFLAGS flags)
Definition: c4d_basedraw.h:1247
void SetPlanarRotation(Float r)
Definition: c4d_basedraw.h:335
#define NOCLIP_D
Clip against the view border.
Definition: c4d_basedraw.h:1130
BaseDraw * GetBaseDraw(Int32 num)
BaseContainer GetDisplay(void)
Definition: c4d_basedraw.h:103
Definition: c4d_basedraw.h:747
void BeginDraw()
Must be called before any drawing functions.
void TextAt(Int32 x, Int32 y, const String &txt)
Vector _position
The screen space position for the text.
Definition: c4d_basedraw.h:252
void FreeDrawXORPolyLine()
Definition: c4d_basedraw.h:1405
void SetPen(const Vector &col, Int32 flags=0)
Definition: c4d_basedraw.h:981
GeData GetParameterData(Int32 id)
DRAWPASS
Definition: ge_prepass.h:3258
void SetColor(Int32 r, Int32 g, Int32 b, Int32 a=255)
static void Free(BaseDrawHelp *&p)
@ BASEDRAW_DATA_SHOWNORMALS
Definition: dbasedraw.h:30
Bool SetParameter(const DescID &id, const GeData &t_data, DESCFLAGS_SET flags)
MAXON_ATTRIBUTE_FORCE_INLINE ResultRef< T > Append()
Definition: basearray.h:569
BaseDocument * GetDocument(void)
Definition: c4d_basedraw.h:73
Definition: matrix4d.h:12
Vector ProjectPointOnPlane(const Vector &p, const Vector &v, Float mouse_x, Float mouse_y, Int32 *err=nullptr)
SqrMat3< V > sqmat
The 3×3 matrix for rotation, scale and shear.
Definition: matrix.h:282
void InitUndo(BaseDocument *doc)
Definition: c4d_basedraw.h:1478
void DrawCircle2D(Int32 mx, Int32 my, Float rad)
Definition: c4d_basedraw.h:1169
@ NO_ANIMATION
Ignore all animation.
Vector WS(const Vector &p) const
Definition: c4d_basedraw.h:409
Definition: c4d_basedocument.h:43
@ HIGHLIGHT_PASS_INV
Inverted highlight pass.
BaseObject * GetEditorCamera(void)
Definition: c4d_basedraw.h:868
void DrawLine2D(const Vector &p1, const Vector &p2)
Definition: c4d_basedraw.h:1152
void DrawLine(const Vector &p1, const Vector &p2, Int32 flags)
Definition: c4d_basedraw.h:1209
Definition: c4d_gedata.h:82
const DataType & GetType() const
Definition: datatypebase.h:1220
void SetPointSize(Float pointsize)
Definition: c4d_basedraw.h:987
#define iferr_scope_handler
Definition: resultbase.h:1361
@ BIG
Handle used by object generators and deformers.
Definition: c4d_baselist.h:1331
#define DRAW_PARAMETER_LINEWIDTH
Float Line width in pixels. (OpenGL only.)
Definition: c4d_basedraw.h:1510
DRAW_TEXTUREFLAGS
Definition: ge_prepass.h:2758
maxon::Int32 Int32
Definition: ge_sys_math.h:58
void DrawXORPolyLine(const Float32 *p, Int32 cnt)
Definition: c4d_basedraw.h:1435
BaseDocument * GetDocument()
Definition: c4d_baselist.h:1915
void LineStrip(const Vector &vp, const Vector &vc, Int32 flags)
Definition: c4d_basedraw.h:1385
#define ApplicationOutput(formatString,...)
Definition: debugdiagnostics.h:207
void SetLightList(Int32 mode)
Definition: c4d_basedraw.h:1001
void BeginDrawXORPolyLine()
Definition: c4d_basedraw.h:1442
@ BASEDRAW_PROJECTION_FRONT
Definition: dbasedraw.h:237
void DrawPolygon(const Vector *p, const Vector *f, Bool quad)
Definition: c4d_basedraw.h:1292
void FillRect(Int32 x1, Int32 y1, Int32 x2, Int32 y2)
#define Ttexture
Texture - TextureTag.
Definition: ge_prepass.h:1236
void SetSceneCamera(BaseObject *op, Bool animate=false)
Definition: c4d_basedraw.h:836
BaseTag * GetTag(Int32 type, Int32 nr=0)
Definition: c4d_baseobject.h:674
const Matrix & GetMg(void)
Definition: c4d_basedraw.h:85
void SetMatrix_Screen()
Definition: c4d_basedraw.h:1067
void SetMatrix_Matrix(BaseObject *op, const Matrix &mg)
Definition: c4d_basedraw.h:1101
Vector GetMp(void)
Definition: c4d_baseobject.h:524
const Vector * GetPointR(void) const
Definition: c4d_baseobject.h:1425
maxon::Vec3< maxon::Float64, 1 > Vector
Definition: ge_math.h:145
BaseObject * GetSkyObject() const
Definition: c4d_basedraw.h:850
static BaseObject * Alloc(Int32 type)
Definition: c4d_basebitmap.h:410
static Bool PickObject(BaseDraw *bd, BaseDocument *doc, Int32 x, Int32 y, Int32 rad, VIEWPORT_PICK_FLAGS flags, LassoSelection *ls, C4DObjectList *list, maxon::SquareMatrix4d *m=nullptr, Int32 *sampleLocation=nullptr)
V off
The translation vector.
Definition: matrix.h:279
Definition: ge_autoptr.h:36
@ FAILURE
There was an error while drawing.
#define BDRAW_SETLIGHTLIST_NOLIGHTS
No lights.
Definition: c4d_basedraw.h:1005
@ BASEDRAW_DATA_SELECTED_NORMALS
Definition: dbasedraw.h:44
Bool HasCameraLink(void)
Definition: c4d_basedraw.h:822
maxon::Bool Bool
Definition: ge_sys_math.h:53
void EndDraw()
Must be called after a sequence of drawing functions to free the memory allocated by BeginDraw().
BaseObject * GetActiveObject(void)
Definition: c4d_tools.h:811
@ ENVIRONMENT_AMBIENT
Definition: oenvironment.h:6
Bool IsInstanceOf(Int32 id) const
Definition: c4d_baselist.h:1373
Vector GetRad(void)
Definition: c4d_baseobject.h:531
String GetName() const
Definition: c4d_baselist.h:2318
Bool TestClipping3D(const Vector &mp, const Vector &rad, const Matrix &mg, Bool *clip2d, Bool *clipz)
static String VectorToString(const Vector32 &v, Int32 nnk=-1)
Definition: c4d_string.h:571
Float SimpleShade(const Vector &p, const Vector &n)
Definition: c4d_basedraw.h:1715
@ DISPLAYTAG_SDISPLAYMODE
Definition: tdisplay.h:6
V v2
The Y axis.
Definition: matrix.h:28
@ ONLY_ACTIVE_VIEW
Only redraw the active view.
Bool GetParameter(const DescID &id, GeData &t_data, DESCFLAGS_GET flags)
Definition: c4d_basedocument.h:490
const Vector & GetVector(void) const
Definition: c4d_gedata.h:451
DISPLAYFILTER GetDisplayFilter() const
Definition: c4d_basedraw.h:1588
Definition: c4d_basecontainer.h:46
Vector GetObjectColor(const BaseDrawHelp *bh, BaseObject *op, Bool lines=false, Bool usedInBaseDraw=true, Int instanceIndex=0) const
Definition: c4d_basedraw.h:948
void SetTransparency(Int32 trans)
Definition: c4d_basedraw.h:962
@ BASEDRAW_DISPLAYFILTER_HYPERNURBS
Definition: dbasedraw.h:179
Float GetFloat(void) const
Definition: c4d_gedata.h:439
Vector CheckColor(const Vector &col)
Definition: c4d_basedraw.h:955