metaforce/Runtime/GuiSys/CGuiLight.cpp

97 lines
2.7 KiB
C++
Raw Permalink Normal View History

#include "Runtime/GuiSys/CGuiLight.hpp"
#include "Runtime/GuiSys/CGuiFrame.hpp"
2021-04-10 08:42:06 +00:00
namespace metaforce {
CGuiLight::CGuiLight(const CGuiWidgetParms& parms, const CLight& light)
2018-12-08 05:30:43 +00:00
: CGuiWidget(parms)
, xb8_type(light.x1c_type)
, xbc_spotCutoff(light.x20_spotCutoff)
, xc0_distC(light.x24_distC)
, xc4_distL(light.x28_distL)
, xc8_distQ(light.x2c_distQ)
, xcc_angleC(light.x30_angleC)
, xd0_angleL(light.x34_angleL)
, xd4_angleQ(light.x38_angleQ)
, xd8_lightId(light.x40_lightId) {}
2016-03-16 20:49:35 +00:00
2018-12-08 05:30:43 +00:00
CGuiLight::~CGuiLight() { xb0_frame->RemoveLight(this); }
2018-12-08 05:30:43 +00:00
CLight CGuiLight::BuildLight() const {
CLight ret = CLight::BuildLocalAmbient(zeus::skZero3f, zeus::skBlack);
2016-03-16 20:49:35 +00:00
2018-12-08 05:30:43 +00:00
switch (xb8_type) {
case ELightType::Spot:
ret = CLight::BuildSpot(GetWorldPosition(), x34_worldXF.basis[1], xa4_color, xbc_spotCutoff);
break;
case ELightType::Point:
ret = CLight::BuildPoint(GetWorldPosition(), xa4_color);
break;
case ELightType::Directional:
ret = CLight::BuildDirectional(x34_worldXF.basis[1], xa4_color);
break;
default:
break;
}
2016-03-16 20:49:35 +00:00
2018-12-08 05:30:43 +00:00
ret.SetAttenuation(xc0_distC, xc4_distL, xc8_distQ);
ret.SetAngleAttenuation(xcc_angleC, xd0_angleL, xd4_angleQ);
return ret;
2016-03-16 20:49:35 +00:00
}
2018-12-08 05:30:43 +00:00
void CGuiLight::SetIsVisible(bool vis) {
if (vis)
xb0_frame->AddLight(this);
else
xb0_frame->RemoveLight(this);
CGuiWidget::SetIsVisible(vis);
2016-03-15 04:55:57 +00:00
}
2018-12-08 05:30:43 +00:00
std::shared_ptr<CGuiWidget> CGuiLight::Create(CGuiFrame* frame, CInputStream& in, CSimplePool* sp) {
CGuiWidgetParms parms = ReadWidgetHeader(frame, in);
2018-12-08 05:30:43 +00:00
ELightType tp = ELightType(in.readUint32Big());
float distC = in.readFloatBig();
float distL = in.readFloatBig();
float distQ = in.readFloatBig();
float angC = in.readFloatBig();
float angL = in.readFloatBig();
float angQ = in.readFloatBig();
u32 lightId = in.readUint32Big();
2016-03-16 20:49:35 +00:00
2018-12-08 05:30:43 +00:00
std::shared_ptr<CGuiLight> ret = {};
switch (tp) {
case ELightType::Spot: {
float cutoff = in.readFloatBig();
CLight lt = CLight::BuildSpot(zeus::skZero3f, zeus::skZero3f, parms.x10_color, cutoff);
2018-12-08 05:30:43 +00:00
lt.SetAttenuation(distC, distL, distQ);
lt.SetAngleAttenuation(angC, angL, angQ);
lt.x40_lightId = lightId;
ret = std::make_shared<CGuiLight>(parms, lt);
break;
}
case ELightType::Point: {
CLight lt = CLight::BuildPoint(zeus::skZero3f, parms.x10_color);
2018-12-08 05:30:43 +00:00
lt.SetAttenuation(distC, distL, distQ);
lt.x40_lightId = lightId;
ret = std::make_shared<CGuiLight>(parms, lt);
break;
}
case ELightType::Directional: {
CLight lt = CLight::BuildDirectional(zeus::skZero3f, parms.x10_color);
2018-12-08 05:30:43 +00:00
lt.x40_lightId = lightId;
ret = std::make_shared<CGuiLight>(parms, lt);
break;
}
default:
break;
}
2018-12-08 05:30:43 +00:00
ret->ParseBaseInfo(frame, in, parms);
frame->RegisterLight(ret->shared_from_this());
frame->AddLight(ret.get());
return ret;
}
2021-04-10 08:42:06 +00:00
} // namespace metaforce