scrollinglaser.patch (10,356 bytes)
2007-10-19 18:38
Index: Lua/LuaWeaponDefs.cpp
===================================================================
--- Lua/LuaWeaponDefs.cpp (revision 4599)
+++ Lua/LuaWeaponDefs.cpp (working copy)
@@ -332,6 +332,7 @@
HSTR_PUSH_NUMBER(L, "color2B", v.color2.z);
HSTR_PUSH_BOOL (L, "smokeTrail", v.smokeTrail);
HSTR_PUSH_BOOL (L, "beamWeapon", v.beamweapon);
+ HSTR_PUSH_BOOL (L, "hardStop", v.hardStop);
HSTR_PUSH_NUMBER(L, "tileLength", v.tilelength);
HSTR_PUSH_NUMBER(L, "scrollSpeed", v.scrollspeed);
HSTR_PUSH_NUMBER(L, "pulseSpeed", v.pulseSpeed);
Index: Sim/Projectiles/WeaponProjectiles/LaserProjectile.cpp
===================================================================
--- Sim/Projectiles/WeaponProjectiles/LaserProjectile.cpp (revision 4599)
+++ Sim/Projectiles/WeaponProjectiles/LaserProjectile.cpp (working copy)
@@ -19,6 +19,7 @@
CR_MEMBER(length),
CR_MEMBER(curLength),
CR_MEMBER(speedf),
+ CR_MEMBER(stayTime),
CR_MEMBER(intensityFalloff),
CR_MEMBER(midtexx),
CR_RESERVED(16)
@@ -32,6 +33,7 @@
color2(color2),
length(length),
curLength(0),
+ stayTime(0),
intensity(intensity),
intensityFalloff(intensity*weaponDef->falloffRate)
{
@@ -60,22 +62,34 @@
if(curLength>length)
curLength=length;
} else { //fading out after hit
- curLength-=speedf;
+ if (stayTime <= 0)
+ curLength-=speedf;
+ else
+ stayTime--;
if(curLength<=0){
deleteMe=true;
curLength=0;
}
}
ttl--;
-
- if(ttl<5){
- intensity-=intensityFalloff*0.2f;
- if(intensity<=0){
- deleteMe=true;
- intensity=0;
+
+ if(weaponDef->visuals.hardStop) {
+ if(ttl==0 && checkCol){
+ checkCol=false;
+ speed=ZeroVector;
+ if (curLength < length) //if the laser wasn't fully extended yet
+ stayTime = 1 + (length - curLength) / speedf; //remember how long until it would have been fully extended
}
+ } else {
+ if(ttl<5 && checkCol){
+ intensity-=intensityFalloff*0.2f;
+ if(intensity<=0){
+ deleteMe=true;
+ intensity=0;
+ }
+ }
}
-
+
float3 tempSpeed = speed;
UpdateGroundBounce();
if(tempSpeed != speed){
@@ -94,6 +108,10 @@
checkCol=false;
speed=ZeroVector;
pos=oldPos;
+ if (curLength < length) { //if the laser wasn't fully extended yet
+ curLength+=speedf; //was too short for some reason
+ stayTime = 1 + (length - curLength) / speedf; //remember how long until it would have been fully extended
+ }
}
}
@@ -107,6 +125,8 @@
checkCol=false;
speed=ZeroVector;
pos=oldPos;
+ if (curLength < length) //if the laser wasn't fully extended yet
+ stayTime = 1 + (length - curLength) / speedf; //remember how long until it would have been fully extended
}
}
@@ -122,6 +142,8 @@
checkCol=false;
speed=ZeroVector;
pos=oldPos;
+ if (curLength < length) //if the laser wasn't fully extended yet
+ stayTime = 1 + (length - curLength) / speedf; //remember how long until it would have been fully extended
}
//CSimpleParticleSystem *ps = SAFE_NEW CSimpleParticleSystem();
@@ -170,6 +192,16 @@
if(camDist<weaponDef->lodDistance){
float3 pos1=pos+speed*gu->timeOffset;
float3 pos2=pos1-dir*curLength;
+ float texStartOffset;
+ float texEndOffset;
+ if (checkCol) { //expanding or contracting?
+ texStartOffset=0;
+ texEndOffset=(1.0f - curLength/length)*(weaponDef->visuals.texture1->xstart - weaponDef->visuals.texture1->xend);
+ }
+ else {
+ texStartOffset=(-1.0f + curLength/length + ((float)stayTime * speedf/length))*(weaponDef->visuals.texture1->xstart - weaponDef->visuals.texture1->xend);
+ texEndOffset= ((float)stayTime * speedf/length)*(weaponDef->visuals.texture1->xstart - weaponDef->visuals.texture1->xend);
+ }
va->AddVertexTC(pos1-dir1*size, midtexx,weaponDef->visuals.texture2->ystart, col);
va->AddVertexTC(pos1+dir1*size, midtexx,weaponDef->visuals.texture2->yend,col);
@@ -180,14 +212,14 @@
va->AddVertexTC(pos1+dir1*coresize-dir2*coresize,weaponDef->visuals.texture2->xstart,weaponDef->visuals.texture2->yend,col2);
va->AddVertexTC(pos1-dir1*coresize-dir2*coresize,weaponDef->visuals.texture2->xstart,weaponDef->visuals.texture2->ystart,col2);
- va->AddVertexTC(pos1-dir1*size,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart, col);
- va->AddVertexTC(pos1+dir1*size,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend, col);
- va->AddVertexTC(pos2+dir1*size,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend, col);
- va->AddVertexTC(pos2-dir1*size,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart, col);
- va->AddVertexTC(pos1-dir1*coresize,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart, col2);
- va->AddVertexTC(pos1+dir1*coresize,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend, col2);
- va->AddVertexTC(pos2+dir1*coresize,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend, col2);
- va->AddVertexTC(pos2-dir1*coresize,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart, col2);
+ va->AddVertexTC(pos1-dir1*size,weaponDef->visuals.texture1->xstart + texStartOffset,weaponDef->visuals.texture1->ystart, col);
+ va->AddVertexTC(pos1+dir1*size,weaponDef->visuals.texture1->xstart + texStartOffset,weaponDef->visuals.texture1->yend, col);
+ va->AddVertexTC(pos2+dir1*size,weaponDef->visuals.texture1->xend + texEndOffset,weaponDef->visuals.texture1->yend, col);
+ va->AddVertexTC(pos2-dir1*size,weaponDef->visuals.texture1->xend + texEndOffset,weaponDef->visuals.texture1->ystart, col);
+ va->AddVertexTC(pos1-dir1*coresize,weaponDef->visuals.texture1->xstart + texStartOffset,weaponDef->visuals.texture1->ystart, col2);
+ va->AddVertexTC(pos1+dir1*coresize,weaponDef->visuals.texture1->xstart + texStartOffset,weaponDef->visuals.texture1->yend, col2);
+ va->AddVertexTC(pos2+dir1*coresize,weaponDef->visuals.texture1->xend + texEndOffset,weaponDef->visuals.texture1->yend, col2);
+ va->AddVertexTC(pos2-dir1*coresize,weaponDef->visuals.texture1->xend + texEndOffset,weaponDef->visuals.texture1->ystart, col2);
va->AddVertexTC(pos2-dir1*size, midtexx,weaponDef->visuals.texture2->ystart, col);
va->AddVertexTC(pos2+dir1*size, midtexx,weaponDef->visuals.texture2->yend,col);
@@ -200,15 +232,25 @@
} else {
float3 pos1=pos+speed*gu->timeOffset+dir*(size*0.5f);
float3 pos2=pos1-dir*(curLength+size);
+ float texStartOffset;
+ float texEndOffset;
+ if (checkCol) { //expanding or contracting?
+ texStartOffset=0;
+ texEndOffset=(1.0f - curLength/length)*(weaponDef->visuals.texture1->xstart - weaponDef->visuals.texture1->xend);
+ }
+ else {
+ texStartOffset=(-1.0f + curLength/length + ((float)stayTime * speedf/length))*(weaponDef->visuals.texture1->xstart - weaponDef->visuals.texture1->xend);
+ texEndOffset= ((float)stayTime * speedf/length)*(weaponDef->visuals.texture1->xstart - weaponDef->visuals.texture1->xend);
+ }
- va->AddVertexTC(pos1-dir1*size,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart, col);
- va->AddVertexTC(pos1+dir1*size,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend, col);
- va->AddVertexTC(pos2+dir1*size,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend, col);
- va->AddVertexTC(pos2-dir1*size,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart, col);
- va->AddVertexTC(pos1-dir1*coresize,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart, col2);
- va->AddVertexTC(pos1+dir1*coresize,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend, col2);
- va->AddVertexTC(pos2+dir1*coresize,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend, col2);
- va->AddVertexTC(pos2-dir1*coresize,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart, col2);
+ va->AddVertexTC(pos1-dir1*size,weaponDef->visuals.texture1->xstart + texStartOffset,weaponDef->visuals.texture1->ystart, col);
+ va->AddVertexTC(pos1+dir1*size,weaponDef->visuals.texture1->xstart + texStartOffset,weaponDef->visuals.texture1->yend, col);
+ va->AddVertexTC(pos2+dir1*size,weaponDef->visuals.texture1->xend + texEndOffset,weaponDef->visuals.texture1->yend, col);
+ va->AddVertexTC(pos2-dir1*size,weaponDef->visuals.texture1->xend + texEndOffset,weaponDef->visuals.texture1->ystart, col);
+ va->AddVertexTC(pos1-dir1*coresize,weaponDef->visuals.texture1->xstart + texStartOffset,weaponDef->visuals.texture1->ystart, col2);
+ va->AddVertexTC(pos1+dir1*coresize,weaponDef->visuals.texture1->xstart + texStartOffset,weaponDef->visuals.texture1->yend, col2);
+ va->AddVertexTC(pos2+dir1*coresize,weaponDef->visuals.texture1->xend + texEndOffset,weaponDef->visuals.texture1->yend, col2);
+ va->AddVertexTC(pos2-dir1*coresize,weaponDef->visuals.texture1->xend + texEndOffset,weaponDef->visuals.texture1->ystart, col2);
}
}
Index: Sim/Projectiles/WeaponProjectiles/LaserProjectile.h
===================================================================
--- Sim/Projectiles/WeaponProjectiles/LaserProjectile.h (revision 4599)
+++ Sim/Projectiles/WeaponProjectiles/LaserProjectile.h (working copy)
@@ -27,7 +27,9 @@
float speedf;
float intensityFalloff;
float midtexx;
+ int stayTime; //number of frames the laser had left to expand if it impacted before reaching full length
+
};
Index: Sim/Weapons/WeaponDefHandler.cpp
===================================================================
--- Sim/Weapons/WeaponDefHandler.cpp (revision 4599)
+++ Sim/Weapons/WeaponDefHandler.cpp (working copy)
@@ -470,6 +470,7 @@
// CLaserProjectile
wd.visuals.texture1 = &ph->laserfallofftex;
wd.visuals.texture2 = &ph->laserendtex;
+ wd.visuals.hardStop = wdTable.GetBool("hardstop", false);
wd.collisionSize = wdTable.GetFloat("collisionSize", 0.5f);
} else if (wd.type == "BeamLaser") {
if (wd.largeBeamLaser) {
Index: Sim/Weapons/WeaponDefHandler.h
===================================================================
--- Sim/Weapons/WeaponDefHandler.h (revision 4599)
+++ Sim/Weapons/WeaponDefHandler.h (working copy)
@@ -148,6 +148,7 @@
bool smokeTrail;
bool beamweapon;
+ bool hardStop; //whether the shot should fade out or stop and contract at max range
AtlasedTexture *texture1;
AtlasedTexture *texture2;