Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
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