Crazy Mixed-Up Leo Rendering Code from Header Files In the $XGLHOME/src/dd/leo/include directory there are some strange header files: Leo3dLi1MspRend.h Leo3dLi1TlistRend.h Leo3dLi1TStripStarRend.h Leo3dLi1TlistRestartRend.h Leo3dLi1TlistGenlRend.h These files contain template code used by the .cc files to generate specialized renderers for specific cases. This keeps the program from having to do 'if (lighting == FACET) . . . ' which will slow down the renderer. It also keeps the programmer from having to repeat the same code several times for several specific cases. The drawback is that the code is hard to debug because you can't set breakpoints in it. The renderers are chosen by using a jump table. This is a table of function pointers to renderers. Each different combination of rendering options leads to a different entry in the table by using a simple algorithm (from Leo3dLi1Msp.cc): index = sp->surf.copy_facet * 20 + sp->surf.rend_color_src * 5 + sp->surf.rend_norm_src; sp->surf.renderer->msp = mspRenderer[index]; The array is filled with pointers to generic renderers for most cases, but some specific (well used) combinations have their own renderer (from Leo3dLi1Msp.cc): static int (XglDpCtx3dLeo::*mspRenderer[40])(XglPrimData* pd) = { /* copy_facet rend_color_src rend_norm_src renderer */ /*FALSE CTX_COLOR NO_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE CTX_COLOR FACET_NORMAL */ XglDpCtx3dLeo::renderMspCcFn, /*FALSE CTX_COLOR CALC_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE CTX_COLOR VERTEX_NORMAL */ XglDpCtx3dLeo::renderMspCcVn, /*FALSE CTX_COLOR FIRST_VERTEX_NORMAL*/ XglDpCtx3dLeo::renderMsp, /*FALSE FACET_COLOR NO_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE FACET_COLOR FACET_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE FACET_COLOR CALC_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE FACET_COLOR VERTEX_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE FACET_COLOR FIRST_VERTEX_NORMAL*/ XglDpCtx3dLeo::renderMsp, /*FALSE VERTEX_COLOR NO_NORMAL */ XglDpCtx3dLeo::renderMspVcNn, /*FALSE VERTEX_COLOR FACET_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE VERTEX_COLOR CALC_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE VERTEX_COLOR VERTEX_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE VERTEX_COLOR FIRST_VERTEX_NORMAL*/ XglDpCtx3dLeo::renderMsp, /*FALSE FIRST_VERTEX_COLOR NO_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE FIRST_VERTEX_COLOR FACET_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE FIRST_VERTEX_COLOR CALC_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE FIRST_VERTEX_COLOR VERTEX_NORMAL */ XglDpCtx3dLeo::renderMsp, /*FALSE FIRST_VERTEX_COLOR FIRST_VERTEX_NORMAL*/ XglDpCtx3dLeo::renderMsp, /*TRUE CTX_COLOR NO_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE CTX_COLOR FACET_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE CTX_COLOR CALC_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE CTX_COLOR VERTEX_NORMAL */ XglDpCtx3dLeo::renderMspCfCcVn, /*TRUE CTX_COLOR FIRST_VERTEX_NORMAL*/ XglDpCtx3dLeo::renderMsp, /*TRUE FACET_COLOR NO_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE FACET_COLOR FACET_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE FACET_COLOR CALC_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE FACET_COLOR VERTEX_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE FACET_COLOR FIRST_VERTEX_NORMAL*/ XglDpCtx3dLeo::renderMsp, /*TRUE VERTEX_COLOR NO_NORMAL */ XglDpCtx3dLeo::renderMspCfVcNn, /*TRUE VERTEX_COLOR FACET_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE VERTEX_COLOR CALC_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE VERTEX_COLOR VERTEX_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE VERTEX_COLOR FIRST_VERTEX_NORMAL*/ XglDpCtx3dLeo::renderMsp, /*TRUE FIRST_VERTEX_COLOR NO_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE FIRST_VERTEX_COLOR FACET_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE FIRST_VERTEX_COLOR CALC_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE FIRST_VERTEX_COLOR VERTEX_NORMAL */ XglDpCtx3dLeo::renderMsp, /*TRUE FIRST_VERTEX_COLOR FIRST_VERTEX_NORMAL*/ XglDpCtx3dLeo::renderMsp }; Notice how some lines are different. Here's the code that generates those specialized renderers: #define MSP_FUNC_NAME renderMspCcFn #define LEO_CTX_COLOR #define LEO_FACET_NORMAL #include "include/Leo3dLi1MspRend.h" #undef MSP_FUNC_NAME #undef LEO_CTX_COLOR #undef LEO_FACET_NORMAL #define MSP_FUNC_NAME renderMspCcVn #define LEO_DIRECT_DMA_CHECK #define LEO_CTX_COLOR #define LEO_VERTEX_NORMAL #include "include/Leo3dLi1MspRend.h" #undef MSP_FUNC_NAME #undef LEO_DIRECT_DMA_CHECK #undef LEO_CTX_COLOR #undef LEO_VERTEX_NORMAL #define MSP_FUNC_NAME renderMspVcNn #define LEO_DIRECT_DMA_CHECK #define LEO_VERTEX_COLOR #define LEO_NO_NORMAL #include "include/Leo3dLi1MspRend.h" #undef MSP_FUNC_NAME #undef LEO_DIRECT_DMA_CHECK #undef LEO_VERTEX_COLOR #undef LEO_NO_NORMAL #define MSP_FUNC_NAME renderMspCfCcVn #define LEO_COPY_FACET #define LEO_CTX_COLOR #define LEO_VERTEX_NORMAL #include "include/Leo3dLi1MspRend.h" #undef MSP_FUNC_NAME #undef LEO_COPY_FACET #undef LEO_CTX_COLOR #undef LEO_VERTEX_NORMAL #define MSP_FUNC_NAME renderMspCfVcNn #define LEO_COPY_FACET #define LEO_VERTEX_COLOR #define LEO_NO_NORMAL #include "include/Leo3dLi1MspRend.h" #undef MSP_FUNC_NAME #undef LEO_COPY_FACET #undef LEO_VERTEX_COLOR #undef LEO_NO_NORMAL So you can tell what's going on. First is the name of the function you want generated, then which attributes you want generated. Here's how the header file looks: int XglDpCtx3dLeo::MSP_FUNC_NAME(XglPrimData *pd) { Leo_surface_props* sp = cache->csp; // Current surface props Xgli_api_data* api_data; // Api data Xgli_api_point_data* pdata; // Api point data #if defined (LEO_COPY_FACET) || defined(LEO_FACET_NORMAL) || defined(LEO_FACET_COLOR) Xgli_api_facet_data* fdata; // Api facet data #endif Xgl_pt_list* pl; // Current point list #ifdef LEO_CALC_NORMAL Xgl_pt_f3d* cnorms = NULL; // Steps through calcd normals Xgl_pt_f3d* cnorm_list = NULL; #endif #if defined (LEO_COPY_FACET) || defined(LEO_FACET_NORMAL) || defined(LEO_FACET_COLOR) char* facets = NULL; // steps through api facets #endif [. . .] -Paul