MuadDib's persistent saber burn marks

set cg_saberBurnMarkExtraTime > 0 to activate
This commit is contained in:
Simon 2022-11-09 22:05:06 +00:00
parent 6695f0bc0d
commit 3e54452a0b
4 changed files with 31 additions and 17 deletions

View file

@ -68,7 +68,9 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#define MAX_STEP_CHANGE 32
#define MAX_VERTS_ON_POLY 10
#define MAX_MARK_POLYS 256
#define MAX_MARK_POLYS 2048
#define MARK_TOTAL_TIME 10000
#define MARK_FADE_TIME 1000
#define STAT_MINUS 10 // num frame for '-' stats digit
@ -192,6 +194,7 @@ typedef centity_s centity_t;
typedef struct markPoly_s {
struct markPoly_s *prevMark, *nextMark;
int time;
int fadeTime; // custom fade time (to slow down fade of saber burn marks)
qhandle_t markShader;
qboolean alphaFade; // fade alpha instead of rgb
float color[4];
@ -621,6 +624,7 @@ extern vmCvar_t cg_thirdPersonTargetDamp;
extern vmCvar_t cg_saberAutoThird;
extern vmCvar_t cg_gunAutoFirst;
extern vmCvar_t cg_debugSaberCombat;
extern vmCvar_t cg_saberBurnMarkExtraTime;
extern vmCvar_t cg_zProj;
extern vmCvar_t cg_stereoSeparation;

View file

@ -300,6 +300,7 @@ vmCvar_t cg_thirdPersonTargetDamp;
vmCvar_t cg_saberAutoThird;
vmCvar_t cg_gunAutoFirst;
vmCvar_t cg_debugSaberCombat;
vmCvar_t cg_saberBurnMarkExtraTime;
vmCvar_t cg_thirdPersonAlpha;
vmCvar_t cg_thirdPersonAutoAlpha;
@ -444,6 +445,7 @@ static cvarTable_t cvarTable[] = {
{ &cg_saberAutoThird, "cg_saberAutoThird", "0", CVAR_ARCHIVE },
{ &cg_gunAutoFirst, "cg_gunAutoFirst", "1", CVAR_ARCHIVE },
{ &cg_debugSaberCombat, "cg_debugSaberCombat", "0", CVAR_ARCHIVE },
{ &cg_saberBurnMarkExtraTime, "cg_saberBurnMarkExtraTime", "0", CVAR_ARCHIVE },
{ &cg_pano, "pano", "0", 0 },
{ &cg_panoNumShots, "panoNumShots", "10", 0 },

View file

@ -225,8 +225,6 @@ void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir,
CG_AddMarks
===============
*/
#define MARK_TOTAL_TIME 20000
#define MARK_FADE_TIME 10000
void CG_AddMarks( void ) {
int j;
@ -270,9 +268,13 @@ void CG_AddMarks( void ) {
}
// fade all marks out with time
int markFadeTime = mp->fadeTime;
if (!markFadeTime) {
markFadeTime = MARK_FADE_TIME;
}
t = mp->time + MARK_TOTAL_TIME - cg.time;
if ( t < MARK_FADE_TIME ) {
fade = 255 * t / MARK_FADE_TIME;
if ( t < markFadeTime ) {
fade = 255 * t / markFadeTime;
if ( mp->alphaFade ) {
for ( j = 0 ; j < mp->poly.numVerts ; j++ ) {
mp->verts[j].modulate[3] = fade;
@ -280,7 +282,7 @@ void CG_AddMarks( void ) {
}
else
{
float f = (float)t / MARK_FADE_TIME;
float f = (float)t / markFadeTime;
for ( j = 0 ; j < mp->poly.numVerts ; j++ ) {
mp->verts[j].modulate[0] = mp->color[0] * f;
mp->verts[j].modulate[1] = mp->color[1] * f;

View file

@ -4388,19 +4388,25 @@ void CG_CreateSaberMarks( vec3_t start, vec3_t end, vec3_t normal )
v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * (0.15f + Q_flrand(0.0f, 1.0f) * 0.05f);
}
// save it persistantly, do burn first
// Allow to prolong max saber mark time
cvar_t *sabeBurnMarkExtraTime = gi.cvar( "cg_saberBurnMarkExtraTime", "0", 1 );
int extraTime = sabeBurnMarkExtraTime->value * MARK_TOTAL_TIME;
if (sabeBurnMarkExtraTime->value == 0.0f) {
mark = CG_AllocMark();
mark->time = cg.time;
mark->time = cg.time + 8500;
mark->alphaFade = qtrue;
mark->markShader = cgs.media.rivetMarkShader;
mark->poly.numVerts = mf->numPoints;
mark->color[0] = mark->color[1] = mark->color[2] = mark->color[3] = 255;
memcpy(mark->verts, verts, mf->numPoints * sizeof(verts[0]));
}
// And now do a glow pass
// by moving the start time back, we can hack it to fade out way before the burn does
// Instead do only the glow pass and make it slowly fade (to make it look like cooling down)
mark = CG_AllocMark();
mark->time = cg.time - 8500;
mark->time = cg.time + extraTime;
mark->fadeTime = MARK_TOTAL_TIME + extraTime;
mark->alphaFade = qfalse;
mark->markShader = cgi_R_RegisterShader("gfx/effects/saberDamageGlow" );
mark->poly.numVerts = mf->numPoints;