/** * @brief Set the surface state according to surface flags and bind the texture * @sa R_DrawSurfaces */ static void R_SetSurfaceState (const mBspSurface_t *surf) { image_t *image; if (r_state.blend_enabled) { /* alpha blend */ vec4_t color = {1.0, 1.0, 1.0, 1.0}; switch (surf->texinfo->flags & (SURF_BLEND33 | SURF_BLEND66)) { case SURF_BLEND33: color[3] = 0.33; break; case SURF_BLEND66: color[3] = 0.66; break; } R_Color(color); } image = surf->texinfo->image; R_BindTexture(image->texnum); /* texture */ if (texunit_lightmap.enabled) { /* lightmap */ if (surf->flags & MSURF_LIGHTMAP) R_BindLightmapTexture(surf->lightmap_texnum); } R_SetSurfaceBumpMappingParameters(surf, image->normalmap, image->specularmap); R_EnableGlowMap(image->glowmap); R_CheckError(); }
/** * @brief Manages state for stages supporting static, dynamic, and per-pixel lighting. */ static void R_StageLighting (const mBspSurface_t *surf, const materialStage_t *stage) { /* if the surface has a lightmap, and the stage specifies lighting.. */ if ((surf->flags & MSURF_LIGHTMAP) && (stage->flags & (STAGE_LIGHTMAP | STAGE_LIGHTING))) { R_EnableTexture(&texunit_lightmap, true); R_BindLightmapTexture(surf->lightmap_texnum); /* hardware lighting */ /** @todo fix it and enable it back for r_materials 1 */ if (r_materials->integer > 1) { if ((stage->flags & STAGE_LIGHTING)) { R_EnableLighting(r_state.world_program, true); R_SetSurfaceBumpMappingParameters(surf, stage->image->normalmap, stage->image->specularmap); } else { R_SetSurfaceBumpMappingParameters(surf, nullptr, nullptr); R_EnableLighting(nullptr, false); } } } else { if (!r_state.lighting_enabled) return; R_EnableLighting(nullptr, false); R_EnableTexture(&texunit_lightmap, false); } }
/* * R_SetSurfaceState_default */ static void R_SetSurfaceState_default(const r_bsp_surface_t *surf) { r_image_t *image; float a; if (r_state.blend_enabled) { // alpha blend switch (surf->texinfo->flags & (SURF_BLEND_33 | SURF_BLEND_66)) { case SURF_BLEND_33: a = 0.33; break; case SURF_BLEND_66: a = 0.66; break; default: // both flags mean use the texture's alpha channel a = 1.0; break; } glColor4f(1.0, 1.0, 1.0, a); } image = surf->texinfo->image; if (texunit_diffuse.enabled) // diffuse texture R_BindTexture(image->texnum); if (texunit_lightmap.enabled) // lightmap texture R_BindLightmapTexture(surf->lightmap_texnum); if (r_state.lighting_enabled) { // hardware lighting if (r_bumpmap->value) { // bump mapping if (image->normalmap) { R_BindDeluxemapTexture(surf->deluxemap_texnum); R_BindNormalmapTexture(image->normalmap->texnum); R_EnableBumpmap(&image->material, true); } else R_EnableBumpmap(NULL, false); } if (surf->light_frame == r_locals.light_frame) // dynamic light sources R_EnableLights(surf->lights); else R_EnableLights(0); } }
/** * @brief Draw the day and night images of a flat geoscape * multitexture feature is used to blend the images * @sa R_Draw3DGlobe * @param[in] p The horizontal shift of the night map * @param[in] cx The x texture coordinate * @param[in] cy The y texture coordinate * @param[in] iz The zoomlevel of the geoscape - see ccs.zoom * @param[in] map The geoscape map to draw (can be changed in the campaign definition) * @param[in] overlayNation,overlayXVI,overlayRadar Whether these overlays should be drawn or not */ void R_DrawFlatGeoscape (const vec2_t nodePos, const vec2_t nodeSize, float p, float cx, float cy, float iz, const char *map, bool overlayNation, bool overlayXVI, bool overlayRadar, image_t *r_dayandnightTexture, image_t *r_xviTexture, image_t *r_radarTexture) { image_t *gl; float geoscape_texcoords[4 * 2]; short geoscape_verts[4 * 2]; /* normalize */ const float nx = nodePos[0] * viddef.rx; const float ny = nodePos[1] * viddef.ry; const float nw = nodeSize[0] * viddef.rx; const float nh = nodeSize[1] * viddef.ry; /* load day image */ gl = R_FindImage(va("pics/geoscape/%s_day", map), it_wrappic); if (gl == r_noTexture) Com_Error(ERR_FATAL, "Could not load geoscape day image"); /* alter the array pointers */ glVertexPointer(2, GL_SHORT, 0, geoscape_verts); R_BindArray(GL_TEXTURE_COORD_ARRAY, GL_FLOAT, geoscape_texcoords); geoscape_texcoords[0] = cx - iz; geoscape_texcoords[1] = cy - iz; geoscape_texcoords[2] = cx + iz; geoscape_texcoords[3] = cy - iz; geoscape_texcoords[4] = cx + iz; geoscape_texcoords[5] = cy + iz; geoscape_texcoords[6] = cx - iz; geoscape_texcoords[7] = cy + iz; geoscape_verts[0] = nx; geoscape_verts[1] = ny; geoscape_verts[2] = nx + nw; geoscape_verts[3] = ny; geoscape_verts[4] = nx + nw; geoscape_verts[5] = ny + nh; geoscape_verts[6] = nx; geoscape_verts[7] = ny + nh; /* draw day image */ R_BindTexture(gl->texnum); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); refdef.batchCount++; /* draw night map */ gl = R_FindImage(va("pics/geoscape/%s_night", map), it_wrappic); /* maybe the campaign map doesn't have a night image */ if (gl != r_noTexture) { float geoscape_nighttexcoords[4 * 2]; R_BindTexture(gl->texnum); R_EnableTexture(&texunit_lightmap, true); R_SelectTexture(&texunit_lightmap); geoscape_nighttexcoords[0] = geoscape_texcoords[0] + p; geoscape_nighttexcoords[1] = geoscape_texcoords[1]; geoscape_nighttexcoords[2] = geoscape_texcoords[2] + p; geoscape_nighttexcoords[3] = geoscape_texcoords[3]; geoscape_nighttexcoords[4] = geoscape_texcoords[4] + p; geoscape_nighttexcoords[5] = geoscape_texcoords[5]; geoscape_nighttexcoords[6] = geoscape_texcoords[6] + p; geoscape_nighttexcoords[7] = geoscape_texcoords[7]; R_BindArray(GL_TEXTURE_COORD_ARRAY, GL_FLOAT, geoscape_nighttexcoords); R_BindTexture(r_dayandnightTexture->texnum); R_SelectTexture(&texunit_diffuse); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); refdef.batchCount++; R_SelectTexture(&texunit_lightmap); R_BindArray(GL_TEXTURE_COORD_ARRAY, GL_FLOAT, geoscape_texcoords); R_EnableTexture(&texunit_lightmap, false); } /* draw nation overlay */ if (overlayNation) { gl = R_FindImage(va("pics/geoscape/%s_nations_overlay", map), it_wrappic); if (gl == r_noTexture) Com_Error(ERR_FATAL, "Could not load geoscape nation overlay image"); /* draw day image */ R_BindTexture(gl->texnum); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); refdef.batchCount++; } /* draw XVI image */ if (overlayXVI) { gl = R_FindImage(va("pics/geoscape/%s_xvi_overlay", map), it_wrappic); if (gl == r_noTexture) Com_Error(ERR_FATAL, "Could not load xvi overlay image"); R_BindTexture(gl->texnum); R_EnableTexture(&texunit_lightmap, true); R_BindLightmapTexture(r_xviTexture->texnum); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); refdef.batchCount++; R_EnableTexture(&texunit_lightmap, false); } /* draw radar image */ if (overlayRadar) { R_BindTexture(r_radarTexture->texnum); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); refdef.batchCount++; } /* and restore them */ R_BindDefaultArray(GL_TEXTURE_COORD_ARRAY); R_BindDefaultArray(GL_VERTEX_ARRAY); }