mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-14 00:40:55 +00:00
sw and gl rmisc are now client clean. the graphing functions ahve been pulled
out into r_graph.c (Time and Z graph), cl_ngraph.c (Net graph), and {gl,sw}_graph.c (R_LineGraph). gl_ngraph.c is gone. Unfortunatly, something is rather wrong with NetGraph in gl (probably R_LineGraph).
This commit is contained in:
parent
f732cd7932
commit
4a80639556
29 changed files with 812 additions and 718 deletions
|
@ -189,6 +189,7 @@ extern qboolean r_force_fullscreen;
|
||||||
extern qboolean r_paused;
|
extern qboolean r_paused;
|
||||||
extern entity_t *r_view_model;
|
extern entity_t *r_view_model;
|
||||||
extern entity_t *r_player_entity;
|
extern entity_t *r_player_entity;
|
||||||
|
extern int r_lineadj;
|
||||||
|
|
||||||
void *D_SurfaceCacheAddress (void);
|
void *D_SurfaceCacheAddress (void);
|
||||||
int D_SurfaceCacheForRes (int width, int height);
|
int D_SurfaceCacheForRes (int width, int height);
|
||||||
|
@ -207,4 +208,6 @@ dlight_t *R_AllocDlight (int key);
|
||||||
void R_DecayLights (double frametime);
|
void R_DecayLights (double frametime);
|
||||||
void R_ClearDlights (void);
|
void R_ClearDlights (void);
|
||||||
|
|
||||||
|
void R_LineGraph (int x, int y, int *h_vals, int count);
|
||||||
|
|
||||||
#endif // __render_h
|
#endif // __render_h
|
||||||
|
|
|
@ -85,11 +85,13 @@ extern int glx, gly, glwidth, glheight;
|
||||||
|
|
||||||
#define BACKFACE_EPSILON 0.01
|
#define BACKFACE_EPSILON 0.01
|
||||||
|
|
||||||
|
#define NUM_GRAPH_TEXTURES 8
|
||||||
|
|
||||||
extern qboolean envmap;
|
extern qboolean envmap;
|
||||||
extern int currenttexture;
|
extern int currenttexture;
|
||||||
extern int cnttextures[2];
|
extern int cnttextures[2];
|
||||||
extern int particletexture;
|
extern int particletexture;
|
||||||
extern int netgraphtexture;
|
extern int graph_texture[NUM_GRAPH_TEXTURES];
|
||||||
extern int netgraphtexture; // netgraph texture
|
extern int netgraphtexture; // netgraph texture
|
||||||
|
|
||||||
extern int skytexturenum; // index in cl.loadmodel, not gl texture object
|
extern int skytexturenum; // index in cl.loadmodel, not gl texture object
|
||||||
|
@ -234,4 +236,6 @@ void AddLightBlend (float, float, float, float);
|
||||||
extern int c_brush_polys, c_alias_polys;
|
extern int c_brush_polys, c_alias_polys;
|
||||||
extern float r_world_matrix[16];
|
extern float r_world_matrix[16];
|
||||||
|
|
||||||
|
int R_InitGraphTextures (int base);
|
||||||
|
|
||||||
#endif // __glquake_h
|
#endif // __glquake_h
|
||||||
|
|
|
@ -325,6 +325,7 @@ struct dlight_s;
|
||||||
void R_StoreEfrags (efrag_t **ppefrag);
|
void R_StoreEfrags (efrag_t **ppefrag);
|
||||||
void R_TimeRefresh_f (void);
|
void R_TimeRefresh_f (void);
|
||||||
void R_TimeGraph (void);
|
void R_TimeGraph (void);
|
||||||
|
void R_ZGraph (void);
|
||||||
void R_PrintAliasStats (void);
|
void R_PrintAliasStats (void);
|
||||||
void R_PrintTimes (void);
|
void R_PrintTimes (void);
|
||||||
void R_PrintDSpeeds (void);
|
void R_PrintDSpeeds (void);
|
||||||
|
|
|
@ -74,7 +74,7 @@ client_LIB_DEPS= libqfnet.a $(qf_client_LIBS)
|
||||||
|
|
||||||
client_SOURCES= cl_cam.c cl_cmd.c cl_demo.c cl_input.c cl_main.c cl_parse.c \
|
client_SOURCES= cl_cam.c cl_cmd.c cl_demo.c cl_input.c cl_main.c cl_parse.c \
|
||||||
cl_tent.c \
|
cl_tent.c \
|
||||||
console.c keys.c sbar.c r_cvar.c r_efrag.c r_ent.c r_main.c \
|
console.c keys.c sbar.c r_cvar.c r_efrag.c r_ent.c r_graph.c r_main.c \
|
||||||
r_part.c r_view.c nonintel.c locs.c pcx.c tga.c
|
r_part.c r_view.c nonintel.c locs.c pcx.c tga.c
|
||||||
|
|
||||||
server_SOURCES= host.c host_cmd.c pr_cmds.c sv_cvar.c sv_main.c \
|
server_SOURCES= host.c host_cmd.c pr_cmds.c sv_cvar.c sv_main.c \
|
||||||
|
@ -88,7 +88,8 @@ combined_SOURCES= $(common_SOURCES) $(client_SOURCES) $(server_SOURCES) \
|
||||||
# ... Common stuff
|
# ... Common stuff
|
||||||
soft_SOURCES= d_edge.c d_fill.c d_init.c d_modech.c d_part.c d_polyse.c \
|
soft_SOURCES= d_edge.c d_fill.c d_init.c d_modech.c d_part.c d_polyse.c \
|
||||||
d_scan.c d_sky.c d_sprite.c d_surf.c d_vars.c d_zpoint.c \
|
d_scan.c d_sky.c d_sprite.c d_surf.c d_vars.c d_zpoint.c \
|
||||||
draw.c screen.c sw_raclip.c sw_ralias.c sw_rbsp.c sw_rdraw.c \
|
draw.c screen.c sw_graph.c sw_raclip.c sw_ralias.c sw_rbsp.c \
|
||||||
|
sw_rdraw.c \
|
||||||
sw_redge.c sw_rlight.c sw_rmain.c sw_rmisc.c sw_rpart.c \
|
sw_redge.c sw_rlight.c sw_rmain.c sw_rmisc.c sw_rpart.c \
|
||||||
sw_rsky.c sw_rsprite.c sw_rsurf.c sw_skin.c sw_view.c \
|
sw_rsky.c sw_rsprite.c sw_rsurf.c sw_skin.c sw_view.c \
|
||||||
$(soft_ASM)
|
$(soft_ASM)
|
||||||
|
@ -122,7 +123,7 @@ nq_x11_DEPENDENCIES=../../libs/models/libQFmodels_sw.la ../../libs/video/targets
|
||||||
# OpenGL-using targets
|
# OpenGL-using targets
|
||||||
# ... Common stuff
|
# ... Common stuff
|
||||||
ogl_SOURCES= noisetextures.c gl_textures.c gl_draw.c gl_dyn_fires.c \
|
ogl_SOURCES= noisetextures.c gl_textures.c gl_draw.c gl_dyn_fires.c \
|
||||||
gl_dyn_part.c gl_dyn_textures.c gl_ngraph.c gl_rlight.c \
|
gl_dyn_part.c gl_dyn_textures.c gl_graph.c gl_rlight.c \
|
||||||
gl_rmain.c gl_rmisc.c gl_rsurf.c gl_screen.c gl_skin.c \
|
gl_rmain.c gl_rmisc.c gl_rsurf.c gl_screen.c gl_skin.c \
|
||||||
gl_sky.c gl_sky_clip.c gl_view.c gl_warp.c
|
gl_sky.c gl_sky_clip.c gl_view.c gl_warp.c
|
||||||
|
|
||||||
|
|
145
nq/source/gl_graph.c
Normal file
145
nq/source/gl_graph.c
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
gl_ngraph.c
|
||||||
|
|
||||||
|
(description)
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_STRING_H
|
||||||
|
# include <string.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_STRINGS_H
|
||||||
|
# include <strings.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "QF/cvar.h"
|
||||||
|
#include "QF/draw.h"
|
||||||
|
#include "QF/sys.h"
|
||||||
|
|
||||||
|
#include "glquake.h"
|
||||||
|
#include "r_cvar.h"
|
||||||
|
|
||||||
|
extern byte *draw_chars; // 8*8 graphic characters
|
||||||
|
extern qboolean lighthalf;
|
||||||
|
|
||||||
|
extern cvar_t *r_netgraph;
|
||||||
|
extern cvar_t *r_netgraph_alpha;
|
||||||
|
extern cvar_t *r_netgraph_box;
|
||||||
|
|
||||||
|
static int graph_index;
|
||||||
|
static int graph_size[NUM_GRAPH_TEXTURES];
|
||||||
|
static int graph_width[NUM_GRAPH_TEXTURES];
|
||||||
|
static byte *graph_texels[NUM_GRAPH_TEXTURES];
|
||||||
|
int graph_texture[NUM_GRAPH_TEXTURES];
|
||||||
|
|
||||||
|
int
|
||||||
|
R_InitGraphTextures (int base)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_GRAPH_TEXTURES; i++)
|
||||||
|
graph_texture[i] = base++;
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
R_LineGraph (int x, int y, int *h_vals, int count)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int h;
|
||||||
|
int s;
|
||||||
|
byte color;
|
||||||
|
int size;
|
||||||
|
byte *dest;
|
||||||
|
|
||||||
|
if (!count)
|
||||||
|
return;
|
||||||
|
|
||||||
|
s = r_graphheight->int_val;
|
||||||
|
|
||||||
|
size = 2 * count;
|
||||||
|
if (size > graph_size[graph_index]) {
|
||||||
|
graph_size[graph_index] = size;
|
||||||
|
graph_texels[graph_index] = realloc (graph_texels[graph_index], size);
|
||||||
|
}
|
||||||
|
graph_width[graph_index] = count;
|
||||||
|
|
||||||
|
if (!graph_texels[graph_index])
|
||||||
|
Sys_Error ("R_LineGraph: failed to allocate texture buffer\n");
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (count--) {
|
||||||
|
dest = graph_texels[graph_index] + i++;
|
||||||
|
|
||||||
|
h = *h_vals++;
|
||||||
|
|
||||||
|
if (h == 10000)
|
||||||
|
color = 0x6f; // yellow
|
||||||
|
else if (h == 9999)
|
||||||
|
color = 0x4f; // red
|
||||||
|
else if (h == 9998)
|
||||||
|
color = 0xd0; // blue
|
||||||
|
else
|
||||||
|
color = 0xfe; // white
|
||||||
|
|
||||||
|
if (h > s)
|
||||||
|
h = s;
|
||||||
|
|
||||||
|
for (j = 0; j < h; j++, dest += graph_width[graph_index])
|
||||||
|
dest[0] = color;
|
||||||
|
|
||||||
|
for (; j < s; j++, dest += graph_width[graph_index])
|
||||||
|
dest[0] = 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindTexture (GL_TEXTURE_2D, graph_texture[graph_index]);
|
||||||
|
|
||||||
|
glTexImage2D (GL_TEXTURE_2D, 0, gl_alpha_format,
|
||||||
|
graph_width[graph_index], s, 0, GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, graph_texels[graph_index]);
|
||||||
|
|
||||||
|
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
|
||||||
|
glBegin (GL_QUADS);
|
||||||
|
glTexCoord2f (0, 0);
|
||||||
|
glVertex2f (x, y);
|
||||||
|
glTexCoord2f (1, 0);
|
||||||
|
glVertex2f (x + graph_width[graph_index], y);
|
||||||
|
glTexCoord2f (1, 1);
|
||||||
|
glVertex2f (x + graph_width[graph_index], y - s);
|
||||||
|
glTexCoord2f (0, 1);
|
||||||
|
glVertex2f (x, y - s);
|
||||||
|
glEnd ();
|
||||||
|
|
||||||
|
glColor3ubv (lighthalf_v);
|
||||||
|
|
||||||
|
graph_index = (graph_index + 1) % NUM_GRAPH_TEXTURES;
|
||||||
|
}
|
|
@ -1,186 +0,0 @@
|
||||||
/*
|
|
||||||
gl_ngraph.c
|
|
||||||
|
|
||||||
(description)
|
|
||||||
|
|
||||||
Copyright (C) 1996-1997 Id Software, Inc.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to:
|
|
||||||
|
|
||||||
Free Software Foundation, Inc.
|
|
||||||
59 Temple Place - Suite 330
|
|
||||||
Boston, MA 02111-1307, USA
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include "config.h"
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_STRING_H
|
|
||||||
# include <string.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_STRINGS_H
|
|
||||||
# include <strings.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "QF/compat.h"
|
|
||||||
#include "QF/cvar.h"
|
|
||||||
#include "QF/draw.h"
|
|
||||||
#include "QF/vid.h"
|
|
||||||
|
|
||||||
#include "client.h"
|
|
||||||
#include "glquake.h"
|
|
||||||
#include "sbar.h"
|
|
||||||
|
|
||||||
extern byte *draw_chars; // 8*8 graphic characters
|
|
||||||
extern qboolean lighthalf;
|
|
||||||
|
|
||||||
extern cvar_t *r_netgraph;
|
|
||||||
extern cvar_t *r_netgraph_alpha;
|
|
||||||
extern cvar_t *r_netgraph_box;
|
|
||||||
|
|
||||||
int netgraphtexture; // netgraph texture
|
|
||||||
|
|
||||||
#define NET_GRAPHHEIGHT 32
|
|
||||||
|
|
||||||
//XXXstatic byte ngraph_texels[NET_GRAPHHEIGHT][NET_TIMINGS];
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
R_LineGraph (int x, int h)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
int i;
|
|
||||||
int s;
|
|
||||||
int color;
|
|
||||||
|
|
||||||
s = NET_GRAPHHEIGHT;
|
|
||||||
|
|
||||||
if (h == 10000)
|
|
||||||
color = 0x6f; // yellow
|
|
||||||
else if (h == 9999)
|
|
||||||
color = 0x4f; // red
|
|
||||||
else if (h == 9998)
|
|
||||||
color = 0xd0; // blue
|
|
||||||
else
|
|
||||||
color = 0xfe; // white
|
|
||||||
|
|
||||||
if (h > s)
|
|
||||||
h = s;
|
|
||||||
|
|
||||||
for (i = 0; i < h; i++)
|
|
||||||
if (i & 1)
|
|
||||||
ngraph_texels[NET_GRAPHHEIGHT - i - 1][x] = 0xff;
|
|
||||||
else
|
|
||||||
ngraph_texels[NET_GRAPHHEIGHT - i - 1][x] = (byte) color;
|
|
||||||
|
|
||||||
for (; i < s; i++)
|
|
||||||
ngraph_texels[NET_GRAPHHEIGHT - i - 1][x] = (byte) 0xff;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
Draw_CharToNetGraph (int x, int y, int num)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
int row, col;
|
|
||||||
byte *source;
|
|
||||||
int drawline;
|
|
||||||
int nx;
|
|
||||||
|
|
||||||
row = num >> 4;
|
|
||||||
col = num & 15;
|
|
||||||
source = draw_chars + (row << 10) + (col << 3);
|
|
||||||
|
|
||||||
for (drawline = 8; drawline; drawline--, y++) {
|
|
||||||
for (nx = 0; nx < 8; nx++)
|
|
||||||
if (source[nx] != 255)
|
|
||||||
ngraph_texels[y][nx + x] = 0x60 + source[nx];
|
|
||||||
source += 128;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
R_NetGraph (void)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
int a, x, i, y;
|
|
||||||
int lost;
|
|
||||||
char st[80];
|
|
||||||
unsigned int ngraph_pixels[NET_GRAPHHEIGHT][NET_TIMINGS];
|
|
||||||
|
|
||||||
x = 0;
|
|
||||||
lost = CL_CalcNet ();
|
|
||||||
for (a = 0; a < NET_TIMINGS; a++) {
|
|
||||||
i = (cls.netchan.outgoing_sequence - a) & NET_TIMINGSMASK;
|
|
||||||
R_LineGraph (NET_TIMINGS - 1 - a, packet_latency[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// now load the netgraph texture into gl and draw it
|
|
||||||
for (y = 0; y < NET_GRAPHHEIGHT; y++)
|
|
||||||
for (x = 0; x < NET_TIMINGS; x++)
|
|
||||||
ngraph_pixels[y][x] = d_8to24table[ngraph_texels[y][x]];
|
|
||||||
|
|
||||||
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 16): 0 ;
|
|
||||||
y = vid.height - sb_lines - 24 - NET_GRAPHHEIGHT - 1;
|
|
||||||
|
|
||||||
if (r_netgraph_alpha->value < 0.995) // roundoff
|
|
||||||
glColor4f (1, 1, 1, r_netgraph_alpha->value);
|
|
||||||
|
|
||||||
if (r_netgraph_box->int_val)
|
|
||||||
Draw_TextBox (x, y, NET_TIMINGS / 8, NET_GRAPHHEIGHT / 8 + 1);
|
|
||||||
|
|
||||||
y += 8;
|
|
||||||
|
|
||||||
snprintf (st, sizeof (st), "%3i%% packet loss", lost);
|
|
||||||
if (cl_hudswap->int_val) {
|
|
||||||
Draw_String8 (vid.width - ((strlen (st) * 8) + 8), y, st);
|
|
||||||
} else {
|
|
||||||
Draw_String8 (8, y, st);
|
|
||||||
}
|
|
||||||
|
|
||||||
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 8) : 8;
|
|
||||||
|
|
||||||
y += 8;
|
|
||||||
|
|
||||||
glBindTexture (GL_TEXTURE_2D, netgraphtexture);
|
|
||||||
|
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, gl_alpha_format,
|
|
||||||
NET_TIMINGS, NET_GRAPHHEIGHT, 0, GL_RGBA,
|
|
||||||
GL_UNSIGNED_BYTE, ngraph_pixels);
|
|
||||||
|
|
||||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
|
|
||||||
glBegin (GL_QUADS);
|
|
||||||
glTexCoord2f (0, 0);
|
|
||||||
glVertex2f (x, y);
|
|
||||||
glTexCoord2f (1, 0);
|
|
||||||
glVertex2f (x + NET_TIMINGS, y);
|
|
||||||
glTexCoord2f (1, 1);
|
|
||||||
glVertex2f (x + NET_TIMINGS, y + NET_GRAPHHEIGHT);
|
|
||||||
glTexCoord2f (0, 1);
|
|
||||||
glVertex2f (x, y + NET_GRAPHHEIGHT);
|
|
||||||
glEnd ();
|
|
||||||
|
|
||||||
glColor3ubv (lighthalf_v);
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -1053,6 +1053,9 @@ R_Clear (void)
|
||||||
void
|
void
|
||||||
R_RenderScene (void)
|
R_RenderScene (void)
|
||||||
{
|
{
|
||||||
|
if (r_timegraph->int_val || r_speeds->int_val || r_dspeeds->int_val)
|
||||||
|
r_time1 = Sys_DoubleTime ();
|
||||||
|
|
||||||
R_SetupFrame ();
|
R_SetupFrame ();
|
||||||
|
|
||||||
R_SetFrustum ();
|
R_SetFrustum ();
|
||||||
|
@ -1070,6 +1073,12 @@ R_RenderScene (void)
|
||||||
R_DrawEntitiesOnList ();
|
R_DrawEntitiesOnList ();
|
||||||
|
|
||||||
R_RenderDlights ();
|
R_RenderDlights ();
|
||||||
|
|
||||||
|
if (r_timegraph->int_val)
|
||||||
|
R_TimeGraph ();
|
||||||
|
|
||||||
|
if (r_zgraph->int_val)
|
||||||
|
R_ZGraph ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -41,16 +41,16 @@
|
||||||
#include "QF/cmd.h"
|
#include "QF/cmd.h"
|
||||||
#include "QF/console.h"
|
#include "QF/console.h"
|
||||||
#include "QF/cvar.h"
|
#include "QF/cvar.h"
|
||||||
|
#include "QF/quakefs.h"
|
||||||
|
#include "QF/render.h"
|
||||||
#include "QF/skin.h"
|
#include "QF/skin.h"
|
||||||
#include "QF/sys.h"
|
#include "QF/sys.h"
|
||||||
#include "QF/vid.h"
|
#include "QF/vid.h"
|
||||||
#include "QF/varrays.h"
|
#include "QF/varrays.h"
|
||||||
|
|
||||||
#include "client.h"
|
|
||||||
#include "glquake.h"
|
#include "glquake.h"
|
||||||
#include "r_dynamic.h"
|
#include "r_dynamic.h"
|
||||||
#include "r_local.h"
|
#include "r_local.h"
|
||||||
#include "QF/render.h"
|
|
||||||
|
|
||||||
varray_t2f_c4f_v3f_t varray[MAX_VARRAY_VERTS];
|
varray_t2f_c4f_v3f_t varray[MAX_VARRAY_VERTS];
|
||||||
|
|
||||||
|
@ -155,8 +155,7 @@ R_Init (void)
|
||||||
|
|
||||||
GDT_Init ();
|
GDT_Init ();
|
||||||
|
|
||||||
netgraphtexture = texture_extension_number;
|
texture_extension_number = R_InitGraphTextures (texture_extension_number);
|
||||||
texture_extension_number++;
|
|
||||||
|
|
||||||
texture_extension_number = Skin_Init_Textures (texture_extension_number);
|
texture_extension_number = Skin_Init_Textures (texture_extension_number);
|
||||||
|
|
||||||
|
|
|
@ -941,8 +941,8 @@ SCR_UpdateScreen (double realtime)
|
||||||
// draw any areas not covered by the refresh
|
// draw any areas not covered by the refresh
|
||||||
SCR_TileClear ();
|
SCR_TileClear ();
|
||||||
|
|
||||||
if (r_netgraph->int_val)
|
//if (r_netgraph->int_val)
|
||||||
R_NetGraph ();
|
// CL_NetGraph ();
|
||||||
|
|
||||||
if (cl.intermission == 1 && key_dest == key_game) {
|
if (cl.intermission == 1 && key_dest == key_game) {
|
||||||
Sbar_IntermissionOverlay ();
|
Sbar_IntermissionOverlay ();
|
||||||
|
|
110
nq/source/r_graph.c
Normal file
110
nq/source/r_graph.c
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
r_graph.c
|
||||||
|
|
||||||
|
rednerer diagnostic graphs
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "QF/draw.h"
|
||||||
|
#include "QF/render.h"
|
||||||
|
#include "QF/sys.h"
|
||||||
|
|
||||||
|
#include "r_local.h"
|
||||||
|
#include "sbar.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_TIMINGS 100
|
||||||
|
extern float mouse_x, mouse_y;
|
||||||
|
int graphval;
|
||||||
|
|
||||||
|
/*
|
||||||
|
R_TimeGraph
|
||||||
|
|
||||||
|
Performance monitoring tool
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
R_TimeGraph (void)
|
||||||
|
{
|
||||||
|
static int timex;
|
||||||
|
int a;
|
||||||
|
int l;
|
||||||
|
float r_time2;
|
||||||
|
static int r_timings[MAX_TIMINGS];
|
||||||
|
int x;
|
||||||
|
|
||||||
|
r_time2 = Sys_DoubleTime ();
|
||||||
|
|
||||||
|
a = (r_time2 - r_time1) / 0.01;
|
||||||
|
// a = fabs(mouse_y * 0.05);
|
||||||
|
// a = (int)((r_refdef.vieworg[2] + 1024)/1)%(int)r_graphheight->value;
|
||||||
|
// a = (int)((pmove.velocity[2] + 500)/10);
|
||||||
|
// a = fabs(velocity[0])/20;
|
||||||
|
// a = ((int)fabs(origin[0])/8)%20;
|
||||||
|
// a = (cl.idealpitch + 30)/5;
|
||||||
|
// a = (int)(cl.simangles[YAW] * 64/360) & 63;
|
||||||
|
a = graphval;
|
||||||
|
|
||||||
|
r_timings[timex] = a;
|
||||||
|
a = timex;
|
||||||
|
|
||||||
|
l = MAX_TIMINGS;
|
||||||
|
if (l > r_refdef.vrect.width)
|
||||||
|
l = r_refdef.vrect.width;
|
||||||
|
x = r_refdef.vrect.width - l;
|
||||||
|
a = timex - l;
|
||||||
|
if (a < 0) {
|
||||||
|
R_LineGraph (x, r_refdef.vrect.height - 2, &r_timings[a + MAX_TIMINGS], -a);
|
||||||
|
x -= a;
|
||||||
|
l += a;
|
||||||
|
a = 0;
|
||||||
|
}
|
||||||
|
R_LineGraph (x, r_refdef.vrect.height - 2, &r_timings[a], l);
|
||||||
|
|
||||||
|
timex = (timex + 1) % MAX_TIMINGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
R_ZGraph (void)
|
||||||
|
{
|
||||||
|
int a, x, w, i;
|
||||||
|
static int height[256];
|
||||||
|
|
||||||
|
if (r_refdef.vrect.width <= 256)
|
||||||
|
w = r_refdef.vrect.width;
|
||||||
|
else
|
||||||
|
w = 256;
|
||||||
|
|
||||||
|
height[r_framecount & 255] = ((int) r_origin[2]) & 31;
|
||||||
|
|
||||||
|
x = 0;
|
||||||
|
for (a = 0; a < w; a++) {
|
||||||
|
i = (r_framecount - a) & 255;
|
||||||
|
}
|
||||||
|
R_LineGraph (x, r_refdef.vrect.height - 2, height, w);
|
||||||
|
}
|
|
@ -11,6 +11,8 @@ dlight_t r_dlights[MAX_DLIGHTS];
|
||||||
entity_t *r_view_model;
|
entity_t *r_view_model;
|
||||||
entity_t *r_player_entity;
|
entity_t *r_player_entity;
|
||||||
lightstyle_t r_lightstyle[MAX_LIGHTSTYLES];
|
lightstyle_t r_lightstyle[MAX_LIGHTSTYLES];
|
||||||
|
int r_lineadj;
|
||||||
|
float r_time1;
|
||||||
|
|
||||||
|
|
||||||
dlight_t *
|
dlight_t *
|
||||||
|
|
|
@ -717,6 +717,7 @@ SCR_DrawStringToSnap (const char *s, byte * buf, int x, int y, int width)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SCR_RSShot_f (void)
|
SCR_RSShot_f (void)
|
||||||
{
|
{
|
||||||
|
@ -802,7 +803,7 @@ SCR_RSShot_f (void)
|
||||||
st[sizeof (st) - 1] = 0;
|
st[sizeof (st) - 1] = 0;
|
||||||
SCR_DrawStringToSnap (st, newbuf, w - strlen (st) * 8, 10, w);
|
SCR_DrawStringToSnap (st, newbuf, w - strlen (st) * 8, 10, w);
|
||||||
|
|
||||||
strncpy (st, name->string, sizeof (st));
|
strncpy (st, cl_name->string, sizeof (st));
|
||||||
st[sizeof (st) - 1] = 0;
|
st[sizeof (st) - 1] = 0;
|
||||||
SCR_DrawStringToSnap (st, newbuf, w - strlen (st) * 8, 20, w);
|
SCR_DrawStringToSnap (st, newbuf, w - strlen (st) * 8, 20, w);
|
||||||
|
|
||||||
|
@ -821,6 +822,7 @@ SCR_RSShot_f (void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
@ -965,6 +967,10 @@ SCR_UpdateScreen (double realtime)
|
||||||
|
|
||||||
SCR_DrawRam ();
|
SCR_DrawRam ();
|
||||||
SCR_DrawNet ();
|
SCR_DrawNet ();
|
||||||
|
|
||||||
|
//if (r_netgraph->int_val)
|
||||||
|
// CL_NetGraph ();
|
||||||
|
|
||||||
SCR_DrawFPS ();
|
SCR_DrawFPS ();
|
||||||
SCR_DrawTime ();
|
SCR_DrawTime ();
|
||||||
SCR_DrawTurtle ();
|
SCR_DrawTurtle ();
|
||||||
|
|
77
nq/source/sw_graph.c
Normal file
77
nq/source/sw_graph.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
r_misc.c
|
||||||
|
|
||||||
|
(description)
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "QF/draw.h"
|
||||||
|
#include "QF/render.h"
|
||||||
|
|
||||||
|
#include "r_local.h"
|
||||||
|
#include "r_cvar.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
R_LineGraph
|
||||||
|
|
||||||
|
Only called by R_DisplayTime
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
R_LineGraph (int x, int y, int *h_vals, int count)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
byte *dest;
|
||||||
|
int s;
|
||||||
|
int color;
|
||||||
|
int h;
|
||||||
|
|
||||||
|
// FIXME: should be disabled on no-buffer adapters, or should be in the driver
|
||||||
|
s = r_graphheight->int_val;
|
||||||
|
|
||||||
|
while (count--) {
|
||||||
|
dest = vid.buffer + vid.rowbytes * y + x++;
|
||||||
|
|
||||||
|
h = *h_vals++;
|
||||||
|
|
||||||
|
if (h == 10000)
|
||||||
|
color = 0x6f; // yellow
|
||||||
|
else if (h == 9999)
|
||||||
|
color = 0x4f; // red
|
||||||
|
else if (h == 9998)
|
||||||
|
color = 0xd0; // blue
|
||||||
|
else
|
||||||
|
color = 0xff; // pink
|
||||||
|
|
||||||
|
if (h > s)
|
||||||
|
h = s;
|
||||||
|
|
||||||
|
for (i = 0; i < h; i++, dest -= vid.rowbytes) {
|
||||||
|
dest[0] = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -56,7 +56,6 @@
|
||||||
void *colormap;
|
void *colormap;
|
||||||
vec3_t viewlightvec;
|
vec3_t viewlightvec;
|
||||||
alight_t r_viewlighting = { 128, 192, viewlightvec };
|
alight_t r_viewlighting = { 128, 192, viewlightvec };
|
||||||
float r_time1;
|
|
||||||
int r_numallocatededges;
|
int r_numallocatededges;
|
||||||
qboolean r_drawpolys;
|
qboolean r_drawpolys;
|
||||||
qboolean r_drawculledpolys;
|
qboolean r_drawculledpolys;
|
||||||
|
@ -137,7 +136,6 @@ void R_MarkLeaves (void);
|
||||||
|
|
||||||
extern cvar_t *scr_fov;
|
extern cvar_t *scr_fov;
|
||||||
|
|
||||||
void R_NetGraph (void);
|
|
||||||
void R_ZGraph (void);
|
void R_ZGraph (void);
|
||||||
|
|
||||||
|
|
||||||
|
@ -909,9 +907,6 @@ R_RenderView_ (void)
|
||||||
if (r_timegraph->int_val)
|
if (r_timegraph->int_val)
|
||||||
R_TimeGraph ();
|
R_TimeGraph ();
|
||||||
|
|
||||||
if (r_netgraph->int_val)
|
|
||||||
R_NetGraph ();
|
|
||||||
|
|
||||||
if (r_zgraph->int_val)
|
if (r_zgraph->int_val)
|
||||||
R_ZGraph ();
|
R_ZGraph ();
|
||||||
|
|
||||||
|
|
|
@ -34,14 +34,12 @@
|
||||||
#include "QF/console.h"
|
#include "QF/console.h"
|
||||||
#include "QF/cmd.h"
|
#include "QF/cmd.h"
|
||||||
#include "QF/draw.h"
|
#include "QF/draw.h"
|
||||||
|
#include "QF/render.h"
|
||||||
#include "QF/sys.h"
|
#include "QF/sys.h"
|
||||||
|
|
||||||
#include "host.h"
|
#include "host.h"
|
||||||
#include "r_local.h"
|
#include "r_local.h"
|
||||||
#include "QF/render.h"
|
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
#include "server.h"
|
|
||||||
#include "view.h"
|
|
||||||
|
|
||||||
void
|
void
|
||||||
R_CheckVariables (void)
|
R_CheckVariables (void)
|
||||||
|
@ -119,161 +117,6 @@ R_LoadSky_f (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
R_LineGraph
|
|
||||||
|
|
||||||
Only called by R_DisplayTime
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
R_LineGraph (int x, int y, int h)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
byte *dest;
|
|
||||||
int s;
|
|
||||||
int color;
|
|
||||||
|
|
||||||
// FIXME: should be disabled on no-buffer adapters, or should be in the driver
|
|
||||||
|
|
||||||
// x += r_refdef.vrect.x;
|
|
||||||
// y += r_refdef.vrect.y;
|
|
||||||
|
|
||||||
dest = vid.buffer + vid.rowbytes * y + x;
|
|
||||||
|
|
||||||
s = r_graphheight->int_val;
|
|
||||||
|
|
||||||
if (h == 10000)
|
|
||||||
color = 0x6f; // yellow
|
|
||||||
else if (h == 9999)
|
|
||||||
color = 0x4f; // red
|
|
||||||
else if (h == 9998)
|
|
||||||
color = 0xd0; // blue
|
|
||||||
else
|
|
||||||
color = 0xff; // pink
|
|
||||||
|
|
||||||
if (h > s)
|
|
||||||
h = s;
|
|
||||||
|
|
||||||
for (i = 0; i < h; i++, dest -= vid.rowbytes) {
|
|
||||||
dest[0] = color;
|
|
||||||
// *(dest-vid.rowbytes) = 0x30;
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
for (; i < s; i++, dest -= vid.rowbytes * 2) {
|
|
||||||
dest[0] = 0x30;
|
|
||||||
*(dest - vid.rowbytes) = 0x30;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_TIMINGS 100
|
|
||||||
extern float mouse_x, mouse_y;
|
|
||||||
int graphval;
|
|
||||||
|
|
||||||
/*
|
|
||||||
R_TimeGraph
|
|
||||||
|
|
||||||
Performance monitoring tool
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
R_TimeGraph (void)
|
|
||||||
{
|
|
||||||
static int timex;
|
|
||||||
int a;
|
|
||||||
float r_time2;
|
|
||||||
static byte r_timings[MAX_TIMINGS];
|
|
||||||
int x;
|
|
||||||
|
|
||||||
r_time2 = Sys_DoubleTime ();
|
|
||||||
|
|
||||||
a = (r_time2 - r_time1) / 0.01;
|
|
||||||
// a = fabs(mouse_y * 0.05);
|
|
||||||
// a = (int)((r_refdef.vieworg[2] + 1024)/1)%(int)r_graphheight->value;
|
|
||||||
// a = (int)((pmove.velocity[2] + 500)/10);
|
|
||||||
// a = fabs(velocity[0])/20;
|
|
||||||
// a = ((int)fabs(origin[0])/8)%20;
|
|
||||||
// a = (cl.idealpitch + 30)/5;
|
|
||||||
// a = (int)(cl.simangles[YAW] * 64/360) & 63;
|
|
||||||
a = graphval;
|
|
||||||
|
|
||||||
r_timings[timex] = a;
|
|
||||||
a = timex;
|
|
||||||
|
|
||||||
if (r_refdef.vrect.width <= MAX_TIMINGS)
|
|
||||||
x = r_refdef.vrect.width - 1;
|
|
||||||
else
|
|
||||||
x = r_refdef.vrect.width - (r_refdef.vrect.width - MAX_TIMINGS) / 2;
|
|
||||||
do {
|
|
||||||
R_LineGraph (x, r_refdef.vrect.height - 2, r_timings[a]);
|
|
||||||
if (x == 0)
|
|
||||||
break; // screen too small to hold entire thing
|
|
||||||
x--;
|
|
||||||
a--;
|
|
||||||
if (a == -1)
|
|
||||||
a = MAX_TIMINGS - 1;
|
|
||||||
} while (a != timex);
|
|
||||||
|
|
||||||
timex = (timex + 1) % MAX_TIMINGS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
R_NetGraph (void)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
int a, x, y, h, i;
|
|
||||||
int lost;
|
|
||||||
char st[80];
|
|
||||||
|
|
||||||
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 16): 0;
|
|
||||||
y = vid.height - sb_lines - 24 - r_graphheight->int_val - 1;
|
|
||||||
|
|
||||||
h = r_graphheight->int_val % 8;
|
|
||||||
|
|
||||||
Draw_TextBox (x, y, NET_TIMINGS / 8, r_graphheight->int_val / 8 + 1);
|
|
||||||
|
|
||||||
lost = CL_CalcNet ();
|
|
||||||
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 8) : 8;
|
|
||||||
y = vid.height - sb_lines - 9;
|
|
||||||
|
|
||||||
y -= h;
|
|
||||||
for (a = 0; a < NET_TIMINGS; a++) {
|
|
||||||
i = (cls.netchan.outgoing_sequence - a) & NET_TIMINGSMASK;
|
|
||||||
R_LineGraph (x + NET_TIMINGS - 1 - a, y, packet_latency[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
y -= vid.height - sb_lines - 24 - r_graphheight->int_val + 7;
|
|
||||||
snprintf (st, sizeof (st), "%3i%% packet loss", lost);
|
|
||||||
if (cl_hudswap->int_val) {
|
|
||||||
Draw_String8 (vid.width - ((strlen (st) * 8) + 8), y, st);
|
|
||||||
} else {
|
|
||||||
Draw_String8 (8, y, st);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
R_ZGraph (void)
|
|
||||||
{
|
|
||||||
int a, x, w, i;
|
|
||||||
static int height[256];
|
|
||||||
|
|
||||||
if (r_refdef.vrect.width <= 256)
|
|
||||||
w = r_refdef.vrect.width;
|
|
||||||
else
|
|
||||||
w = 256;
|
|
||||||
|
|
||||||
height[r_framecount & 255] = ((int) r_origin[2]) & 31;
|
|
||||||
|
|
||||||
x = 0;
|
|
||||||
for (a = 0; a < w; a++) {
|
|
||||||
i = (r_framecount - a) & 255;
|
|
||||||
R_LineGraph (x + w - 1 - a, r_refdef.vrect.height - 2, height[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
R_PrintTimes (void)
|
R_PrintTimes (void)
|
||||||
{
|
{
|
||||||
|
@ -484,7 +327,7 @@ R_SetupFrame (void)
|
||||||
vrect.width = vid.width;
|
vrect.width = vid.width;
|
||||||
vrect.height = vid.height;
|
vrect.height = vid.height;
|
||||||
|
|
||||||
R_ViewChanged (&vrect, cl_sbar->int_val ? sb_lines : 0, vid.aspect);
|
R_ViewChanged (&vrect, r_lineadj, vid.aspect);
|
||||||
} else {
|
} else {
|
||||||
w = vid.width;
|
w = vid.width;
|
||||||
h = vid.height;
|
h = vid.height;
|
||||||
|
@ -505,7 +348,7 @@ R_SetupFrame (void)
|
||||||
vrect.height = (int) h;
|
vrect.height = (int) h;
|
||||||
|
|
||||||
R_ViewChanged (&vrect,
|
R_ViewChanged (&vrect,
|
||||||
(int) ((float) (cl_sbar->int_val ? sb_lines : 0) *
|
(int) ((float) r_lineadj *
|
||||||
(h / (float) vid.height)),
|
(h / (float) vid.height)),
|
||||||
vid.aspect * (h / w) * ((float) vid.width /
|
vid.aspect * (h / w) * ((float) vid.width /
|
||||||
(float) vid.height));
|
(float) vid.height));
|
||||||
|
@ -516,7 +359,7 @@ R_SetupFrame (void)
|
||||||
vrect.width = vid.width;
|
vrect.width = vid.width;
|
||||||
vrect.height = vid.height;
|
vrect.height = vid.height;
|
||||||
|
|
||||||
R_ViewChanged (&vrect, cl_sbar->int_val ? sb_lines : 0, vid.aspect);
|
R_ViewChanged (&vrect, r_lineadj, vid.aspect);
|
||||||
}
|
}
|
||||||
|
|
||||||
r_viewchanged = false;
|
r_viewchanged = false;
|
||||||
|
|
|
@ -318,4 +318,6 @@ extern double realtime;
|
||||||
|
|
||||||
void Cvar_Info (struct cvar_s *var);
|
void Cvar_Info (struct cvar_s *var);
|
||||||
|
|
||||||
|
void CL_NetGraph (void);
|
||||||
|
|
||||||
#endif // _CLIENT_H
|
#endif // _CLIENT_H
|
||||||
|
|
|
@ -95,10 +95,10 @@ client_LIB_DEPS= libqfnet.a $(qf_client_LIBS)
|
||||||
# libQFjs is seperate because it needs to be linked after when building statically
|
# libQFjs is seperate because it needs to be linked after when building statically
|
||||||
|
|
||||||
client_SOURCES= cl_cam.c cl_cmd.c cl_cvar.c cl_demo.c cl_ents.c cl_input.c \
|
client_SOURCES= cl_cam.c cl_cmd.c cl_cvar.c cl_demo.c cl_ents.c cl_input.c \
|
||||||
cl_main.c cl_misc.c cl_parse.c cl_pred.c cl_skin.c cl_slist.c \
|
cl_main.c cl_misc.c cl_ngraph.c cl_parse.c cl_pred.c cl_skin.c \
|
||||||
cl_tent.c \
|
cl_slist.c cl_tent.c \
|
||||||
console.c keys.c locs.c nonintel.c pcx.c r_cvar.c r_efrag.c \
|
console.c keys.c locs.c nonintel.c pcx.c r_cvar.c r_efrag.c \
|
||||||
r_ent.c r_main.c r_view.c sbar.c skin.c teamplay.c tga.c \
|
r_ent.c r_graph.c r_main.c r_view.c sbar.c skin.c teamplay.c tga.c \
|
||||||
wad.c cl_math.S $(syscl_SRC)
|
wad.c cl_math.S $(syscl_SRC)
|
||||||
|
|
||||||
# Software-rendering clients
|
# Software-rendering clients
|
||||||
|
@ -107,7 +107,7 @@ client_SOURCES= cl_cam.c cl_cmd.c cl_cvar.c cl_demo.c cl_ents.c cl_input.c \
|
||||||
|
|
||||||
soft_SOURCES= d_edge.c d_fill.c d_init.c d_modech.c \
|
soft_SOURCES= d_edge.c d_fill.c d_init.c d_modech.c \
|
||||||
d_part.c d_polyse.c d_scan.c d_sky.c d_sprite.c d_surf.c \
|
d_part.c d_polyse.c d_scan.c d_sky.c d_sprite.c d_surf.c \
|
||||||
d_vars.c d_zpoint.c draw.c sw_raclip.c sw_ralias.c sw_rbsp.c \
|
d_vars.c d_zpoint.c draw.c sw_graph.c sw_raclip.c sw_ralias.c sw_rbsp.c \
|
||||||
sw_rdraw.c sw_redge.c sw_rlight.c sw_rmain.c sw_rmisc.c \
|
sw_rdraw.c sw_redge.c sw_rlight.c sw_rmain.c sw_rmisc.c \
|
||||||
sw_rpart.c sw_rsky.c sw_rsprite.c sw_rsurf.c sw_skin.c \
|
sw_rpart.c sw_rsky.c sw_rsprite.c sw_rsurf.c sw_skin.c \
|
||||||
sw_view.c screen.c \
|
sw_view.c screen.c \
|
||||||
|
@ -146,7 +146,7 @@ qw_client_x11_DEPENDENCIES=../../libs/models/libQFmodels_sw.la ../../libs/video/
|
||||||
#
|
#
|
||||||
# ... Common stuff
|
# ... Common stuff
|
||||||
ogl_SOURCES= noisetextures.c gl_textures.c gl_draw.c gl_dyn_fires.c \
|
ogl_SOURCES= noisetextures.c gl_textures.c gl_draw.c gl_dyn_fires.c \
|
||||||
gl_dyn_part.c gl_dyn_textures.c gl_ngraph.c gl_rlight.c \
|
gl_dyn_part.c gl_dyn_textures.c gl_graph.c gl_rlight.c \
|
||||||
gl_rmain.c gl_rmisc.c gl_rsurf.c gl_screen.c gl_skin.c \
|
gl_rmain.c gl_rmisc.c gl_rsurf.c gl_screen.c gl_skin.c \
|
||||||
gl_sky.c gl_sky_clip.c gl_view.c gl_warp.c
|
gl_sky.c gl_sky_clip.c gl_view.c gl_warp.c
|
||||||
|
|
||||||
|
|
78
qw/source/cl_ngraph.c
Normal file
78
qw/source/cl_ngraph.c
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
cl_ngraph.c
|
||||||
|
|
||||||
|
client network diagnostic graph
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "QF/draw.h"
|
||||||
|
#include "QF/render.h"
|
||||||
|
|
||||||
|
#include "cl_parse.h"
|
||||||
|
#include "client.h"
|
||||||
|
#include "sbar.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
CL_NetGraph (void)
|
||||||
|
{
|
||||||
|
int a, l, x, y, h, i;
|
||||||
|
int lost;
|
||||||
|
char st[80];
|
||||||
|
|
||||||
|
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 16): 0;
|
||||||
|
y = vid.height - sb_lines - 24 - r_graphheight->int_val - 1;
|
||||||
|
|
||||||
|
h = r_graphheight->int_val % 8;
|
||||||
|
|
||||||
|
Draw_TextBox (x, y, NET_TIMINGS / 8, r_graphheight->int_val / 8 + 1);
|
||||||
|
|
||||||
|
lost = CL_CalcNet ();
|
||||||
|
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 8) : 8;
|
||||||
|
y = vid.height - sb_lines - 9;
|
||||||
|
|
||||||
|
l = NET_TIMINGS;
|
||||||
|
if (l > r_refdef.vrect.width - 8)
|
||||||
|
l = r_refdef.vrect.width - 8;
|
||||||
|
i = (cls.netchan.outgoing_sequence - a) & NET_TIMINGSMASK;
|
||||||
|
a = i - l;
|
||||||
|
if (a < 0) {
|
||||||
|
R_LineGraph (x, y, &packet_latency[a + NET_TIMINGS], -a);
|
||||||
|
x -= a;
|
||||||
|
l += a;
|
||||||
|
a = 0;
|
||||||
|
}
|
||||||
|
R_LineGraph (x, y, &packet_latency[a], l);
|
||||||
|
|
||||||
|
y = vid.height - sb_lines - 24 - r_graphheight->int_val + 7;
|
||||||
|
snprintf (st, sizeof (st), "%3i%% packet loss", lost);
|
||||||
|
if (cl_hudswap->int_val) {
|
||||||
|
Draw_String8 (vid.width - ((strlen (st) * 8) + 8), y, st);
|
||||||
|
} else {
|
||||||
|
Draw_String8 (8, y, st);
|
||||||
|
}
|
||||||
|
}
|
145
qw/source/gl_graph.c
Normal file
145
qw/source/gl_graph.c
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
gl_ngraph.c
|
||||||
|
|
||||||
|
(description)
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_STRING_H
|
||||||
|
# include <string.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_STRINGS_H
|
||||||
|
# include <strings.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "QF/cvar.h"
|
||||||
|
#include "QF/draw.h"
|
||||||
|
#include "QF/sys.h"
|
||||||
|
|
||||||
|
#include "glquake.h"
|
||||||
|
#include "r_cvar.h"
|
||||||
|
|
||||||
|
extern byte *draw_chars; // 8*8 graphic characters
|
||||||
|
extern qboolean lighthalf;
|
||||||
|
|
||||||
|
extern cvar_t *r_netgraph;
|
||||||
|
extern cvar_t *r_netgraph_alpha;
|
||||||
|
extern cvar_t *r_netgraph_box;
|
||||||
|
|
||||||
|
static int graph_index;
|
||||||
|
static int graph_size[NUM_GRAPH_TEXTURES];
|
||||||
|
static int graph_width[NUM_GRAPH_TEXTURES];
|
||||||
|
static byte *graph_texels[NUM_GRAPH_TEXTURES];
|
||||||
|
int graph_texture[NUM_GRAPH_TEXTURES];
|
||||||
|
|
||||||
|
int
|
||||||
|
R_InitGraphTextures (int base)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_GRAPH_TEXTURES; i++)
|
||||||
|
graph_texture[i] = base++;
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
R_LineGraph (int x, int y, int *h_vals, int count)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int h;
|
||||||
|
int s;
|
||||||
|
byte color;
|
||||||
|
int size;
|
||||||
|
byte *dest;
|
||||||
|
|
||||||
|
if (!count)
|
||||||
|
return;
|
||||||
|
|
||||||
|
s = r_graphheight->int_val;
|
||||||
|
|
||||||
|
size = 2 * count;
|
||||||
|
if (size > graph_size[graph_index]) {
|
||||||
|
graph_size[graph_index] = size;
|
||||||
|
graph_texels[graph_index] = realloc (graph_texels[graph_index], size);
|
||||||
|
}
|
||||||
|
graph_width[graph_index] = count;
|
||||||
|
|
||||||
|
if (!graph_texels[graph_index])
|
||||||
|
Sys_Error ("R_LineGraph: failed to allocate texture buffer\n");
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (count--) {
|
||||||
|
dest = graph_texels[graph_index] + i++;
|
||||||
|
|
||||||
|
h = *h_vals++;
|
||||||
|
|
||||||
|
if (h == 10000)
|
||||||
|
color = 0x6f; // yellow
|
||||||
|
else if (h == 9999)
|
||||||
|
color = 0x4f; // red
|
||||||
|
else if (h == 9998)
|
||||||
|
color = 0xd0; // blue
|
||||||
|
else
|
||||||
|
color = 0xfe; // white
|
||||||
|
|
||||||
|
if (h > s)
|
||||||
|
h = s;
|
||||||
|
|
||||||
|
for (j = 0; j < h; j++, dest += graph_width[graph_index])
|
||||||
|
dest[0] = color;
|
||||||
|
|
||||||
|
for (; j < s; j++, dest += graph_width[graph_index])
|
||||||
|
dest[0] = 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindTexture (GL_TEXTURE_2D, graph_texture[graph_index]);
|
||||||
|
|
||||||
|
glTexImage2D (GL_TEXTURE_2D, 0, gl_alpha_format,
|
||||||
|
graph_width[graph_index], s, 0, GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, graph_texels[graph_index]);
|
||||||
|
|
||||||
|
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
|
||||||
|
glBegin (GL_QUADS);
|
||||||
|
glTexCoord2f (0, 0);
|
||||||
|
glVertex2f (x, y);
|
||||||
|
glTexCoord2f (1, 0);
|
||||||
|
glVertex2f (x + graph_width[graph_index], y);
|
||||||
|
glTexCoord2f (1, 1);
|
||||||
|
glVertex2f (x + graph_width[graph_index], y - s);
|
||||||
|
glTexCoord2f (0, 1);
|
||||||
|
glVertex2f (x, y - s);
|
||||||
|
glEnd ();
|
||||||
|
|
||||||
|
glColor3ubv (lighthalf_v);
|
||||||
|
|
||||||
|
graph_index = (graph_index + 1) % NUM_GRAPH_TEXTURES;
|
||||||
|
}
|
|
@ -1,181 +0,0 @@
|
||||||
/*
|
|
||||||
gl_ngraph.c
|
|
||||||
|
|
||||||
(description)
|
|
||||||
|
|
||||||
Copyright (C) 1996-1997 Id Software, Inc.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to:
|
|
||||||
|
|
||||||
Free Software Foundation, Inc.
|
|
||||||
59 Temple Place - Suite 330
|
|
||||||
Boston, MA 02111-1307, USA
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include "config.h"
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_STRING_H
|
|
||||||
# include <string.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_STRINGS_H
|
|
||||||
# include <strings.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "QF/compat.h"
|
|
||||||
#include "QF/cvar.h"
|
|
||||||
#include "QF/draw.h"
|
|
||||||
#include "QF/vid.h"
|
|
||||||
|
|
||||||
#include "cl_parse.h"
|
|
||||||
#include "client.h"
|
|
||||||
#include "glquake.h"
|
|
||||||
#include "sbar.h"
|
|
||||||
|
|
||||||
extern byte *draw_chars; // 8*8 graphic characters
|
|
||||||
extern qboolean lighthalf;
|
|
||||||
|
|
||||||
extern cvar_t *r_netgraph;
|
|
||||||
extern cvar_t *r_netgraph_alpha;
|
|
||||||
extern cvar_t *r_netgraph_box;
|
|
||||||
|
|
||||||
int netgraphtexture; // netgraph texture
|
|
||||||
|
|
||||||
#define NET_GRAPHHEIGHT 32
|
|
||||||
|
|
||||||
static byte ngraph_texels[NET_GRAPHHEIGHT][NET_TIMINGS];
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
R_LineGraph (int x, int h)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int s;
|
|
||||||
int color;
|
|
||||||
|
|
||||||
s = NET_GRAPHHEIGHT;
|
|
||||||
|
|
||||||
if (h == 10000)
|
|
||||||
color = 0x6f; // yellow
|
|
||||||
else if (h == 9999)
|
|
||||||
color = 0x4f; // red
|
|
||||||
else if (h == 9998)
|
|
||||||
color = 0xd0; // blue
|
|
||||||
else
|
|
||||||
color = 0xfe; // white
|
|
||||||
|
|
||||||
if (h > s)
|
|
||||||
h = s;
|
|
||||||
|
|
||||||
for (i = 0; i < h; i++)
|
|
||||||
if (i & 1)
|
|
||||||
ngraph_texels[NET_GRAPHHEIGHT - i - 1][x] = 0xff;
|
|
||||||
else
|
|
||||||
ngraph_texels[NET_GRAPHHEIGHT - i - 1][x] = (byte) color;
|
|
||||||
|
|
||||||
for (; i < s; i++)
|
|
||||||
ngraph_texels[NET_GRAPHHEIGHT - i - 1][x] = (byte) 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
Draw_CharToNetGraph (int x, int y, int num)
|
|
||||||
{
|
|
||||||
int row, col;
|
|
||||||
byte *source;
|
|
||||||
int drawline;
|
|
||||||
int nx;
|
|
||||||
|
|
||||||
row = num >> 4;
|
|
||||||
col = num & 15;
|
|
||||||
source = draw_chars + (row << 10) + (col << 3);
|
|
||||||
|
|
||||||
for (drawline = 8; drawline; drawline--, y++) {
|
|
||||||
for (nx = 0; nx < 8; nx++)
|
|
||||||
if (source[nx] != 255)
|
|
||||||
ngraph_texels[y][nx + x] = 0x60 + source[nx];
|
|
||||||
source += 128;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
R_NetGraph (void)
|
|
||||||
{
|
|
||||||
int a, x, i, y;
|
|
||||||
int lost;
|
|
||||||
char st[80];
|
|
||||||
unsigned int ngraph_pixels[NET_GRAPHHEIGHT][NET_TIMINGS];
|
|
||||||
|
|
||||||
x = 0;
|
|
||||||
lost = CL_CalcNet ();
|
|
||||||
for (a = 0; a < NET_TIMINGS; a++) {
|
|
||||||
i = (cls.netchan.outgoing_sequence - a) & NET_TIMINGSMASK;
|
|
||||||
R_LineGraph (NET_TIMINGS - 1 - a, packet_latency[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// now load the netgraph texture into gl and draw it
|
|
||||||
for (y = 0; y < NET_GRAPHHEIGHT; y++)
|
|
||||||
for (x = 0; x < NET_TIMINGS; x++)
|
|
||||||
ngraph_pixels[y][x] = d_8to24table[ngraph_texels[y][x]];
|
|
||||||
|
|
||||||
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 16): 0 ;
|
|
||||||
y = vid.height - sb_lines - 24 - NET_GRAPHHEIGHT - 1;
|
|
||||||
|
|
||||||
if (r_netgraph_alpha->value < 0.995) // roundoff
|
|
||||||
glColor4f (1, 1, 1, r_netgraph_alpha->value);
|
|
||||||
|
|
||||||
if (r_netgraph_box->int_val)
|
|
||||||
Draw_TextBox (x, y, NET_TIMINGS / 8, NET_GRAPHHEIGHT / 8 + 1);
|
|
||||||
|
|
||||||
y += 8;
|
|
||||||
|
|
||||||
snprintf (st, sizeof (st), "%3i%% packet loss", lost);
|
|
||||||
if (cl_hudswap->int_val) {
|
|
||||||
Draw_String8 (vid.width - ((strlen (st) * 8) + 8), y, st);
|
|
||||||
} else {
|
|
||||||
Draw_String8 (8, y, st);
|
|
||||||
}
|
|
||||||
|
|
||||||
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 8) : 8;
|
|
||||||
|
|
||||||
y += 8;
|
|
||||||
|
|
||||||
glBindTexture (GL_TEXTURE_2D, netgraphtexture);
|
|
||||||
|
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, gl_alpha_format,
|
|
||||||
NET_TIMINGS, NET_GRAPHHEIGHT, 0, GL_RGBA,
|
|
||||||
GL_UNSIGNED_BYTE, ngraph_pixels);
|
|
||||||
|
|
||||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
|
|
||||||
glBegin (GL_QUADS);
|
|
||||||
glTexCoord2f (0, 0);
|
|
||||||
glVertex2f (x, y);
|
|
||||||
glTexCoord2f (1, 0);
|
|
||||||
glVertex2f (x + NET_TIMINGS, y);
|
|
||||||
glTexCoord2f (1, 1);
|
|
||||||
glVertex2f (x + NET_TIMINGS, y + NET_GRAPHHEIGHT);
|
|
||||||
glTexCoord2f (0, 1);
|
|
||||||
glVertex2f (x, y + NET_GRAPHHEIGHT);
|
|
||||||
glEnd ();
|
|
||||||
|
|
||||||
glColor3ubv (lighthalf_v);
|
|
||||||
}
|
|
|
@ -1053,6 +1053,9 @@ R_Clear (void)
|
||||||
void
|
void
|
||||||
R_RenderScene (void)
|
R_RenderScene (void)
|
||||||
{
|
{
|
||||||
|
if (r_timegraph->int_val || r_speeds->int_val || r_dspeeds->int_val)
|
||||||
|
r_time1 = Sys_DoubleTime ();
|
||||||
|
|
||||||
R_SetupFrame ();
|
R_SetupFrame ();
|
||||||
|
|
||||||
R_SetFrustum ();
|
R_SetFrustum ();
|
||||||
|
@ -1070,6 +1073,12 @@ R_RenderScene (void)
|
||||||
R_DrawEntitiesOnList ();
|
R_DrawEntitiesOnList ();
|
||||||
|
|
||||||
R_RenderDlights ();
|
R_RenderDlights ();
|
||||||
|
|
||||||
|
if (r_timegraph->int_val)
|
||||||
|
R_TimeGraph ();
|
||||||
|
|
||||||
|
if (r_zgraph->int_val)
|
||||||
|
R_ZGraph ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -41,16 +41,16 @@
|
||||||
#include "QF/cmd.h"
|
#include "QF/cmd.h"
|
||||||
#include "QF/console.h"
|
#include "QF/console.h"
|
||||||
#include "QF/cvar.h"
|
#include "QF/cvar.h"
|
||||||
|
#include "QF/quakefs.h"
|
||||||
|
#include "QF/render.h"
|
||||||
#include "QF/skin.h"
|
#include "QF/skin.h"
|
||||||
#include "QF/sys.h"
|
#include "QF/sys.h"
|
||||||
#include "QF/vid.h"
|
#include "QF/vid.h"
|
||||||
#include "QF/varrays.h"
|
#include "QF/varrays.h"
|
||||||
|
|
||||||
#include "client.h"
|
|
||||||
#include "glquake.h"
|
#include "glquake.h"
|
||||||
#include "r_dynamic.h"
|
#include "r_dynamic.h"
|
||||||
#include "r_local.h"
|
#include "r_local.h"
|
||||||
#include "QF/render.h"
|
|
||||||
|
|
||||||
varray_t2f_c4f_v3f_t varray[MAX_VARRAY_VERTS];
|
varray_t2f_c4f_v3f_t varray[MAX_VARRAY_VERTS];
|
||||||
|
|
||||||
|
@ -155,8 +155,7 @@ R_Init (void)
|
||||||
|
|
||||||
GDT_Init ();
|
GDT_Init ();
|
||||||
|
|
||||||
netgraphtexture = texture_extension_number;
|
texture_extension_number = R_InitGraphTextures (texture_extension_number);
|
||||||
texture_extension_number++;
|
|
||||||
|
|
||||||
texture_extension_number = Skin_Init_Textures (texture_extension_number);
|
texture_extension_number = Skin_Init_Textures (texture_extension_number);
|
||||||
|
|
||||||
|
|
|
@ -940,7 +940,7 @@ SCR_UpdateScreen (double realtime)
|
||||||
SCR_TileClear ();
|
SCR_TileClear ();
|
||||||
|
|
||||||
if (r_netgraph->int_val)
|
if (r_netgraph->int_val)
|
||||||
R_NetGraph ();
|
CL_NetGraph ();
|
||||||
|
|
||||||
if (cl.intermission == 1 && key_dest == key_game) {
|
if (cl.intermission == 1 && key_dest == key_game) {
|
||||||
Sbar_IntermissionOverlay ();
|
Sbar_IntermissionOverlay ();
|
||||||
|
|
110
qw/source/r_graph.c
Normal file
110
qw/source/r_graph.c
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
r_graph.c
|
||||||
|
|
||||||
|
rednerer diagnostic graphs
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "QF/draw.h"
|
||||||
|
#include "QF/render.h"
|
||||||
|
#include "QF/sys.h"
|
||||||
|
|
||||||
|
#include "r_local.h"
|
||||||
|
#include "sbar.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_TIMINGS 100
|
||||||
|
extern float mouse_x, mouse_y;
|
||||||
|
int graphval;
|
||||||
|
|
||||||
|
/*
|
||||||
|
R_TimeGraph
|
||||||
|
|
||||||
|
Performance monitoring tool
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
R_TimeGraph (void)
|
||||||
|
{
|
||||||
|
static int timex;
|
||||||
|
int a;
|
||||||
|
int l;
|
||||||
|
float r_time2;
|
||||||
|
static int r_timings[MAX_TIMINGS];
|
||||||
|
int x;
|
||||||
|
|
||||||
|
r_time2 = Sys_DoubleTime ();
|
||||||
|
|
||||||
|
a = (r_time2 - r_time1) / 0.01;
|
||||||
|
// a = fabs(mouse_y * 0.05);
|
||||||
|
// a = (int)((r_refdef.vieworg[2] + 1024)/1)%(int)r_graphheight->value;
|
||||||
|
// a = (int)((pmove.velocity[2] + 500)/10);
|
||||||
|
// a = fabs(velocity[0])/20;
|
||||||
|
// a = ((int)fabs(origin[0])/8)%20;
|
||||||
|
// a = (cl.idealpitch + 30)/5;
|
||||||
|
// a = (int)(cl.simangles[YAW] * 64/360) & 63;
|
||||||
|
a = graphval;
|
||||||
|
|
||||||
|
r_timings[timex] = a;
|
||||||
|
a = timex;
|
||||||
|
|
||||||
|
l = MAX_TIMINGS;
|
||||||
|
if (l > r_refdef.vrect.width)
|
||||||
|
l = r_refdef.vrect.width;
|
||||||
|
x = r_refdef.vrect.width - l;
|
||||||
|
a = timex - l;
|
||||||
|
if (a < 0) {
|
||||||
|
R_LineGraph (x, r_refdef.vrect.height - 2, &r_timings[a + MAX_TIMINGS], -a);
|
||||||
|
x -= a;
|
||||||
|
l += a;
|
||||||
|
a = 0;
|
||||||
|
}
|
||||||
|
R_LineGraph (x, r_refdef.vrect.height - 2, &r_timings[a], l);
|
||||||
|
|
||||||
|
timex = (timex + 1) % MAX_TIMINGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
R_ZGraph (void)
|
||||||
|
{
|
||||||
|
int a, x, w, i;
|
||||||
|
static int height[256];
|
||||||
|
|
||||||
|
if (r_refdef.vrect.width <= 256)
|
||||||
|
w = r_refdef.vrect.width;
|
||||||
|
else
|
||||||
|
w = 256;
|
||||||
|
|
||||||
|
height[r_framecount & 255] = ((int) r_origin[2]) & 31;
|
||||||
|
|
||||||
|
x = 0;
|
||||||
|
for (a = 0; a < w; a++) {
|
||||||
|
i = (r_framecount - a) & 255;
|
||||||
|
}
|
||||||
|
R_LineGraph (x, r_refdef.vrect.height - 2, height, w);
|
||||||
|
}
|
|
@ -11,6 +11,8 @@ dlight_t r_dlights[MAX_DLIGHTS];
|
||||||
entity_t *r_view_model;
|
entity_t *r_view_model;
|
||||||
entity_t *r_player_entity;
|
entity_t *r_player_entity;
|
||||||
lightstyle_t r_lightstyle[MAX_LIGHTSTYLES];
|
lightstyle_t r_lightstyle[MAX_LIGHTSTYLES];
|
||||||
|
int r_lineadj;
|
||||||
|
float r_time1;
|
||||||
|
|
||||||
|
|
||||||
dlight_t *
|
dlight_t *
|
||||||
|
|
|
@ -965,6 +965,10 @@ SCR_UpdateScreen (double realtime)
|
||||||
|
|
||||||
SCR_DrawRam ();
|
SCR_DrawRam ();
|
||||||
SCR_DrawNet ();
|
SCR_DrawNet ();
|
||||||
|
|
||||||
|
if (r_netgraph->int_val)
|
||||||
|
CL_NetGraph ();
|
||||||
|
|
||||||
SCR_DrawFPS ();
|
SCR_DrawFPS ();
|
||||||
SCR_DrawTime ();
|
SCR_DrawTime ();
|
||||||
SCR_DrawTurtle ();
|
SCR_DrawTurtle ();
|
||||||
|
|
77
qw/source/sw_graph.c
Normal file
77
qw/source/sw_graph.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
r_misc.c
|
||||||
|
|
||||||
|
(description)
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "QF/draw.h"
|
||||||
|
#include "QF/render.h"
|
||||||
|
|
||||||
|
#include "r_local.h"
|
||||||
|
#include "r_cvar.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
R_LineGraph
|
||||||
|
|
||||||
|
Only called by R_DisplayTime
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
R_LineGraph (int x, int y, int *h_vals, int count)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
byte *dest;
|
||||||
|
int s;
|
||||||
|
int color;
|
||||||
|
int h;
|
||||||
|
|
||||||
|
// FIXME: should be disabled on no-buffer adapters, or should be in the driver
|
||||||
|
s = r_graphheight->int_val;
|
||||||
|
|
||||||
|
while (count--) {
|
||||||
|
dest = vid.buffer + vid.rowbytes * y + x++;
|
||||||
|
|
||||||
|
h = *h_vals++;
|
||||||
|
|
||||||
|
if (h == 10000)
|
||||||
|
color = 0x6f; // yellow
|
||||||
|
else if (h == 9999)
|
||||||
|
color = 0x4f; // red
|
||||||
|
else if (h == 9998)
|
||||||
|
color = 0xd0; // blue
|
||||||
|
else
|
||||||
|
color = 0xff; // pink
|
||||||
|
|
||||||
|
if (h > s)
|
||||||
|
h = s;
|
||||||
|
|
||||||
|
for (i = 0; i < h; i++, dest -= vid.rowbytes) {
|
||||||
|
dest[0] = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -56,7 +56,6 @@
|
||||||
void *colormap;
|
void *colormap;
|
||||||
vec3_t viewlightvec;
|
vec3_t viewlightvec;
|
||||||
alight_t r_viewlighting = { 128, 192, viewlightvec };
|
alight_t r_viewlighting = { 128, 192, viewlightvec };
|
||||||
float r_time1;
|
|
||||||
int r_numallocatededges;
|
int r_numallocatededges;
|
||||||
qboolean r_drawpolys;
|
qboolean r_drawpolys;
|
||||||
qboolean r_drawculledpolys;
|
qboolean r_drawculledpolys;
|
||||||
|
@ -137,7 +136,6 @@ void R_MarkLeaves (void);
|
||||||
|
|
||||||
extern cvar_t *scr_fov;
|
extern cvar_t *scr_fov;
|
||||||
|
|
||||||
void R_NetGraph (void);
|
|
||||||
void R_ZGraph (void);
|
void R_ZGraph (void);
|
||||||
|
|
||||||
|
|
||||||
|
@ -909,9 +907,6 @@ R_RenderView_ (void)
|
||||||
if (r_timegraph->int_val)
|
if (r_timegraph->int_val)
|
||||||
R_TimeGraph ();
|
R_TimeGraph ();
|
||||||
|
|
||||||
if (r_netgraph->int_val)
|
|
||||||
R_NetGraph ();
|
|
||||||
|
|
||||||
if (r_zgraph->int_val)
|
if (r_zgraph->int_val)
|
||||||
R_ZGraph ();
|
R_ZGraph ();
|
||||||
|
|
||||||
|
|
|
@ -34,13 +34,11 @@
|
||||||
#include "QF/console.h"
|
#include "QF/console.h"
|
||||||
#include "QF/cmd.h"
|
#include "QF/cmd.h"
|
||||||
#include "QF/draw.h"
|
#include "QF/draw.h"
|
||||||
|
#include "QF/render.h"
|
||||||
#include "QF/sys.h"
|
#include "QF/sys.h"
|
||||||
|
|
||||||
#include "cl_parse.h"
|
|
||||||
#include "client.h"
|
|
||||||
#include "host.h"
|
#include "host.h"
|
||||||
#include "r_local.h"
|
#include "r_local.h"
|
||||||
#include "QF/render.h"
|
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -119,159 +117,6 @@ R_LoadSky_f (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
R_LineGraph
|
|
||||||
|
|
||||||
Only called by R_DisplayTime
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
R_LineGraph (int x, int y, int h)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
byte *dest;
|
|
||||||
int s;
|
|
||||||
int color;
|
|
||||||
|
|
||||||
// FIXME: should be disabled on no-buffer adapters, or should be in the driver
|
|
||||||
|
|
||||||
// x += r_refdef.vrect.x;
|
|
||||||
// y += r_refdef.vrect.y;
|
|
||||||
|
|
||||||
dest = vid.buffer + vid.rowbytes * y + x;
|
|
||||||
|
|
||||||
s = r_graphheight->int_val;
|
|
||||||
|
|
||||||
if (h == 10000)
|
|
||||||
color = 0x6f; // yellow
|
|
||||||
else if (h == 9999)
|
|
||||||
color = 0x4f; // red
|
|
||||||
else if (h == 9998)
|
|
||||||
color = 0xd0; // blue
|
|
||||||
else
|
|
||||||
color = 0xff; // pink
|
|
||||||
|
|
||||||
if (h > s)
|
|
||||||
h = s;
|
|
||||||
|
|
||||||
for (i = 0; i < h; i++, dest -= vid.rowbytes) {
|
|
||||||
dest[0] = color;
|
|
||||||
// *(dest-vid.rowbytes) = 0x30;
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
for (; i < s; i++, dest -= vid.rowbytes * 2) {
|
|
||||||
dest[0] = 0x30;
|
|
||||||
*(dest - vid.rowbytes) = 0x30;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_TIMINGS 100
|
|
||||||
extern float mouse_x, mouse_y;
|
|
||||||
int graphval;
|
|
||||||
|
|
||||||
/*
|
|
||||||
R_TimeGraph
|
|
||||||
|
|
||||||
Performance monitoring tool
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
R_TimeGraph (void)
|
|
||||||
{
|
|
||||||
static int timex;
|
|
||||||
int a;
|
|
||||||
float r_time2;
|
|
||||||
static byte r_timings[MAX_TIMINGS];
|
|
||||||
int x;
|
|
||||||
|
|
||||||
r_time2 = Sys_DoubleTime ();
|
|
||||||
|
|
||||||
a = (r_time2 - r_time1) / 0.01;
|
|
||||||
// a = fabs(mouse_y * 0.05);
|
|
||||||
// a = (int)((r_refdef.vieworg[2] + 1024)/1)%(int)r_graphheight->value;
|
|
||||||
// a = (int)((pmove.velocity[2] + 500)/10);
|
|
||||||
// a = fabs(velocity[0])/20;
|
|
||||||
// a = ((int)fabs(origin[0])/8)%20;
|
|
||||||
// a = (cl.idealpitch + 30)/5;
|
|
||||||
// a = (int)(cl.simangles[YAW] * 64/360) & 63;
|
|
||||||
a = graphval;
|
|
||||||
|
|
||||||
r_timings[timex] = a;
|
|
||||||
a = timex;
|
|
||||||
|
|
||||||
if (r_refdef.vrect.width <= MAX_TIMINGS)
|
|
||||||
x = r_refdef.vrect.width - 1;
|
|
||||||
else
|
|
||||||
x = r_refdef.vrect.width - (r_refdef.vrect.width - MAX_TIMINGS) / 2;
|
|
||||||
do {
|
|
||||||
R_LineGraph (x, r_refdef.vrect.height - 2, r_timings[a]);
|
|
||||||
if (x == 0)
|
|
||||||
break; // screen too small to hold entire thing
|
|
||||||
x--;
|
|
||||||
a--;
|
|
||||||
if (a == -1)
|
|
||||||
a = MAX_TIMINGS - 1;
|
|
||||||
} while (a != timex);
|
|
||||||
|
|
||||||
timex = (timex + 1) % MAX_TIMINGS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
R_NetGraph (void)
|
|
||||||
{
|
|
||||||
int a, x, y, h, i;
|
|
||||||
int lost;
|
|
||||||
char st[80];
|
|
||||||
|
|
||||||
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 16): 0;
|
|
||||||
y = vid.height - sb_lines - 24 - r_graphheight->int_val - 1;
|
|
||||||
|
|
||||||
h = r_graphheight->int_val % 8;
|
|
||||||
|
|
||||||
Draw_TextBox (x, y, NET_TIMINGS / 8, r_graphheight->int_val / 8 + 1);
|
|
||||||
|
|
||||||
lost = CL_CalcNet ();
|
|
||||||
x = cl_hudswap->int_val ? vid.width - (NET_TIMINGS + 8) : 8;
|
|
||||||
y = vid.height - sb_lines - 9;
|
|
||||||
|
|
||||||
y -= h;
|
|
||||||
for (a = 0; a < NET_TIMINGS; a++) {
|
|
||||||
i = (cls.netchan.outgoing_sequence - a) & NET_TIMINGSMASK;
|
|
||||||
R_LineGraph (x + NET_TIMINGS - 1 - a, y, packet_latency[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
y -= vid.height - sb_lines - 24 - r_graphheight->int_val + 7;
|
|
||||||
snprintf (st, sizeof (st), "%3i%% packet loss", lost);
|
|
||||||
if (cl_hudswap->int_val) {
|
|
||||||
Draw_String8 (vid.width - ((strlen (st) * 8) + 8), y, st);
|
|
||||||
} else {
|
|
||||||
Draw_String8 (8, y, st);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
R_ZGraph (void)
|
|
||||||
{
|
|
||||||
int a, x, w, i;
|
|
||||||
static int height[256];
|
|
||||||
|
|
||||||
if (r_refdef.vrect.width <= 256)
|
|
||||||
w = r_refdef.vrect.width;
|
|
||||||
else
|
|
||||||
w = 256;
|
|
||||||
|
|
||||||
height[r_framecount & 255] = ((int) r_origin[2]) & 31;
|
|
||||||
|
|
||||||
x = 0;
|
|
||||||
for (a = 0; a < w; a++) {
|
|
||||||
i = (r_framecount - a) & 255;
|
|
||||||
R_LineGraph (x + w - 1 - a, r_refdef.vrect.height - 2, height[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
R_PrintTimes (void)
|
R_PrintTimes (void)
|
||||||
{
|
{
|
||||||
|
@ -482,7 +327,7 @@ R_SetupFrame (void)
|
||||||
vrect.width = vid.width;
|
vrect.width = vid.width;
|
||||||
vrect.height = vid.height;
|
vrect.height = vid.height;
|
||||||
|
|
||||||
R_ViewChanged (&vrect, cl_sbar->int_val ? sb_lines : 0, vid.aspect);
|
R_ViewChanged (&vrect, r_lineadj, vid.aspect);
|
||||||
} else {
|
} else {
|
||||||
w = vid.width;
|
w = vid.width;
|
||||||
h = vid.height;
|
h = vid.height;
|
||||||
|
@ -503,7 +348,7 @@ R_SetupFrame (void)
|
||||||
vrect.height = (int) h;
|
vrect.height = (int) h;
|
||||||
|
|
||||||
R_ViewChanged (&vrect,
|
R_ViewChanged (&vrect,
|
||||||
(int) ((float) (cl_sbar->int_val ? sb_lines : 0) *
|
(int) ((float) r_lineadj *
|
||||||
(h / (float) vid.height)),
|
(h / (float) vid.height)),
|
||||||
vid.aspect * (h / w) * ((float) vid.width /
|
vid.aspect * (h / w) * ((float) vid.width /
|
||||||
(float) vid.height));
|
(float) vid.height));
|
||||||
|
@ -514,7 +359,7 @@ R_SetupFrame (void)
|
||||||
vrect.width = vid.width;
|
vrect.width = vid.width;
|
||||||
vrect.height = vid.height;
|
vrect.height = vid.height;
|
||||||
|
|
||||||
R_ViewChanged (&vrect, cl_sbar->int_val ? sb_lines : 0, vid.aspect);
|
R_ViewChanged (&vrect, r_lineadj, vid.aspect);
|
||||||
}
|
}
|
||||||
|
|
||||||
r_viewchanged = false;
|
r_viewchanged = false;
|
||||||
|
|
Loading…
Reference in a new issue