diff --git a/libs/video/renderer/Makefile.am b/libs/video/renderer/Makefile.am index 00d9f1889..958e2c47d 100644 --- a/libs/video/renderer/Makefile.am +++ b/libs/video/renderer/Makefile.am @@ -15,7 +15,7 @@ endif lib_LTLIBRARIES = $(RENDERER_GL) $(RENDERER_SW) -common_SOURCES = r_cvar.c r_efrag.c r_ent.c r_graph.c r_main.c +common_SOURCES = r_cvar.c r_efrag.c r_ent.c r_graph.c r_main.c r_part.c libQFrenderer_gl_la_LDFLAGS = -version-info 1:0:0 libQFrenderer_gl_la_LIBADD = gl/libgl.la diff --git a/libs/video/renderer/gl/Makefile.am b/libs/video/renderer/gl/Makefile.am index 99572ad37..39566d5e5 100644 --- a/libs/video/renderer/gl/Makefile.am +++ b/libs/video/renderer/gl/Makefile.am @@ -9,6 +9,6 @@ endif noinst_LTLIBRARIES = $(GL) libgl_la_LDFLAGS = -version-info 1:0:0 -libgl_la_SOURCES = gl_draw.c gl_dyn_fires.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_sky.c gl_sky_clip.c gl_textures.c gl_warp.c noisetextures.c +libgl_la_SOURCES = gl_draw.c gl_dyn_fires.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_sky.c gl_sky_clip.c gl_textures.c gl_warp.c noisetextures.c diff --git a/nq/source/gl_dyn_part.c b/libs/video/renderer/gl/gl_dyn_part.c similarity index 100% rename from nq/source/gl_dyn_part.c rename to libs/video/renderer/gl/gl_dyn_part.c diff --git a/nq/source/r_part.c b/libs/video/renderer/r_part.c similarity index 100% rename from nq/source/r_part.c rename to libs/video/renderer/r_part.c diff --git a/libs/video/renderer/sw/Makefile.am b/libs/video/renderer/sw/Makefile.am index 9a444465f..071908767 100644 --- a/libs/video/renderer/sw/Makefile.am +++ b/libs/video/renderer/sw/Makefile.am @@ -13,8 +13,8 @@ libsw_la_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 draw.c \ nonintel.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_rsky.c sw_rsprite.c sw_rsurf.c \ - sw_skin.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 \ d_draw.S d_draw16.S d_parta.S d_polysa.S d_scana.S d_spr8.S \ d_varsa.S surf16.S surf8.S sw_raclipa.S sw_raliasa.S sw_rdrawa.S \ sw_redgea.S sw_rvarsa.S \ diff --git a/nq/source/sw_rpart.c b/libs/video/renderer/sw/sw_rpart.c similarity index 100% rename from nq/source/sw_rpart.c rename to libs/video/renderer/sw/sw_rpart.c diff --git a/nq/source/Makefile.am b/nq/source/Makefile.am index b629769e6..6e74675de 100644 --- a/nq/source/Makefile.am +++ b/nq/source/Makefile.am @@ -71,7 +71,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_screen.c \ cl_parse.c cl_tent.c \ console.c keys.c sbar.c \ - r_part.c r_view.c locs.c pcx.c tga.c + r_view.c locs.c pcx.c tga.c server_SOURCES= host.c host_cmd.c pr_cmds.c sv_cvar.c sv_main.c \ sv_move.c sv_phys.c sv_progs.c sv_user.c @@ -82,7 +82,7 @@ combined_SOURCES= $(common_SOURCES) $(client_SOURCES) $(server_SOURCES) \ # Software-rendering targets # # ... Common stuff -soft_SOURCES= sw_rpart.c sw_view.c +soft_SOURCES= sw_view.c # ... Linux FBDev nq_fbdev_SOURCES= $(combined_SOURCES) $(soft_SOURCES) @@ -112,7 +112,7 @@ nq_x11_DEPENDENCIES=../../libs/video/renderer/libQFrenderer_sw.la ../../libs/mod # OpenGL-using targets # ... Common stuff -ogl_SOURCES= gl_dyn_part.c gl_view.c +ogl_SOURCES= gl_view.c # ... 3Dfx Voodoo 1 and 2 SVGAlib-based console GL nq_3dfx_SOURCES= $(combined_SOURCES) $(ogl_SOURCES) diff --git a/qw/source/Makefile.am b/qw/source/Makefile.am index f203c7dfc..a57b0e886 100644 --- a/qw/source/Makefile.am +++ b/qw/source/Makefile.am @@ -105,7 +105,7 @@ client_SOURCES= cl_cam.c cl_cmd.c cl_cvar.c cl_demo.c cl_ents.c cl_input.c \ # # ... Common stuff -soft_SOURCES= sw_rpart.c sw_view.c +soft_SOURCES= sw_view.c # ... Linux FBDev qw_client_fbdev_SOURCES= $(common_SOURCES) $(client_SOURCES) $(soft_SOURCES) @@ -136,7 +136,7 @@ qw_client_x11_DEPENDENCIES=../../libs/video/renderer/libQFrenderer_sw.la ../../l # OpenGL-using clients # # ... Common stuff -ogl_SOURCES= gl_dyn_part.c gl_view.c +ogl_SOURCES= gl_view.c # ... 3Dfx Voodoo 1 and 2 SVGAlib-based console GL qw_client_3dfx_SOURCES= $(common_SOURCES) $(client_SOURCES) $(ogl_SOURCES) diff --git a/qw/source/gl_dyn_part.c b/qw/source/gl_dyn_part.c deleted file mode 100644 index 9e73690a1..000000000 --- a/qw/source/gl_dyn_part.c +++ /dev/null @@ -1,756 +0,0 @@ -/* - gl_dyn_part.c - - OpenGL particle system. - - 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 -#endif -#ifdef HAVE_STRINGS_H -# include -#endif - -#include - -#include "QF/cmd.h" -#include "QF/compat.h" -#include "QF/console.h" -#include "QF/qargs.h" -#include "QF/quakefs.h" -#include "QF/render.h" -#include "QF/sys.h" -#include "QF/varrays.h" - -#include "glquake.h" -#include "r_dynamic.h" -#include "r_shared.h" - -static particle_t *particles, **freeparticles; -static short r_numparticles, numparticles; - -extern qboolean lighthalf; - -extern cvar_t *cl_max_particles; - -extern int part_tex_dot; -extern int part_tex_spark; -extern int part_tex_smoke[8]; -extern int part_tex_smoke_ring[8]; - -int ramp[8] = { 0x6d, 0x6b, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 }; - - -inline particle_t * -particle_new (ptype_t type, int texnum, vec3_t org, float scale, vec3_t vel, - float die, byte color, byte alpha, vec3_t up, vec3_t right) -{ - particle_t *part; - - if (numparticles >= r_numparticles) { - // Con_Printf("FAILED PARTICLE ALLOC!\n"); - return NULL; - } - - part = &particles[numparticles++]; - - part->type = type; - VectorCopy (org, part->org); - VectorCopy (vel, part->vel); - part->die = die; - part->color = color; - part->alpha = alpha; - part->tex = texnum; - part->scale = scale; - - VectorScale (up, 1.5, part->up); - VectorScale (right, 1.5, part->right); - - return part; -} - - -inline particle_t * -particle_new_random (ptype_t type, int texnum, vec3_t org, int org_fuzz, - float scale, int vel_fuzz, float die, byte color, - byte alpha) -{ - vec3_t porg, pvel; - int j; - - for (j = 0; j < 3; j++) { - if (org_fuzz) - porg[j] = lhrandom (-org_fuzz, org_fuzz) + org[j]; - if (vel_fuzz) - pvel[j] = lhrandom (-vel_fuzz, vel_fuzz); - } - return particle_new (type, texnum, porg, scale, pvel, die, color, alpha, vec3_origin, vec3_origin); -} - - -/* - 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. -*/ -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. - */ - r_numparticles = max(var->int_val, 0); - - // 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); - - particles = (particle_t *) - calloc (r_numparticles, sizeof (particle_t)); - freeparticles = (particle_t **) - calloc (r_numparticles, sizeof (particle_t*)); - - R_ClearParticles(); -} - - -void -R_Particles_Init_Cvars (void) -{ - // Misty-chan: This is a cvar that does callbacks. Whenever it - // changes, it calls the function R_MaxParticlesCheck and therefore - // is very nifty. - Cvar_Get ("cl_max_particles", "2048", CVAR_ARCHIVE, R_MaxParticlesCheck, - "Maximum amount of particles to display. No maximum, minimum is 0, although it's best to use r_particles 0 instead."); -} - - -void -R_ClearParticles (void) -{ - numparticles = 0; -} - - -void -R_ReadPointFile_f (void) -{ - QFile *f; - vec3_t org; - int r; - int c; - char name[MAX_OSPATH], *mapname, *t1; - - mapname = strdup (r_worldentity.model->name); - if (!mapname) - Sys_Error ("Can't duplicate mapname!"); - t1 = strrchr (mapname, '.'); - if (!t1) - Sys_Error ("Can't find .!"); - t1[0] = '\0'; - - snprintf (name, sizeof (name), "%s.pts", mapname); - free (mapname); - - COM_FOpenFile (name, &f); - if (!f) { - Con_Printf ("couldn't open %s\n", name); - return; - } - - Con_Printf ("Reading %s...\n", name); - c = 0; - for (;;) { - char buf[64]; - - Qgets (f, buf, sizeof (buf)); - r = sscanf (buf, "%f %f %f\n", &org[0], &org[1], &org[2]); - if (r != 3) - break; - c++; - - if (!particle_new (pt_static, part_tex_dot, org, 1.5, vec3_origin, - 99999, (-c) & 15, 255, vec3_origin, vec3_origin)) { - Con_Printf ("Not enough free particles\n"); - break; - } - } - - Qclose (f); - Con_Printf ("%i points read\n", c); -} - - -void -R_ParticleExplosion (vec3_t org) -{ - if (!r_particles->int_val) - return; - - particle_new_random (pt_smokecloud, part_tex_smoke[rand () & 7], org, 4, 30, - 8, r_realtime + 5, (rand () & 7) + 8, - 128 + (rand () & 63)); -} - - -void -R_ParticleExplosion2 (vec3_t org, int colorStart, int colorLength) -{ - int i; - int colorMod = 0; - - if (!r_particles->int_val) - return; - - for (i = 0; i < 512; i++) { - particle_new_random (pt_blob, part_tex_dot, org, 16, 2, 256, (r_realtime + 0.3), (colorStart + (colorMod % colorLength)), 255); - colorMod++; - } -} - - -void -R_BlobExplosion (vec3_t org) -{ - int i; - - if (!r_particles->int_val) - return; - - for (i = 0; i < 512; i++) { - particle_new_random (pt_blob, part_tex_dot, org, 12, 2, 256, - (r_realtime + 1 + (rand () & 8) * 0.05), - (66 + rand () % 6), 255); - } - for (i = 0; i < 512; i++) { - particle_new_random (pt_blob2, part_tex_dot, org, 12, 2, 256, - (r_realtime + 1 + (rand () & 8) * 0.05), - (150 + rand () % 6), 255); - } -} - - -static void -R_RunSparkEffect (vec3_t org, int count, int ofuzz) -{ - if (!r_particles->int_val) - return; - - particle_new (pt_smokecloud, part_tex_smoke[rand () & 7], org, - (ofuzz / 8) * .75, vec3_origin, r_realtime + 99, - 12 + (rand () & 3), 96, vec3_origin, vec3_origin); - while (count--) - particle_new_random (pt_fallfadespark, part_tex_spark, org, ofuzz * .75, - 1, 96, r_realtime + 5, ramp[rand () % 6], - lhrandom (0, 255)); -} - - -static void -R_RunGunshotEffect (vec3_t org, int count) -{ - int scale; - - if (!r_particles->int_val) - return; - - if (count > 6) - scale = 3; - else - scale = 2; - - R_RunSparkEffect (org, count * 10, 8 * scale); - return; -} - - -static void -R_BloodPuff (vec3_t org, int count) -{ - if (!r_particles->int_val) - return; - - particle_new (pt_bloodcloud, part_tex_smoke[rand () & 7], org, 9, - vec3_origin, r_realtime + 99, 68 + (rand () & 3), 128, - vec3_origin, vec3_origin); -} - - -void -R_RunPuffEffect (vec3_t org, particle_effect_t type, byte count) -{ - if (!r_particles->int_val) - return; - - switch (type) { - case PE_GUNSHOT: - R_RunGunshotEffect (org, count); - break; - case PE_BLOOD: - R_BloodPuff (org, count); - break; - case PE_LIGHTNINGBLOOD: - R_BloodPuff (org, 5 + (rand () & 1)); - break; - default: - break; - } -} - - -void -R_RunParticleEffect (vec3_t org, int color, int count) -{ - int i, j, scale; - vec3_t porg; - - if (!r_particles->int_val) - return; - - if (count > 130) - scale = 3; - else if (count > 20) - scale = 2; - else - scale = 1; - - for (i = 0; i < count; i++) { - for (j = 0; j < 3; j++) { - porg[j] = org[j] + scale * ((rand () & 15) - 8); - } - particle_new (pt_grav, part_tex_dot, porg, 1.5, vec3_origin, - (r_realtime + 0.1 * (rand () % 5)), - (color & ~7) + (rand () & 7), 255, vec3_origin, vec3_origin); - } -} - - -void -R_RunSpikeEffect (vec3_t org, particle_effect_t type) -{ - switch (type) { - case PE_SPIKE: - R_RunSparkEffect (org, 5, 8); - break; - case PE_SUPERSPIKE: - R_RunSparkEffect (org, 10, 8); - break; - case PE_KNIGHTSPIKE: - R_RunSparkEffect (org, 10, 8); - break; - case PE_WIZSPIKE: - R_RunSparkEffect (org, 15, 16); - break; - default: - break; - } -} - - -void -R_LavaSplash (vec3_t org) -{ - int i, j; - float vel; - vec3_t dir, porg, pvel; - - if (!r_particles->int_val) - return; - - for (i = -8; i < 8; i++) { - for (j = -8; j < 8; j++) { - dir[0] = j * 16 + (rand () & 7); - dir[1] = i * 16 + (rand () & 7); - dir[2] = 256; - - porg[0] = org[0] + dir[0]; - porg[1] = org[1] + dir[1]; - porg[2] = org[2] + (rand () & 63); - - VectorNormalize (dir); - vel = 50 + (rand () & 63); - VectorScale (dir, vel, pvel); - particle_new (pt_grav, part_tex_dot, porg, 3, pvel, - (r_realtime + 2 + (rand () & 31) * 0.02), - (224 + (rand () & 7)), 193, vec3_origin, vec3_origin); - } - } -} - - -void -R_TeleportSplash (vec3_t org) -{ - int i, j, k; - float vel; - vec3_t dir, porg, pvel; - - if (!r_particles->int_val) - return; - - for (i = -16; i < 16; i += 4) - for (j = -16; j < 16; j += 4) - for (k = -24; k < 32; k += 4) { - dir[0] = j * 8; - dir[1] = i * 8; - dir[2] = k * 8; - - porg[0] = org[0] + i + (rand () & 3); - porg[1] = org[1] + j + (rand () & 3); - porg[2] = org[2] + k + (rand () & 3); - - VectorNormalize (dir); - vel = 50 + (rand () & 63); - VectorScale (dir, vel, pvel); - particle_new (pt_grav, part_tex_spark, porg, 0.6, pvel, - (r_realtime + 0.2 + (rand () & 7) * 0.02), - (7 + (rand () & 7)), 255, vec3_origin, vec3_origin); - } -} - - -void -R_RocketTrail (int type, entity_t *ent) -{ - vec3_t vec, subtract; - float len, dist; - int j, ptex; - ptype_t ptype; - vec3_t porg, pvel, up, right; - float pdie, pscale; - byte palpha, pcolor; - - if (type == 0) - R_AddFire (ent->old_origin, ent->origin, ent); - - if (!r_particles->int_val) - return; - - VectorSubtract (ent->origin, ent->old_origin, vec); - len = VectorNormalize (vec); - while (len > 0) { - VectorCopy (vec3_origin, up); - VectorCopy (vec3_origin, right); - VectorCopy (vec3_origin, pvel); - pdie = r_realtime + 2; - ptype = pt_static; - ptex = part_tex_dot; - palpha = 255; - pcolor = 0; - pscale = 6; - dist = 40; - - switch (type) { - case 0: // rocket trail - pdie = r_realtime + 60; -// ptype = pt_smokering; // Mercury's Rings - ptype = pt_smoke; - pscale = lhrandom (6, 8); -// pcolor = (rand () & 255); // Misty-chan's Easter Egg - pcolor = (rand () & 3) + 12; - palpha = 128 + (rand () & 31); -// VectorVectors(vec, right, up); // Mercury's Rings - VectorCopy (ent->old_origin, porg); -// ptex = part_tex_smoke_ring[rand () & 7]; // Mercury's Rings - ptex = part_tex_smoke[rand () & 7]; - break; - case 1: // grenade trail - ptype = pt_smoke; - pscale = lhrandom (7, 10); -// pcolor = (rand () & 255); // Misty-chan's Easter Egg - pcolor = (rand () & 3); - palpha = 128 + (rand () & 31); - VectorCopy (ent->old_origin, porg); - ptex = part_tex_smoke[rand () & 7]; - break; - case 2: // blood - pscale = 5; - case 4: // slight blood - pscale += lhrandom (1, 4); - ptex = part_tex_smoke[rand () & 7]; - pcolor = 68 + (rand () & 3); - for (j = 0; j < 3; j++) { - pvel[j] = lhrandom (-3, 3) * type; - porg[j] = ent->old_origin[j] + lhrandom (-1.5, 1.5); - } - ptype = pt_grav; - break; - case 6: // voor trail -// Use smoke ring effects here, once merged with nq? --Despair - dist = 3; - pcolor = 9 * 16 + 8 + (rand () & 3); - ptype = pt_static; - pscale = lhrandom (.75, 1.5); - pdie = r_realtime + 0.3; - for (j = 0; j < 3; j++) - porg[j] = ent->old_origin[j] + lhrandom (-8, 8); - break; - case 3: - case 5: // tracer - { - static int tracercount; - - dist = 3; - pdie = r_realtime + 0.5; - ptype = pt_static; - pscale = lhrandom (1.5, 3); - if (type == 3) - pcolor = 52 + ((tracercount & 4) << 1); - else - pcolor = 230 + ((tracercount & 4) << 1); - - tracercount++; - - VectorCopy (ent->old_origin, porg); - if (tracercount & 1) { - pvel[0] = 30 * vec[1]; - pvel[1] = 30 * -vec[0]; - } else { - pvel[0] = 30 * -vec[1]; - pvel[1] = 30 * vec[0]; - } - break; - } - } - - VectorScale (vec, min(dist, len), subtract); - VectorAdd (ent->old_origin, subtract, ent->old_origin); - len -= dist; - - particle_new (ptype, ptex, porg, pscale, pvel, pdie, pcolor, palpha, - up, right); - } -} - - -void -R_DrawParticles (void) -{ - byte i; - float grav, fast_grav, dvel; - float minparticledist; - unsigned char *at; - byte alpha; - float scale; - 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; - - // LordHavoc: particles should not affect zbuffer - glDepthMask (GL_FALSE); - - VectorScale (vup, 1.5, o_up); - VectorScale (vright, 1.5, o_right); - - 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 = r_frametime * 800) * 0.05; - dvel = 4 * r_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... - if (part->die <= r_realtime) { - freeparticles[j++] = part; - continue; - } - maxparticle = k; - activeparticles++; - - // Don't render particles too close to us. - // Note, we must still do physics and such on them. - if (!(DotProduct (part->org, vpn) < minparticledist) && - r_particles->int_val) { - at = (byte *) & d_8to24table[(byte) part->color]; - alpha = part->alpha; - -#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 { - memcpy(up, part->up, sizeof(up)); - memcpy(right, part->right, sizeof(right)); - } - - if (lighthalf) { - 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 { - varray[0].color[0] = (float) at[0] / 255; - varray[0].color[1] = (float) at[1] / 255; - varray[0].color[2] = (float) at[2] / 255; - } - varray[0].color[3] = (float) alpha / 255; - - 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; - - up_scale[0] = up[0] * scale; - up_scale[1] = up[1] * scale; - up_scale[2] = up[2] * scale; - - right_scale[0] = right[0] * scale; - right_scale[1] = right[1] * scale; - right_scale[2] = right[2] * scale; - - up_right_scale[0] = (up[0] + right[0]) * scale; - up_right_scale[1] = (up[1] + right[1]) * scale; - up_right_scale[2] = (up[2] + right[2]) * scale; - - 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]; - - 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]; - - 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); - } - - for (i = 0; i < 3; i++) - part->org[i] += part->vel[i] * r_frametime; - - switch (part->type) { - case pt_static: - break; - case pt_blob: - for (i = 0; i < 3; i++) - part->vel[i] += part->vel[i] * dvel; - part->vel[2] -= grav; - break; - case pt_blob2: - for (i = 0; i < 2; i++) - part->vel[i] -= part->vel[i] * dvel; - part->vel[2] -= grav; - break; - case pt_grav: - part->vel[2] -= grav; - break; - case pt_smoke: - if ((part->alpha -= r_frametime * 90) < 1) - part->die = -1; - part->scale += r_frametime * 6; -// part->org[2] += r_frametime * 30; - break; - case pt_smokering: - if ((part->alpha -= r_frametime * 130) < 1) - part->die = -1; - part->scale += r_frametime * 10; -// part->org[2] += r_frametime * 30; - break; - case pt_smokecloud: - if ((part->alpha -= r_frametime * 128) < 1) - { - part->die = -1; - break; - } - part->scale += r_frametime * 60; - part->org[2] += r_frametime * 30; - break; - case pt_bloodcloud: - if ((part->alpha -= r_frametime * 64) < 1) - { - part->die = -1; - break; - } - part->scale += r_frametime * 4; - part->vel[2] -= grav; - break; - case pt_fadespark: - if ((part->alpha -= r_frametime * 256) < 1) - part->die = -1; - part->vel[2] -= grav; - break; - case pt_fadespark2: - if ((part->alpha -= r_frametime * 512) < 1) - part->die = -1; - part->vel[2] -= grav; - break; - case pt_fallfadespark: - if ((part->alpha -= r_frametime * 256) < 1) - part->die = -1; - part->vel[2] -= fast_grav; - break; - default: - Con_DPrintf ("unhandled particle type %d\n", part->type); - break; - } - // LordHavoc: immediate removal of unnecessary particles (must - // be done to ensure compactor below operates properly in all - // cases) - if (part->die <= r_realtime) - freeparticles[j++] = part; - } - k = 0; - while (maxparticle >= activeparticles) { - *freeparticles[k++] = particles[maxparticle--]; - while (maxparticle >= activeparticles && - particles[maxparticle].die <= r_realtime) - maxparticle--; - } - numparticles = activeparticles; - - glColor3ubv (lighthalf_v); - glDepthMask (GL_TRUE); -} diff --git a/qw/source/sw_rpart.c b/qw/source/sw_rpart.c deleted file mode 100644 index c6d9d975d..000000000 --- a/qw/source/sw_rpart.c +++ /dev/null @@ -1,601 +0,0 @@ -/* - sw_rpart.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 - -#include "QF/compat.h" -#include "QF/console.h" -#include "QF/qargs.h" -#include "QF/quakefs.h" -#include "QF/render.h" - -#include "r_cvar.h" -#include "r_dynamic.h" -#include "r_local.h" - -int ramp1[8] = { 0x6f, 0x6d, 0x6b, 0x69, 0x67, 0x65, 0x63, 0x61 }; -int ramp2[8] = { 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x68, 0x66 }; -int ramp3[8] = { 0x6d, 0x6b, 6, 5, 4, 3 }; - -particle_t *active_particles, *free_particles; - -particle_t *particles; -int r_numparticles; - -vec3_t r_pright, r_pup, r_ppn; - -/* - R_MaxParticlesCheck - - Misty-chan: EXTREME heavy lifting and bugfixing thanks goes out to taniwha - - I built this, and he got it working :) -*/ -void -R_MaxParticlesCheck (cvar_t *var) -{ - // Do not use 0 in this! sw doesn't grok 0 and it'll segfault if we do! - r_numparticles = max(var->int_val, 1); - - /* - Debugging code. will print what the above was set to, and is also useful - for checking if this is accidentally being run all the time. - Con_Printf ("%d", r_numparticles); - */ - - if (particles) - free (particles); - - particles = (particle_t *) calloc (r_numparticles, sizeof (particle_t)); - - R_ClearParticles (); -} - - -void -R_Particles_Init_Cvars (void) -{ - // Does a callback to R_MaxParticleCheck when the cvar changes. Neat trick. - Cvar_Get ("cl_max_particles", "2048", CVAR_ARCHIVE, R_MaxParticlesCheck, - "Maximum amount of particles to display. No maximum, minimum is 1."); -} - - -void -R_ClearParticles (void) -{ - int i; - - free_particles = &particles[0]; - active_particles = NULL; - - for (i = 0; i < r_numparticles; i++) - particles[i].next = &particles[i + 1]; - particles[r_numparticles - 1].next = NULL; -} - - -void -R_ReadPointFile_f (void) -{ - QFile *f; - vec3_t org; - int r; - int c; - particle_t *p; - char name[MAX_OSPATH]; - -// FIXME snprintf (name, sizeof (name), "maps/%s.pts", sv.name); - - COM_FOpenFile (name, &f); - if (!f) { - Con_Printf ("couldn't open %s\n", name); - return; - } - - Con_Printf ("Reading %s...\n", name); - c = 0; - for (;;) { - char buf[64]; - - Qgets (f, buf, sizeof (buf)); - r = sscanf (buf, "%f %f %f\n", &org[0], &org[1], &org[2]); - if (r != 3) - break; - c++; - - if (!free_particles) { - Con_Printf ("Not enough free particles\n"); - break; - } - p = free_particles; - free_particles = p->next; - p->next = active_particles; - active_particles = p; - - p->die = 99999; - p->color = (-c) & 15; - p->type = pt_static; - VectorCopy (vec3_origin, p->vel); - VectorCopy (org, p->org); - } - - Qclose (f); - Con_Printf ("%i points read\n", c); -} - - -void -R_RunSpikeEffect (vec3_t pos, particle_effect_t type) -{ - switch (type) { - case PE_WIZSPIKE: - R_RunParticleEffect (pos, 20, 30); - break; - case PE_KNIGHTSPIKE: - R_RunParticleEffect (pos, 226, 20); - break; - case PE_SPIKE: - R_RunParticleEffect (pos, 0, 10); - break; - case PE_SUPERSPIKE: - R_RunParticleEffect (pos, 0, 20); - break; - default: - break; - } -} - - -void -R_RunPuffEffect (vec3_t pos, particle_effect_t type, byte cnt) -{ - if (!r_particles->int_val) - return; - - switch (type) { - case PE_GUNSHOT: - R_RunParticleEffect (pos, 0, 20 * cnt); - break; - case PE_BLOOD: - R_RunParticleEffect (pos, 73, 20 * cnt); - break; - case PE_LIGHTNINGBLOOD: - R_RunParticleEffect (pos, 225, 50); - break; - default: - break; - } -} - - -void -R_ParticleExplosion (vec3_t org) -{ - int i, j; - particle_t *p; - - if (!r_particles->int_val) - return; - - for (i = 0; i < 1024; i++) { - if (!free_particles) - return; - p = free_particles; - free_particles = p->next; - p->next = active_particles; - active_particles = p; - - p->die = r_realtime + 5; - p->color = ramp1[0]; - p->ramp = rand () & 3; - if (i & 1) { - p->type = pt_explode; - for (j = 0; j < 3; j++) { - p->org[j] = org[j] + ((rand () % 32) - 16); - p->vel[j] = (rand () % 512) - 256; - } - } else { - p->type = pt_explode2; - for (j = 0; j < 3; j++) { - p->org[j] = org[j] + ((rand () % 32) - 16); - p->vel[j] = (rand () % 512) - 256; - } - } - } -} - - -void -R_ParticleExplosion2 (vec3_t org, int colorStart, int colorLength) -{ - int i, j; - particle_t *p; - int colorMod = 0; - - for (i=0; i<512; i++) - { - if (!free_particles) - return; - p = free_particles; - free_particles = p->next; - p->next = active_particles; - active_particles = p; - - p->die = r_realtime + 0.3; - p->color = colorStart + (colorMod % colorLength); - colorMod++; - - p->type = pt_blob; - for (j=0 ; j<3 ; j++) - { - p->org[j] = org[j] + ((rand()%32)-16); - p->vel[j] = (rand()%512)-256; - } - } -} - - -void -R_BlobExplosion (vec3_t org) -{ - int i, j; - particle_t *p; - - if (!r_particles->int_val) - return; - - for (i = 0; i < 1024; i++) { - if (!free_particles) - return; - p = free_particles; - free_particles = p->next; - p->next = active_particles; - active_particles = p; - - p->die = r_realtime + 1 + (rand () & 8) * 0.05; - - if (i & 1) { - p->type = pt_blob; - p->color = 66 + rand () % 6; - for (j = 0; j < 3; j++) { - p->org[j] = org[j] + ((rand () % 32) - 16); - p->vel[j] = (rand () % 512) - 256; - } - } else { - p->type = pt_blob2; - p->color = 150 + rand () % 6; - for (j = 0; j < 3; j++) { - p->org[j] = org[j] + ((rand () % 32) - 16); - p->vel[j] = (rand () % 512) - 256; - } - } - } -} - - -void -R_RunParticleEffect (vec3_t org, int color, int count) -{ - int i, j; - particle_t *p; - int scale; - - if (!r_particles->int_val) - return; - - if (count > 130) - scale = 3; - else if (count > 20) - scale = 2; - else - scale = 1; - - for (i = 0; i < count; i++) { - if (!free_particles) - return; - p = free_particles; - free_particles = p->next; - p->next = active_particles; - active_particles = p; - - p->die = r_realtime + 0.1 * (rand () % 5); - p->color = (color & ~7) + (rand () & 7); - p->type = pt_grav; - for (j = 0; j < 3; j++) { - p->org[j] = org[j] + scale * ((rand () & 15) - 8); - p->vel[j] = vec3_origin[j]; // + (rand()%300)-150; - } - } -} - - -void -R_LavaSplash (vec3_t org) -{ - int i, j, k; - particle_t *p; - float vel; - vec3_t dir; - - if (!r_particles->int_val) - return; - - for (i = -16; i < 16; i++) - for (j = -16; j < 16; j++) - for (k = 0; k < 1; k++) { - if (!free_particles) - return; - p = free_particles; - free_particles = p->next; - p->next = active_particles; - active_particles = p; - - p->die = r_realtime + 2 + (rand () & 31) * 0.02; - p->color = 224 + (rand () & 7); - p->type = pt_grav; - - dir[0] = j * 8 + (rand () & 7); - dir[1] = i * 8 + (rand () & 7); - dir[2] = 256; - - p->org[0] = org[0] + dir[0]; - p->org[1] = org[1] + dir[1]; - p->org[2] = org[2] + (rand () & 63); - - VectorNormalize (dir); - vel = 50 + (rand () & 63); - VectorScale (dir, vel, p->vel); - } -} - - -void -R_TeleportSplash (vec3_t org) -{ - int i, j, k; - particle_t *p; - float vel; - vec3_t dir; - - if (!r_particles->int_val) - return; - - for (i = -16; i < 16; i += 4) - for (j = -16; j < 16; j += 4) - for (k = -24; k < 32; k += 4) { - if (!free_particles) - return; - p = free_particles; - free_particles = p->next; - p->next = active_particles; - active_particles = p; - - p->die = r_realtime + 0.2 + (rand () & 7) * 0.02; - p->color = 7 + (rand () & 7); - p->type = pt_grav; - - dir[0] = j * 8; - dir[1] = i * 8; - dir[2] = k * 8; - - p->org[0] = org[0] + i + (rand () & 3); - p->org[1] = org[1] + j + (rand () & 3); - p->org[2] = org[2] + k + (rand () & 3); - - VectorNormalize (dir); - vel = 50 + (rand () & 63); - VectorScale (dir, vel, p->vel); - } -} - - -void -R_RocketTrail (int type, entity_t *ent) -{ - vec3_t vec; - float len; - int j; - particle_t *p; - - if (!r_particles->int_val) - return; - - VectorSubtract (ent->origin, ent->old_origin, vec); - len = VectorNormalize (vec); - while (len > 0) { - len -= 3; - - if (!free_particles) - return; - p = free_particles; - free_particles = p->next; - p->next = active_particles; - active_particles = p; - - VectorCopy (vec3_origin, p->vel); - p->die = r_realtime + 2; - - if (type == 4) { // slight blood - p->type = pt_slowgrav; - p->color = 67 + (rand () & 3); - for (j = 0; j < 3; j++) - p->org[j] = ent->old_origin[j] + ((rand () % 6) - 3); - len -= 3; - } else if (type == 2) { // blood - p->type = pt_slowgrav; - p->color = 67 + (rand () & 3); - for (j = 0; j < 3; j++) - p->org[j] = ent->old_origin[j] + ((rand () % 6) - 3); - } else if (type == 6) { // voor trail - p->color = 9 * 16 + 8 + (rand () & 3); - p->type = pt_static; - p->die = r_realtime + 0.3; - for (j = 0; j < 3; j++) - p->org[j] = ent->old_origin[j] + ((rand () & 15) - 8); - } else if (type == 1) { // smoke smoke - p->ramp = (rand () & 3) + 2; - p->color = ramp3[(int) p->ramp]; - p->type = pt_fire; - for (j = 0; j < 3; j++) - p->org[j] = ent->old_origin[j] + ((rand () % 6) - 3); - } else if (type == 0) { // rocket trail - p->ramp = (rand () & 3); - p->color = ramp3[(int) p->ramp]; - p->type = pt_fire; - for (j = 0; j < 3; j++) - p->org[j] = ent->old_origin[j] + ((rand () % 6) - 3); - } else if (type == 3 || type == 5) { // tracer - static int tracercount; - - p->die = r_realtime + 0.5; - p->type = pt_static; - if (type == 3) - p->color = 52 + ((tracercount & 4) << 1); - else - p->color = 230 + ((tracercount & 4) << 1); - - tracercount++; - - VectorCopy (ent->old_origin, p->org); - if (tracercount & 1) { - p->vel[0] = 30 * vec[1]; - p->vel[1] = 30 * -vec[0]; - } else { - p->vel[0] = 30 * -vec[1]; - p->vel[1] = 30 * vec[0]; - } - - } - - VectorAdd (ent->old_origin, vec, ent->old_origin); - } -} - - -void -R_DrawParticles (void) -{ - particle_t *p, **particle; - float grav; - int i; - float time2, time3; - float time1; - float dvel; - float frametime; - - D_StartParticles (); - - VectorScale (vright, xscaleshrink, r_pright); - VectorScale (vup, yscaleshrink, r_pup); - VectorCopy (vpn, r_ppn); - - frametime = r_frametime; - time3 = frametime * 15; - time2 = frametime * 10; // 15; - time1 = frametime * 5; - grav = frametime * 800 * 0.05; - dvel = 4 * frametime; - - for (particle = &active_particles; *particle;) { - if ((*particle)->die < r_realtime) { - p = (*particle)->next; - (*particle)->next = free_particles; - free_particles = (*particle); - (*particle) = p; - } else { - p = *particle; - particle = &(*particle)->next; - - D_DrawParticle (p); - - p->org[0] += p->vel[0] * frametime; - p->org[1] += p->vel[1] * frametime; - p->org[2] += p->vel[2] * frametime; - - switch (p->type) { - case pt_static: - break; - case pt_fire: - p->ramp += time1; - if (p->ramp >= 6) - p->die = -1; - else - p->color = ramp3[(int) p->ramp]; - p->vel[2] += grav; - break; - - case pt_explode: - p->ramp += time2; - if (p->ramp >= 8) - p->die = -1; - else - p->color = ramp1[(int) p->ramp]; - for (i = 0; i < 3; i++) - p->vel[i] += p->vel[i] * dvel; - p->vel[2] -= grav; - break; - - case pt_explode2: - p->ramp += time3; - if (p->ramp >= 8) - p->die = -1; - else - p->color = ramp2[(int) p->ramp]; - for (i = 0; i < 3; i++) - p->vel[i] -= p->vel[i] * frametime; - p->vel[2] -= grav; - break; - - case pt_blob: - for (i = 0; i < 3; i++) - p->vel[i] += p->vel[i] * dvel; - p->vel[2] -= grav; - break; - - case pt_blob2: - for (i = 0; i < 2; i++) - p->vel[i] -= p->vel[i] * dvel; - p->vel[2] -= grav; - break; - - case pt_slowgrav: - case pt_grav: - p->vel[2] -= grav; - break; - default: - Con_DPrintf ("unhandled particle type %d\n", p->type); - break; - } - } - } - D_EndParticles (); -}