Skip to content

Commit

Permalink
Added createSearchLight
Browse files Browse the repository at this point in the history
  • Loading branch information
jushar committed Dec 7, 2015
1 parent 0906b9a commit 9330995
Show file tree
Hide file tree
Showing 23 changed files with 307 additions and 5 deletions.
22 changes: 21 additions & 1 deletion MTA10/game_sa/CPointLightsSA.cpp
Expand Up @@ -39,4 +39,24 @@ void CPointLightsSA::AddLight ( int iMode, const CVector vecPosition, CVector ve
call dwFunc
add esp, 56
}
}
}

void CPointLightsSA::RenderHeliLight ( const CVector& vecStart, const CVector& vecEnd, float startRadius, float endRadius, bool renderSpot )
{
using CHeli_SearchLightCone_t = void(__cdecl *)(int handleId, CVector startPos, CVector endPos, float radius1, float unknownConstant,
int unkown1, bool renderSpot, CVector* unkown3, CVector* unkown4, CVector* unknown5, int unknown6, float radius2);
using CHeli_PreSearchLightCone_t = int(__cdecl *)();
using CHeli_PostSearchLightCone_t = int(__cdecl *)();

auto CHeli_SearchLightCone = (CHeli_SearchLightCone_t)FUNC_CHeli_SearchLightCone;
auto CHeli_PreSearchLightCone = (CHeli_PreSearchLightCone_t)FUNC_CHeli_Pre_SearchLightCone;
auto CHeli_PostSearchLightCone = (CHeli_PostSearchLightCone_t)FUNC_CHeli_Post_SearchLightCone;

// 3x3 translation matrix (initialised by the game)
CVector mat[] = { CVector(), CVector(), CVector() };

// Set render states and render
CHeli_PreSearchLightCone ();
CHeli_SearchLightCone ( 0, vecStart, vecEnd, endRadius, 1.0f, 0, renderSpot, &mat[0], &mat[1], &mat[2], 1, startRadius );
CHeli_PostSearchLightCone ();
}
5 changes: 5 additions & 0 deletions MTA10/game_sa/CPointLightsSA.h
Expand Up @@ -16,11 +16,16 @@
#include <game/CPointLights.h>

#define FUNC_CPointLights_AddLight 0x7000e0
#define FUNC_CHeli_Pre_SearchLightCone 0x6C4650
#define FUNC_CHeli_Post_SearchLightCone 0x6C46E0
#define FUNC_CHeli_SearchLightCone 0x6C58E0

class CPointLightsSA : public CPointLights
{
public:
void AddLight ( int iMode, const CVector vecPosition, CVector vecDirection, float fRadius, SColor color, unsigned char uc_8, bool bCreatesShadow, CEntity * pAffected );

void RenderHeliLight ( const CVector& vecStart, const CVector& vecEnd, float startRadius, float endRadius, bool renderSpot );
};

