//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// #if !defined ( DLIGHTH ) #define DLIGHTH #ifdef _WIN32 #pragma once #endif #include "mathlib/vector.h" class IClientRenderable; //----------------------------------------------------------------------------- // Dynamic light structure //----------------------------------------------------------------------------- enum { DLIGHT_NO_WORLD_ILLUMINATION = 0x1, DLIGHT_NO_MODEL_ILLUMINATION = 0x2, // NOTE: These two features are used to dynamically tweak the alpha on displacements // which is a special effect for selecting which texture to use. If // we ever change how alpha is stored for displacements, we'll have to kill this feature DLIGHT_ADD_DISPLACEMENT_ALPHA = 0x4, DLIGHT_SUBTRACT_DISPLACEMENT_ALPHA = 0x8, DLIGHT_DISPLACEMENT_MASK = (DLIGHT_ADD_DISPLACEMENT_ALPHA | DLIGHT_SUBTRACT_DISPLACEMENT_ALPHA), }; // This is the lighting value that is used to determine when something can be // culle from lighting because it is close enough to black to be virtually black. //#define MIN_LIGHTING_VALUE (1.0f/256.0f) // This is the broken value of MIN_LIGHTING_VALUE that we have to take into consideration // to make sure that the lighting for dlights look the same as they did in HL2. // We'll use the real MIN_LIGHTING_VALUE above to calculate larger radii for dynamic // light sources. //#define HL2_BROKEN_MIN_LIGHTING_VALUE (20.0f/256.0f) struct dlight_t { int flags; Vector origin; float radius; ColorRGBExp32 color; // Light color with exponent float die; // stop lighting after this time float decay; // drop this each second float minlight; // don't add when contributing less int key; int style; // lightstyle // For spotlights. Use m_OuterAngle == 0 for point lights Vector m_Direction; // center of the light cone float m_InnerAngle; float m_OuterAngle; // If this ptr is set, the dlight will only affect this particular client renderable const IClientRenderable* m_pExclusiveLightReceiver; dlight_t() : m_pExclusiveLightReceiver( NULL ) { } // see comments above about HL2_BROKEN_MIN_LIGHTING_VALUE and MIN_LIGHTING_VALUE // THIS SHOULD ONLY GET CALLED FROM THE ENGINE float GetRadius() const { // return FastSqrt( radius * radius * ( HL2_BROKEN_MIN_LIGHTING_VALUE / MIN_LIGHTING_VALUE ) ); return radius; } // see comments above about HL2_BROKEN_MIN_LIGHTING_VALUE and MIN_LIGHTING_VALUE // THIS SHOULD ONLY GET CALLED FROM THE ENGINE float GetRadiusSquared() const { // return radius * radius * ( HL2_BROKEN_MIN_LIGHTING_VALUE / MIN_LIGHTING_VALUE ); return radius * radius; } // THIS SHOULD ONLY GET CALLED FROM THE ENGINE float IsRadiusGreaterThanZero() const { // don't bother calculating the new radius if you just want to know if it is greater than zero. return radius > 0.0f; } }; #endif