From db0e59eeca766dc6c747f546a682c56c15db8e32 Mon Sep 17 00:00:00 2001 From: havoc Date: Fri, 11 Jul 2003 07:45:10 +0000 Subject: [PATCH] added cvars r_lerpsprites, r_lerpmodels, and r_waterscroll (and to menu as well) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3228 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rmain.c | 9 +++++++++ gl_rsurf.c | 16 +++++++++++----- menu.c | 18 +++++++++++++++--- r_lerpanim.c | 26 ++++++++++++++++---------- r_sprites.c | 41 +++++++++++++++++++++-------------------- render.h | 4 ++++ 6 files changed, 76 insertions(+), 38 deletions(-) diff --git a/gl_rmain.c b/gl_rmain.c index 7c1d60a7..a107d936 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -70,6 +70,12 @@ cvar_t gl_fogend = {0, "gl_fogend","0"}; cvar_t r_textureunits = {0, "r_textureunits", "32"}; +cvar_t r_lerpsprites = {CVAR_SAVE, "r_lerpsprites", "1"}; +cvar_t r_lerpmodels = {CVAR_SAVE, "r_lerpmodels", "1"}; +cvar_t r_waterscroll = {CVAR_SAVE, "r_waterscroll", "1"}; + + + void R_ModulateColors(float *in, float *out, int verts, float r, float g, float b) { int i; @@ -230,6 +236,9 @@ void GL_Main_Init(void) Cvar_RegisterVariable (&r_fullbright); Cvar_RegisterVariable (&r_textureunits); Cvar_RegisterVariable (&r_shadow_cull); + Cvar_RegisterVariable (&r_lerpsprites); + Cvar_RegisterVariable (&r_lerpmodels); + Cvar_RegisterVariable (&r_waterscroll); if (gamemode == GAME_NEHAHRA || gamemode == GAME_NEXUIZ) Cvar_SetValue("r_fullbrights", 0); R_RegisterModule("GL_Main", gl_main_start, gl_main_shutdown, gl_main_newmap); diff --git a/gl_rsurf.c b/gl_rsurf.c index 2c78a2c6..51be852c 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -787,9 +787,12 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) texture_t *texture; matrix4x4_t tempmatrix; - // scrolling in texture matrix - Matrix4x4_CreateTranslate(&tempmatrix, sin(cl.time) * 0.125, sin(cl.time * 0.8f) * 0.125, 0); - R_Mesh_TextureMatrix(0, &tempmatrix); + if (r_waterscroll.value) + { + // scrolling in texture matrix + Matrix4x4_CreateTranslate(&tempmatrix, sin(cl.time) * 0.025 * r_waterscroll.value, sin(cl.time * 0.8f) * 0.025 * r_waterscroll.value, 0); + R_Mesh_TextureMatrix(0, &tempmatrix); + } R_Mesh_Matrix(&ent->matrix); Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); @@ -857,8 +860,11 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) } } - Matrix4x4_CreateIdentity(&tempmatrix); - R_Mesh_TextureMatrix(0, &tempmatrix); + if (r_waterscroll.value) + { + Matrix4x4_CreateIdentity(&tempmatrix); + R_Mesh_TextureMatrix(0, &tempmatrix); + } } static void RSurfShader_Water(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain) diff --git a/menu.c b/menu.c index 46864a75..d48ea90f 100644 --- a/menu.c +++ b/menu.c @@ -144,8 +144,8 @@ void M_Background(int width, int height) menu_height = height; menu_x = (vid.conwidth - menu_width) * 0.5; menu_y = (vid.conheight - menu_height) * 0.5; - DrawQ_Fill(menu_x, menu_y, menu_width, menu_height, 0, 0, 0, 0.5, 0); - //DrawQ_Fill(0, 0, vid.conwidth, vid.conheight, 0, 0, 0, 0.5, 0); + //DrawQ_Fill(menu_x, menu_y, menu_width, menu_height, 0, 0, 0, 0.5, 0); + DrawQ_Fill(0, 0, vid.conwidth, vid.conheight, 0, 0, 0, 0.5, 0); } /* @@ -1330,7 +1330,7 @@ void M_Options_Key (int k) } } -#define OPTIONS_EFFECTS_ITEMS 17 +#define OPTIONS_EFFECTS_ITEMS 20 int options_effects_cursor; @@ -1417,6 +1417,15 @@ void M_Menu_Options_Effects_AdjustSliders (int dir) case 16: Cvar_SetValueQuick (&cl_particles_blood_alpha, bound(0.2, cl_particles_blood_alpha.value + dir * 0.1, 1)); break; + case 17: + Cvar_SetValueQuick (&r_lerpmodels, !r_lerpmodels.integer); + break; + case 18: + Cvar_SetValueQuick (&r_lerpsprites, !r_lerpsprites.integer); + break; + case 19: + Cvar_SetValueQuick (&r_waterscroll, bound(0, r_waterscroll.value + dir * 0.5, 10)); + break; } } @@ -1449,6 +1458,9 @@ void M_Options_Effects_Draw (void) M_Print(16, y, " Blood");M_DrawCheckbox(220, y, cl_particles_blood.integer);y += 8; M_Print(16, y, " Blood Size");M_DrawSlider(220, y, cl_particles_blood_size.value, 2, 20);y += 8; M_Print(16, y, " Blood Opacity");M_DrawSlider(220, y, cl_particles_blood_alpha.value, 0.2, 1);y += 8; + M_Print(16, y, " Model Interpolation");M_DrawCheckbox(220, y, r_lerpmodels.integer);y += 8; + M_Print(16, y, " Sprite Interpolation");M_DrawCheckbox(220, y, r_lerpsprites.integer);y += 8; + M_Print(16, y, " Water Movement");M_DrawSlider(220, y, r_waterscroll.value, 0, 10);y += 8; // cursor M_DrawCharacter(200, 32 + options_effects_cursor*8, 12+((int)(realtime*4)&1)); diff --git a/r_lerpanim.c b/r_lerpanim.c index 753e4af2..91b55bff 100644 --- a/r_lerpanim.c +++ b/r_lerpanim.c @@ -34,11 +34,13 @@ void R_LerpAnimation(entity_render_t *r) if (r->frame1 < 0) Host_Error ("CL_LerpAnimation: frame1 is NULL\n"); - // round off very close blend percentages - if (r->framelerp < (1.0f / 65536.0f)) - r->framelerp = 0; - if (r->framelerp >= (65535.0f / 65536.0f)) + // check r_lerpmodels and round off very close blend percentages + if (!r_lerpmodels.integer) + r->framelerp = 1; + else if (r->framelerp >= (65535.0f / 65536.0f)) r->framelerp = 1; + else if (r->framelerp < (1.0f / 65536.0f)) + r->framelerp = 0; blend[0].frame = blend[1].frame = blend[2].frame = blend[3].frame = 0; blend[0].lerp = blend[1].lerp = blend[2].lerp = blend[3].lerp = 0; @@ -55,10 +57,12 @@ void R_LerpAnimation(entity_render_t *r) sub1 = (int) (sublerp); sub2 = sub1 + 1; sublerp -= sub1; - if (sublerp < (1.0f / 65536.0f)) - sublerp = 0; - if (sublerp >= (65535.0f / 65536.0f)) + if (!r_lerpmodels.integer) + sublerp = 1; + else if (sublerp >= (65535.0f / 65536.0f)) sublerp = 1; + else if (sublerp < (1.0f / 65536.0f)) + sublerp = 0; if (scene->loop) { sub1 = (sub1 % scene->framecount); @@ -113,10 +117,12 @@ void R_LerpAnimation(entity_render_t *r) sub1 = (int) (sublerp); sub2 = sub1 + 1; sublerp -= sub1; - if (sublerp < (1.0f / 65536.0f)) - sublerp = 0; - if (sublerp >= (65535.0f / 65536.0f)) + if (!r_lerpmodels.integer) sublerp = 1; + else if (sublerp >= (65535.0f / 65536.0f)) + sublerp = 1; + else if (sublerp < (1.0f / 65536.0f)) + sublerp = 0; if (scene->loop) { sub1 = (sub1 % scene->framecount); diff --git a/r_sprites.c b/r_sprites.c index 47e9fb20..7b5b8e55 100644 --- a/r_sprites.c +++ b/r_sprites.c @@ -1,8 +1,6 @@ #include "quakedef.h" -#define LERPSPRITES - static int R_SpriteSetup (const entity_render_t *ent, int type, float org[3], float left[3], float up[3]) { float matrix1[3][3], matrix2[3][3], matrix3[3][3]; @@ -114,28 +112,31 @@ void R_DrawSpriteModelCallback(const void *calldata1, int calldata2) fog = 0; ifog = 1 - fog; -#ifdef LERPSPRITES - // LordHavoc: interpolated sprite rendering - for (i = 0;i < 4;i++) + if (r_lerpsprites.integer) { - if (ent->frameblend[i].lerp >= 0.01f) + // LordHavoc: interpolated sprite rendering + for (i = 0;i < 4;i++) { - frame = ent->model->sprdata_frames + ent->frameblend[i].frame; - R_DrawSpriteImage((ent->effects & EF_ADDITIVE) || (ent->model->flags & EF_ADDITIVE), frame, frame->texture, org, up, left, color[0] * ifog, color[1] * ifog, color[2] * ifog, ent->alpha * ent->frameblend[i].lerp); - if (fog * ent->frameblend[i].lerp >= 0.01f) - R_DrawSpriteImage(true, frame, frame->fogtexture, org, up, left, fogcolor[0],fogcolor[1],fogcolor[2], fog * ent->alpha * ent->frameblend[i].lerp); + if (ent->frameblend[i].lerp >= 0.01f) + { + frame = ent->model->sprdata_frames + ent->frameblend[i].frame; + R_DrawSpriteImage((ent->effects & EF_ADDITIVE) || (ent->model->flags & EF_ADDITIVE), frame, frame->texture, org, up, left, color[0] * ifog, color[1] * ifog, color[2] * ifog, ent->alpha * ent->frameblend[i].lerp); + if (fog * ent->frameblend[i].lerp >= 0.01f) + R_DrawSpriteImage(true, frame, frame->fogtexture, org, up, left, fogcolor[0],fogcolor[1],fogcolor[2], fog * ent->alpha * ent->frameblend[i].lerp); + } } } -#else - // LordHavoc: no interpolation - frame = NULL; - for (i = 0;i < 4 && ent->frameblend[i].lerp;i++) - frame = ent->model->sprdata_frames + ent->frameblend[i].frame; - - R_DrawSpriteImage((ent->effects & EF_ADDITIVE) || (ent->model->flags & EF_ADDITIVE), frame, frame->texture, org, up, left, color[0] * ifog, color[1] * ifog, color[2] * ifog, ent->alpha); - if (fog * ent->frameblend[i].lerp >= 0.01f) - R_DrawSpriteImage(true, frame, frame->fogtexture, org, up, left, fogcolor[0],fogcolor[1],fogcolor[2], fog * ent->alpha); -#endif + else + { + // LordHavoc: no interpolation + frame = NULL; + for (i = 0;i < 4 && ent->frameblend[i].lerp;i++) + frame = ent->model->sprdata_frames + ent->frameblend[i].frame; + + R_DrawSpriteImage((ent->effects & EF_ADDITIVE) || (ent->model->flags & EF_ADDITIVE), frame, frame->texture, org, up, left, color[0] * ifog, color[1] * ifog, color[2] * ifog, ent->alpha); + if (fog * ent->frameblend[i].lerp >= 0.01f) + R_DrawSpriteImage(true, frame, frame->fogtexture, org, up, left, fogcolor[0],fogcolor[1],fogcolor[2], fog * ent->alpha); + } } void R_Model_Sprite_Draw(entity_render_t *ent) diff --git a/render.h b/render.h index 5e84178a..2bd3e247 100644 --- a/render.h +++ b/render.h @@ -66,6 +66,10 @@ extern cvar_t r_novis; // detail texture stuff extern cvar_t r_detailtextures; +extern cvar_t r_lerpsprites; +extern cvar_t r_lerpmodels; +extern cvar_t r_waterscroll; + // useful functions for rendering void R_ModulateColors(float *in, float *out, int verts, float r, float g, float b); void R_FillColors(float *out, int verts, float r, float g, float b, float a); -- 2.39.2