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]> 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]] On Behalf Of Steven Caron
> Sent: 30 July 2012 18:45
> To: [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]>> 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]>] On Behalf Of Steven Caron
> Sent: 30 July 2012 17:54
> To: [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]>>> 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]>>] On Behalf Of Steven Caron
> Sent: 30 July 2012 04:43
> To: [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
>
>

Reply via email to