Muzzle Flash Lighting: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
mNo edit summary
 
(18 intermediate revisions by 10 users not shown)
Line 1: Line 1:
{{otherlang2
{{lang|title=Muzzle Flash Lighting|Muzzle Flash Lighting}}
|title=Muzzle Flash Lighting
|ru=Muzzle_Flash_Lighting:ru
|de=Muzzle_Flash_Lighting:de
}}


This tutorial will show you how to create a muzzleflash that dynamically appears and lights up the world around you, like in Counter-Strike: Source. These types of lights are called "dlights".
This tutorial will show you how to create a muzzleflash that dynamically appears and lights up the world around the player, like in Counter-Strike: Source. These types of lights are called [[dlight]]s on brushes, and [[elight]]s on models.


This code was designed for any Orange Box based mod, singleplayer or multiplayer. It also works with NPCs, assuming that you've gotten them to work properly.
This code was designed for any Orange Box based mod, singleplayer or multiplayer. It also works with NPCs, assuming they work properly.


{{warning| Some dynamic props will not be lit when using dlights.}}
{{warning| Some dynamic props will not be lit when using dlights.}}
{{warning| Too many dlights may result in severe performance losses on low-end systems. When coding for lighting, dlights should be used sparingly.}}
{{warning| Too many dlights may result in severe performance losses on low-end systems. When coding for lighting, dlights should be used sparingly.}}
{{Note | From Slam12f, even better if you can write a console command to enable or disable dlights. Is easy to implement with help use static ConVar.}}
{{Note | The quality of dynamic lights depends on the lightmap scale.}}


== Implementing Dlight-based Muzzleflashes ==
== Implementing DLight-based Muzzleflashes ==


The coding begins! Only a few minor changes are needed here to make your muzzleflashes look better than ever.
The coding begins! Only a few minor changes are needed here to make muzzleflashes look better than ever.


First off, open up '''c_baseanimating.cpp''' and search for the function ''void C_BaseAnimating::ProcessMuzzleFlashEvent()''
First off, open up '''c_baseanimating.cpp''' and search for the function ''void C_BaseAnimating::ProcessMuzzleFlashEvent()''
Line 34: Line 30:
el->color.exponent = 5;
el->color.exponent = 5;
</source>
</source>
As you may have noticed, Valve went a little crazy here and the result was a seemingly ugly muzzleflash. This tutorial is all about making things pretty, so we're going to change that. Replace the entries above with this:
Valve went a little crazy here and the result was a seemingly ugly muzzleflash. This tutorial is all about making things pretty, so lets change that. Replace the entries above with this:
<source lang=cpp>
<source lang=cpp>
Vector vAttachment, vAng;
Vector vAttachment, vAng;
QAngle angles;
QAngle angles;
GetAttachment( attachment, vAttachment, angles );
GetAttachment(1, vAttachment, angles); // set 1 instead of "attachment"
AngleVectors(angles, &vAng);
vAttachment += vAng * 2;


AngleVectors( angles, &vAng );
dlight_t *dl = effects->CL_AllocDlight(index);
vAttachment += vAng * 2;
dlight_t *dl = effects->CL_AllocDlight ( index );
dl->origin = vAttachment;
dl->origin = vAttachment;
dl->color.r = 231;
dl->color.g = 219;
dl->color.b = 14;
dl->die = gpGlobals->curtime + 0.05f;
dl->radius = random->RandomFloat( 245.0f, 256.0f );
dl->decay = 512.0f;
</source>
Edit: Changed the code for the colors, by default it was set to a magenta-ish color. A good muzzle flash color is closer to white, you can try 252, 238, 128 for a realistic washed out yellow.
== Notes ==
I am currently working further on this idea, the updates will add more visual effects to this idea to create a more realistic and cleaner look to the muzzle flash. the update will only work on the orange box engine
A link will be provided HERE when the new muzzle flash is done
A NOTE FROM GAMERMAN12: I had updated this code so that the lights decay after firing, so you have a flashing effect when shooting machine guns. And it fades so that it's alitle more realistic. Thanks.


== Episode 2 Fix ==
// Original color values
int originalR = 231;
int originalG = 219;
int originalB = 14;


