/* ============== R_AddMD5Surfaces ============== */ void R_AddMD5Surfaces(trRefEntity_t * ent) { md5Model_t *model; md5Surface_t *surface; shader_t *shader; int i; qboolean personalModel; int fogNum; model = tr.currentModel->md5; // don't add third_person objects if not in a portal personalModel = (ent->e.renderfx & RF_THIRD_PERSON) && !tr.viewParms.isPortal; // cull the entire model if merged bounding box of both frames // is outside the view frustum R_CullMD5(ent); if(ent->cull == CULL_OUT) { return; } // set up world bounds for light intersection tests R_SetupEntityWorldBounds(ent); // set up lighting now that we know we aren't culled if(!personalModel || r_shadows->integer > SHADOWING_BLOB) { R_SetupEntityLighting(&tr.refdef, ent, NULL); } // see if we are in a fog volume fogNum = R_FogWorldBox(ent->worldBounds); if(!r_vboModels->integer || !model->numVBOSurfaces || (!glConfig2.vboVertexSkinningAvailable && ent->e.skeleton.type == SK_ABSOLUTE)) { // finally add surfaces for(i = 0, surface = model->surfaces; i < model->numSurfaces; i++, surface++) { if(ent->e.customShader) { shader = R_GetShaderByHandle(ent->e.customShader); } else if(ent->e.customSkin > 0 && ent->e.customSkin < tr.numSkins) { skin_t *skin; skin = R_GetSkinByHandle(ent->e.customSkin); // match the surface name to something in the skin file shader = tr.defaultShader; // FIXME: replace MD3_MAX_SURFACES for skin_t::surfaces if(i >= 0 && i < skin->numSurfaces && skin->surfaces[i]) { shader = skin->surfaces[i]->shader; } if(shader == tr.defaultShader) { ri.Printf(PRINT_DEVELOPER, "WARNING: no shader for surface %i in skin %s\n", i, skin->name); } else if(shader->defaultShader) { ri.Printf(PRINT_DEVELOPER, "WARNING: shader %s in skin %s not found\n", shader->name, skin->name); } } else { shader = R_GetShaderByHandle(surface->shaderIndex); } // we will add shadows even if the main object isn't visible in the view // don't add third_person objects if not viewing through a portal if(!personalModel) { R_AddDrawSurf((void *)surface, shader, -1, fogNum); } } } else { int i; srfVBOMD5Mesh_t *vboSurface; shader_t *shader; for(i = 0; i < model->numVBOSurfaces; i++) { vboSurface = model->vboSurfaces[i]; if(ent->e.customShader) { shader = R_GetShaderByHandle(ent->e.customShader); } else if(ent->e.customSkin > 0 && ent->e.customSkin < tr.numSkins) { skin_t *skin; skin = R_GetSkinByHandle(ent->e.customSkin); // match the surface name to something in the skin file shader = tr.defaultShader; // FIXME: replace MD3_MAX_SURFACES for skin_t::surfaces //if(i >= 0 && i < skin->numSurfaces && skin->surfaces[i]) if(vboSurface->skinIndex >= 0 && vboSurface->skinIndex < skin->numSurfaces && skin->surfaces[vboSurface->skinIndex]) { shader = skin->surfaces[vboSurface->skinIndex]->shader; } if(shader == tr.defaultShader) { ri.Printf(PRINT_DEVELOPER, "WARNING: no shader for surface %i in skin %s\n", i, skin->name); } else if(shader->defaultShader) { ri.Printf(PRINT_DEVELOPER, "WARNING: shader %s in skin %s not found\n", shader->name, skin->name); } } else { shader = vboSurface->shader; } // don't add third_person objects if not viewing through a portal if(!personalModel) { R_AddDrawSurf((void *)vboSurface, shader, -1, fogNum); } } } }
/* ============== R_AddMD5Surfaces ============== */ void R_AddMD5Surfaces( trRefEntity_t *ent ) { md5Model_t *model; md5Surface_t *surface; shader_t *shader; int i; qboolean personalModel; int fogNum; model = tr.currentModel->model.md5; // don't add third_person objects if not in a portal personalModel = ( ent->e.renderfx & RF_THIRD_PERSON ) && !tr.viewParms.isPortal; // cull the entire model if merged bounding box of both frames // is outside the view frustum if ( R_CullMD5( ent ) == CULL_OUT ) { return; } // set up lighting now that we know we aren't culled if ( !personalModel || r_shadows->integer > SHADOWING_BLOB ) { R_SetupEntityLighting( &tr.refdef, ent ); } // see if we are in a fog volume fogNum = 0; //R_FogWorldBox(ent->worldBounds); // finally add surfaces for ( i = 0, surface = model->surfaces; i < model->numSurfaces; i++, surface++ ) { if ( ent->e.customShader ) { shader = R_GetShaderByHandle( ent->e.customShader ); } else if ( ent->e.customSkin > 0 && ent->e.customSkin < tr.numSkins ) { skin_t *skin; skin = R_GetSkinByHandle( ent->e.customSkin ); // match the surface name to something in the skin file shader = tr.defaultShader; // FIXME: replace MD3_MAX_SURFACES for skin_t::surfaces if ( i >= 0 && i < skin->numSurfaces && skin->surfaces[ i ] ) { shader = skin->surfaces[ i ]->shader; } if ( shader == tr.defaultShader ) { ri.Printf( PRINT_DEVELOPER, "WARNING: no shader for surface %i in skin %s\n", i, skin->name ); } else if ( shader->defaultShader ) { ri.Printf( PRINT_DEVELOPER, "WARNING: shader %s in skin %s not found\n", shader->name, skin->name ); } } else { shader = R_GetShaderByHandle( surface->shaderIndex ); if ( ent->e.altShaderIndex > 0 && ent->e.altShaderIndex < MAX_ALTSHADERS && shader->altShader[ ent->e.altShaderIndex ].index ) { shader = R_GetShaderByHandle( shader->altShader[ ent->e.altShaderIndex ].index ); } } // we will add shadows even if the main object isn't visible in the view // don't add third_person objects if not viewing through a portal if ( !personalModel ) { R_AddDrawSurf( ( surfaceType_t * ) surface, shader, fogNum, 0, 0 ); } } }