X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_rmain.c;h=d266859e0a131e4ca9ca7c0f2deecaad779c300e;hb=f9605292b17719532eac0b3c7ccd6341b671d684;hp=24a08cdbaa36c736b1d60aed628bdf83aa12be15;hpb=ccf0849cbfe3013a00dff7f37cc68e774b241cb5;p=xonotic%2Fdarkplaces.git diff --git a/gl_rmain.c b/gl_rmain.c index 24a08cdb..d266859e 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -73,16 +73,15 @@ cvar_t r_speeds = {"r_speeds","0"}; cvar_t r_speeds2 = {"r_speeds2","0"}; cvar_t r_fullbright = {"r_fullbright","0"}; //cvar_t r_lightmap = {"r_lightmap","0"}; -cvar_t r_shadows = {"r_shadows","0"}; cvar_t r_wateralpha = {"r_wateralpha","1"}; cvar_t r_dynamic = {"r_dynamic","1"}; cvar_t r_novis = {"r_novis","0"}; cvar_t r_waterripple = {"r_waterripple","0"}; cvar_t r_fullbrights = {"r_fullbrights", "1"}; -cvar_t contrast = {"contrast", "1.0", TRUE}; // LordHavoc: a method of operating system independent color correction -cvar_t brightness = {"brightness", "1.0", TRUE}; // LordHavoc: a method of operating system independent color correction -cvar_t gl_lightmode = {"gl_lightmode", "1", TRUE}; // LordHavoc: overbright lighting +cvar_t contrast = {"contrast", "1.0", true}; // LordHavoc: a method of operating system independent color correction +cvar_t brightness = {"brightness", "1.0", true}; // LordHavoc: a method of operating system independent color correction +cvar_t gl_lightmode = {"gl_lightmode", "1", true}; // LordHavoc: overbright lighting //cvar_t r_dynamicbothsides = {"r_dynamicbothsides", "1"}; // LordHavoc: can disable dynamic lighting of backfaces, but quake maps are weird so it doesn't always work right... cvar_t r_farclip = {"r_farclip", "6144"}; @@ -212,11 +211,15 @@ void FOG_registercvars() } } -void glmain_start() +void gl_main_start() { } -void glmain_shutdown() +void gl_main_shutdown() +{ +} + +void gl_main_newmap() { } @@ -225,7 +228,6 @@ void GL_Main_Init() FOG_registercvars(); Cvar_RegisterVariable (&r_drawentities); Cvar_RegisterVariable (&r_drawviewmodel); - Cvar_RegisterVariable (&r_shadows); Cvar_RegisterVariable (&r_speeds); Cvar_RegisterVariable (&r_speeds2); Cvar_RegisterVariable (&contrast); @@ -243,7 +245,7 @@ void GL_Main_Init() // if (gl_vendor && strstr(gl_vendor, "3Dfx")) // gl_lightmode.value = 0; Cvar_RegisterVariable (&r_fullbright); - R_RegisterModule("GL_Main", glmain_start, glmain_shutdown); + R_RegisterModule("GL_Main", gl_main_start, gl_main_shutdown, gl_main_newmap); } extern void GL_Draw_Init(); @@ -257,10 +259,11 @@ extern void R_Crosshairs_Init(); extern void R_Light_Init(); extern void R_Particles_Init(); extern void R_Explosion_Init(); +extern void CL_Effects_Init(); void Render_Init() { - R_ShutdownModules(); + R_Modules_Shutdown(); GL_Draw_Init(); GL_Main_Init(); GL_Models_Init(); @@ -272,7 +275,9 @@ void Render_Init() R_Light_Init(); R_Particles_Init(); R_Explosion_Init(); - R_StartModules(); + CL_Effects_Init(); + R_Decals_Init(); + R_Modules_Start(); } /* @@ -280,7 +285,7 @@ void Render_Init() GL_Init =============== */ -extern char *QSG_EXTENSIONS; +extern char *ENGINE_EXTENSIONS; void GL_Init (void) { gl_vendor = glGetString (GL_VENDOR); @@ -296,10 +301,10 @@ void GL_Init (void) // Con_Printf ("%s %s\n", gl_renderer, gl_version); VID_CheckMultitexture(); - VID_CheckVertexArrays(); + VID_CheckCVA(); // LordHavoc: report supported extensions - Con_Printf ("\nQSG extensions: %s\n", QSG_EXTENSIONS); + Con_Printf ("\nengine extensions: %s\n", ENGINE_EXTENSIONS); glCullFace(GL_FRONT); glEnable(GL_TEXTURE_2D); @@ -325,13 +330,6 @@ void R_RotateForEntity (entity_t *e) } */ -// LordHavoc: if not for the fact BRIGHTFIELD particles require this, it would be removed... -#define NUMVERTEXNORMALS 162 - -float r_avertexnormals[NUMVERTEXNORMALS][3] = { -#include "anorms.h" -}; - // LordHavoc: shading stuff vec3_t shadevector; vec3_t shadecolor; @@ -341,7 +339,74 @@ float modelalpha; //================================================================================== void R_DrawBrushModel (entity_t *e); -void R_DrawSpriteModel (entity_t *e); +void R_DrawSpriteModel (entity_t *e, frameblend_t *blend); + +void R_LerpUpdate(entity_t *ent) +{ + int frame; + frame = ent->render.frame; + if (ent->render.model && ent->render.frame >= ent->render.model->numframes) + { + Con_Printf("R_LerpUpdate: no such frame%6i in \"%s\"\n", ent->render.frame, ent->render.model->name); + frame = 0; + } + + if (ent->render.lerp_model != ent->render.model) + { + // reset all interpolation information + ent->render.lerp_model = ent->render.model; + ent->render.frame1 = ent->render.frame2 = frame; + ent->render.frame1start = ent->render.frame2start = cl.time; + ent->render.framelerp = 1; + ent->render.lerp_starttime = 0; + } + else if (ent->render.frame2 != frame) + { + // transition to new frame + ent->render.frame1 = ent->render.frame2; + ent->render.frame1start = ent->render.frame2start; + ent->render.frame2 = frame; + ent->render.frame2start = cl.time; + ent->render.framelerp = 0; + ent->render.lerp_starttime = cl.time; + } + else + { + // lerp_starttime < 0 is used to prevent changing of framelerp + if (ent->render.lerp_starttime >= 0) + { + // update transition + ent->render.framelerp = (cl.time - ent->render.lerp_starttime) * 10; + ent->render.framelerp = bound(0, ent->render.framelerp, 1); + } + } +} + + +void R_PrepareEntities (void) +{ + int i; + entity_t *ent; + vec3_t v; + // this updates entities that are supposed to be view relative + for (i = 0;i < cl_numvisedicts;i++) + { + ent = cl_visedicts[i]; + + if (ent->render.flags & RENDER_VIEWMODEL) + { + // remove flag so it will not be repeated incase RelinkEntities is not called again for a while + ent->render.flags -= RENDER_VIEWMODEL; + // transform origin + VectorCopy(ent->render.origin, v); + ent->render.origin[0] = v[0] * vpn[0] + v[1] * vright[0] + v[2] * vup[0] + r_refdef.vieworg[0]; + ent->render.origin[1] = v[0] * vpn[1] + v[1] * vright[1] + v[2] * vup[1] + r_refdef.vieworg[1]; + ent->render.origin[2] = v[0] * vpn[2] + v[1] * vright[2] + v[2] * vup[2] + r_refdef.vieworg[2]; + // adjust angles + VectorAdd(ent->render.angles, r_refdef.viewangles, ent->render.angles); + } + } +} /* ============= @@ -356,12 +421,12 @@ void R_DrawEntitiesOnList1 (void) if (!r_drawentities.value) return; - for (i=0 ; imodel->type != mod_brush) + if (cl_visedicts[i]->render.model->type != mod_brush) continue; currententity = cl_visedicts[i]; - modelalpha = currententity->alpha; + modelalpha = currententity->render.alpha; R_DrawBrushModel (currententity); } @@ -370,23 +435,28 @@ void R_DrawEntitiesOnList1 (void) void R_DrawEntitiesOnList2 (void) { int i; + frameblend_t blend[4]; if (!r_drawentities.value) return; - for (i=0 ; ialpha; + modelalpha = currententity->render.alpha; - switch (currententity->model->type) + switch (currententity->render.model->type) { case mod_alias: - R_DrawAliasModel (currententity, true, modelalpha, currententity->model, currententity->frame, currententity->skinnum, currententity->origin, currententity->angles, currententity->effects, currententity->model->flags, currententity->colormap); + R_LerpUpdate(currententity); + R_LerpAnimation(currententity->render.model, currententity->render.frame1, currententity->render.frame2, currententity->render.frame1start, currententity->render.frame2start, currententity->render.framelerp, blend); + R_DrawAliasModel (currententity, true, modelalpha, currententity->render.model, blend, currententity->render.skinnum, currententity->render.origin, currententity->render.angles, currententity->render.scale, currententity->render.effects, currententity->render.model->flags, currententity->render.colormap); break; case mod_sprite: - R_DrawSpriteModel (currententity); + R_LerpUpdate(currententity); + R_LerpAnimation(currententity->render.model, currententity->render.frame1, currententity->render.frame2, currententity->render.frame1start, currententity->render.frame2start, currententity->render.framelerp, blend); + R_DrawSpriteModel (currententity, blend); break; default: @@ -402,18 +472,23 @@ R_DrawViewModel */ void R_DrawViewModel (void) { - if (!r_drawviewmodel.value || chase_active.value || envmap || !r_drawentities.value || cl.items & IT_INVISIBILITY || cl.stats[STAT_HEALTH] <= 0 || !cl.viewent.model) + frameblend_t blend[4]; + + if (!r_drawviewmodel.value || chase_active.value || envmap || !r_drawentities.value || cl.items & IT_INVISIBILITY || cl.stats[STAT_HEALTH] <= 0 || !cl.viewent.render.model) return; currententity = &cl.viewent; - currententity->alpha = modelalpha = cl_entities[cl.viewentity].alpha; // LordHavoc: if the player is transparent, so is his gun - currententity->effects = cl_entities[cl.viewentity].effects; - currententity->scale = 1; - VectorCopy(cl_entities[cl.viewentity].colormod, currententity->colormod); + currententity->render.alpha = modelalpha = cl_entities[cl.viewentity].render.alpha; // LordHavoc: if the player is transparent, so is the gun + currententity->render.effects = cl_entities[cl.viewentity].render.effects; + currententity->render.scale = 1; + VectorCopy(cl_entities[cl.viewentity].render.colormod, currententity->render.colormod); + + R_LerpUpdate(currententity); + R_LerpAnimation(currententity->render.model, currententity->render.frame1, currententity->render.frame2, currententity->render.frame1start, currententity->render.frame2start, currententity->render.framelerp, blend); // hack the depth range to prevent view model from poking into walls glDepthRange (gldepthmin, gldepthmin + 0.3*(gldepthmax-gldepthmin)); - R_DrawAliasModel (currententity, FALSE, modelalpha, currententity->model, currententity->frame, currententity->skinnum, currententity->origin, currententity->angles, currententity->effects, currententity->model->flags, currententity->colormap); + R_DrawAliasModel (currententity, false, modelalpha, currententity->render.model, blend, currententity->render.skinnum, currententity->render.origin, currententity->render.angles, currententity->render.scale, currententity->render.effects, currententity->render.model->flags, currententity->render.colormap); glDepthRange (gldepthmin, gldepthmax); } @@ -691,16 +766,6 @@ void GL_BlendView() glEnable(GL_TEXTURE_2D); } -/* -#define TIMEREPORT(DESC) \ - if (r_speeds2.value)\ - {\ - temptime = -currtime;\ - currtime = Sys_FloatTime();\ - temptime += currtime;\ - Con_Printf(DESC " %.4fms ", temptime * 1000.0);\ - } -*/ #define TIMEREPORT(VAR) \ if (r_speeds2.value)\ {\ @@ -722,17 +787,16 @@ extern qboolean intimerefresh; extern qboolean skyisvisible; extern void R_Sky(); extern void UploadLightmaps(); -char r_speeds2_string1[81], r_speeds2_string2[81], r_speeds2_string3[81], r_speeds2_string4[81], r_speeds2_string5[81], r_speeds2_string6[81]; +char r_speeds2_string1[81], r_speeds2_string2[81], r_speeds2_string3[81], r_speeds2_string4[81], r_speeds2_string5[81], r_speeds2_string6[81], r_speeds2_string7[81]; void R_RenderView (void) { double starttime, currtime, temptime; - int time_clear, time_setup, time_world, time_bmodels, time_upload, time_sky, time_wall, time_models, time_moveparticles, time_drawparticles, time_moveexplosions, time_drawexplosions, time_transpoly, time_blend, time_total; -// double currtime, temptime; + int time_clear, time_setup, time_world, time_bmodels, time_upload, time_sky, time_wall, time_models, time_moveparticles, time_drawparticles, time_moveexplosions, time_drawexplosions, time_drawdecals, time_transpoly, time_blend, time_total; // if (r_norefresh.value) // return; - if (!r_worldentity.model || !cl.worldmodel) - Sys_Error ("R_RenderView: NULL worldmodel"); + if (!r_worldentity.render.model || !cl.worldmodel) + Host_Error ("R_RenderView: NULL worldmodel"); lighthalf = gl_lightmode.value; @@ -741,14 +805,10 @@ void R_RenderView (void) if (r_speeds2.value) { starttime = currtime = Sys_FloatTime(); -// Con_Printf("render time: "); } else starttime = currtime = 0; R_Clear(); - skypolyclear(); - wallpolyclear(); - transpolyclear(); skyisvisible = false; TIMEREPORT(time_clear) @@ -757,6 +817,13 @@ void R_RenderView (void) R_SetupFrame (); R_SetFrustum (); R_SetupGL (); + + R_PrepareEntities(); + + skypolyclear(); + wallpolyclear(); + transpolyclear(); + TIMEREPORT(time_setup) R_MarkLeaves (); // done here so we know if we're in water @@ -777,8 +844,8 @@ void R_RenderView (void) wallpolyrender(); TIMEREPORT(time_wall) -// if (!intimerefresh) -// S_ExtraUpdate (); // don't let sound get messed up if going slow + if (!intimerefresh && !r_speeds2.value) + S_ExtraUpdate (); // don't let sound get messed up if going slow R_DrawEntitiesOnList2 (); // other models // R_RenderDlights (); @@ -792,6 +859,8 @@ void R_RenderView (void) TIMEREPORT(time_moveexplosions) R_DrawExplosions(); TIMEREPORT(time_drawexplosions) + R_DrawDecals(); + TIMEREPORT(time_drawdecals) transpolyrender(); TIMEREPORT(time_transpoly) @@ -803,12 +872,12 @@ void R_RenderView (void) if (r_speeds2.value) { time_total = (int) ((Sys_FloatTime() - starttime) * 1000000.0); -// Con_Printf("\n"); sprintf(r_speeds2_string1, "%6i walls %6i dlitwalls %7i modeltris %7i transpoly\n", c_brush_polys, c_light_polys, c_alias_polys, currenttranspoly); sprintf(r_speeds2_string2, "BSP: %6i faces %6i nodes %6i leafs\n", c_faces, c_nodes, c_leafs); sprintf(r_speeds2_string3, "%4i models %4i bmodels %4i sprites %5i particles %3i dlights\n", c_models, c_bmodels, c_sprites, c_particles, c_dlights); sprintf(r_speeds2_string4, "%6ius clear %6ius setup %6ius world %6ius bmodel %6ius upload", time_clear, time_setup, time_world, time_bmodels, time_upload); sprintf(r_speeds2_string5, "%6ius sky %6ius wall %6ius models %6ius mpart %6ius dpart ", time_sky, time_wall, time_models, time_moveparticles, time_drawparticles); - sprintf(r_speeds2_string6, "%6ius trans %6ius blend %6ius total %6ius permdl", time_transpoly, time_blend, time_total, time_models / max(c_models, 1)); + sprintf(r_speeds2_string6, "%6ius mexplo %6ius dexplo %6ius decals %6ius trans %6ius blend ", time_moveexplosions, time_drawexplosions, time_drawdecals, time_transpoly, time_blend); + sprintf(r_speeds2_string7, "%6ius permdl %6ius total ", time_models / max(c_models, 1), time_total); } }