BaseSelect->SelectAll() Freezing C4D.. [SOLVED]
-
On 14/05/2015 at 06:31, xxxxxxxx wrote:
User Information:
Cinema 4D Version: R14+
Platform: Windows ;
Language(s) : C++ ;---------
Hi,I'm doing a final tidy-up of remaining code in my plugin and have noticed something which causes C4D to freeze..
My plugin is an ObjectData, registered with OBJECT_MODIFIER, and op->SetDeformMode(TRUE) is also set inside the MSG_MENUPREPARE of the Message function.
I have narrowed it down to the following code. If i delete everything else inside my ModifyObject override and just have the following, it will freeze C4D by simply toggling between perspective viewport and four-views 3 or 4 times:
Bool MyPlugin::ModifyObject(BaseObject* mod, BaseDocument* doc, BaseObject* op, const Matrix& op_mg, const Matrix& mod_mg, Real lod, LONG flags, BaseThread* thread) { PolygonObject* poly = ToPoly(op); BaseSelect* sel = poly->GetPolygonS(); sel->SelectAll(0,poly->GetPolygonCount()); return TRUE; }
Can anybody confirm this or suggest a solution?
[edit] Just to add, all i do is inside a fresh scene, create a cube, create my plugin deformer, and drag the deformer under the cube, then switch between perspective single view, and default four-views, a couple of times, and it freezes..
-
On 14/05/2015 at 06:36, xxxxxxxx wrote:
You try to select polygon that do not exist.
//max The last element in the range to select! sel->SelectAll(0,poly->GetPolygonCount()-1);
-
On 14/05/2015 at 06:39, xxxxxxxx wrote:
Opps, noob mistake
But it still freezes..
-
On 14/05/2015 at 06:50, xxxxxxxx wrote:
Of course you need to make sure that 'op' is really a PolygonObject using IsInstanceOf(Opolygon) and that everything is not nullptr.
-
On 14/05/2015 at 06:53, xxxxxxxx wrote:
You mean op?
Well using ToPoly on OP under a primitive object has been working 100% fine until i put SelectAll() inside the ModifyObject function.. And my test case is pretty simple, create a cube, drag deformer under it..
-
On 14/05/2015 at 07:21, xxxxxxxx wrote:
Hmm i think you are right.. When i use a cube thats converted to a mesh with CSTO it works fine..
Strange how i haven't came across this the entire time i've been developing this plugin..
I think i read in another recent thread using the cache is possible with primitives..
-
On 14/05/2015 at 09:26, xxxxxxxx wrote:
Yes of course I mean 'op'.
The code could look like this.Bool MyPlugin::ModifyObject(BaseObject* mod, BaseDocument* doc, BaseObject* op, const Matrix& op_mg, const Matrix& mod_mg, Real lod, LONG flags, BaseThread* thread) { if(op==nullptr) return FALSE; if(op->IsInstanceOf(Opolygon)){ PolygonObject* poly = ToPoly(op); BaseSelect* sel = poly->GetPolygonS(); if(sel==nullptr) return FALSE; const Int32 polyCount = poly->GetPolygonCount(); if(polyCount > 0) { sel->SelectAll(0,polyCount-1); } //.... } return TRUE; }
-
On 14/05/2015 at 10:31, xxxxxxxx wrote:
Thanks Remotion that's much appreciated. I managed to get it working with the recursive function example in the code docs for GetCache(), but not sure if that's overkill at this point until i test further..
-
On 15/05/2015 at 08:53, xxxxxxxx wrote:
Hello,
I just want to point out that ToPoly() is no function but simply a macro. As you see in the documentation it only casts a BaseObject pointer to a PolygonObject pointer (and doesn't do anything) and should only applied when one really knows a given object is a polygon object.
Best wishes,
Sebastian