Jump to content

Extracting polygon information from a packed prim

Recommended Posts

Hi everybody,


Apologies if this has been asked a thousand times, but my searching hasn't found anything conclusive yet.


I'm attempting to take a packed primitive and extract the polygon geometry data from the packed prims in my C++ ROP. Here's a rough sketch of how the code looks right now. I've omitted a lot of error checking code, but this is the gist:

// the packed prim
gdp = _sopNode->getCookedGeo(context, 1);

for (GA_Iterator it(gdp->getPrimitiveRange()); !it.atEnd(); ++it)
    // the GEO_Primitive of the sub-primitive
    const GEO_Primitive* p = gdp->getGEOPrimitive(*it);
    const GU_PrimPacked* pack = UTverify_cast<const GU_PrimPacked*>(p);
    const GU_PackedGeometry* pImpl = UTverify_cast<const GU_PackedGeometry*>(pack->implementation());
    // dest has the mesh 
    GU_Detail dest;

    for (GA_Iterator jt(dest.getPrimitiveRange()); !jt.atEnd(); ++jt)
        // now looking at the individual faces on the poly
        const GEO_Primitive* face = dest.getGEOPrimitive(*jt);

        GA_ROHandleV3 ptREF(&dest, GA_ATTRIB_POINT, "P");
        for (GA_Iterator pt(face->getPointRange()); !pt.atEnd(); ++pt)
            GA_Offset ptoff = pt.getOffset();
            UT_Vector3 pos = ptRef.get(ptoff);
            // have the position of the points for this face

So, I have the points. Yay for that. Now I'm looking to figure out the vertex indices for these points. Some of these points being printed out are exactly the same, which makes me think the faces are sharing a vertex. How do I get those vertex indices from the face? I've been playing with a VertexMap, but the numbers coming out are all exactly the same as the offset, which makes me think I'm doing something wrong.


If I have a polygon like:

|        |        |

I'd expect vertices 2 and 5 to be shared between the two faces, so my position information would look like:


1 (0, 0, 0)

2 (1, 0, 0)

3 (2, 0, 0)

4 (0, 1, 0)

5 (1, 1, 0)

6 (2, 1, 0)


And my face index lists would be something like:


Face A : 1 2 5 4

Face B : 2 3 6 5


How do I get that face index list information out of my GEO_Primitive for the face?


Many thanks for any tips.

Link to comment
Share on other sites

Houdini uses different terminology. What you refer to as a (shared) "vertex", it is called a point in Houdini. An element in your "face index list" is called a vertex in Houdini, where the contents of a vertex (semantically) contains the point offset, uv values, etc. So basically, what you want is something more like this: (untested)

for (GA_Offset ptoff : dest.getPointRange()) {
    std::cout << "Point " << dest.pointIndex(ptoff) << " pos " << dest.getPos3(ptoff) << "\n";
for (GA_Offset primoff : dest.getPrimitiveRange()) {
    std::cout << "Primitive " << dest.primitiveIndex(primoff) << ": ";
    const GEO_Primitive* face = dest.getGEOPrimitive(primoff);
    for (GA_Offset ptoff : face->getPointRange()) {
        std::cout << dest.pointIndex(ptoff) << " ";
    std::cout << "\n";
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...