#endif
1 change: 1 addition & 0 deletions MTA10/mods/deathmatch/StdInc.h
Expand Up @@ -88,6 +88,7 @@
#include <CClientTexture.h>
#include <CClientShader.h>
#include <CClientWebBrowser.h>
#include <CClientSearchLight.h>
#include <CClientEffect.h>
#include <CCustomData.h>
#include <CElementArray.h>
Expand Down
3 changes: 3 additions & 0 deletions MTA10/mods/deathmatch/_Deathmatch 2008.vcxproj
Expand Up @@ -359,12 +359,14 @@
</ClCompile>
<ClCompile Include="..\shared_logic\CClientEffect.cpp" />
<ClCompile Include="..\shared_logic\CClientEffectManager.cpp" />
<ClCompile Include="..\shared_logic\CClientSearchLight.cpp" />
<ClCompile Include="..\shared_logic\CClientPointLights.cpp" />
<ClCompile Include="..\shared_logic\CClientPointLightsManager.cpp" />
<ClCompile Include="..\shared_logic\luadefs\CLuaVector2Defs.cpp" />
<ClCompile Include="..\shared_logic\luadefs\CLuaVector3Defs.cpp" />
<ClCompile Include="..\shared_logic\luadefs\CLuaVector4Defs.cpp" />
<ClCompile Include="..\shared_logic\lua\CLuaFunctionDefs.PointLights.cpp" />
<ClCompile Include="..\shared_logic\lua\CLuaFunctionDefs.SearchLight.cpp" />
<ClCompile Include="..\shared_logic\lua\CLuaVector2.cpp" />
<ClCompile Include="..\shared_logic\lua\CLuaVector3.cpp" />
<ClCompile Include="..\shared_logic\lua\CLuaVector4.cpp" />
Expand Down Expand Up @@ -753,6 +755,7 @@
<ItemGroup>
<ClInclude Include="..\shared_logic\CClientEffect.h" />
<ClInclude Include="..\shared_logic\CClientEffectManager.h" />
<ClInclude Include="..\shared_logic\CClientSearchLight.h" />
<ClInclude Include="..\shared_logic\CClientPointLights.h" />
<ClInclude Include="..\shared_logic\CClientPointLightsManager.h" />
<ClInclude Include="..\shared_logic\luadefs\CLuaVector2Defs.h" />
Expand Down
9 changes: 9 additions & 0 deletions MTA10/mods/deathmatch/_Deathmatch 2008.vcxproj.filters
Expand Up @@ -935,6 +935,12 @@
<ClCompile Include="..\shared_logic\lua\CLuaFunctionDefs.Browser.cpp">
<Filter>Source Files\shared_logic\lua</Filter>
</ClCompile>
<ClCompile Include="..\shared_logic\lua\CLuaFunctionDefs.SearchLight.cpp">
<Filter>Source Files\shared_logic\lua</Filter>
</ClCompile>
<ClCompile Include="..\shared_logic\CClientSearchLight.cpp">
<Filter>Source Files\shared_logic</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="CClient.h">
Expand Down Expand Up @@ -1651,5 +1657,8 @@
<ClInclude Include="..\shared_logic\CClientWebBrowser.h">
<Filter>Header Files\shared_logic</Filter>
</ClInclude>
<ClInclude Include="..\shared_logic\CClientSearchLight.h">
<Filter>Header Files\shared_logic</Filter>
</ClInclude>
</ItemGroup>
</Project>
7 changes: 7 additions & 0 deletions MTA10/mods/deathmatch/logic/CClientGame.cpp
Expand Up @@ -261,6 +261,7 @@ CClientGame::CClientGame ( bool bLocalPlay )
g_pMultiplayer->SetProjectileHandler ( CClientProjectileManager::Hook_StaticProjectileCreation );
g_pMultiplayer->SetRender3DStuffHandler ( CClientGame::StaticRender3DStuffHandler );
g_pMultiplayer->SetPreRenderSkyHandler ( CClientGame::StaticPreRenderSkyHandler );
g_pMultiplayer->SetRenderHeliLightHandler ( CClientGame::StaticRenderHeliLightHandler );
g_pMultiplayer->SetChokingHandler ( CClientGame::StaticChokingHandler );
g_pMultiplayer->SetPreWorldProcessHandler ( CClientGame::StaticPreWorldProcessHandler );
g_pMultiplayer->SetPostWorldProcessHandler ( CClientGame::StaticPostWorldProcessHandler );
Expand Down Expand Up @@ -416,6 +417,7 @@ CClientGame::~CClientGame ( void )
g_pMultiplayer->SetProjectileHandler ( NULL );
g_pMultiplayer->SetRender3DStuffHandler ( NULL );
g_pMultiplayer->SetPreRenderSkyHandler ( NULL );
g_pMultiplayer->SetRenderHeliLightHandler ( nullptr );
g_pMultiplayer->SetChokingHandler ( NULL );
g_pMultiplayer->SetPreWorldProcessHandler ( NULL );
g_pMultiplayer->SetPostWorldProcessHandler ( NULL );
Expand Down Expand Up @@ -3654,6 +3656,11 @@ void CClientGame::StaticPreRenderSkyHandler ( void )
g_pClientGame->PreRenderSkyHandler ();
}

