polygon counts in a node

New Message Reply Date view Thread view Subject view Author view

Roy W Latham (rlatham++at++shell.portal.com)
Tue, 14 Mar 1995 20:55:47 -0800


I have more questions about finding number of polygons in a node.
Previously, S.R.C advised me to look at trav.c, and I did. I modified two functionxxhhh
functions: pfuTravPrintNode and cbPrintNodeInfo in trav.c ... ooops let me
correct that. I copied those two functions into my program and modified them
in my program.

I also set the notifylevel to PF_INFO and imported east.terrain1.flt.

However, the number that I obatained from modiefied function doens't seem to
match with the number of triangles generated by performer.

here is part of my code.

/*=========================================================================*/
int initSceneGraph(pfScene *scene) {
    pfuTraverser trav;
    pfSphere bsphere;
    void* sharedArena = NULL;
    pfGroup *root;
    long loaded = 0;
    int i;
     

/*===== Create a DCS for pfuXformer =====*/
    ViewState->sceneDCS = pfNewDCS();
    ViewState->sceneGlyph = pfNewGroup();
    ViewState->sceneGroup = pfNewGroup();
     
    pfAddChild(scene, ViewState->sceneDCS);
    pfAddChild(ViewState->sceneDCS, ViewState->sceneGlyph);
    pfAddChild(ViewState->sceneDCS, ViewState->sceneGroup);
     
    for (i = 0; i < NumFiles; i++){
         
        /*=== Add terrain to the scene ===*/
        root = (pfGroup *)LoadFile(DatabaseFiles[i], NULL);
        if (root == NULL){
             printf( "CAN'T FIND: %s\n", DatabaseFiles[i]);
             exit(-1);
        }
        pfAddChild(ViewState->sceneGroup, root);
        ++loaded;
     }
     
/*===== FIND THE NUMBER OF TRIANGLES IN THE TERRAIN =====*/
        ViewState->polygon_count_of_terrain = 0;
        pfuInitTraverser(&trav);
        trav.preFunc = cbPrintNodeInfo;
        pfuTraverse((pfNode *)ViewState->sceneGroup, &trav);
         
         
/*===== FIND THE CENTER OF TERRAIN BEFORE GLYPHOID WAS PUT IN =====*/
        pfuTravCalcBBox(ViewState->sceneGroup, &box);
        pfGetNodeBSphere(ViewState->sceneGroup, &bsphere);
        PFCOPY_VEC3(ViewState->terrainCenter, bsphere.center);
        PFCOPY_VEC3(ViewState->viewCoord.xyz, ViewState->terrainCenter);
        ViewState->sceneSize = PF_MIN2(2.5f*bsphere.radius, 40000.0f);
          
    return loaded;
}

/*****************************************************************************/

static long cbPrintNodeInfo(pfuTraverser *trav){
    pfNode *node = trav->node;
    long type;
     
    if (!node)
    {
        pfNotify(PFNFY_DEBUG, PFNFY_PRINT, "cbPrintNodeInfo: node null!");
        return PFTRAV_CONT;
    }
     
    type = pfGetType(node);
    switch (type)
    {
        case PFTYPE_GEODE:
          {
            long nGSets = pfGetNumGSets((pfGeode *)node);
            long i;
            for (i = 0 ; i < nGSets ; i++){
               pfGeoSet *gd = pfGetGSet((pfGeode *)node, i);
               long ptype = pfGetGSetPrimType(gd);
               long nPrims = pfGetGSetNumPrims(gd);
               switch (ptype){
                 
                case PFGS_TRIS:
                        ViewState->polygon_count_of_terrain += nPrims;
                    break;
                     
                case PFGS_QUADS:
                        ViewState->polygon_count_of_terrain += 2 * nPrims;
                    break;
                                         
                case PFGS_TRISTRIPS:
                        ViewState->polygon_count_of_terrain += 3 * nPrims;
                    break;
               }
                
            }
          }
        break;
         
        default:
            /* just keep going */
        break;
    }
    return PFTRAV_CONT;
}


New Message Reply Date view Thread view Subject view Author view

This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:51:04 PDT

This message has been cleansed for anti-spam protection. Replace '++at++' in any mail addresses with the '@' symbol.