If you encounter an error (error C2065: 'Attachment' : undeclared identifier) while building, try using this instead:
// Randomize color components within the range of +/- 20
dl->color.r = originalR + random->RandomInt(-20, 20);
dl->color.g = originalG + random->RandomInt(-20, 20);
dl->color.b = originalB + random->RandomInt(0, 0);


<source lang=cpp>
// Randomize the die value by +/- 0.01
Vector vAttachment, vAng;
dl->die = gpGlobals->curtime + 0.05f + random->RandomFloat(-0.01f, 0.01f);
QAngle angles;
dl->radius = random->RandomFloat(245.0f, 256.0f);
GetAttachment( 1, vAttachment, angles ); // set 1 instead "attachment"


AngleVectors( angles, &vAng );
// Randomize the decay value
vAttachment += vAng * 2;
dl->decay = random->RandomFloat(400.0f, 600.0f);
dlight_t *dl = effects->CL_AllocDlight ( index );
dl->origin = vAttachment;
dl->color.r = 231;
dl->color.g = 219;
dl->color.b = 14;
dl->die = gpGlobals->curtime + 0.05f;
dl->radius = random->RandomFloat( 245.0f, 256.0f );
dl->decay = 512.0f;
</source>
</source>
{{tip | You can try 252, 238, 128 for a realistic washed out yellow color.}}
{{idea | Write a console command to enable or disable dlights to shave off performance losses}}


[[Category:Weapons programming]]
[[Category:Weapons programming]]

Latest revision as of 20:46, 16 May 2024

English (en)Deutsch (de)Русский (ru)Translate (Translate)

This tutorial will show you how to create a muzzleflash that dynamically appears and lights up the world around the player, like in Counter-Strike: Source. These types of lights are called dlights on brushes, and elights on models.

This code was designed for any Orange Box based mod, singleplayer or multiplayer. It also works with NPCs, assuming they work properly.

Warning.pngWarning: Some dynamic props will not be lit when using dlights.
Warning.pngWarning: Too many dlights may result in severe performance losses on low-end systems. When coding for lighting, dlights should be used sparingly.
Note.pngNote: The quality of dynamic lights depends on the lightmap scale.

Implementing DLight-based Muzzleflashes

The coding begins! Only a few minor changes are needed here to make muzzleflashes look better than ever.

First off, open up c_baseanimating.cpp and search for the function void C_BaseAnimating::ProcessMuzzleFlashEvent()

Vector vAttachment;
QAngle dummyAngles;
GetAttachment( attachment, vAttachment, dummyAngles );

// Make an elight
dlight_t *el = effects->CL_AllocElight( LIGHT_INDEX_MUZZLEFLASH + index );
el->origin = vAttachment;
el->radius = random->RandomInt( 32, 64 ); 
el->decay = el->radius / 0.05f;
el->die = gpGlobals->curtime + 0.05f;
el->color.r = 255;
el->color.g = 192;
el->color.b = 64;
el->color.exponent = 5;

Valve went a little crazy here and the result was a seemingly ugly muzzleflash. This tutorial is all about making things pretty, so lets change that. Replace the entries above with this:

			Vector vAttachment, vAng;
			QAngle angles;
			GetAttachment(1, vAttachment, angles); // set 1 instead of "attachment"
			AngleVectors(angles, &vAng);
			vAttachment += vAng * 2;

			dlight_t *dl = effects->CL_AllocDlight(index);
			dl->origin = vAttachment;

			// Original color values
			int originalR = 231;
			int originalG = 219;
			int originalB = 14;

			// Randomize color components within the range of +/- 20
			dl->color.r = originalR + random->RandomInt(-20, 20);
			dl->color.g = originalG + random->RandomInt(-20, 20);
			dl->color.b = originalB + random->RandomInt(0, 0);

			// Randomize the die value by +/- 0.01
			dl->die = gpGlobals->curtime + 0.05f + random->RandomFloat(-0.01f, 0.01f);
			dl->radius = random->RandomFloat(245.0f, 256.0f);

			// Randomize the decay value
			dl->decay = random->RandomFloat(400.0f, 600.0f);
Tip.pngTip: You can try 252, 238, 128 for a realistic washed out yellow color.
Tip.pngIdea: Write a console command to enable or disable dlights to shave off performance losses