From 372c89b4799f444a7fe9de1fddbfcf7d08225f00 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sun, 19 Dec 2021 13:38:50 +0900 Subject: [PATCH] [particles] Merge physics code The particle physics is called by the renderer. --- include/r_internal.h | 1 + libs/video/renderer/gl/gl_dyn_part.c | 33 +----------- libs/video/renderer/glsl/glsl_particles.c | 63 +---------------------- libs/video/renderer/r_part.c | 34 ++++++++++++ libs/video/renderer/sw/sw_rpart.c | 28 +--------- libs/video/renderer/sw32/sw32_rpart.c | 28 +--------- 6 files changed, 40 insertions(+), 147 deletions(-) diff --git a/include/r_internal.h b/include/r_internal.h index a1ea3d17c..09f4f3878 100644 --- a/include/r_internal.h +++ b/include/r_internal.h @@ -51,6 +51,7 @@ void R_InitEfrags (void); void R_ClearState (void); void R_InitSky (struct texture_s *mt); // called at level load void R_Textures_Init (void); +void R_RunParticles (float dT); void R_RenderView (void); // must set r_refdef first void R_ViewChanged (void); // must set r_refdef first // called whenever r_refdef or vid change diff --git a/libs/video/renderer/gl/gl_dyn_part.c b/libs/video/renderer/gl/gl_dyn_part.c index 5b0db4da3..b915880e8 100644 --- a/libs/video/renderer/gl/gl_dyn_part.c +++ b/libs/video/renderer/gl/gl_dyn_part.c @@ -124,6 +124,8 @@ gl_R_DrawParticles (void) if (!r_particles->int_val) return; + R_RunParticles (vr_data.frametime); + qfglBindTexture (GL_TEXTURE_2D, gl_part_tex); // LordHavoc: particles should not affect zbuffer qfglDepthMask (GL_FALSE); @@ -135,27 +137,8 @@ gl_R_DrawParticles (void) vacount = 0; VA = particleVertexArray; - vec4f_t gravity = {0, 0, -vr_data.gravity, 0}; - - unsigned j = 0; for (unsigned i = 0; i < numparticles; i++) { particle_t *p = &particles[i]; - partparm_t *parm = &partparams[i]; - - if (p->live <= 0 || p->ramp >= parm->ramp_max - || p->alpha <= 0 || p->scale <= 0) { - continue; - } - const int *ramp = partramps[j]; - if (i > j) { - particles[j] = *p; - partparams[j] = *parm; - partramps[j] = ramp; - } - p = &particles[j]; - parm = &partparams[j]; - j += 1; - // Don't render particles too close to us. // Note, we must still do physics and such on them. if (!(DotProduct (p->pos, vpn) < minparticledist)) { @@ -224,19 +207,7 @@ gl_R_DrawParticles (void) VA = particleVertexArray; } } - - float dT = vr_data.frametime; - p->pos += dT * p->vel; - p->vel += dT * (p->vel * parm->drag + gravity * parm->drag[3]); - p->ramp += dT * parm->ramp; - p->live -= dT; - p->alpha -= dT * parm->alpha_rate; - p->scale += dT * parm->scale_rate; - if (ramp) { - p->icolor = ramp[(int)p->ramp]; - } } - numparticles = j; if (vacount) { if (partUseVA) { diff --git a/libs/video/renderer/glsl/glsl_particles.c b/libs/video/renderer/glsl/glsl_particles.c index ebda3b447..128473e02 100644 --- a/libs/video/renderer/glsl/glsl_particles.c +++ b/libs/video/renderer/glsl/glsl_particles.c @@ -256,27 +256,8 @@ draw_qf_particles (void) vacount = 0; VA = particleVertexArray; - vec4f_t gravity = {0, 0, -vr_data.gravity, 0}; - - unsigned j = 0; for (unsigned i = 0; i < numparticles; i++) { particle_t *p = &particles[i]; - partparm_t *parm = &partparams[i]; - - if (p->live <= 0 || p->ramp >= parm->ramp_max - || p->alpha <= 0 || p->scale <= 0) { - continue; - } - const int *ramp = partramps[j]; - if (i > j) { - particles[j] = *p; - partparams[j] = *parm; - partramps[j] = ramp; - } - p = &particles[j]; - parm = &partparams[j]; - j += 1; - // Don't render particles too close to us. // Note, we must still do physics and such on them. if (!(DotProduct (p->pos, vpn) < minparticledist)) { @@ -338,19 +319,7 @@ draw_qf_particles (void) VA += 4; vacount += 6; } - - float dT = vr_data.frametime; - p->pos += dT * p->vel; - p->vel += dT * (p->vel * parm->drag + gravity * parm->drag[3]); - p->ramp += dT * parm->ramp; - p->live -= dT; - p->alpha -= dT * parm->alpha_rate; - p->scale += dT * parm->scale_rate; - if (ramp) { - p->icolor = ramp[(int)p->ramp]; - } } - numparticles = j; qfeglVertexAttribPointer (quake_part.vertex.location, 3, GL_FLOAT, 0, sizeof (partvert_t), @@ -406,27 +375,8 @@ draw_id_particles (void) vacount = 0; VA = particleVertexArray; - vec4f_t gravity = {0, 0, -vr_data.gravity, 0}; - - unsigned j = 0; for (unsigned i = 0; i < numparticles; i++) { particle_t *p = &particles[i]; - partparm_t *parm = &partparams[i]; - - if (p->live <= 0 || p->ramp >= parm->ramp_max - || p->alpha <= 0 || p->scale <= 0) { - continue; - } - const int *ramp = partramps[j]; - if (i > j) { - particles[j] = *p; - partparams[j] = *parm; - partramps[j] = ramp; - } - p = &particles[j]; - parm = &partparams[j]; - j += 1; - // Don't render particles too close to us. // Note, we must still do physics and such on them. if (!(DotProduct (p->pos, vpn) < minparticledist)) { @@ -435,19 +385,7 @@ draw_id_particles (void) VA++; vacount++; } - - float dT = vr_data.frametime; - p->pos += dT * p->vel; - p->vel += dT * (p->vel * parm->drag + gravity * parm->drag[3]); - p->ramp += dT * parm->ramp; - p->live -= dT; - p->alpha -= dT * parm->alpha_rate; - p->scale += dT * parm->scale_rate; - if (ramp) { - p->icolor = ramp[(int)p->ramp]; - } } - numparticles = j; qfeglVertexAttribPointer (quake_point.vertex.location, 3, GL_FLOAT, 0, sizeof (partvert_t), @@ -469,6 +407,7 @@ glsl_R_DrawParticles (void) { if (!r_particles->int_val || !numparticles) return; + R_RunParticles (vr_data.frametime); if (0/*FIXME r_particles_style->int_val*/) { draw_qf_particles (); } else { diff --git a/libs/video/renderer/r_part.c b/libs/video/renderer/r_part.c index b2c83fc02..7dabe54f6 100644 --- a/libs/video/renderer/r_part.c +++ b/libs/video/renderer/r_part.c @@ -85,3 +85,37 @@ R_ClearParticles (void) { numparticles = 0; } + +void +R_RunParticles (float dT) +{ + vec4f_t gravity = {0, 0, -vr_data.gravity, 0}; + + unsigned j = 0; + for (unsigned i = 0; i < numparticles; i++) { + particle_t *p = &particles[i]; + partparm_t *parm = &partparams[i]; + + if (p->live <= 0 || p->ramp >= parm->ramp_max) { + continue; + } + const int *ramp = partramps[j]; + if (i > j) { + particles[j] = *p; + partparams[j] = *parm; + partramps[j] = ramp; + } + p = &particles[j]; + parm = &partparams[j]; + j += 1; + + p->pos += dT * p->vel; + p->vel += dT * (p->vel * parm->drag + gravity * parm->drag[3]); + p->ramp += dT * parm->ramp; + p->live -= dT; + if (ramp) { + p->icolor = ramp[(int)p->ramp]; + } + } + numparticles = j; +} diff --git a/libs/video/renderer/sw/sw_rpart.c b/libs/video/renderer/sw/sw_rpart.c index ceeda14a0..5445a83cd 100644 --- a/libs/video/renderer/sw/sw_rpart.c +++ b/libs/video/renderer/sw/sw_rpart.c @@ -56,38 +56,12 @@ R_DrawParticles (void) VectorScale (vup, yscaleshrink, r_pup); VectorCopy (vpn, r_ppn); - vec4f_t gravity = {0, 0, -vr_data.gravity, 0}; + R_RunParticles (vr_data.frametime); - unsigned j = 0; for (unsigned i = 0; i < numparticles; i++) { particle_t *p = &particles[i]; - partparm_t *parm = &partparams[i]; - - if (p->live <= 0 || p->ramp >= parm->ramp_max) { - continue; - } - const int *ramp = partramps[j]; - if (i > j) { - particles[j] = *p; - partparams[j] = *parm; - partramps[j] = ramp; - } - p = &particles[j]; - parm = &partparams[j]; - j += 1; - D_DrawParticle (p); - - float dT = vr_data.frametime; - p->pos += dT * p->vel; - p->vel += dT * (p->vel * parm->drag + gravity * parm->drag[3]); - p->ramp += dT * parm->ramp; - p->live -= dT; - if (ramp) { - p->icolor = ramp[(int)p->ramp]; - } } - numparticles = j; } static void diff --git a/libs/video/renderer/sw32/sw32_rpart.c b/libs/video/renderer/sw32/sw32_rpart.c index 4bef2bc2b..a7234463f 100644 --- a/libs/video/renderer/sw32/sw32_rpart.c +++ b/libs/video/renderer/sw32/sw32_rpart.c @@ -59,38 +59,12 @@ sw32_R_DrawParticles (void) VectorScale (vup, yscaleshrink, r_pup); VectorCopy (vpn, r_ppn); - vec4f_t gravity = {0, 0, -vr_data.gravity, 0}; + R_RunParticles (vr_data.frametime); - unsigned j = 0; for (unsigned i = 0; i < numparticles; i++) { particle_t *p = &particles[i]; - partparm_t *parm = &partparams[i]; - - if (p->live <= 0 || p->ramp >= parm->ramp_max) { - continue; - } - const int *ramp = partramps[j]; - if (i > j) { - particles[j] = *p; - partparams[j] = *parm; - partramps[j] = ramp; - } - p = &particles[j]; - parm = &partparams[j]; - j += 1; - sw32_D_DrawParticle (p); - - float dT = vr_data.frametime; - p->pos += dT * p->vel; - p->vel += dT * (p->vel * parm->drag + gravity * parm->drag[3]); - p->ramp += dT * parm->ramp; - p->live -= dT; - if (ramp) { - p->icolor = ramp[(int)p->ramp]; - } } - numparticles = j; } static void