2018-10-07 03:42:33 +00:00
|
|
|
#pragma once
|
2016-04-14 21:42:47 +00:00
|
|
|
|
2016-08-14 21:11:44 +00:00
|
|
|
#include "RetroTypes.hpp"
|
|
|
|
#include "zeus/CVector3f.hpp"
|
2016-08-21 00:04:50 +00:00
|
|
|
#include "zeus/CColor.hpp"
|
|
|
|
#include "zeus/CAABox.hpp"
|
|
|
|
#include "Graphics/CLight.hpp"
|
2016-08-14 21:11:44 +00:00
|
|
|
|
2016-04-14 21:42:47 +00:00
|
|
|
namespace urde
|
|
|
|
{
|
2016-08-21 00:04:50 +00:00
|
|
|
class CBooModel;
|
|
|
|
class CStateManager;
|
|
|
|
class CGameArea;
|
2016-04-14 21:42:47 +00:00
|
|
|
|
|
|
|
class CActorLights
|
|
|
|
{
|
2016-08-31 00:33:59 +00:00
|
|
|
static s32 sFrameSchedulerCount;
|
2016-08-21 00:04:50 +00:00
|
|
|
std::vector<CLight> x0_areaLights;
|
|
|
|
std::vector<CLight> x144_dynamicLights;
|
2017-12-19 03:05:50 +00:00
|
|
|
zeus::CColor x288_ambientColor = zeus::CColor::skBlack;
|
2016-08-21 00:04:50 +00:00
|
|
|
TAreaId x294_aid = kInvalidAreaId;
|
|
|
|
|
|
|
|
union
|
|
|
|
{
|
|
|
|
struct
|
|
|
|
{
|
2017-04-10 06:57:00 +00:00
|
|
|
bool x298_24_dirty : 1;
|
|
|
|
bool x298_25_castShadows : 1;
|
|
|
|
bool x298_26_hasAreaLights : 1;
|
|
|
|
bool x298_27_findShadowLight : 1;
|
2016-08-21 00:04:50 +00:00
|
|
|
bool x298_28_inArea : 1;
|
2017-04-10 06:57:00 +00:00
|
|
|
bool x298_29_ambientChannelOverflow : 1;
|
|
|
|
bool x298_30_layer2 : 1;
|
|
|
|
bool x298_31_disableWorldLights : 1;
|
|
|
|
bool x299_24_inBrightLight : 1;
|
2017-04-13 19:28:31 +00:00
|
|
|
bool x299_25_useBrightLightLag : 1;
|
2017-11-30 01:22:46 +00:00
|
|
|
bool x299_26_ambientOnly : 1;
|
2016-08-21 00:04:50 +00:00
|
|
|
};
|
|
|
|
u16 _dummy = 0;
|
|
|
|
};
|
2017-08-10 07:05:27 +00:00
|
|
|
bool x29a_findNearestDynamicLights = false;
|
2017-08-31 02:42:37 +00:00
|
|
|
s32 x29c_shadowLightArrIdx = -1;
|
|
|
|
s32 x2a0_shadowLightIdx = -1;
|
2017-04-10 06:57:00 +00:00
|
|
|
u32 x2a4_lastUpdateFrame = 0;
|
|
|
|
u32 x2a8_areaUpdateFramePeriod;
|
|
|
|
zeus::CVector3f x2ac_actorPosBias;
|
|
|
|
int x2b8_maxAreaLights;
|
|
|
|
int x2bc_maxDynamicLights;
|
|
|
|
zeus::CVector3f x2c0_lastActorPos;
|
|
|
|
float x2cc_actorPositionDeltaUpdateThreshold;
|
|
|
|
float x2d0_shadowDynamicRangeThreshold = 0.f;
|
|
|
|
float x2d4_worldLightingLevel = 1.f;
|
2017-08-31 02:42:37 +00:00
|
|
|
s32 x2d8_brightLightIdx = -1;
|
2017-04-13 19:28:31 +00:00
|
|
|
u32 x2dc_brightLightLag = 0;
|
2016-08-21 00:04:50 +00:00
|
|
|
|
2017-04-10 06:57:00 +00:00
|
|
|
static void MergeOverflowLight(CLight& out, zeus::CColor& color, const CLight& in, float colorMag);
|
|
|
|
void AddOverflowToLights(const CLight& light, const zeus::CColor& color, float mag);
|
|
|
|
void MoveAmbienceToLights(const zeus::CColor& color);
|
|
|
|
void MultiplyLightingLevels(float level);
|
2017-04-13 19:28:31 +00:00
|
|
|
void UpdateBrightLight();
|
2017-04-10 06:57:00 +00:00
|
|
|
|
2016-04-14 21:42:47 +00:00
|
|
|
public:
|
2017-04-10 06:57:00 +00:00
|
|
|
CActorLights(u32 areaUpdateFramePeriod, const zeus::CVector3f& actorPosBias,
|
|
|
|
int maxDynamicLights, int maxAreaLights, bool ambientChannelOverflow,
|
|
|
|
bool layer2, bool disableWorldLights, float positionUpdateThreshold);
|
2016-08-21 00:04:50 +00:00
|
|
|
|
|
|
|
void BuildConstantAmbientLighting();
|
|
|
|
void BuildConstantAmbientLighting(const zeus::CColor& color);
|
|
|
|
void BuildFakeLightList(const std::vector<CLight>& lights, const zeus::CColor& color);
|
2017-04-13 19:28:31 +00:00
|
|
|
void BuildFaceLightList(const CStateManager& mgr, const CGameArea& area, const zeus::CAABox& aabb);
|
|
|
|
bool BuildAreaLightList(const CStateManager& mgr, const CGameArea& area, const zeus::CAABox& aabb);
|
|
|
|
void BuildDynamicLightList(const CStateManager& mgr, const zeus::CAABox& aabb);
|
2017-08-08 06:03:57 +00:00
|
|
|
std::vector<CLight> BuildLightVector() const;
|
2016-08-21 00:04:50 +00:00
|
|
|
void ActivateLights(CBooModel& model) const;
|
2017-04-10 06:57:00 +00:00
|
|
|
void SetCastShadows(bool v) { x298_25_castShadows = v; }
|
2017-05-31 02:51:38 +00:00
|
|
|
void SetFindShadowLight(bool v) { x298_27_findShadowLight = v; }
|
2017-08-31 02:42:37 +00:00
|
|
|
void SetShadowDynamicRangeThreshold(float t) { x2d0_shadowDynamicRangeThreshold = t; }
|
2017-08-10 07:05:27 +00:00
|
|
|
void SetAmbientChannelOverflow(bool v) { x298_29_ambientChannelOverflow = v; }
|
|
|
|
void DisableAreaLights();
|
|
|
|
void SetMaxDynamicLights(int l) { x2bc_maxDynamicLights = l; }
|
|
|
|
void SetFindNearestDynamicLights(bool v) { x29a_findNearestDynamicLights = v; }
|
2016-08-21 00:04:50 +00:00
|
|
|
void SetAmbientColor(const zeus::CColor& color) { x288_ambientColor = color; }
|
2017-04-13 19:28:31 +00:00
|
|
|
const zeus::CColor& GetAmbientColor() const { return x288_ambientColor; }
|
2016-08-21 00:04:50 +00:00
|
|
|
const CLight& GetLight(u32 idx) const;
|
|
|
|
u32 GetActiveLightCount() const;
|
2017-08-13 07:56:35 +00:00
|
|
|
int GetMaxAreaLights() const { return x2b8_maxAreaLights; }
|
2017-04-13 19:28:31 +00:00
|
|
|
const std::vector<CLight>& GetAreaLights() const { return x0_areaLights; }
|
|
|
|
const std::vector<CLight>& GetDynamicLights() const { return x144_dynamicLights; }
|
2017-08-13 07:56:35 +00:00
|
|
|
bool GetIsDirty() const { return x298_24_dirty; }
|
2017-09-30 03:45:57 +00:00
|
|
|
void SetDirty() { x298_24_dirty = true; }
|
2017-08-31 02:42:37 +00:00
|
|
|
bool HasShadowLight() const { return x29c_shadowLightArrIdx != -1; }
|
|
|
|
s32 GetShadowLightArrIndex() const { return x29c_shadowLightArrIdx; }
|
|
|
|
s32 GetShadowLightIndex() const { return x2a0_shadowLightIdx; }
|
2018-05-16 04:07:38 +00:00
|
|
|
u32 GetAreaUpdateFramePeriod() const { return x2a8_areaUpdateFramePeriod; }
|
|
|
|
void SetAreaUpdateFramePeriod(u32 p) { x2a8_areaUpdateFramePeriod = p; }
|
2016-04-14 21:42:47 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|