X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_rmain.c;h=ec4d0dac51c9312d9d241258afc8e519d83072e7;hb=dc5006685dfe9ad5a6b39b0dda5088d8144d396b;hp=5d3b8f4dfaded6a960df2db6accdcced67bb5d1c;hpb=3b8b31726da557e99a3019ce561482d175ae2f5a;p=xonotic%2Fdarkplaces.git diff --git a/gl_rmain.c b/gl_rmain.c index 5d3b8f4d..ec4d0dac 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -37,7 +37,17 @@ int c_alias_polys, c_light_polys, c_faces, c_nodes, c_leafs, c_models, c_bmodels // true during envmap command capture qboolean envmap; +// maximum visible distance (recalculated from world box each frame) float r_farclip; +// brightness of world lightmaps and related lighting +// (often reduced when world rtlights are enabled) +float r_lightmapintensity; +// whether to draw world lights realtime, dlights realtime, and their shadows +qboolean r_rtworld; +qboolean r_rtworldshadows; +qboolean r_rtdlight; +qboolean r_rtdlightshadows; + // forces all rendering to draw triangle outlines int r_showtrispass; @@ -50,8 +60,10 @@ vec3_t r_viewright; vec3_t r_viewup; int r_view_x; int r_view_y; +int r_view_z; int r_view_width; int r_view_height; +int r_view_depth; float r_view_fov_x; float r_view_fov_y; matrix4x4_t r_view_matrix; @@ -438,10 +450,9 @@ static void R_MarkEntities (void) Matrix4x4_OriginFromMatrix(&ent->matrix, ent->origin); // some of the renderer still relies on scale... ent->scale = Matrix4x4_ScaleFromMatrix(&ent->matrix); - R_LerpAnimation(ent); R_UpdateEntLights(ent); if ((chase_active.integer || !(ent->flags & RENDER_EXTERIORMODEL)) - && !VIS_CullBox(ent->mins, ent->maxs) + && (!VIS_CullBox(ent->mins, ent->maxs) || (ent->effects & EF_NODEPTHTEST)) && (!envmap || !(ent->flags & (RENDER_VIEWMODEL | RENDER_EXTERIORMODEL)))) ent->visframe = r_framecount; } @@ -469,30 +480,6 @@ int R_DrawBrushModelsSky (void) return sky; } -/* -============= -R_DrawViewModel -============= -*/ -/* -void R_DrawViewModel (void) -{ - entity_render_t *ent; - - // FIXME: move these checks to client - if (!r_drawviewmodel.integer || chase_active.integer || envmap || !r_drawentities.integer || cl.items & IT_INVISIBILITY || cl.stats[STAT_HEALTH] <= 0 || !cl.viewent.render.model) - return; - - ent = &cl.viewent.render; - Mod_CheckLoaded(ent->model); - R_LerpAnimation(ent); - Matrix4x4_CreateFromQuakeEntity(&ent->matrix, ent->origin[0], ent->origin[1], ent->origin[2], -ent->angles[0], ent->angles[1], ent->angles[2], ent->scale); - Matrix4x4_Invert_Simple(&ent->inversematrix, &ent->matrix); - R_UpdateEntLights(ent); - ent->model->Draw(ent); -} -*/ - void R_DrawNoModel(entity_render_t *ent); void R_DrawModels(void) { @@ -578,31 +565,6 @@ static void R_BlendView(void) R_Mesh_Draw(3, 1, polygonelements); } -void R_UpdateWorld(void) -{ - if (!r_refdef.entities/* || !cl.worldmodel*/) - return; //Host_Error ("R_RenderView: NULL worldmodel"); - - if (r_shadow_realtime_world.integer && !gl_stencil) - { - Con_Print("Realtime world lighting requires 32bit color; turning off r_shadow_realtime_world, please type vid_bitsperpixel 32;vid_restart and try again\n"); - Cvar_SetValueQuick(&r_shadow_realtime_world, 0); - } - - // don't allow cheats in multiplayer - if (!cl.islocalgame) - { - if (r_fullbright.integer != 0) - Cvar_Set ("r_fullbright", "0"); - if (r_ambient.value != 0) - Cvar_Set ("r_ambient", "0"); - } - - R_Textures_Frame(); - R_UpdateFog(); - R_UpdateLights(); -} - void R_RenderScene(void); /* @@ -614,20 +576,32 @@ void R_RenderView(void) { if (!r_refdef.entities/* || !cl.worldmodel*/) return; //Host_Error ("R_RenderView: NULL worldmodel"); - + r_view_width = bound(0, r_refdef.width, vid.realwidth); r_view_height = bound(0, r_refdef.height, vid.realheight); + r_view_depth = 1; r_view_x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width); r_view_y = bound(0, r_refdef.y, vid.realheight - r_refdef.height); + r_view_z = 0; r_view_fov_x = bound(1, r_refdef.fov_x, 170); r_view_fov_y = bound(1, r_refdef.fov_y, 170); r_view_matrix = r_refdef.viewentitymatrix; + GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 1); + r_rtworld = r_shadow_realtime_world.integer; + r_rtworldshadows = r_rtworld && r_shadow_realtime_world_shadows.integer && gl_stencil; + r_rtdlight = r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer; + r_rtdlightshadows = r_rtdlight && (r_rtworld ? r_shadow_realtime_world_dlightshadows.integer : r_shadow_realtime_dlight_shadows.integer) && gl_stencil; + r_lightmapintensity = r_rtworld ? r_shadow_realtime_world_lightmaps.value : 1; // GL is weird because it's bottom to top, r_view_y is top to bottom qglViewport(r_view_x, vid.realheight - (r_view_y + r_view_height), r_view_width, r_view_height); GL_Scissor(r_view_x, r_view_y, r_view_width, r_view_height); GL_ScissorTest(true); + GL_DepthMask(true); R_ClearScreen(); + R_Textures_Frame(); + R_UpdateFog(); + R_UpdateLights(); R_TimeReport("setup"); qglDepthFunc(GL_LEQUAL); @@ -657,12 +631,14 @@ void R_RenderScene(void) r_framecount++; + R_MeshQueue_BeginScene(); + GL_ShowTrisColor(0.05, 0.05, 0.05, 1); R_SetFrustum(); r_farclip = R_FarClip(r_vieworigin, r_viewforward, 768.0f) + 256.0f; - if (gl_stencil && (r_shadow_realtime_world.integer || (r_shadow_realtime_dlight.integer && r_shadow_realtime_dlight_shadows.integer))) + if (r_rtworldshadows || r_rtdlightshadows) GL_SetupView_Mode_PerspectiveInfiniteFarClip(r_view_fov_x, r_view_fov_y, 1.0f); else GL_SetupView_Mode_Perspective(r_view_fov_x, r_view_fov_y, 1.0f, r_farclip); @@ -680,8 +656,6 @@ void R_RenderScene(void) R_MarkEntities(); R_TimeReport("markentity"); - R_MeshQueue_BeginScene(); - R_Shadow_UpdateWorldLightSelection(); // don't let sound skip if going slow @@ -861,7 +835,7 @@ void R_DrawNoModelCallback(const void *calldata1, int calldata2) GL_BlendFunc(GL_ONE, GL_ZERO); GL_DepthMask(true); } - GL_DepthTest(true); + GL_DepthTest(!(ent->effects & EF_NODEPTHTEST)); if (fogenabled) { memcpy(color4f, nomodelcolor4f, sizeof(float[6*4])); @@ -893,7 +867,7 @@ void R_DrawNoModelCallback(const void *calldata1, int calldata2) void R_DrawNoModel(entity_render_t *ent) { //if ((ent->effects & EF_ADDITIVE) || (ent->alpha < 1)) - R_MeshQueue_AddTransparent(ent->origin, R_DrawNoModelCallback, ent, 0); + R_MeshQueue_AddTransparent(ent->effects & EF_NODEPTHTEST ? r_vieworigin : ent->origin, R_DrawNoModelCallback, ent, 0); //else // R_DrawNoModelCallback(ent, 0); }