mirror of https://github.com/AxioDL/metaforce.git
Various lighting fixes
This commit is contained in:
parent
e69a4fdd98
commit
4e06ea1bb5
|
@ -135,7 +135,7 @@ void CActorLights::AddOverflowToLights(const CLight& light, const zeus::CColor&
|
||||||
}
|
}
|
||||||
|
|
||||||
void CActorLights::MoveAmbienceToLights(const zeus::CColor& color) {
|
void CActorLights::MoveAmbienceToLights(const zeus::CColor& color) {
|
||||||
if (x298_29_ambienceGenerated) {
|
if (x298_29_ambienceGenerated || x0_areaLights.empty()) {
|
||||||
x288_ambientColor += color * 0.333333f;
|
x288_ambientColor += color * 0.333333f;
|
||||||
x288_ambientColor.a() = 1.f;
|
x288_ambientColor.a() = 1.f;
|
||||||
return;
|
return;
|
||||||
|
@ -187,6 +187,7 @@ bool CActorLights::BuildAreaLightList(const CStateManager& mgr, const CGameArea&
|
||||||
/* Early return if not ready for update */
|
/* Early return if not ready for update */
|
||||||
if (mgr.GetInputFrameIdx() - x2a4_lastUpdateFrame < x2a8_areaUpdateFramePeriod)
|
if (mgr.GetInputFrameIdx() - x2a4_lastUpdateFrame < x2a8_areaUpdateFramePeriod)
|
||||||
return false;
|
return false;
|
||||||
|
x2a4_lastUpdateFrame = mgr.GetInputFrameIdx();
|
||||||
vec = aabb.center() + x2ac_actorPosBias;
|
vec = aabb.center() + x2ac_actorPosBias;
|
||||||
if (x2d4_worldLightingLevel == worldLightingLevel)
|
if (x2d4_worldLightingLevel == worldLightingLevel)
|
||||||
if ((x2c0_lastActorPos - vec).magSquared() < x2cc_actorPositionDeltaUpdateThreshold)
|
if ((x2c0_lastActorPos - vec).magSquared() < x2cc_actorPositionDeltaUpdateThreshold)
|
||||||
|
@ -243,19 +244,13 @@ bool CActorLights::BuildAreaLightList(const CStateManager& mgr, const CGameArea&
|
||||||
x288_ambientColor = light.GetNormalIndependentLightingAtPoint(vec);
|
x288_ambientColor = light.GetNormalIndependentLightingAtPoint(vec);
|
||||||
} else {
|
} else {
|
||||||
EPVSVisSetState visible = EPVSVisSetState::OutOfBounds;
|
EPVSVisSetState visible = EPVSVisSetState::OutOfBounds;
|
||||||
if (area.GetAreaVisSet()) {
|
if (area.GetAreaVisSet() && lightIt->DoesCastShadows()) {
|
||||||
if (lightIt->DoesCastShadows()) {
|
u32 pvsIdx = use2ndLayer ? area.Get2ndPVSLightFeature(lightIdx) : area.Get1stPVSLightFeature(lightIdx);
|
||||||
u32 pvsIdx;
|
visible = sets[0].GetVisible(pvsIdx);
|
||||||
if (use2ndLayer)
|
if (visible != EPVSVisSetState::OutOfBounds)
|
||||||
pvsIdx = area.Get2ndPVSLightFeature(lightIdx);
|
visible = std::max(visible, sets[1].GetVisible(pvsIdx));
|
||||||
else
|
if (visible != EPVSVisSetState::OutOfBounds)
|
||||||
pvsIdx = area.Get1stPVSLightFeature(lightIdx);
|
visible = std::max(visible, sets[2].GetVisible(pvsIdx));
|
||||||
visible = sets[0].GetVisible(pvsIdx);
|
|
||||||
if (visible != EPVSVisSetState::OutOfBounds)
|
|
||||||
visible = std::max(visible, sets[1].GetVisible(pvsIdx));
|
|
||||||
if (visible != EPVSVisSetState::OutOfBounds)
|
|
||||||
visible = std::max(visible, sets[2].GetVisible(pvsIdx));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (visible != EPVSVisSetState::EndOfTree) {
|
if (visible != EPVSVisSetState::EndOfTree) {
|
||||||
zeus::CSphere sphere(light.GetPosition(), light.GetRadius() * 2.f);
|
zeus::CSphere sphere(light.GetPosition(), light.GetRadius() * 2.f);
|
||||||
|
|
|
@ -9,7 +9,7 @@ constexpr zeus::CVector3f kDefaultDirection(0.f, -1.f, 0.f);
|
||||||
|
|
||||||
float CLight::CalculateLightRadius() const {
|
float CLight::CalculateLightRadius() const {
|
||||||
if (FLT_EPSILON > x28_distL && FLT_EPSILON > x2c_distQ) {
|
if (FLT_EPSILON > x28_distL && FLT_EPSILON > x2c_distQ) {
|
||||||
return 0.f;
|
return FLT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
float intensity = GetIntensity();
|
float intensity = GetIntensity();
|
||||||
|
@ -77,8 +77,8 @@ CLight CLight::BuildDirectional(const zeus::CVector3f& dir, const zeus::CColor&
|
||||||
}
|
}
|
||||||
|
|
||||||
CLight CLight::BuildSpot(const zeus::CVector3f& pos, const zeus::CVector3f& dir, const zeus::CColor& color,
|
CLight CLight::BuildSpot(const zeus::CVector3f& pos, const zeus::CVector3f& dir, const zeus::CColor& color,
|
||||||
float angle) {
|
float cutoff) {
|
||||||
return CLight(ELightType::Spot, pos, dir, color, angle);
|
return CLight(ELightType::Spot, pos, dir, color, cutoff);
|
||||||
}
|
}
|
||||||
|
|
||||||
CLight CLight::BuildPoint(const zeus::CVector3f& pos, const zeus::CColor& color) {
|
CLight CLight::BuildPoint(const zeus::CVector3f& pos, const zeus::CColor& color) {
|
||||||
|
|
|
@ -27,11 +27,11 @@ class CLight {
|
||||||
zeus::CColor x18_color = zeus::skClear;
|
zeus::CColor x18_color = zeus::skClear;
|
||||||
ELightType x1c_type = ELightType::Custom;
|
ELightType x1c_type = ELightType::Custom;
|
||||||
float x20_spotCutoff = 0.f;
|
float x20_spotCutoff = 0.f;
|
||||||
float x24_distC = 1.f;
|
float x24_distC = 0.f;
|
||||||
float x28_distL = 0.f;
|
float x28_distL = 1.f;
|
||||||
float x2c_distQ = 0.f;
|
float x2c_distQ = 0.f;
|
||||||
float x30_angleC = 1.f;
|
float x30_angleC = 0.f;
|
||||||
float x34_angleL = 0.f;
|
float x34_angleL = 1.f;
|
||||||
float x38_angleQ = 0.f;
|
float x38_angleQ = 0.f;
|
||||||
u32 x3c_priority = 0;
|
u32 x3c_priority = 0;
|
||||||
u32 x40_lightId = 0; // Serves as unique key
|
u32 x40_lightId = 0; // Serves as unique key
|
||||||
|
@ -97,7 +97,7 @@ public:
|
||||||
|
|
||||||
static CLight BuildDirectional(const zeus::CVector3f& dir, const zeus::CColor& color);
|
static CLight BuildDirectional(const zeus::CVector3f& dir, const zeus::CColor& color);
|
||||||
static CLight BuildSpot(const zeus::CVector3f& pos, const zeus::CVector3f& dir, const zeus::CColor& color,
|
static CLight BuildSpot(const zeus::CVector3f& pos, const zeus::CVector3f& dir, const zeus::CColor& color,
|
||||||
float angle);
|
float cutoff);
|
||||||
static CLight BuildPoint(const zeus::CVector3f& pos, const zeus::CColor& color);
|
static CLight BuildPoint(const zeus::CVector3f& pos, const zeus::CColor& color);
|
||||||
static CLight BuildCustom(const zeus::CVector3f& pos, const zeus::CVector3f& dir, const zeus::CColor& color,
|
static CLight BuildCustom(const zeus::CVector3f& pos, const zeus::CVector3f& dir, const zeus::CColor& color,
|
||||||
float distC, float distL, float distQ, float angleC, float angleL, float angleQ);
|
float distC, float distL, float distQ, float angleC, float angleL, float angleQ);
|
||||||
|
|
|
@ -124,7 +124,7 @@ float CPlayerGun::CMotionState::gGunExtendDistance = 0.125f;
|
||||||
float CPlayerGun::skTractorBeamFactor = 0.5f / CPlayerState::GetMissileComboChargeFactor();
|
float CPlayerGun::skTractorBeamFactor = 0.5f / CPlayerState::GetMissileComboChargeFactor();
|
||||||
|
|
||||||
CPlayerGun::CPlayerGun(TUniqueId playerId)
|
CPlayerGun::CPlayerGun(TUniqueId playerId)
|
||||||
: x0_lights(8, zeus::CVector3f{-30.f, 0.f, 30.f}, 4, 4, false, false, false, 0.1f)
|
: x0_lights(8, zeus::skZero3f, 4, 4, false, false, false, 0.1f)
|
||||||
, x538_playerId(playerId)
|
, x538_playerId(playerId)
|
||||||
, x550_camBob(CPlayerCameraBob::ECameraBobType::One, CPlayerCameraBob::GetCameraBobExtent(),
|
, x550_camBob(CPlayerCameraBob::ECameraBobType::One, CPlayerCameraBob::GetCameraBobExtent(),
|
||||||
CPlayerCameraBob::GetCameraBobPeriod())
|
CPlayerCameraBob::GetCameraBobPeriod())
|
||||||
|
|
|
@ -64,7 +64,7 @@ CLight CWorldLight::GetAsCGraphicsLight() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto [distC, distL, distQ] = CalculateLightFalloff(x3c_falloff, x28_q);
|
const auto [distC, distL, distQ] = CalculateLightFalloff(x3c_falloff, x28_q);
|
||||||
return CLight::BuildCustom(x10_position, zeus::CVector3f{0.f, 1.f, 0.f},
|
return CLight::BuildCustom(x10_position, zeus::CVector3f{1.f, 0.f, 0.f},
|
||||||
zeus::CColor{x4_color.x(), x4_color.y(), x4_color.z(), 1.f}, distC, distL, distQ, 1.f, 0.f,
|
zeus::CColor{x4_color.x(), x4_color.y(), x4_color.z(), 1.f}, distC, distL, distQ, 1.f, 0.f,
|
||||||
0.f);
|
0.f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -224,19 +224,16 @@ void GXInitLightAttnK(GX::LightObj* light, float k0, float k1, float k2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GXInitLightSpot(GX::LightObj* light, float cutoff, GX::SpotFn spotFn) {
|
void GXInitLightSpot(GX::LightObj* light, float cutoff, GX::SpotFn spotFn) {
|
||||||
if (cutoff < 0.f || cutoff > 90.f) {
|
if (cutoff <= 0.f || cutoff > 90.f) {
|
||||||
spotFn = GX::SP_OFF;
|
spotFn = GX::SP_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
float cr = (cutoff * M_PIF) / 180.f;
|
float cr = std::cos((cutoff * M_PIF) / 180.f);
|
||||||
float a0 = 1.f;
|
float a0 = 1.f;
|
||||||
float a1 = 0.f;
|
float a1 = 0.f;
|
||||||
float a2 = 0.f;
|
float a2 = 0.f;
|
||||||
switch (spotFn) {
|
switch (spotFn) {
|
||||||
case GX::SP_OFF:
|
default:
|
||||||
a0 = 1.f;
|
|
||||||
a1 = 0.f;
|
|
||||||
a2 = 0.f;
|
|
||||||
break;
|
break;
|
||||||
case GX::SP_FLAT:
|
case GX::SP_FLAT:
|
||||||
a0 = -1000.f * cr;
|
a0 = -1000.f * cr;
|
||||||
|
@ -249,7 +246,7 @@ void GXInitLightSpot(GX::LightObj* light, float cutoff, GX::SpotFn spotFn) {
|
||||||
a2 = 0.f;
|
a2 = 0.f;
|
||||||
break;
|
break;
|
||||||
case GX::SP_COS2:
|
case GX::SP_COS2:
|
||||||
a0 = 0.0f;
|
a0 = 0.f;
|
||||||
a1 = -cr / (1.f - cr);
|
a1 = -cr / (1.f - cr);
|
||||||
a2 = 1.f / (1.f - cr);
|
a2 = 1.f / (1.f - cr);
|
||||||
break;
|
break;
|
||||||
|
@ -323,10 +320,11 @@ void GXInitLightPos(GX::LightObj* light, float x, float y, float z) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GXInitLightDir(GX::LightObj* light, float nx, float ny, float nz) {
|
void GXInitLightDir(GX::LightObj* light, float nx, float ny, float nz) {
|
||||||
light->nx = nx;
|
light->nx = -nx;
|
||||||
light->ny = ny;
|
light->ny = -ny;
|
||||||
light->nz = nz;
|
light->nz = -nz;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GXInitSpecularDir(GX::LightObj* light, float nx, float ny, float nz) {
|
void GXInitSpecularDir(GX::LightObj* light, float nx, float ny, float nz) {
|
||||||
float hx = -nx;
|
float hx = -nx;
|
||||||
float hy = -ny;
|
float hy = -ny;
|
||||||
|
|
Loading…
Reference in New Issue