diff --git a/engine/client/m_options.c b/engine/client/m_options.c index 2bdeb2acf..bc3c8f467 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -808,7 +808,7 @@ void M_Menu_Render_f (void) { MB_REDTEXT("Rendering Options", false), MB_TEXT("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082", false), - MB_CHECKBOXCVAR("Calculate VIS", r_novis, 0), + MB_CHECKBOXCVAR("Disable VIS", r_novis, 0), MB_CHECKBOXCVAR("Fast Sky", r_fastsky, 0), MB_CHECKBOXCVAR("Disable Model Lerp", r_nolerp, 0), MB_CHECKBOXCVAR("Disable Framegroup Lerp", r_noframegrouplerp, 0), @@ -2505,16 +2505,21 @@ const char *Mod_FrameNameForNum(model_t *model, int num); const char *Mod_SkinNameForNum(model_t *model, int num); #include "com_mesh.h" -static void M_BoneDisplay(galiasbone_t *b, int *y, int depth, int parent, int first, int last) +static void M_BoneDisplay(entity_t *e, galiasbone_t *b, int *y, int depth, int parent, int first, int last) { int i; for (i = first; i < last; i++) { if (b[i].parent == parent) { - Draw_FunString(depth*16, *y, va("%i: %s", i, b[i].name)); + float result[12]; + memset(result, 0, sizeof(result)); + if (Mod_GetTag(e->model, i, &e->framestate, result)) + Draw_FunString(depth*16, *y, va("%i: %s (%g %g %g)", i, b[i].name, result[3], result[7], result[11])); + else + Draw_FunString(depth*16, *y, va("%i: %s", i, b[i].name)); *y += 8; - M_BoneDisplay(b, y, depth+1, i, i+1, last); + M_BoneDisplay(e, b, y, depth+1, i, i+1, last); } } } @@ -2603,7 +2608,7 @@ static void M_ModelViewerDraw(int x, int y, struct menucustom_s *c, struct menu_ { Draw_FunString(0, y, va("Bones: ", mods->skingroup, fname)); y+=8; - M_BoneDisplay(b, &y, 0, -1, 0, bonecount); + M_BoneDisplay(&ent, b, &y, 0, -1, 0, bonecount); } } } diff --git a/engine/client/renderer.c b/engine/client/renderer.c index f5302929b..312e4897d 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -150,6 +150,9 @@ cvar_t r_waterwarp = CVARF ("r_waterwarp", "1", cvar_t r_replacemodels = CVARFD ("r_replacemodels", IFMINIMAL("","md3 md2"), CVAR_ARCHIVE, "A list of filename extensions to attempt to use instead of mdl."); +cvar_t gl_lightmap_nearest = CVARFD ("gl_lightmap_nearest", "0", CVAR_ARCHIVE, "Use nearest sampling for lightmaps. This will give a more blocky look. Meaningless when gl_lightmap_nearest is enabled."); +cvar_t gl_lightmap_average = CVARFD ("gl_lightmap_average", "0", CVAR_ARCHIVE, "Determine lightmap values based upon the center of the polygon. This will give a more buggy look, quite probably."); + //otherwise it would defeat the point. cvar_t scr_allowsnap = CVARF ("scr_allowsnap", "1", CVAR_NOTFROMSERVER); @@ -478,6 +481,9 @@ void GLRenderer_Init(void) Cvar_Register (&gl_menutint_shader, GLRENDEREROPTIONS); + Cvar_Register (&gl_lightmap_nearest, GLRENDEREROPTIONS); + Cvar_Register (&gl_lightmap_average, GLRENDEREROPTIONS); + R_BloomRegister(); } #endif diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index 82fe33f54..8a250ec83 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -3772,9 +3772,23 @@ qboolean Mod_GetTag(model_t *model, int tagnum, framestate_t *fstate, float *res if (f2ness != 1) { f1time *= g1->rate; - frame1 = (int)f1time%g1->numposes; - frame2 = ((int)f1time+1)%g1->numposes; - f1time = f1time - (int)f1time; + if (g1->loop) + { + frame1 = (int)f1time%g1->numposes; + frame2 = ((int)f1time+1)%g1->numposes; + f1time = f1time - (int)f1time; + } + else + { + frame1 = (int)f1time; + frame2 = ((int)f1time+1); + f1time = f1time - (int)f1time; + if (frame2 >= g1->numposes) + { + frame1 = frame2 = g1->numposes-1; + f1time = 0; + } + } pose[numposes] = g1->boneofs + inf->numbones*12*frame1; plerp[numposes] = (1-f1time) * (1-f2ness); numposes++; @@ -3788,9 +3802,23 @@ qboolean Mod_GetTag(model_t *model, int tagnum, framestate_t *fstate, float *res if (f2ness) { f2time *= g2->rate; - frame1 = (int)f2time%g2->numposes; - frame2 = ((int)f2time+1)%g2->numposes; - f2time = f2time - (int)f2time; + if (g2->loop) + { + frame1 = (int)f2time%g2->numposes; + frame2 = ((int)f2time+1)%g2->numposes; + f2time = f2time - (int)f2time; + } + else + { + frame1 = (int)f2time; + frame2 = ((int)f2time+1); + f2time = f2time - (int)f2time; + if (frame2 >= g2->numposes) + { + frame1 = frame2 = g2->numposes-1; + f2time = 0; + } + } pose[numposes] = g2->boneofs + inf->numbones*12*frame1; plerp[numposes] = (1-f2time) * f2ness; numposes++; diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index 549f21f88..77f909e6b 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -31,6 +31,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern cvar_t r_shadow_bumpscale_basetexture; extern cvar_t r_replacemodels; +extern cvar_t gl_lightmap_average; qboolean isnotmap = true; //used to not warp ammo models. @@ -2523,10 +2524,21 @@ void ModQ1_Batches_BuildQ1Q2Poly(model_t *mod, msurface_t *surf, void *cookie) mesh->st_array[i][0] = s/surf->texinfo->texture->width; mesh->st_array[i][1] = t/surf->texinfo->texture->height; - for (sty = 0; sty < 1; sty++) + if (gl_lightmap_average.ival) { - mesh->lmst_array[sty][i][0] = (s - surf->texturemins[0] + (surf->light_s[sty]*16) + 8) / (mod->lightmaps.width*16); - mesh->lmst_array[sty][i][1] = (t - surf->texturemins[1] + (surf->light_t[sty]*16) + 8) / (mod->lightmaps.height*16); + for (sty = 0; sty < 1; sty++) + { + mesh->lmst_array[sty][i][0] = (surf->extents[0]*0.5 + (surf->light_s[sty]*16) + 8) / (mod->lightmaps.width*16); + mesh->lmst_array[sty][i][1] = (surf->extents[1]*0.5 + (surf->light_t[sty]*16) + 8) / (mod->lightmaps.height*16); + } + } + else + { + for (sty = 0; sty < 1; sty++) + { + mesh->lmst_array[sty][i][0] = (s - surf->texturemins[0] + (surf->light_s[sty]*16) + 8) / (mod->lightmaps.width*16); + mesh->lmst_array[sty][i][1] = (t - surf->texturemins[1] + (surf->light_t[sty]*16) + 8) / (mod->lightmaps.height*16); + } } //figure out the texture directions, for bumpmapping and stuff diff --git a/engine/gl/gl_rsurf.c b/engine/gl/gl_rsurf.c index f2f695177..dfe3c3110 100644 --- a/engine/gl/gl_rsurf.c +++ b/engine/gl/gl_rsurf.c @@ -26,6 +26,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "renderque.h" #include +extern cvar_t gl_lightmap_nearest; + void GLBE_ClearVBO(vbo_t *vbo) { int vboh[6 + MAXRLIGHTMAPS]; @@ -532,8 +534,16 @@ void GLBE_UploadAllLightmaps(void) TEXASSIGN(lm->lightmap_texture, R_AllocNewTexture("***lightmap***", lm->width, lm->height, IF_LINEAR|IF_NOMIPMAP)); } GL_MTBind(0, GL_TEXTURE_2D, lm->lightmap_texture); - qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + if (gl_lightmap_nearest.ival) + { + qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + else + { + qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } switch (lightmap_bytes) { case 4: diff --git a/engine/server/sv_init.c b/engine/server/sv_init.c index 870d17092..cca2320f0 100644 --- a/engine/server/sv_init.c +++ b/engine/server/sv_init.c @@ -1468,8 +1468,14 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us else snprintf(sv.mapname, sizeof(sv.mapname), "%s", sv.name); if (Cvar_Get("sv_readonlyworld", "1", 0, "DP compatability")->value) + { ent->readonly = true; //lock it down! + if (ent->v->origin[0] != 0 || ent->v->origin[1] != 0 || ent->v->origin[2] != 0 || ent->v->angles[0] != 0 || ent->v->angles[1] != 0 || ent->v->angles[2] != 0) + Con_Printf("Warning: The world has moved. Alert your nearest reputable news agency.\n"); + + } + // look up some model indexes for specialized message compression SV_FindModelNumbers (); }