/** * @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); } }
void R_RenderAlphaTestBspRRefs (void) { R_EnableAlphaTest(true); R_EnableLighting(r_state.world_program, true); R_EnableWorldLights(); R_RenderBspRRefs(R_DrawSurfaces, S_ALPHA_TEST); R_EnableLighting(nullptr, false); R_EnableGlowMap(nullptr); R_EnableAlphaTest(false); }
/** * @brief Draw all simple opaque bsp surfaces with multitexture enabled and light enabled */ void R_RenderOpaqueBspRRefs (void) { R_EnableTexture(&texunit_lightmap, true); R_EnableLighting(r_state.world_program, true); R_EnableWorldLights(); R_RenderBspRRefs(R_DrawSurfaces, S_OPAQUE); R_EnableLighting(nullptr, false); R_EnableGlowMap(nullptr); R_EnableTexture(&texunit_lightmap, false); }
/** * @sa R_GetEntityLists */ void R_DrawOpaqueMeshEntities (entity_t* ents) { if (!ents) return; if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) { R_EnableLighting(r_state.model_program, true); } R_DrawMeshEntities(ents); if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) { R_EnableLighting(nullptr, false); R_EnableGlowMap(nullptr); } }
/** * @sa R_GetEntityLists */ void R_DrawOpaqueMeshEntities (entity_t *ents) { if (!ents) return; if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) { R_EnableLighting(r_state.world_program, qtrue); } R_DrawMeshEntities(ents); if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) { R_EnableLighting(NULL, qfalse); R_EnableGlowMap(NULL); } }
/** * @brief Re-draws the mesh using the stencil test. Meshes with stale lighting * information, or with a lighting point above our view, are not drawn. */ static void R_DrawMeshShadow (entity_t *e, const mAliasMesh_t *mesh) { vec4_t color; const bool oldBlend = r_state.blend_enabled; const bool lighting = r_state.lighting_enabled; r_program_t *program = r_state.active_program; if (!r_stencilshadows->integer) return; if (!r_shadows->value) return; if (r_wire->integer) return; if (e->flags & RF_NO_SHADOW) return; if (e->flags & RF_TRANSLUCENT) return; if (!R_UpdateShadowOrigin(e)) return; if (e->lighting->shadowOrigin[2] > refdef.viewOrigin[2]) return; Vector4Set(color, 0.0, 0.0, 0.0, r_shadows->value * MESH_SHADOW_ALPHA); R_Color(color); R_EnableTexture(&texunit_diffuse, false); R_EnableBlend(true); R_RotateForMeshShadow(e); R_EnableStencilTest(true); if (lighting) R_EnableLighting(NULL, false); glDrawArrays(GL_TRIANGLES, 0, mesh->num_tris * 3); refdef.batchCount++; if (lighting) R_EnableLighting(program, true); R_EnableStencilTest(false); R_RotateForMeshShadow(NULL); R_EnableBlend(oldBlend); R_EnableTexture(&texunit_diffuse, true); R_Color(NULL); }
/** * @sa R_GetEntityLists */ void R_DrawBlendMeshEntities (entity_t* ents) { if (!ents) return; if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) { R_EnableLighting(r_state.model_program, true); } R_EnableBlend(true); R_DrawMeshEntities(R_MergeSortEntList(ents)); R_EnableBlend(false); if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) { R_EnableLighting(nullptr, false); R_EnableGlowMap(nullptr); } }
/** * @sa R_GetEntityLists */ void R_DrawBlendMeshEntities (entity_t *ents) { if (!ents) return; if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) { R_EnableLighting(r_state.world_program, qtrue); } R_EnableBlend(qtrue); R_DrawMeshEntities(R_MergeSortEntList(ents)); R_EnableBlend(qfalse); if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) { R_EnableLighting(NULL, qfalse); R_EnableGlowMap(NULL); } }
/* * R_DrawOpaqueSurfaces_default */ void R_DrawOpaqueSurfaces_default(const r_bsp_surfaces_t *surfs) { if (!surfs->count) return; if (r_draw_wireframe->value) { // surface outlines R_DrawSurfacesLines_default(surfs); return; } R_EnableTexture(&texunit_lightmap, true); R_EnableLighting(r_state.world_program, true); R_DrawSurfaces_default(surfs); R_EnableLighting(NULL, false); R_EnableTexture(&texunit_lightmap, false); }
/** * @brief Iterates the specified surfaces list, updating materials as they are * encountered, and rendering all visible stages. State is lazily managed * throughout the iteration, so there is a concerted effort to restore the * state after all surface stages have been rendered. */ void R_DrawMaterialSurfaces (const mBspSurfaces_t *surfs, GLushort *indexPtr) { int i; if (!r_materials->integer || r_wire->integer) return; if (!surfs->count) return; assert(r_state.blend_enabled); /** @todo - integrate BSP lighting with model lighting */ R_EnableModelLights(nullptr, 0, false, false); R_EnableColorArray(true); R_ResetArrayState(); R_EnableColorArray(false); R_EnableLighting(nullptr, false); R_EnableTexture(&texunit_lightmap, false); #ifndef GL_VERSION_ES_CM_1_0 glEnable(GL_POLYGON_OFFSET_FILL); #endif glPolygonOffset(-1.f, -1.f); glMatrixMode(GL_TEXTURE); /* some stages will manipulate texcoords */ for (i = 0; i < surfs->count; i++) { materialStage_t *s; mBspSurface_t *surf = surfs->surfaces[i]; material_t *m = &surf->texinfo->image->material; int j = -1; if (surf->frame != r_locals.frame) continue; R_UpdateMaterial(m); for (s = m->stages; s; s = s->next, j--) { if (!(s->flags & STAGE_RENDER)) continue; R_SetSurfaceStageState(surf, s); R_DrawSurfaceStage(surf, s); } } R_Color(nullptr); /* polygon offset parameters */ glPolygonOffset(0.0, 0.0); #ifndef GL_VERSION_ES_CM_1_0 glDisable(GL_POLYGON_OFFSET_FILL); #endif glLoadIdentity(); glMatrixMode(GL_MODELVIEW); R_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); R_EnableFog(true); R_EnableColorArray(false); R_EnableTexture(&texunit_lightmap, false); R_EnableBumpmap(nullptr); R_EnableLighting(nullptr, false); R_EnableGlowMap(nullptr); R_Color(nullptr); }