2022-02-27 07:53:44 -05:00
# include <STDInclude.hpp>
2017-01-19 16:23:59 -05:00
namespace Components
{
Utils : : Signal < Renderer : : BackendCallback > Renderer : : BackendFrameSignal ;
2017-06-22 16:05:22 -04:00
Utils : : Signal < Renderer : : BackendCallback > Renderer : : SingleBackendFrameSignal ;
2017-01-19 16:23:59 -05:00
2022-05-05 10:03:14 -04:00
Utils : : Signal < Renderer : : Callback > Renderer : : EndRecoverDeviceSignal ;
Utils : : Signal < Renderer : : Callback > Renderer : : BeginRecoverDeviceSignal ;
2017-04-23 07:31:48 -04:00
2021-11-11 08:00:46 -05:00
Dvar : : Var Renderer : : r_drawTriggers ;
Dvar : : Var Renderer : : r_drawSceneModelCollisions ;
Dvar : : Var Renderer : : r_drawModelBoundingBoxes ;
Dvar : : Var Renderer : : r_drawModelNames ;
Dvar : : Var Renderer : : r_drawAABBTrees ;
Dvar : : Var Renderer : : r_playerDrawDebugDistance ;
float cyan [ 4 ] = { 0.0f , 0.5f , 0.5f , 1.0f } ;
float red [ 4 ] = { 1.0f , 0.0f , 0.0f , 1.0f } ;
float green [ 4 ] = { 0.0f , 1.0f , 0.0f , 1.0f } ;
// R_draw model names & collisions colors
2021-11-08 11:56:19 -05:00
float sceneModelsColor [ 4 ] = { 1.0f , 1.0f , 0.0f , 1.0f } ;
float dobjsColor [ 4 ] = { 0.0f , 1.0f , 1.0f , 1.0f } ;
float staticModelsColor [ 4 ] = { 1.0f , 0.0f , 1.0f , 1.0f } ;
float gentitiesColor [ 4 ] = { 1.0f , 0.5f , 0.5f , 1.0f } ;
2021-11-11 08:00:46 -05:00
// Trigger colors
float hurt [ 4 ] = { 1.0f , 0.0f , 0.0f , 1.0f } ;
float hurtTouch [ 4 ] = { 0.75f , 0.0f , 0.0f , 1.0f } ;
float damage [ 4 ] = { 0.0f , 0.0f , 1.0f , 1.0f } ;
float once [ 4 ] = { 0.0f , 1.0f , 1.0f , 1.0f } ;
float multiple [ 4 ] = { 0.0f , 1.0f , 0.0f , 1.0f } ;
2021-11-08 11:56:19 -05:00
2017-01-19 16:23:59 -05:00
__declspec ( naked ) void Renderer : : BackendFrameStub ( )
{
__asm
{
pushad
call Renderer : : BackendFrameHandler
popad
mov eax , ds : 66E1 BF0h
2017-01-28 06:39:03 -05:00
push 536 A85h
retn
2017-01-19 16:23:59 -05:00
}
}
void Renderer : : BackendFrameHandler ( )
{
IDirect3DDevice9 * device = * Game : : dx_ptr ;
if ( device )
{
device - > AddRef ( ) ;
2017-06-22 16:05:22 -04:00
2017-01-19 16:23:59 -05:00
Renderer : : BackendFrameSignal ( device ) ;
2017-06-22 16:05:22 -04:00
Utils : : Signal < Renderer : : BackendCallback > copy ( Renderer : : SingleBackendFrameSignal ) ;
Renderer : : SingleBackendFrameSignal . clear ( ) ;
copy ( device ) ;
2017-01-19 16:23:59 -05:00
device - > Release ( ) ;
}
}
2017-06-22 16:05:22 -04:00
void Renderer : : OnNextBackendFrame ( Utils : : Slot < Renderer : : BackendCallback > callback )
{
Renderer : : SingleBackendFrameSignal . connect ( callback ) ;
}
2017-01-19 16:23:59 -05:00
void Renderer : : OnBackendFrame ( Utils : : Slot < Renderer : : BackendCallback > callback )
{
Renderer : : BackendFrameSignal . connect ( callback ) ;
}
2022-05-05 10:03:14 -04:00
void Renderer : : OnDeviceRecoveryEnd ( Utils : : Slot < Renderer : : Callback > callback )
2017-01-19 16:23:59 -05:00
{
Renderer : : EndRecoverDeviceSignal . connect ( callback ) ;
}
2022-05-05 10:03:14 -04:00
void Renderer : : OnDeviceRecoveryBegin ( Utils : : Slot < Renderer : : Callback > callback )
2017-01-19 16:23:59 -05:00
{
Renderer : : BeginRecoverDeviceSignal . connect ( callback ) ;
}
int Renderer : : Width ( )
{
2017-06-22 16:05:22 -04:00
return reinterpret_cast < LPPOINT > ( 0x66E1C68 ) - > x ;
2017-01-19 16:23:59 -05:00
}
int Renderer : : Height ( )
{
2017-06-22 16:05:22 -04:00
return reinterpret_cast < LPPOINT > ( 0x66E1C68 ) - > y ;
2017-01-19 16:23:59 -05:00
}
2017-06-06 08:02:56 -04:00
void Renderer : : PreVidRestart ( )
{
Renderer : : BeginRecoverDeviceSignal ( ) ;
}
void Renderer : : PostVidRestart ( )
{
Renderer : : EndRecoverDeviceSignal ( ) ;
}
__declspec ( naked ) void Renderer : : PostVidRestartStub ( )
{
__asm
{
pushad
call Renderer : : PostVidRestart
popad
push 4F 84 C0h
retn
}
}
2018-12-24 15:42:39 -05:00
void Renderer : : R_TextureFromCodeError ( const char * sampler , Game : : GfxCmdBufState * state )
{
2022-06-12 17:07:53 -04:00
Logger : : Error ( Game : : ERR_FATAL , " Tried to use sampler '{}' when it isn't valid for material '{}' and technique '{}' " ,
2018-12-24 15:42:39 -05:00
sampler , state - > material - > info . name , state - > technique - > name ) ;
}
__declspec ( naked ) void Renderer : : StoreGfxBufContextPtrStub1 ( )
{
__asm
{
// original code
2022-06-12 17:07:53 -04:00
mov eax , dword ptr [ eax * 4 + 0x66E600C ]
2018-12-24 15:42:39 -05:00
// show error
2022-06-12 17:07:53 -04:00
pushad
push [ esp + 0x24 + 0x20 ]
push eax
call R_TextureFromCodeError
add esp , 8
popad
2018-12-24 15:42:39 -05:00
// go back
2022-06-12 17:07:53 -04:00
push 0x54CAC1
retn
2018-12-24 15:42:39 -05:00
}
}
__declspec ( naked ) void Renderer : : StoreGfxBufContextPtrStub2 ( )
{
__asm
{
// original code
2022-06-12 17:07:53 -04:00
mov edx , dword ptr [ eax * 4 + 0x66E600C ]
2018-12-24 15:42:39 -05:00
// show error
2022-06-12 17:07:53 -04:00
pushad
push ebx
push edx
call R_TextureFromCodeError
add esp , 8
popad
2018-12-24 15:42:39 -05:00
// go back
2022-06-12 17:07:53 -04:00
push 0x54CFA4
retn
2018-12-24 15:42:39 -05:00
}
}
2018-12-25 16:47:10 -05:00
int Renderer : : DrawTechsetForMaterial ( int a1 , float a2 , float a3 , const char * material , Game : : vec4_t * color , int a6 )
{
auto mat = Game : : DB_FindXAssetHeader ( Game : : XAssetType : : ASSET_TYPE_MATERIAL , Utils : : String : : VA ( " wc/%s " , material ) ) . material ;
return Utils : : Hook : : Call < int ( int , float , float , const char * , Game : : vec4_t * , int ) > ( 0x005033E0 ) ( a1 , a2 , a3 , Utils : : String : : VA ( " %s (^3%s^7) " , mat - > info . name , mat - > techniqueSet - > name ) , color , a6 ) ;
}
2021-11-07 16:48:52 -05:00
void Renderer : : DebugDrawTriggers ( )
{
2021-11-11 08:00:46 -05:00
if ( ! r_drawTriggers . get < bool > ( ) ) return ;
2021-11-07 16:48:52 -05:00
2021-12-13 12:46:55 -05:00
auto entities = Game : : g_entities ;
2021-11-07 16:48:52 -05:00
2021-11-11 08:00:46 -05:00
for ( auto i = 0u ; i < 0x800u ; i + + )
2021-11-07 16:48:52 -05:00
{
auto * ent = & entities [ i ] ;
if ( ent - > r . isInUse )
{
Game : : Bounds b = ent - > r . box ;
b . midPoint [ 0 ] + = ent - > r . currentOrigin [ 0 ] ;
b . midPoint [ 1 ] + = ent - > r . currentOrigin [ 1 ] ;
b . midPoint [ 2 ] + = ent - > r . currentOrigin [ 2 ] ;
switch ( ent - > handler )
{
case Game : : ENT_HANDLER_TRIGGER_HURT :
Game : : R_AddDebugBounds ( hurt , & b ) ;
break ;
case Game : : ENT_HANDLER_TRIGGER_HURT_TOUCH :
Game : : R_AddDebugBounds ( hurtTouch , & b ) ;
break ;
case Game : : ENT_HANDLER_TRIGGER_DAMAGE :
Game : : R_AddDebugBounds ( damage , & b ) ;
break ;
case Game : : ENT_HANDLER_TRIGGER_MULTIPLE :
if ( ent - > spawnflags & 0x40 )
Game : : R_AddDebugBounds ( once , & b ) ;
else
Game : : R_AddDebugBounds ( multiple , & b ) ;
break ;
default :
2021-11-11 08:00:46 -05:00
auto rv = std : : min ( static_cast < float > ( ent - > handler ) , 5.0f ) / 5.0f ;
2021-12-13 12:46:55 -05:00
auto gv = std : : clamp ( static_cast < float > ( ent - > handler - 5 ) , 0.f , 5.0f ) / 5.0f ;
auto bv = std : : clamp ( static_cast < float > ( ent - > handler - 10 ) , 0.f , 5.0f ) / 5.0f ;
2021-11-07 16:48:52 -05:00
float color [ 4 ] = { rv , gv , bv , 1.0f } ;
Game : : R_AddDebugBounds ( color , & b ) ;
break ;
}
}
}
}
void Renderer : : DebugDrawSceneModelCollisions ( )
{
2021-11-11 08:00:46 -05:00
if ( ! r_drawSceneModelCollisions . get < bool > ( ) ) return ;
2021-11-07 16:48:52 -05:00
2021-12-13 12:46:55 -05:00
auto scene = Game : : scene ;
2021-11-07 16:48:52 -05:00
for ( auto i = 0 ; i < scene - > sceneModelCount ; i + + )
{
if ( ! scene - > sceneModel [ i ] . model )
continue ;
for ( auto j = 0 ; j < scene - > sceneModel [ i ] . model - > numCollSurfs ; j + + )
{
auto b = scene - > sceneModel [ i ] . model - > collSurfs [ j ] . bounds ;
b . midPoint [ 0 ] + = scene - > sceneModel [ i ] . placement . base . origin [ 0 ] ;
b . midPoint [ 1 ] + = scene - > sceneModel [ i ] . placement . base . origin [ 1 ] ;
b . midPoint [ 2 ] + = scene - > sceneModel [ i ] . placement . base . origin [ 2 ] ;
b . halfSize [ 0 ] * = scene - > sceneModel [ i ] . placement . scale ;
b . halfSize [ 1 ] * = scene - > sceneModel [ i ] . placement . scale ;
b . halfSize [ 2 ] * = scene - > sceneModel [ i ] . placement . scale ;
Game : : R_AddDebugBounds ( green , & b , & scene - > sceneModel [ i ] . placement . base . quat ) ;
}
}
}
2021-11-08 11:56:19 -05:00
void Renderer : : DebugDrawModelBoundingBoxes ( )
2021-11-07 16:48:52 -05:00
{
2021-11-11 08:00:46 -05:00
auto val = r_drawModelBoundingBoxes . get < int > ( ) ;
2021-11-07 16:48:52 -05:00
2021-11-08 11:56:19 -05:00
if ( ! val ) return ;
2021-11-07 16:48:52 -05:00
2021-11-11 08:00:46 -05:00
// Ingame only
2021-11-08 11:56:19 -05:00
int clientNum = Game : : CG_GetClientNum ( ) ;
2021-11-11 08:00:46 -05:00
if ( ! Game : : CL_IsCgameInitialized ( ) | |
clientNum > = 18 | |
clientNum < 0 | |
2021-12-13 13:06:04 -05:00
Game : : g_entities [ clientNum ] . client = = nullptr ) {
2021-11-11 08:00:46 -05:00
return ;
}
2021-11-07 16:48:52 -05:00
2021-11-08 11:56:19 -05:00
Game : : gentity_t * clientEntity = & Game : : g_entities [ clientNum ] ;
2021-11-07 16:48:52 -05:00
2021-12-13 12:46:55 -05:00
float playerPosition [ 3 ] { clientEntity - > r . currentOrigin [ 0 ] , clientEntity - > r . currentOrigin [ 1 ] , clientEntity - > r . currentOrigin [ 2 ] } ;
2021-11-07 16:48:52 -05:00
2021-12-13 13:06:04 -05:00
const auto mapName = Dvar : : Var ( " mapname " ) . get < const char * > ( ) ;
2021-12-13 12:46:55 -05:00
auto scene = Game : : scene ;
2021-11-08 11:56:19 -05:00
auto world = Game : : DB_FindXAssetEntry ( Game : : XAssetType : : ASSET_TYPE_GFXWORLD , Utils : : String : : VA ( " maps/mp/%s.d3dbsp " , mapName ) ) - > asset . header . gfxWorld ;
2021-11-11 10:44:54 -05:00
auto drawDistance = r_playerDrawDebugDistance . get < int > ( ) ;
auto sqrDist = drawDistance * drawDistance ;
2021-12-13 12:46:55 -05:00
switch ( val )
{
2021-11-08 11:56:19 -05:00
case 1 :
for ( auto i = 0 ; i < scene - > sceneModelCount ; i + + )
{
if ( ! scene - > sceneModel [ i ] . model )
continue ;
2021-12-13 12:46:55 -05:00
if ( Utils : : Vec3SqrDistance ( playerPosition , scene - > sceneModel [ i ] . placement . base . origin ) < sqrDist )
2021-11-08 11:56:19 -05:00
{
auto b = scene - > sceneModel [ i ] . model - > bounds ;
b . midPoint [ 0 ] + = scene - > sceneModel [ i ] . placement . base . origin [ 0 ] ;
b . midPoint [ 1 ] + = scene - > sceneModel [ i ] . placement . base . origin [ 1 ] ;
b . midPoint [ 2 ] + = scene - > sceneModel [ i ] . placement . base . origin [ 2 ] ;
b . halfSize [ 0 ] * = scene - > sceneModel [ i ] . placement . scale ;
b . halfSize [ 1 ] * = scene - > sceneModel [ i ] . placement . scale ;
b . halfSize [ 2 ] * = scene - > sceneModel [ i ] . placement . scale ;
Game : : R_AddDebugBounds ( sceneModelsColor , & b , & scene - > sceneModel [ i ] . placement . base . quat ) ;
}
}
break ;
2021-11-07 16:48:52 -05:00
2021-11-08 11:56:19 -05:00
case 2 :
for ( auto i = 0 ; i < scene - > sceneDObjCount ; i + + )
2021-11-07 16:48:52 -05:00
{
2021-12-13 12:46:55 -05:00
if ( Utils : : Vec3SqrDistance ( playerPosition , scene - > sceneDObj [ i ] . cull . bounds . midPoint ) < sqrDist )
2021-11-08 11:56:19 -05:00
{
scene - > sceneDObj [ i ] . cull . bounds . halfSize [ 0 ] = std : : abs ( scene - > sceneDObj [ i ] . cull . bounds . halfSize [ 0 ] ) ;
scene - > sceneDObj [ i ] . cull . bounds . halfSize [ 1 ] = std : : abs ( scene - > sceneDObj [ i ] . cull . bounds . halfSize [ 1 ] ) ;
scene - > sceneDObj [ i ] . cull . bounds . halfSize [ 2 ] = std : : abs ( scene - > sceneDObj [ i ] . cull . bounds . halfSize [ 2 ] ) ;
if ( scene - > sceneDObj [ i ] . cull . bounds . halfSize [ 0 ] < 0 | |
scene - > sceneDObj [ i ] . cull . bounds . halfSize [ 1 ] < 0 | |
scene - > sceneDObj [ i ] . cull . bounds . halfSize [ 2 ] < 0 )
{
2022-06-12 17:07:53 -04:00
Logger : : Warning ( Game : : CON_CHANNEL_DONT_FILTER , " Negative half size for DOBJ {}, this will cause culling issues! " ,
scene - > sceneDObj [ i ] . obj - > models [ 0 ] - > name ) ;
2021-11-08 11:56:19 -05:00
}
Game : : R_AddDebugBounds ( dobjsColor , & scene - > sceneDObj [ i ] . cull . bounds ) ;
}
2021-11-07 16:48:52 -05:00
}
2021-11-08 11:56:19 -05:00
break ;
2021-11-07 16:48:52 -05:00
2021-11-08 11:56:19 -05:00
case 3 :
// Static models
for ( size_t i = 0 ; i < world - > dpvs . smodelCount ; i + + )
{
auto staticModel = world - > dpvs . smodelDrawInsts [ i ] ;
2021-12-13 12:46:55 -05:00
if ( Utils : : Vec3SqrDistance ( playerPosition , staticModel . placement . origin ) < sqrDist )
2021-11-08 11:56:19 -05:00
{
if ( staticModel . model )
{
Game : : Bounds b = staticModel . model - > bounds ;
b . midPoint [ 0 ] + = staticModel . placement . origin [ 0 ] ;
b . midPoint [ 1 ] + = staticModel . placement . origin [ 1 ] ;
b . midPoint [ 2 ] + = staticModel . placement . origin [ 2 ] ;
b . halfSize [ 0 ] * = staticModel . placement . scale ;
b . halfSize [ 1 ] * = staticModel . placement . scale ;
b . halfSize [ 2 ] * = staticModel . placement . scale ;
Game : : R_AddDebugBounds ( staticModelsColor , & b ) ;
}
}
}
break ;
2021-11-07 16:48:52 -05:00
}
}
void Renderer : : DebugDrawModelNames ( )
{
2021-11-11 08:00:46 -05:00
auto val = r_drawModelNames . get < int > ( ) ;
2021-11-07 16:48:52 -05:00
if ( ! val ) return ;
2021-11-11 08:00:46 -05:00
// Ingame only
2021-11-08 11:56:19 -05:00
int clientNum = Game : : CG_GetClientNum ( ) ;
2021-11-11 08:00:46 -05:00
if ( ! Game : : CL_IsCgameInitialized ( ) | |
clientNum > = 18 | |
clientNum < 0 | |
2021-12-13 13:06:04 -05:00
Game : : g_entities [ clientNum ] . client = = nullptr ) {
2021-11-11 08:00:46 -05:00
return ;
}
2021-11-08 11:56:19 -05:00
Game : : gentity_t * clientEntity = & Game : : g_entities [ clientNum ] ;
2021-12-13 12:46:55 -05:00
float playerPosition [ 3 ] { clientEntity - > r . currentOrigin [ 0 ] , clientEntity - > r . currentOrigin [ 1 ] , clientEntity - > r . currentOrigin [ 2 ] } ;
2021-11-07 16:48:52 -05:00
2021-12-13 13:06:04 -05:00
const auto mapName = Dvar : : Var ( " mapname " ) . get < const char * > ( ) ;
2021-12-13 12:46:55 -05:00
auto scene = Game : : scene ;
2021-11-07 16:48:52 -05:00
auto world = Game : : DB_FindXAssetEntry ( Game : : XAssetType : : ASSET_TYPE_GFXWORLD , Utils : : String : : VA ( " maps/mp/%s.d3dbsp " , mapName ) ) - > asset . header . gfxWorld ;
2021-11-11 10:44:54 -05:00
auto drawDistance = r_playerDrawDebugDistance . get < int > ( ) ;
auto sqrDist = drawDistance * drawDistance ;
2021-11-08 11:56:19 -05:00
switch ( val ) {
case 1 :
2021-11-07 16:48:52 -05:00
for ( auto i = 0 ; i < scene - > sceneModelCount ; i + + )
{
if ( ! scene - > sceneModel [ i ] . model )
continue ;
2021-12-13 12:46:55 -05:00
if ( Utils : : Vec3SqrDistance ( playerPosition , scene - > sceneModel [ i ] . placement . base . origin ) < sqrDist )
2021-11-08 11:56:19 -05:00
{
Game : : R_AddDebugString ( sceneModelsColor , scene - > sceneModel [ i ] . placement . base . origin , 1.0 , scene - > sceneModel [ i ] . model - > name ) ;
}
2021-11-07 16:48:52 -05:00
}
2021-11-08 11:56:19 -05:00
break ;
2021-11-07 16:48:52 -05:00
2021-11-08 11:56:19 -05:00
case 2 :
2021-11-07 16:48:52 -05:00
for ( auto i = 0 ; i < scene - > sceneDObjCount ; i + + )
{
if ( scene - > sceneDObj [ i ] . obj )
{
for ( int j = 0 ; j < scene - > sceneDObj [ i ] . obj - > numModels ; j + + )
{
2021-12-13 12:46:55 -05:00
if ( Utils : : Vec3SqrDistance ( playerPosition , scene - > sceneDObj [ i ] . placement . origin ) < sqrDist )
2021-11-08 11:56:19 -05:00
{
Game : : R_AddDebugString ( dobjsColor , scene - > sceneDObj [ i ] . placement . origin , 1.0 , scene - > sceneDObj [ i ] . obj - > models [ j ] - > name ) ;
}
2021-11-07 16:48:52 -05:00
}
}
}
2021-11-08 11:56:19 -05:00
break ;
2021-11-07 16:48:52 -05:00
2021-11-08 11:56:19 -05:00
case 3 :
2021-11-07 16:48:52 -05:00
// Static models
for ( size_t i = 0 ; i < world - > dpvs . smodelCount ; i + + )
{
auto staticModel = world - > dpvs . smodelDrawInsts [ i ] ;
if ( staticModel . model )
{
2021-12-13 12:46:55 -05:00
auto dist = Utils : : Vec3SqrDistance ( playerPosition , staticModel . placement . origin ) ;
2021-11-11 10:44:54 -05:00
if ( dist < sqrDist )
2021-11-08 11:56:19 -05:00
{
Game : : R_AddDebugString ( staticModelsColor , staticModel . placement . origin , 1.0 , staticModel . model - > name ) ;
}
2021-11-07 16:48:52 -05:00
}
}
2021-11-08 11:56:19 -05:00
break ;
2021-11-07 16:48:52 -05:00
}
}
void Renderer : : DebugDrawAABBTrees ( )
{
2021-11-11 08:00:46 -05:00
if ( ! r_drawAABBTrees . get < bool > ( ) ) return ;
2021-11-07 16:48:52 -05:00
Game : : clipMap_t * clipMap = * reinterpret_cast < Game : : clipMap_t * * > ( 0x7998E0 ) ;
if ( ! clipMap ) return ;
for ( unsigned short i = 0 ; i < clipMap - > smodelNodeCount ; + + i )
{
Game : : R_AddDebugBounds ( cyan , & clipMap - > smodelNodes [ i ] . bounds ) ;
}
for ( unsigned int i = 0 ; i < clipMap - > numStaticModels ; i + = 2 )
{
Game : : R_AddDebugBounds ( red , & clipMap - > staticModelList [ i ] . absBounds ) ;
}
}
2017-01-19 16:23:59 -05:00
Renderer : : Renderer ( )
{
2017-02-25 06:54:26 -05:00
if ( Dedicated : : IsEnabled ( ) ) return ;
2022-05-05 10:03:14 -04:00
Scheduler : : Loop ( [ ]
{
2021-11-07 16:57:35 -05:00
if ( Game : : CL_IsCgameInitialized ( ) )
{
DebugDrawAABBTrees ( ) ;
DebugDrawModelNames ( ) ;
2021-11-08 11:56:19 -05:00
DebugDrawModelBoundingBoxes ( ) ;
2021-11-07 16:57:35 -05:00
DebugDrawSceneModelCollisions ( ) ;
DebugDrawTriggers ( ) ;
}
2022-05-05 10:03:14 -04:00
} , Scheduler : : Pipeline : : RENDERER ) ;
2021-11-08 11:56:19 -05:00
2022-04-12 17:15:50 -04:00
// Log broken materials
2018-12-24 15:42:39 -05:00
Utils : : Hook ( 0x0054CAAA , Renderer : : StoreGfxBufContextPtrStub1 , HOOK_JUMP ) . install ( ) - > quick ( ) ;
Utils : : Hook ( 0x0054CF8D , Renderer : : StoreGfxBufContextPtrStub2 , HOOK_JUMP ) . install ( ) - > quick ( ) ;
2018-12-25 16:47:10 -05:00
// Enhance cg_drawMaterial
Utils : : Hook : : Set ( 0x005086DA , " ^3solid^7 " ) ;
Utils : : Hook ( 0x00580F53 , Renderer : : DrawTechsetForMaterial , HOOK_CALL ) . install ( ) - > quick ( ) ;
2017-01-19 16:23:59 -05:00
Utils : : Hook ( 0x536A80 , Renderer : : BackendFrameStub , HOOK_JUMP ) . install ( ) - > quick ( ) ;
2017-06-06 08:02:56 -04:00
// Begin device recovery (not D3D9Ex)
2017-06-14 06:06:04 -04:00
Utils : : Hook ( 0x508298 , [ ] ( )
2021-12-13 13:06:04 -05:00
{
Game : : DB_BeginRecoverLostDevice ( ) ;
Renderer : : BeginRecoverDeviceSignal ( ) ;
} , HOOK_CALL ) . install ( ) - > quick ( ) ;
2017-01-19 16:23:59 -05:00
2021-11-08 13:00:51 -05:00
// End device recovery (not D3D9Ex)
Utils : : Hook ( 0x508355 , [ ] ( )
{
Renderer : : EndRecoverDeviceSignal ( ) ;
Game : : DB_EndRecoverLostDevice ( ) ;
} , HOOK_CALL ) . install ( ) - > quick ( ) ;
2017-06-06 08:02:56 -04:00
2021-11-08 13:00:51 -05:00
// Begin vid_restart
Utils : : Hook ( 0x4CA2FD , Renderer : : PreVidRestart , HOOK_CALL ) . install ( ) - > quick ( ) ;
2017-06-06 08:02:56 -04:00
2021-11-08 13:00:51 -05:00
// End vid_restart
Utils : : Hook ( 0x4CA3A7 , Renderer : : PostVidRestartStub , HOOK_CALL ) . install ( ) - > quick ( ) ;
2021-11-07 16:48:52 -05:00
2022-05-27 06:19:28 -04:00
Scheduler : : Once ( [ ]
2021-11-08 13:00:51 -05:00
{
2021-12-13 13:06:04 -05:00
static const char * values [ ] =
2021-11-08 13:00:51 -05:00
{
2021-11-11 08:00:46 -05:00
" Disabled " ,
" Scene Models " ,
" Scene Dynamic Objects " ,
" GfxWorld Static Models " ,
2021-11-08 13:00:51 -05:00
nullptr
} ;
2022-03-08 07:20:28 -05:00
Renderer : : r_drawModelBoundingBoxes = Game : : Dvar_RegisterEnum ( " r_drawModelBoundingBoxes " , values , 0 , Game : : DVAR_CHEAT , " Draw scene model bounding boxes " ) ;
Renderer : : r_drawSceneModelCollisions = Game : : Dvar_RegisterBool ( " r_drawSceneModelCollisions " , false , Game : : DVAR_CHEAT , " Draw scene model collisions " ) ;
Renderer : : r_drawTriggers = Game : : Dvar_RegisterBool ( " r_drawTriggers " , false , Game : : DVAR_CHEAT , " Draw triggers " ) ;
Renderer : : r_drawModelNames = Game : : Dvar_RegisterEnum ( " r_drawModelNames " , values , 0 , Game : : DVAR_CHEAT , " Draw all model names " ) ;
Renderer : : r_drawAABBTrees = Game : : Dvar_RegisterBool ( " r_drawAabbTrees " , false , Game : : DVAR_CHEAT , " Draw aabb trees " ) ;
Renderer : : r_playerDrawDebugDistance = Game : : Dvar_RegisterInt ( " r_drawDebugDistance " , 1000 , 0 , 50000 , Game : : DVAR_ARCHIVE , " r_draw debug functions draw distance, relative to the player " ) ;
2022-05-27 06:19:28 -04:00
} , Scheduler : : Pipeline : : MAIN ) ;
2017-01-19 16:23:59 -05:00
}
Renderer : : ~ Renderer ( )
{
Renderer : : BackendFrameSignal . clear ( ) ;
2017-06-22 16:05:22 -04:00
Renderer : : SingleBackendFrameSignal . clear ( ) ;
2017-01-19 16:23:59 -05:00
Renderer : : EndRecoverDeviceSignal . clear ( ) ;
Renderer : : BeginRecoverDeviceSignal . clear ( ) ;
}
}