Hello,
I have yet again a strange behaviour with R21 which I cannot seem to explain.
As always a sample implementation is provided below (without any optimization nor sanity checking)
Same code copied into a R21 plugin and R20 plugin provide different results, see screenshot.
I seem to remember having had the same issue on a Mac Mini running R16 (if I remember correctly). Where the Windows implementation resulted in circular dots, while the Mac displayed square dots. Back then, I assumed it was related to the fact the Mac Mini was using an Intel CPU graphic display, while the Windows machine had a NVidia Geforce 920m running.
However, the R20 and R21 testing is done one the same Windows machine, running next to each other in their respective Visual Studio debug session.
I am trying to think and guess what might be wrong in the R21 implementation, but I just cannot figure out what is missing. I simply copied the whole code, ran it in R20 ... and there all is OK.
// ========================
// Cinema 4D C++ plugin
//
// PluginName: Test
// Dummy "empty" plugin
// ========================
// Main.cpp
#include "c4d.h"
// Dummy IDs - for demonstration purposes only
#define MYSCENEHOOK_PLUGIN_ID 1000000
// ====================================
// SceneHook
// ====================================
class MySceneHook : public SceneHookData
{
INSTANCEOF(MySceneHook, SceneHookData)
public:
MySceneHook();
virtual Bool Draw(BaseSceneHook *node, BaseDocument *doc, BaseDraw *bd, BaseDrawHelp *bh, BaseThread *bt, SCENEHOOKDRAW flags);
static NodeData *Alloc(void) { return NewObjClear(MySceneHook); }
};
MySceneHook::MySceneHook() : SceneHookData()
{
}
Bool MySceneHook::Draw(BaseSceneHook *node, BaseDocument *doc, BaseDraw *bd, BaseDrawHelp *bh, BaseThread *bt, SCENEHOOKDRAW flags)
{
if (!node || !doc || !bd || !bh)
return false;
if (flags != SCENEHOOKDRAW::DRAW_PASS)
return true;
Int32 lLeft, lTop, lRight, lBottom;
bd->GetFrame(&lLeft, &lTop, &lRight, &lBottom);
bd->SetMatrix_Screen();
const Int32 pointCount = 5;
for (Int32 i = 0; i < pointCount; ++i)
{
Float pointSize = 10.0 * i;
bd->SetPointSize(pointSize);
iferr(Vector32* vPoints = NewMem(Vector32, pointCount))
return false;
vPoints[0] = Vector32(i * 50.0 + (lLeft + lRight) * 0.5, (lTop + lBottom) * 0.5, 0.0);
const Vector selprevColor = GetViewColor(VIEWCOLOR_SELECTION_PREVIEW);
bd->SetPen(selprevColor);
bd->DrawPointArray(pointCount, vPoints);
DeleteMem(vPoints);
}
// restore basedraw matrix
bd->SetMatrix_Matrix(nullptr, Matrix());
return true;
}
// ====================================
// Plugin Main
// ====================================
Bool PluginStart(void)
{
ApplicationOutput("Test"_s);
RegisterSceneHookPlugin(MYSCENEHOOK_PLUGIN_ID, "MySceneHook"_s, 0, MySceneHook::Alloc, EXECUTIONPRIORITY_GENERATOR, 0);
return true;
}
void PluginEnd(void)
{
}
Bool PluginMessage(Int32 id, void * data)
{
switch (id) {
case C4DPL_INIT_SYS:
if (!g_resource.Init())
return false;
return true;
case C4DMSG_PRIORITY:
return true;
case C4DPL_BUILDMENU:
break;
case C4DPL_ENDACTIVITY:
return true;
}
return false;
}