void CClientGame::StaticRenderHeliLightHandler ()
{
g_pClientGame->GetManager ()->GetPointLightsManager ()->RenderHeliLightHandler ();
}

bool CClientGame::StaticChokingHandler ( unsigned char ucWeaponType )
{
return g_pClientGame->ChokingHandler ( ucWeaponType );
Expand Down
1 change: 1 addition & 0 deletions MTA10/mods/deathmatch/logic/CClientGame.h
Expand Up @@ -499,6 +499,7 @@ class CClientGame
static void StaticDrawRadarAreasHandler ( void );
static void StaticRender3DStuffHandler ( void );
static void StaticPreRenderSkyHandler ( void );
static void StaticRenderHeliLightHandler ( void );
static bool StaticChokingHandler ( unsigned char ucWeaponType );
static void StaticPreWorldProcessHandler ( void );
static void StaticPostWorldProcessHandler ( void );
Expand Down
20 changes: 19 additions & 1 deletion MTA10/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
Expand Up @@ -8821,4 +8821,22 @@ bool CStaticFunctionDefinitions::SetLightDirection ( CClientPointLights* pLight,
return true;
}
return false;
}
}


CClientSearchLight* CStaticFunctionDefinitions::CreateSearchLight ( CResource& Resource, const CVector& vecStart, const CVector& vecEnd, float startRadius, float endRadius, bool renderSpot )
{
auto pLight = new CClientSearchLight ( m_pManager, INVALID_ELEMENT_ID );
if ( pLight )
{
pLight->SetParent ( Resource.GetResourceDynamicEntity () );
pLight->SetStartPosition ( vecStart );
pLight->SetEndPosition ( vecEnd );
pLight->SetStartRadius ( startRadius );
pLight->SetEndRadius ( endRadius );
pLight->SetRenderSpot ( renderSpot );
return pLight;
}

return nullptr;
}
3 changes: 3 additions & 0 deletions MTA10/mods/deathmatch/logic/CStaticFunctionDefinitions.h
Expand Up @@ -323,6 +323,9 @@ class CStaticFunctionDefinitions
static bool SetLightColor ( CClientPointLights* pLight, SColor color );
static bool SetLightDirection ( CClientPointLights* pLight, CVector vecDirection );

// Search light funcs
static CClientSearchLight* CreateSearchLight ( CResource& Resource, const CVector& vecStart, const CVector& vecEnd, float startRadius, float endRadius, bool renderSpot );

// Audio funcs
static bool PlaySoundFrontEnd ( unsigned char ucSound );
static bool SetAmbientSoundEnabled ( eAmbientSoundType eType, bool bMute );
Expand Down
2 changes: 2 additions & 0 deletions MTA10/mods/shared_logic/CClientEntity.h
Expand Up @@ -82,6 +82,7 @@ enum eClientEntityType
CCLIENTSCREENSOURCE,
CCLIENTRENDERTARGET,
CCLIENTBROWSER,
CCLIENTSEARCHLIGHT,
CCLIENTUNKNOWN,
};

Expand Down Expand Up @@ -146,6 +147,7 @@ enum eCClientEntityClassTypes
CLASS_CClientWeapon,
CLASS_CClientEffect,
CLASS_CClientPointLights,
CLASS_CClientSearchLight
};


Expand Down
5 changes: 5 additions & 0 deletions MTA10/mods/shared_logic/CClientManager.cpp
Expand Up @@ -26,6 +26,7 @@ CClientManager::CClientManager ( void )
m_pPickupStreamer = new CClientStreamer ( CClientPickupManager::IsPickupLimitReached, 100.0f, 300, 300 );
m_pPlayerStreamer = new CClientStreamer ( CClientPlayerManager::IsPlayerLimitReached, 250.0f, 300, 300 );
m_pVehicleStreamer = new CClientStreamer ( CClientVehicleManager::IsVehicleLimitReached, 250.0f, 300, 300 );
m_pLightStreamer = new CClientStreamer ( []() -> bool { return false; }, 600.0f, 300, 300 );
m_pModelRequestManager = new CClientModelRequestManager;

