env_glow: Add 'rotate' key to rotate the sprite/material by X degree amount

This commit is contained in:
Marco Cawthorne 2022-01-07 17:04:43 -08:00
parent 52dfde0cf1
commit 02c2ff7be5
Signed by: eukara
GPG key ID: C196CD8BA993248A
3 changed files with 66 additions and 5 deletions

View file

@ -104,9 +104,10 @@ env_glow::predraw(void)
forg = origin + (v_forward * -16);
if (spawnflags & 1)
makevectors(m_vecOrientation);
else
makevectors(view_angles);
makevectors(m_vecOrientation+[0,0,angles[2]]);
else {
makevectors(view_angles+[0,0,angles[2]]);
}
#ifndef FTE_QUADFIX
R_BeginPolygon(m_strSprite, 1, 0);
@ -167,6 +168,9 @@ env_glow::SpawnKey(string strField, string strKey)
case "renderamt":
m_flMaxAlpha = stof(strKey) / 255;
break;
case "rotate":
angles[2] = stof(strKey);
break;
default:
super::SpawnKey(strField, strKey);
}

View file

@ -121,6 +121,7 @@ int g_breakmodel_count;
var hashtable g_hashbreakmodel;
void BreakModel_Spawn(vector pos, vector dir, vector spread, float speed, int count, string type);
void BreakModel_SpawnUnit(vector pos, vector dir, vector spread, float speed, string type);
/* necessary API functions */
//void BreakModel_Init(void);

View file

@ -124,7 +124,8 @@ void
BreakModel_ParseField(int i, int a)
{
if (a == 2) {
g_breakmodel[i].data = sprintf("%s%S %S\n", g_breakmodel[i].data, argv(0), argv(1));
precache_model(argv(0));
g_breakmodel[i].data = sprintf("%s%S %S\n", g_breakmodel[i].data, argv(0), argv(1));
}
};
@ -483,7 +484,10 @@ BreakModel_Spawn(vector smins, vector smaxs, vector dir, float speed, int count,
setsize(gib, [0,0,0], [0,0,0]);
setorigin(gib, endpos);
makevectors(dir);
gib.velocity = v_forward * speed;
gib.velocity = (v_forward * speed) * 0.75;
gib.velocity[0] += (random() - 0.5) * (speed * 0.25);
gib.velocity[1] += (random() - 0.5) * (speed * 0.25);
gib.velocity[2] += (random() - 0.5) * (speed * 0.25);
gib.avelocity = vectoangles(gib.velocity);
gib.movetype = MOVETYPE_BOUNCE;
@ -492,3 +496,55 @@ BreakModel_Spawn(vector smins, vector smaxs, vector dir, float speed, int count,
#endif
}
}
void
BreakModel_SpawnUnit(vector smins, vector smaxs, vector dir, float speed, string type)
{
int index;
index = (int)hash_get(g_hashbreakmodel, type, -1);
if (index < 0) {
crossprint(sprintf("^1 BreakModel_Spawn: type %s is not defined\n", type));
return;
}
float x = tokenize(g_breakmodel[index].data);
int modelcount = x / 2;
for (int i = 0; i < modelcount; i++) {
vector endpos;
string mname;
float fadetime;
entity gib;
int r;
/* pick a model between 0 and num) */
r = i;
/* two entries, always have to skip by 2 */
mname = argv((r * 2));
fadetime = stof(argv((r * 2) + 1));
endpos[0] = smins[0] + ( random() * ( smaxs[0] - smins[0] ) );
endpos[1] = smins[1] + ( random() * ( smaxs[1] - smins[1] ) );
endpos[2] = smins[2] + ( random() * ( smaxs[2] - smins[2] ) );
gib = spawn();
setmodel(gib, mname);
setsize(gib, [0,0,0], [0,0,0]);
setorigin(gib, endpos);
makevectors(dir);
gib.velocity = (v_forward * speed) * 0.75;
gib.velocity[0] += (random() - 0.5) * (speed * 0.25);
gib.velocity[1] += (random() - 0.5) * (speed * 0.25);
gib.velocity[2] += (random() - 0.5) * (speed * 0.25);
gib.avelocity = vectoangles(gib.velocity);
gib.movetype = MOVETYPE_BOUNCE;
#ifdef CLIENT
gib.drawmask = MASK_ENGINE;
#endif
}
}