diff --git a/include/QF/varrays.h b/include/QF/varrays.h new file mode 100644 index 000000000..5694397f6 --- /dev/null +++ b/include/QF/varrays.h @@ -0,0 +1,66 @@ +/* + varrays.h + + OpenGL-specific definitions and prototypes + + 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$ +*/ + +#ifndef __qf_varrays_h +#define __qf_varrays_h + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef HAVE_WINDOWS_H +# include +#endif + +#include + +#include "QF/qfgl_ext.h" + +typedef struct varray_t2f_c4f_v3f_s { + GLfloat texcoord[2]; + GLfloat color[4]; + GLfloat vertex[3]; +} varray_t2f_c4f_v3f_t; + +typedef struct varray_t2f_c4ub_v3f_s { + GLfloat texcoord[2]; + GLubyte color[4]; + GLfloat vertex[3]; +} varray_t2f_c4ub_v3f_t; + +typedef struct varray_t2f_c4f_n3f_v3f_s { + GLfloat texcoord[2]; + GLfloat color[4]; + GLfloat normal[3]; + GLfloat vertex[3]; +} varray_t2f_c4f_n3f_v3f_t; + +#define MAX_VARRAY_VERTS 10000 +extern varray_t2f_c4f_v3f_t varray[MAX_VARRAY_VERTS]; + +#endif // __qf_varrays_h diff --git a/qw/source/cl_demo.c b/qw/source/cl_demo.c index 5081ee209..728389c39 100644 --- a/qw/source/cl_demo.c +++ b/qw/source/cl_demo.c @@ -777,7 +777,7 @@ CL_FinishTimeDemo (void) time = Sys_DoubleTime () - cls.td_starttime; if (!time) time = 1; - Con_Printf ("%i frames %5.1f seconds %5.1f fps\n", frames, time, + Con_Printf ("%i frames %5.1f seconds %5.2f fps\n", frames, time, frames / time); } diff --git a/qw/source/gl_draw.c b/qw/source/gl_draw.c index 82e46ba49..a2194d93d 100644 --- a/qw/source/gl_draw.c +++ b/qw/source/gl_draw.c @@ -261,8 +261,10 @@ gl_lightmode_callback (cvar_t *cvar) { if (cvar->int_val) { lighthalf_v[0] = lighthalf_v[1] = lighthalf_v[2] = 128; + lighthalf = 1; } else { lighthalf_v[0] = lighthalf_v[1] = lighthalf_v[2] = 255; + lighthalf = 0; } R_ForceLightUpdate (); diff --git a/qw/source/gl_dyn_part.c b/qw/source/gl_dyn_part.c index 1b53838c2..901fccb06 100644 --- a/qw/source/gl_dyn_part.c +++ b/qw/source/gl_dyn_part.c @@ -43,6 +43,7 @@ #include "QF/console.h" #include "QF/qargs.h" #include "QF/sys.h" +#include "QF/varrays.h" #include "client.h" #include "glquake.h" @@ -70,15 +71,8 @@ typedef struct particle_s { ptype_t type; } particle_t; -typedef struct varray_s { - float texcoord[2]; - unsigned char color[4]; - float vertex[3]; -} varray_t; - static particle_t *particles, **freeparticles; static short r_numparticles, numparticles; -//static varray_t *vertex_array; extern qboolean lighthalf; @@ -140,36 +134,34 @@ particle_new_random (ptype_t type, int texnum, vec3_t org, int org_fuzz, R_MaxParticlesCheck Misty-chan: Dynamically change the maximum amount of particles on the fly. - Thanks to a LOT of help from Taniwha, Deek, Mercury, Lordhavoc, and lots of others. + Thanks to a LOT of help from Taniwha, Deek, Mercury, Lordhavoc, and + lots of others. */ void R_MaxParticlesCheck (cvar_t *var) { /* - Catchall. If the user changed the setting to a number less than zero *or* if we had a wacky cfg get past - the init code check, this will make sure we don't have problems. Also note that grabbing the var->int_val is IMPORTANT: - Prevents a segfault since if we grabbed the int_val of cl_max_particles we'd sig11 right here at startup. + Catchall. If the user changed the setting to a number less than zero + *or* if we had a wacky cfg get past the init code check, this will + make sure we don't have problems. Also note that grabbing the + var->int_val is IMPORTANT: + + Prevents a segfault since if we grabbed the int_val of + cl_max_particles we'd sig11 right here at startup. */ r_numparticles = max(var->int_val, 0); - /* - Enable this to see how many particles are ACTUALLY allocated whenever you do a cl_max_particles change - Also note it's damned useful for checking for if this thing is running more than it should! - Con_Printf ("%d", r_numparticles); - */ - - // Be very careful the next time we do something like this. calloc/free are IMPORTANT - // and the compiler doesn't know when we do bad things with them. + // Be very careful the next time we do something like this. + // calloc/free are IMPORTANT and the compiler doesn't know when we + // do bad things with them. free (particles); free (freeparticles); - //free (vertex_array); particles = (particle_t *) calloc (r_numparticles, sizeof (particle_t)); freeparticles = (particle_t **) calloc (r_numparticles, sizeof (particle_t*)); - //vertex_array = (float *) calloc(r_numparticles, sizeof (varray_t)); R_ClearParticles(); } @@ -292,7 +284,7 @@ R_RunSparkEffect (vec3_t org, int count, int ofuzz) (ofuzz / 8) * .75, vec3_origin, cl.time + 99, 12 + (rand () & 3), 96, vec3_origin, vec3_origin); while (count--) - particle_new_random (pt_fallfadespark, part_tex_spark, org, ofuzz * .75, + particle_new_random (pt_fallfadespark, part_tex_spark, org, ofuzz * .75, 1, 96, cl.time + 5, ramp[rand () % 6], lhrandom (0, 255)); } @@ -518,7 +510,7 @@ R_RocketTrail (int type, entity_t *ent) case 2: // blood pscale = 12; case 4: // slight blood - pscale += lhrandom (0, 3); + pscale += lhrandom (0.01, 3); ptex = part_tex_smoke[rand () & 7]; pcolor = 68 + (rand () & 3); for (j = 0; j < 3; j++) { @@ -590,8 +582,7 @@ R_DrawParticles (void) particle_t *part; vec3_t up, right, o_up, o_right; vec3_t up_scale, right_scale, up_right_scale; - int activeparticles, maxparticle, j, k, vnum; - varray_t vertex_array[4]; + int activeparticles, maxparticle, j, k; // LordHavoc: particles should not affect zbuffer glDepthMask (GL_FALSE); @@ -599,27 +590,24 @@ R_DrawParticles (void) VectorScale (vup, 1.5, o_up); VectorScale (vright, 1.5, o_right); - glInterleavedArrays (GL_T2F_C4UB_V3F, 0, (void *) &(vertex_array[0])); - - vertex_array[0].texcoord[0] = 0; vertex_array[0].texcoord[1] = 1; - vertex_array[1].texcoord[0] = 0; vertex_array[1].texcoord[1] = 0; - vertex_array[2].texcoord[0] = 1; vertex_array[2].texcoord[1] = 0; - vertex_array[3].texcoord[0] = 1; vertex_array[3].texcoord[1] = 1; - - vnum = 0; + varray[0].texcoord[0] = 0; varray[0].texcoord[1] = 1; + varray[1].texcoord[0] = 0; varray[1].texcoord[1] = 0; + varray[2].texcoord[0] = 1; varray[2].texcoord[1] = 0; + varray[3].texcoord[0] = 1; varray[3].texcoord[1] = 1; grav = (fast_grav = host_frametime * 800) * 0.05; dvel = 4 * host_frametime; minparticledist = DotProduct (r_refdef.vieworg, vpn) + 32.0f; - activeparticles = 0; maxparticle = -1; j = 0; for (k = 0, part = particles; k < numparticles; k++, part++) { - // LordHavoc: this is probably no longer necessary, as it is checked at the end, but could still happen on weird particle effects, left for safety... + // LordHavoc: this is probably no longer necessary, as it is + // checked at the end, but could still happen on weird particle + // effects, left for safety... if (part->die <= cl.time) { freeparticles[j++] = part; continue; @@ -634,7 +622,8 @@ R_DrawParticles (void) at = (byte *) & d_8to24table[(byte) part->color]; alpha = part->alpha; - if (VectorCompare(part->up, part->right)) { +#define mVectorCompare(x, y) ((x[0] == y[0]) && (x[1] == y[1]) && (x[2] == y[2])) + if (mVectorCompare(part->up, part->right)) { memcpy(up, o_up, sizeof(up)); memcpy(right, o_right, sizeof(right)); } else { @@ -643,17 +632,19 @@ R_DrawParticles (void) } if (lighthalf) { - vertex_array[0].color[0] = (byte) ((int) at[0] >> 1); - vertex_array[0].color[1] = (byte) ((int) at[1] >> 1); - vertex_array[0].color[2] = (byte) ((int) at[2] >> 1); + varray[0].color[0] = (float) ((int) at[0] >> 1) / 255; + varray[0].color[1] = (float) ((int) at[1] >> 1) / 255; + varray[0].color[2] = (float) ((int) at[2] >> 1) / 255; } else { - memcpy(vertex_array[0].color, at, 3); + varray[0].color[0] = (float) at[0] / 255; + varray[0].color[1] = (float) at[1] / 255; + varray[0].color[2] = (float) at[2] / 255; } - vertex_array[0].color[3] = alpha; + varray[0].color[3] = (float) alpha / 255; - memcpy(vertex_array[1].color, vertex_array[0].color, 4); - memcpy(vertex_array[2].color, vertex_array[0].color, 4); - memcpy(vertex_array[3].color, vertex_array[0].color, 4); + memcpy(varray[1].color, varray[0].color, sizeof(varray[0].color)); + memcpy(varray[2].color, varray[0].color, sizeof(varray[0].color)); + memcpy(varray[3].color, varray[0].color, sizeof(varray[0].color)); scale = part->scale; @@ -669,60 +660,21 @@ R_DrawParticles (void) up_right_scale[1] = (up[1] + right[1]) * scale; up_right_scale[2] = (up[2] + right[2]) * scale; - vertex_array[0].vertex[0] = part->org[0] + up_right_scale[0]; - vertex_array[0].vertex[1] = part->org[1] + up_right_scale[1]; - vertex_array[0].vertex[2] = part->org[2] + up_right_scale[2]; + varray[0].vertex[0] = part->org[0] + up_right_scale[0]; + varray[0].vertex[1] = part->org[1] + up_right_scale[1]; + varray[0].vertex[2] = part->org[2] + up_right_scale[2]; - vertex_array[1].vertex[0] = - part->org[0] + (-up_scale[0]) + right_scale[0]; - vertex_array[1].vertex[1] = - part->org[1] + (-up_scale[1]) + right_scale[1]; - vertex_array[1].vertex[2] = - part->org[2] + (-up_scale[2]) + right_scale[2]; + varray[1].vertex[0] = part->org[0] - up_scale[0] + right_scale[0]; + varray[1].vertex[1] = part->org[1] - up_scale[1] + right_scale[1]; + varray[1].vertex[2] = part->org[2] - up_scale[2] + right_scale[2]; - vertex_array[2].vertex[0] = part->org[0] + -up_right_scale[0]; - vertex_array[2].vertex[1] = part->org[1] + -up_right_scale[1]; - vertex_array[2].vertex[2] = part->org[2] + -up_right_scale[2]; - - vertex_array[3].vertex[0] = - part->org[0] + up_scale[0] + (-right_scale[0]); - vertex_array[3].vertex[1] = - part->org[1] + up_scale[1] + (-right_scale[1]); - vertex_array[3].vertex[2] = - part->org[2] + up_scale[2] + (-right_scale[2]); - /* - */ - - /* - vertex_array[0].vertex[0] = - (part->org[0] + ((up[0] + right[0]) * scale)); - vertex_array[0].vertex[1] = - (part->org[1] + ((up[1] + right[1]) * scale)); - vertex_array[0].vertex[2] = - (part->org[2] + ((up[2] + right[2]) * scale)); - - vertex_array[1].vertex[0] = - (part->org[0] + (up[0] * -scale) + (right[0] * scale)); - vertex_array[1].vertex[1] = - (part->org[1] + (up[1] * -scale) + (right[1] * scale)); - vertex_array[1].vertex[2] = - (part->org[2] + (up[2] * -scale) + (right[2] * scale)); - - vertex_array[2].vertex[0] = - (part->org[0] + ((up[0] + right[0]) * -scale)); - vertex_array[2].vertex[1] = - (part->org[1] + ((up[1] + right[1]) * -scale)); - vertex_array[2].vertex[2] = - (part->org[2] + ((up[2] + right[2]) * -scale)); - - vertex_array[3].vertex[0] = - (part->org[0] + (up[0] * scale) + (right[0] * -scale)); - vertex_array[3].vertex[1] = - (part->org[1] + (up[1] * scale) + (right[1] * -scale)); - vertex_array[3].vertex[2] = - (part->org[2] + (up[2] * scale) + (right[2] * -scale)); - */ + varray[2].vertex[0] = part->org[0] - up_right_scale[0]; + varray[2].vertex[1] = part->org[1] - up_right_scale[1]; + varray[2].vertex[2] = part->org[2] - up_right_scale[2]; + varray[3].vertex[0] = part->org[0] + up_scale[0] - right_scale[0]; + varray[3].vertex[1] = part->org[1] + up_scale[1] - right_scale[1]; + varray[3].vertex[2] = part->org[2] + up_scale[2] - right_scale[2]; glBindTexture (GL_TEXTURE_2D, part->tex); glDrawArrays (GL_QUADS, 0, 4); @@ -766,13 +718,6 @@ R_DrawParticles (void) part->org[2] += host_frametime * 90; break; case pt_bloodcloud: -/* - if (Mod_PointInLeaf(part->org, cl.worldmodel)->contents != CONTENTS_EMPTY) - { - part->die = -1; - break; - } -*/ if ((part->alpha -= host_frametime * 64) < 1) { part->die = -1; @@ -798,15 +743,17 @@ R_DrawParticles (void) part->vel[2] -= fast_grav; break; } - // LordHavoc: immediate removal of unnecessary particles (must be done to ensure compactor below operates properly in all cases) + // LordHavoc: immediate removal of unnecessary particles (must + // be done to ensure compactor below operates properly in all + // cases) if (part->die <= cl.time) freeparticles[j++] = part; } k = 0; while (maxparticle >= activeparticles) { *freeparticles[k++] = particles[maxparticle--]; - while (maxparticle >= activeparticles - && particles[maxparticle].die <= cl.time) + while (maxparticle >= activeparticles && + particles[maxparticle].die <= cl.time) maxparticle--; } numparticles = activeparticles; diff --git a/qw/source/gl_rmisc.c b/qw/source/gl_rmisc.c index 7f4d185fc..cc682b55f 100644 --- a/qw/source/gl_rmisc.c +++ b/qw/source/gl_rmisc.c @@ -43,12 +43,15 @@ #include "QF/cvar.h" #include "QF/sys.h" #include "QF/vid.h" +#include "QF/varrays.h" #include "glquake.h" #include "r_dynamic.h" #include "r_local.h" #include "skin.h" +varray_t2f_c4f_v3f_t varray[MAX_VARRAY_VERTS]; + qboolean VID_Is8bit (void); void R_InitBubble (void); @@ -207,6 +210,11 @@ R_Init (void) glEnableClientState (GL_COLOR_ARRAY); glEnableClientState (GL_VERTEX_ARRAY); glEnableClientState (GL_TEXTURE_COORD_ARRAY); + +// glInterleavedArrays(GL_T2F_C4F_N3F_V3F, 0, varray); + glTexCoordPointer (2, GL_FLOAT, sizeof(varray[0]), varray[0].texcoord); + glColorPointer (4, GL_FLOAT, sizeof(varray[0]), varray[0].color); + glVertexPointer (3, GL_FLOAT, sizeof(varray[0]), varray[0].vertex); } void