m_pGUIManager = new CClientGUIManager;
Expand Down Expand Up @@ -148,6 +149,9 @@ CClientManager::~CClientManager ( void )
delete m_pVehicleStreamer;
m_pVehicleStreamer = NULL;

delete m_pLightStreamer;
m_pLightStreamer = nullptr;

delete m_pPickupStreamer;
m_pPickupStreamer = NULL;

Expand Down Expand Up @@ -245,6 +249,7 @@ void CClientManager::UpdateStreamers ( void )
m_pPickupStreamer->DoPulse ( vecTemp );
m_pPlayerStreamer->DoPulse ( vecTemp );
m_pVehicleStreamer->DoPulse ( vecTemp );
m_pLightStreamer->DoPulse ( vecTemp );
}
}

Expand Down
2 changes: 2 additions & 0 deletions MTA10/mods/shared_logic/CClientManager.h
Expand Up @@ -87,6 +87,7 @@ class CClientManager
inline CClientDisplayManager* GetDisplayManager ( void ) { return m_pDisplayManager; }
inline CClientVehicleManager* GetVehicleManager ( void ) { return m_pVehicleManager; }
inline CClientStreamer* GetVehicleStreamer ( void ) { return m_pVehicleStreamer; }
inline CClientStreamer* GetLightStreamer ( void ) { return m_pLightStreamer; }
inline CClientPedManager* GetPedManager ( void ) { return m_pPedManager; }
inline CResourceManager* GetResourceManager ( void ) { return m_pResourceManager; }
inline CClientColManager* GetColManager ( void ) { return m_pColManager; }
Expand Down Expand Up @@ -139,6 +140,7 @@ class CClientManager
CClientDisplayManager* m_pDisplayManager;
CClientVehicleManager* m_pVehicleManager;
CClientStreamer* m_pVehicleStreamer;
CClientStreamer* m_pLightStreamer;
CClientPedManager* m_pPedManager;
CClientWaterManager* m_pWaterManager;
CResourceManager* m_pResourceManager;
Expand Down
24 changes: 23 additions & 1 deletion MTA10/mods/shared_logic/CClientPointLightsManager.cpp
Expand Up @@ -55,10 +55,16 @@ void CClientPointLightsManager::DeleteAll ( void )
{
delete *iter;
}

for ( auto pLight : m_SearchLightList )
{
delete pLight;
}
m_bDontRemoveFromList = false;

// Clear the list
m_List.clear ();
m_SearchLightList.clear ();
}

CClientPointLights* CClientPointLightsManager::Get ( ElementID ID )
Expand Down Expand Up @@ -96,10 +102,26 @@ void CClientPointLightsManager::DoPulse ( void )
}
}

void CClientPointLightsManager::RenderHeliLightHandler ()
{
for ( auto pLight : m_SearchLightList )
{
pLight->Render ();
}
}

void CClientPointLightsManager::RemoveFromList ( CClientPointLights* pLight )
{
if ( !m_bDontRemoveFromList )
{
if ( !m_List.empty() ) m_List.remove ( pLight );
}
}
}

