I would say use the GeometryAccessor but I have probably used the SDK less than most of you guys. ;-).
One thing that always bugged me about GetPolygons and related geometry calls is that they return an array of *all* the polygons in the object so it is a really inefficient way to access a single polygon when you know its index. l_polymesh.GetPolygons().GetItem(l_compIdx); GeometryAccessor seems designed to address this shortcoming. -- Brent From: [email protected] [mailto:[email protected]] On Behalf Of Steven Caron Sent: 30 July 2012 22:09 To: [email protected] Subject: Re: SDK : caching the tool context pick buffer ok my concern was actually how i am accessing the components, ie. GetActivePrimitive() and GetPolygons() etc. i was afraid those would be slow vs say CGeometryAccessor, although the data is boiled down it may still be useful and faster than directly accessing the component. i could cache the data like the PickBuffer and query GetGeometry() or GetGeometryAccessor()? s On Mon, Jul 30, 2012 at 1:02 PM, Brent McPherson <[email protected]<mailto:[email protected]>> wrote: Steven, You are passing siPolygonFilter to the pickbuffer so you can call GetComponentIndexAtPosition on the pick buffer to get the polygon under the cursor directly so you don't need to call Snap. In other words the pickbuffer has both object *and* polygon information for each pixel. m_pBuffer = in_ctxt.GetPickBuffer(x, y, 1, 1, siPolygonFilter, m_targets, siShaded); CRef l_obj = m_pBuffer.GetObjectAtPosition(x, y); m_hit = l_obj.IsValid(); if (m_hit) { LONG polyIndex = m_pBuffer.GetComponentIndexAtPosition(x, y); if (polyIndex >= 0) { // Get normal for polygon etc.... Snap is good enough for many tools but it searches through all the objects/components so you lose the constant time performance of the pickbuffer. For things like painting where you might be generating a lot of brush stamps it can make a big difference. In your code below the overhead of calling Snap completely eliminates any benefit gained from the pickbuffer. In fact, you would get the same performance if you removed the PickBuffer calls and just called Snap. -- Brent From: [email protected]<mailto:[email protected]> [mailto:[email protected]<mailto:[email protected]>] On Behalf Of Steven Caron Sent: 30 July 2012 18:45 To: [email protected]<mailto:[email protected]> Subject: Re: SDK : caching the tool context pick buffer aah... too bad it was never exposed to the SDK so it could earn its name ;) while i have you, how is the GAP/XSI Brush Tool querying normals for brush orientation? i am doing something like this, excuse the assumption about getting a single node normal... m_pBuffer = in_ctxt.GetPickBuffer(x, y, 1, 1, siPolygonFilter, m_targets, siShaded); CRef l_obj = m_pBuffer.GetObjectAtPosition(x, y); m_hit = l_obj.IsValid(); if (m_hit) { CStringArray families; families.Add(siMeshFamily); in_ctxt.Snap(x, y, 1, siSnapFace, families, m_targets, m_pos); LONG l_compIdx = m_pBuffer.GetComponentIndexAtPosition(x, y); X3DObject l_xObj(l_obj); PolygonMesh l_polymesh = l_xObj.GetActivePrimitive().GetGeometry(); PolygonFace face = l_polymesh.GetPolygons().GetItem(l_compIdx); PolygonNode node(face.GetNodes().GetItem(0)); bool validN; m_normal = node.GetNormal(validN); m_normal *= l_xObj.GetKinematics().GetGlobal().GetTransform().GetRotationMatrix3(); m_normal.NormalizeInPlace(); } and also in the above code is Snap() fast enough to use for my collision test to place my brush position on? steven On Mon, Jul 30, 2012 at 10:15 AM, Brent McPherson <[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>> wrote: I though you guys knew all our code names. ;-) GAP (Generic Attribute Painter) is what we call the XSI Brush tool. It uses the pickbuffer to lookup surface info for objects. -- Brent From: [email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>> [mailto:[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>] On Behalf Of Steven Caron Sent: 30 July 2012 17:54 To: [email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>> Subject: Re: SDK : caching the tool context pick buffer thanks for the reply Brent! using a dirty flag is totally fine, i think it was just late and i couldn't think of such a obvious answer. i dont think an IsValid method is needed for the PickBuffer, i can use IsNavigating() or use the activate callback to set the flag. i am not at the point where i am thinking about caching multiple views but thanks for the reminder :) i am not familiar with the term 'GAP-like', care to elaborate? steven On Mon, Jul 30, 2012 at 5:13 AM, Brent McPherson <[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>><mailto:[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>>> wrote: Hi Steven, Why don't you keep a dirty flag for the pickbuffer and simply set that in Activate and then the next time you ask for the pickbuffer (in mouse move or mouse down) recompute it if it is dirty. The pickbuffer is specific to a particular view so you can't generate it is a callback like Activate which is not tied to any particular view. The same holds for methods like GetMousePosition. It will return CStatus::Fail when called from Activate. I guess we should have added an IsValid method to the pickbuffer but as a workaround you can assume that if GetViewIndex returns a value greater or equal to zero then it is safe to call GetPickBuffer. You will also need to decide if you are going to cache a pickbuffer for each view or just keep one for the last view etc... The pickbuffer stuff was designed with this purpose in mind and one of our consulting devs used it to do a real-time (GAP-like) sculpting tool for a client. -- Brent From: [email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>><mailto:[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>> [mailto:[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>><mailto:[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>>] On Behalf Of Steven Caron Sent: 30 July 2012 04:43 To: [email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>><mailto:[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>> Subject: SDK : caching the tool context pick buffer hey guys... (read brent) i am trying to cache the PickBuffer each time the user activates this custom tool (this happens on camera navigation, which is my primary concern) but not having much luck. the doc suggests if i pass an empty region i will get the whole view but any subsequent calls i am making to PickBuffer.GetObjectAtPosition() has returned an invalid reference. is this doable in the Activate calback? the docs say..."if unavailable in the current callback or any arguments are invalid then the resulting PickBuffer will be invalid." so, are my arguments incorrect or is this not valid in the this callback? // activate callback, called each time the tool comes active again CStatus Activate(ToolContext& in_ctxt) { // get a list of selected meshes const CString empty; CStringArray families; families.Add(siMeshFamily); Application().GetSelection().GetArray().Filter(empty, families, empty, m_targets); // cache a pick buffer, m_pBuffer is a class member variable where i am caching it m_pBuffer = in_ctxt.GetPickBuffer(x, y, width, height, siPolygonFilter, m_targets, siShaded); LONG x,y; in_ctxt.GetMousePosition(x, y); CRef l_obj = m_pBuffer.GetObjectAtPosition(x, y); Application().LogMessage(L"Activate : " + l_obj.GetAsText()); return CStatus::OK; }; any other tips on caching the PickBuffer each time the camera changes? steven
<<attachment: winmail.dat>>

