2025-07-18 03:23 CEST

View Issue Details Jump to Notes ]
IDProjectCategoryView StatusLast Update
0000661Spring engineGeneralpublic2007-10-28 14:27
ReporterKDR_11k 
Assigned Totvo 
PrioritynormalSeverityfeatureReproducibilityN/A
StatusresolvedResolutionfixed 
Product Version 
Target VersionFixed in Version 
Summary0000661: [patch]scrolling lasers
DescriptionCurrently lasers stretch to their length, the laser always has the full texture, no matter what its length is. That worked back when lasers had no texture but now with custom graphics it looks silly. This patch changes it so the texture always remains the same size and the laser just shows the part that its length can contain. It also adds proper handling for when a laser impacts before it extends to full size by making the laser stay that size but scrolling the visible part of the texture before the laser contracts again (and preventing the laser from fading out if it has already hit). This greatly improves the look of very long laser shots with textures.

This also adds the tag "hardStop" (bool, default 0) which, if used, makes the laser not fade if it doesn't hit before hitting its range limit and instead has the laser stop immediately and contract, as if it had hit something. This looks better with really long lasers, especially those that are longer than their range.
Additional InformationForb seriously needs to reduce the duration on the armmanni weapon in FunTA...
TagsNo tags attached.
Checked infolog.txt for Errors
Attached Files
  • patch file icon 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;
    
    patch file icon scrollinglaser.patch (10,356 bytes) 2007-10-19 18:38 +

-Relationships
+Relationships

-Notes

~0001371

tvo (reporter)

Committed, thanks!
+Notes

-Issue History
Date Modified Username Field Change
2007-10-19 18:38 KDR_11k New Issue
2007-10-19 18:38 KDR_11k File Added: scrollinglaser.patch
2007-10-28 14:26 tvo Status new => assigned
2007-10-28 14:26 tvo Assigned To => tvo
2007-10-28 14:27 tvo Status assigned => resolved
2007-10-28 14:27 tvo Resolution open => fixed
2007-10-28 14:27 tvo Note Added: 0001371
+Issue History