void CClientPointLightsManager::RemoveSearchLightFromList ( CClientSearchLight* pLight )
{
if ( !m_bDontRemoveFromList )
{
m_SearchLightList.remove ( pLight );
}
}
6 changes: 6 additions & 0 deletions MTA10/mods/shared_logic/CClientPointLightsManager.h
Expand Up @@ -20,6 +20,7 @@ class CClientPointLightsManager
{
friend class CClientManager;
friend class CClientPointLights;
friend class CClientSearchLight;

public:
CClientPointLightsManager ( CClientManager* pManager );
Expand All @@ -39,16 +40,21 @@ class CClientPointLightsManager
void SetDimension ( unsigned short usDimension );

void DoPulse ( void );
void RenderHeliLightHandler ( void );

private:

inline void AddToList ( CClientPointLights* pLight ) { m_List.push_back ( pLight ); };
void RemoveFromList ( CClientPointLights* pLight );

inline void AddToSearchLightList ( CClientSearchLight* pLight ) { m_SearchLightList.push_back ( pLight ); }
void RemoveSearchLightFromList ( CClientSearchLight* pLight );

private:
CClientManager* m_pManager;

std::list < CClientPointLights* > m_List;
std::list < CClientSearchLight* > m_SearchLightList;
bool m_bDontRemoveFromList;
unsigned short m_usDimension;

Expand Down
36 changes: 36 additions & 0 deletions MTA10/mods/shared_logic/CClientSearchLight.cpp
@@ -0,0 +1,36 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto v1.x
* (Shared logic for modifications)
* LICENSE: See LICENSE in the top level directory
* FILE: mods/shared_logic/CClientSearchLight.cpp
* PURPOSE: HeliLight entity class source
*
*****************************************************************************/
#include <StdInc.h>

CClientSearchLight::CClientSearchLight ( CClientManager* pManager, ElementID ID ) : ClassInit ( this ), CClientStreamElement ( pManager->GetLightStreamer (), ID )
{
m_pManager = pManager;
pManager->GetPointLightsManager ()->AddToSearchLightList ( this );

SetTypeName ( "searchlight" );
}

CClientSearchLight::~CClientSearchLight ()
{
Unlink ();
}

void CClientSearchLight::Unlink ()
{
g_pClientGame->GetManager ()->GetPointLightsManager ()->RemoveSearchLightFromList ( this );
}

void CClientSearchLight::Render ()
{
DoAttaching ();

if ( IsStreamedIn () )
g_pGame->GetPointLights ()->RenderHeliLight ( m_StartPosition, m_EndPosition, m_StartRadius, m_EndRadius, m_bRenderSpot );
}
58 changes: 58 additions & 0 deletions MTA10/mods/shared_logic/CClientSearchLight.h
@@ -0,0 +1,58 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto v1.x
* (Shared logic for modifications)
* LICENSE: See LICENSE in the top level directory
* FILE: mods/shared_logic/CClientSearchLight.h
* PURPOSE: HeliLight entity class header
*
*****************************************************************************/
#pragma once
#include "CClientEntity.h"

class CClientPointLightsManager;

class CClientSearchLight : public CClientStreamElement
{
DECLARE_CLASS ( CClientSearchLight, CClientEntity );
friend class CClientPointLightsManager;

public:
CClientSearchLight ( CClientManager* pManager, ElementID ID );
~CClientSearchLight ();

void Unlink ();
eClientEntityType GetType () const { return CCLIENTSEARCHLIGHT; }

// CClientEntity methods
virtual void GetPosition ( CVector& vecPosition ) const override { vecPosition = m_StartPosition; } // required for streaming
virtual void SetPosition ( const CVector& vecPosition ) override { }

// CClientStreamElement methods
virtual void StreamIn ( bool bInstantly ) override { if ( !IsStreamedIn () ) NotifyCreate (); }
virtual void StreamOut () override { }

inline const CVector& GetStartPosition () const { return m_StartPosition; }
inline void SetStartPosition ( const CVector& startPos ) { m_StartPosition = startPos; UpdateStreamPosition ( startPos );}
inline const CVector& GetEndPosition () const { return m_EndPosition; }
inline void SetEndPosition ( const CVector& endPos ) { m_EndPosition = endPos; }

inline float GetStartRadius () const { return m_StartRadius; }
inline void SetStartRadius ( float radius ) { m_StartRadius = radius; }
inline float GetEndRadius () const { return m_EndRadius; }
inline void SetEndRadius ( float radius ) { m_EndRadius = radius; }

inline bool GetRenderSpot () const { return m_bRenderSpot; }
inline void SetRenderSpot ( bool renderSpot ) { m_bRenderSpot = renderSpot; }

protected:
void Render ();

private:
bool m_bStreamedIn;
CVector m_StartPosition;
CVector m_EndPosition;
float m_StartRadius;
float m_EndRadius;
bool m_bRenderSpot;
};

1 comment on commit 9330995

@ccw808
Copy link
Member

@ccw808 ccw808 commented on 9330995 Dec 7, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice

Please sign in to comment.