You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
7.1 KiB
189 lines
7.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef ISHADOWMGR_H |
|
#define ISHADOWMGR_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "interface.h" |
|
#include "mathlib/vmatrix.h" |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// forward declarations |
|
//----------------------------------------------------------------------------- |
|
|
|
class IMaterial; |
|
class Vector; |
|
class Vector2D; |
|
struct model_t; |
|
typedef unsigned short ModelInstanceHandle_t; |
|
class IClientRenderable; |
|
class ITexture; |
|
|
|
// change this when the new version is incompatable with the old |
|
#define ENGINE_SHADOWMGR_INTERFACE_VERSION "VEngineShadowMgr002" |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Flags for the creation method |
|
//----------------------------------------------------------------------------- |
|
enum ShadowFlags_t |
|
{ |
|
SHADOW_FLAGS_FLASHLIGHT = (1 << 0), |
|
SHADOW_FLAGS_SHADOW = (1 << 1), |
|
// Update this if you add flags |
|
SHADOW_FLAGS_LAST_FLAG = SHADOW_FLAGS_SHADOW |
|
}; |
|
|
|
#define SHADOW_FLAGS_PROJECTED_TEXTURE_TYPE_MASK ( SHADOW_FLAGS_FLASHLIGHT | SHADOW_FLAGS_SHADOW ) |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
// Shadow-related functionality exported by the engine |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// This is a handle to shadows, clients can create as many as they want |
|
//----------------------------------------------------------------------------- |
|
typedef unsigned short ShadowHandle_t; |
|
|
|
enum |
|
{ |
|
SHADOW_HANDLE_INVALID = (ShadowHandle_t)~0 |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Used for the creation Flags field of CreateShadow |
|
//----------------------------------------------------------------------------- |
|
enum ShadowCreateFlags_t |
|
{ |
|
SHADOW_CACHE_VERTS = ( 1 << 0 ), |
|
SHADOW_FLASHLIGHT = ( 1 << 1 ), |
|
|
|
SHADOW_LAST_FLAG = SHADOW_FLASHLIGHT, |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Information about a particular shadow |
|
//----------------------------------------------------------------------------- |
|
struct ShadowInfo_t |
|
{ |
|
// Transforms from world space into texture space of the shadow |
|
VMatrix m_WorldToShadow; |
|
|
|
// The shadow should no longer be drawn once it's further than MaxDist |
|
// along z in shadow texture coordinates. |
|
float m_FalloffOffset; |
|
float m_MaxDist; |
|
float m_FalloffAmount; // how much to lighten the shadow maximally |
|
Vector2D m_TexOrigin; |
|
Vector2D m_TexSize; |
|
unsigned char m_FalloffBias; |
|
}; |
|
|
|
struct FlashlightState_t; |
|
|
|
//----------------------------------------------------------------------------- |
|
// The engine's interface to the shadow manager |
|
//----------------------------------------------------------------------------- |
|
abstract_class IShadowMgr |
|
{ |
|
public: |
|
// Create, destroy shadows (see ShadowCreateFlags_t for creationFlags) |
|
virtual ShadowHandle_t CreateShadow( IMaterial* pMaterial, IMaterial* pModelMaterial, void* pBindProxy, int creationFlags ) = 0; |
|
virtual void DestroyShadow( ShadowHandle_t handle ) = 0; |
|
|
|
// Resets the shadow material (useful for shadow LOD.. doing blobby at distance) |
|
virtual void SetShadowMaterial( ShadowHandle_t handle, IMaterial* pMaterial, IMaterial* pModelMaterial, void* pBindProxy ) = 0; |
|
|
|
// Shadow opacity |
|
// virtual void SetShadowOpacity( ShadowHandle_t handle, float alpha ) = 0; |
|
// virtual float GetShadowOpacity( ShadowHandle_t handle ) const = 0; |
|
|
|
// Project a shadow into the world |
|
// The two points specify the upper left coordinate and the lower-right |
|
// coordinate of the shadow specified in a shadow "viewplane". The |
|
// projection matrix is a shadow viewplane->world transformation, |
|
// and can be orthographic orperspective. |
|
|
|
// I expect that the client DLL will call this method any time the shadow |
|
// changes because the light changes, or because the entity casting the |
|
// shadow moves |
|
|
|
// Note that we can't really control the shadows from the engine because |
|
// the engine only knows about pevs, which don't exist on the client |
|
|
|
// The shadow matrix specifies a world-space transform for the shadow |
|
// the shadow is projected down the z direction, and the origin of the |
|
// shadow matrix is the origin of the projection ray. The size indicates |
|
// the shadow size measured in the space of the shadow matrix; the |
|
// shadow goes from +/- size.x/2 along the x axis of the shadow matrix |
|
// and +/- size.y/2 along the y axis of the shadow matrix. |
|
virtual void ProjectShadow( ShadowHandle_t handle, const Vector &origin, |
|
const Vector& projectionDir, const VMatrix& worldToShadow, const Vector2D& size, |
|
int nLeafCount, const int *pLeafList, |
|
float maxHeight, float falloffOffset, float falloffAmount, const Vector &vecCasterOrigin ) = 0; |
|
|
|
virtual void ProjectFlashlight( ShadowHandle_t handle, const VMatrix &worldToShadow, int nLeafCount, const int *pLeafList ) = 0; |
|
|
|
// Gets at information about a particular shadow |
|
virtual const ShadowInfo_t &GetInfo( ShadowHandle_t handle ) = 0; |
|
|
|
virtual const Frustum_t &GetFlashlightFrustum( ShadowHandle_t handle ) = 0; |
|
|
|
// Methods related to shadows on brush models |
|
virtual void AddShadowToBrushModel( ShadowHandle_t handle, |
|
model_t* pModel, const Vector& origin, const QAngle& angles ) = 0; |
|
|
|
// Removes all shadows from a brush model |
|
virtual void RemoveAllShadowsFromBrushModel( model_t* pModel ) = 0; |
|
|
|
// Sets the texture coordinate range for a shadow... |
|
virtual void SetShadowTexCoord( ShadowHandle_t handle, float x, float y, float w, float h ) = 0; |
|
|
|
// Methods related to shadows on studio models |
|
virtual void AddShadowToModel( ShadowHandle_t shadow, ModelInstanceHandle_t instance ) = 0; |
|
virtual void RemoveAllShadowsFromModel( ModelInstanceHandle_t instance ) = 0; |
|
|
|
// Set extra clip planes related to shadows... |
|
// These are used to prevent pokethru and back-casting |
|
virtual void ClearExtraClipPlanes( ShadowHandle_t shadow ) = 0; |
|
virtual void AddExtraClipPlane( ShadowHandle_t shadow, const Vector& normal, float dist ) = 0; |
|
|
|
// Allows us to disable particular shadows |
|
virtual void EnableShadow( ShadowHandle_t shadow, bool bEnable ) = 0; |
|
|
|
// Set the darkness falloff bias |
|
virtual void SetFalloffBias( ShadowHandle_t shadow, unsigned char ucBias ) = 0; |
|
|
|
// Update the state for a flashlight. |
|
virtual void UpdateFlashlightState( ShadowHandle_t shadowHandle, const FlashlightState_t &lightState ) = 0; |
|
|
|
virtual void DrawFlashlightDepthTexture( ) = 0; |
|
|
|
virtual void AddFlashlightRenderable( ShadowHandle_t shadow, IClientRenderable *pRenderable ) = 0; |
|
virtual ShadowHandle_t CreateShadowEx( IMaterial* pMaterial, IMaterial* pModelMaterial, void* pBindProxy, int creationFlags ) = 0; |
|
|
|
virtual void SetFlashlightDepthTexture( ShadowHandle_t shadowHandle, ITexture *pFlashlightDepthTexture, unsigned char ucShadowStencilBit ) = 0; |
|
|
|
virtual const FlashlightState_t &GetFlashlightState( ShadowHandle_t handle ) = 0; |
|
|
|
virtual void SetFlashlightRenderState( ShadowHandle_t handle ) = 0; |
|
}; |
|
|
|
|
|
#endif
|
|
|