Fading Values

I wanted to share an advanced effect I've stumbled upon while designing a level in the Source engine. I originally saw the entities for this trick and thought to myself that I could make it do this, but wasn't certain, and was too busy at the time to try implementing it. I was also new to the engine at the time, and knew it'd take me too long to figure it out.
This effect is used to fade fog between different values, but it can be used in basically any entity that has a color value to change it's shade over time. You can also use it to change basically any value over time, such as shifting the Z-plane in on a map, to reduce visibility.
It is really quite powerful, allowing you to alter values that we usually leave static on a map, for fear that the player will notice them changing, and it will break the immersion.
Now, with that preface aside, here we go. The setup is really quite simple, and requires:
- logic_relay - I use one of these for almost all my entity setups, to abstract the routine. It makes it much easier to duplicate the effect in other maps.
- logic_timer - This is the basis of the effect, and controls the time measurements.
- math_counter - This keeps track of the time value for the effect.
- math_colorblend or math_remap - Both of these entities do essentially the same thing, and remap a value based on the input value.
I'm going to list the I/O rigging here, so you can duplicate it, and then I'll add some notes.
Logic_relay targetname fade_value1 OnTrigger counter SetValue 0 OnTrigger timer OnTrigger timer Enable
Logic_timer targetname timer RefireTime .2 StartDisabled 1 OnTimer counter Add .01
math_counter targetname counter max 1 OnHitMax timer Disable OutValue colorblend InValue
math_colorblend targetname colorblend colormin "0 0 0" colormax "255 255 255" OutColor env_fog_controller SetColor
Analysis on what it's doing: You trigger the logic_relay with another entity, or from the console with:
ent_fire fade_value1 trigger
This will start the sequence. The logic_relay starts the timer going, and resets the math_counter to 0. The timer refires every .2 seconds, firing it's output, OnTimer, which adds .01 to the math_counter's stored value. The math_counter fires it's OutValue output whenever it's value is changed, which is in turn input into the math_colorblend. The math_colorblend takes the input value, which is a range from 0-1, and changes the colors based on that.
This range allows for 100 steps. The values that are setup are a compromise between making the blend really smooth and performance. It's slightly "steppy" because it happens 5 times a second. It would be a lot smoother if you increased it to happen more often, with less of a step. You could do that by only adding .005 or a smaller value than the .01 I'm adding right now.
Once the math_counter hits it's max value (1) it will fire an output telling the logic_timer to disable. This effectively stops the sequence until the logic_relay is fired again.
OutColor and OutValue outputs both accept a parameter in Hammer, but make sure you do NOT specify one. The parameter they pass will be dynamically generated by the entity itself.
You can change OutColor on the math_colorblend to target any entity that will accept a colorvalue, and it should work just the same. This entity rig can be further adapted to work with a math_remap, and used to fade between any two values, allowing you to affect the values of pretty much any entity in the game, and change them over time.