Skip to content

Commit e01c2b8

Browse files
authored
dxDrawModel3D lighting (#3904)
1 parent 90fd98a commit e01c2b8

File tree

7 files changed

+25
-14
lines changed

7 files changed

+25
-14
lines changed

Client/game_sa/CRendererSA.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
#include "CMatrix.h"
1616
#include "gamesa_renderware.h"
1717

18+
#define SetLightColoursForPedsCarsAndObjects(fMult) ((RpLight*(__cdecl*)(float))0x735D90)(fMult)
19+
#define SetAmbientColours() ((RpLight*(__cdecl*)())0x735D30)()
20+
1821
CRendererSA::CRendererSA()
1922
{
2023
}
@@ -23,7 +26,7 @@ CRendererSA::~CRendererSA()
2326
{
2427
}
2528

26-
void CRendererSA::RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix)
29+
void CRendererSA::RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix, float lighting)
2730
{
2831
CBaseModelInfoSAInterface* pModelInfoSAInterface = pModelInfo->GetInterface();
2932
if (!pModelInfoSAInterface)
@@ -40,7 +43,10 @@ void CRendererSA::RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix)
4043
rwMatrix.up = (RwV3d&)matrix.vFront;
4144
rwMatrix.at = (RwV3d&)matrix.vUp;
4245
rwMatrix.pos = (RwV3d&)matrix.vPos;
43-
RwFrameTransform(pFrame, &rwMatrix, rwCOMBINEREPLACE);
46+
RwFrameTransform(pFrame, &rwMatrix, rwCOMBINEREPLACE);
47+
48+
// Setup ambient light multiplier
49+
SetLightColoursForPedsCarsAndObjects(lighting);
4450

4551
if (pRwObject->type == RP_TYPE_ATOMIC)
4652
{
@@ -52,4 +58,7 @@ void CRendererSA::RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix)
5258
RpClump* pClump = reinterpret_cast<RpClump*>(pRwObject);
5359
RpClumpRender(pClump);
5460
}
61+
62+
// Restore ambient light
63+
SetAmbientColours();
5564
}

Client/game_sa/CRendererSA.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ class CRendererSA : public CRenderer
1919
CRendererSA();
2020
~CRendererSA();
2121

22-
void RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix) override;
22+
void RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix, float lighting) override;
2323
};

Client/mods/deathmatch/logic/CModelRenderer.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@
1313
#include "game\CRenderer.h"
1414
#include "game\CVisibilityPlugins.h"
1515

16-
bool CModelRenderer::EnqueueModel(CModelInfo* pModelInfo, const CMatrix& matrix)
16+
bool CModelRenderer::EnqueueModel(CModelInfo* pModelInfo, const CMatrix& matrix, float lighting)
1717
{
1818
if (g_pCore->IsWindowMinimized())
1919
return false;
2020

2121
if (pModelInfo && pModelInfo->IsLoaded())
2222
{
23-
m_Queue.emplace_back(pModelInfo, matrix);
23+
m_Queue.emplace_back(pModelInfo, matrix, lighting);
2424
return true;
2525
}
2626

@@ -54,7 +54,7 @@ void CModelRenderer::Render()
5454
for (auto& modelDesc : m_Queue)
5555
{
5656
if (modelDesc.pModelInfo->IsLoaded() && !modelDesc.pModelInfo->GetIdeFlag(eModelIdeFlag::DRAW_LAST))
57-
pRenderer->RenderModel(modelDesc.pModelInfo, modelDesc.matrix);
57+
pRenderer->RenderModel(modelDesc.pModelInfo, modelDesc.matrix, modelDesc.lighting);
5858
}
5959

6060
m_Queue.clear();
@@ -68,5 +68,5 @@ void CModelRenderer::RenderEntity(SModelToRender* modelDesc, float distance)
6868
CRenderer* pRenderer = g_pGame->GetRenderer();
6969
assert(pRenderer);
7070

71-
pRenderer->RenderModel(modelDesc->pModelInfo, modelDesc->matrix);
71+
pRenderer->RenderModel(modelDesc->pModelInfo, modelDesc->matrix, modelDesc->lighting);
7272
}

Client/mods/deathmatch/logic/CModelRenderer.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,17 @@ class CModelRenderer final
1818
{
1919
CModelInfo* pModelInfo;
2020
CMatrix matrix;
21+
float lighting;
2122

22-
SModelToRender(CModelInfo* pModelInfo, const CMatrix& matrix) :
23+
SModelToRender(CModelInfo* pModelInfo, const CMatrix& matrix, float lighting = 0.0f) :
2324
pModelInfo(pModelInfo),
24-
matrix(matrix)
25+
matrix(matrix),
26+
lighting(lighting)
2527
{
2628
}
2729
};
2830

29-
bool EnqueueModel(CModelInfo* pModelInfo, const CMatrix& matrix);
31+
bool EnqueueModel(CModelInfo* pModelInfo, const CMatrix& matrix, float lighting);
3032

3133
void Update();
3234

Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2123,7 +2123,7 @@ bool CLuaDrawingDefs::DxDrawWiredSphere(lua_State* const luaVM, const CVector po
21232123
return true;
21242124
}
21252125

2126-
bool CLuaDrawingDefs::DxDrawModel3D(std::uint32_t modelID, CVector position, CVector rotation, const std::optional<CVector> scale)
2126+
bool CLuaDrawingDefs::DxDrawModel3D(std::uint32_t modelID, CVector position, CVector rotation, const std::optional<CVector> scale, const std::optional<float> lighting)
21272127
{
21282128
CModelInfo* pModelInfo = g_pGame->GetModelInfo(modelID);
21292129
if (!pModelInfo)
@@ -2138,5 +2138,5 @@ bool CLuaDrawingDefs::DxDrawModel3D(std::uint32_t modelID, CVector position, CVe
21382138
ConvertDegreesToRadians(rotation);
21392139

21402140
return g_pClientGame->GetModelRenderer()->EnqueueModel(pModelInfo,
2141-
CMatrix{position, rotation, scale.value_or(CVector{1.0f, 1.0f, 1.0f})});
2141+
CMatrix{position, rotation, scale.value_or(CVector{1.0f, 1.0f, 1.0f})}, lighting.value_or(0.0f));
21422142
}

Client/mods/deathmatch/logic/luadefs/CLuaDrawingDefs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class CLuaDrawingDefs : public CLuaDefs
8282
static bool DxDrawWiredSphere(lua_State* const luaVM, const CVector position, const float radius, const std::optional<SColor> color,
8383
const std::optional<float> lineWidth, const std::optional<unsigned int> iterations);
8484

85-
static bool DxDrawModel3D(std::uint32_t modelID, CVector position, CVector rotation, const std::optional<CVector> scale);
85+
static bool DxDrawModel3D(std::uint32_t modelID, CVector position, CVector rotation, const std::optional<CVector> scale, const std::optional<float> lighting);
8686

8787
private:
8888
static void AddDxMaterialClass(lua_State* luaVM);

Client/sdk/game/CRenderer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ class CRenderer
1919
public:
2020
virtual ~CRenderer() {}
2121

22-
virtual void RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix) = 0;
22+
virtual void RenderModel(CModelInfo* pModelInfo, const CMatrix& matrix, float lighting) = 0;
2323
};

0 commit comments

Comments
 (0)