mirror of https://github.com/PrimeDecomp/prime.git
109 lines
3.0 KiB
C++
109 lines
3.0 KiB
C++
#include "GuiSys/CGuiLight.hpp"
|
|
#include "GuiSys/CGuiFrame.hpp"
|
|
|
|
#include "Kyoto/Streams/CInputStream.hpp"
|
|
|
|
CGuiLight* CGuiLight::Create(CGuiFrame* parent, CInputStream& in, IObjectStore* sp) {
|
|
CGuiWidgetParms parms = ReadWidgetHeader(parent, in);
|
|
CColor color = parms.x10_color;
|
|
ELightType type = (ELightType)in.ReadInt32();
|
|
float distC = in.ReadFloat();
|
|
float distL = in.ReadFloat();
|
|
float distQ = in.ReadFloat();
|
|
float angC = in.ReadFloat();
|
|
float angL = in.ReadFloat();
|
|
float angQ = in.ReadFloat();
|
|
uint lightId = in.ReadInt32();
|
|
|
|
CGuiLight* ret = nullptr;
|
|
|
|
switch (type) {
|
|
case kLT_Spot: {
|
|
float cutoff = in.ReadFloat();
|
|
CLight lt = CLight::BuildSpot(CVector3f::Zero(), CVector3f::Zero(), color, cutoff);
|
|
lt.SetAttenuation(distC, distL, distQ);
|
|
lt.SetAngleAttenuation(angC, angL, angQ);
|
|
lt.SetLightId(lightId);
|
|
|
|
ret = rs_new CGuiLight(parms, lt);
|
|
break;
|
|
}
|
|
case kLT_Point: {
|
|
CLight lt = CLight::BuildPoint(CVector3f::Zero(), color);
|
|
lt.SetAttenuation(distC, distL, distQ);
|
|
lt.SetLightId(lightId);
|
|
ret = rs_new CGuiLight(parms, lt);
|
|
break;
|
|
}
|
|
case kLT_Directional: {
|
|
CLight lt = CLight::BuildDirectional(CVector3f::Zero(), color);
|
|
lt.SetLightId(lightId);
|
|
ret = rs_new CGuiLight(parms, lt);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
ret->ParseBaseInfo(parent, in, parms);
|
|
parent->AddLight(ret);
|
|
return ret;
|
|
}
|
|
|
|
CGuiLight::CGuiLight(const CGuiWidgetParms& parms, const CLight& light)
|
|
: CGuiWidget(parms)
|
|
, xb8_type(light.GetType())
|
|
, xbc_spotCutoff(light.GetSpotCutoff())
|
|
, xc0_distC(light.GetAttenuationConstant())
|
|
, xc4_distL(light.GetAttenuationLinear())
|
|
, xc8_distQ(light.GetAttenuationQuadratic())
|
|
, xcc_angleC(light.GetAngleAttenuationConstant())
|
|
, xd0_angleL(light.GetAngleAttenuationLinear())
|
|
, xd4_angleQ(light.GetAngleAttenuationQuadratic())
|
|
, xd8_lightId(light.GetId())
|
|
, xdc_ambColor(CColor::Black()) {}
|
|
|
|
CGuiLight::~CGuiLight() { GetFrame()->RemoveLight(this); }
|
|
|
|
void CGuiLight::SetIsVisible(const bool visible) {
|
|
if (visible) {
|
|
GetFrame()->AddLight(this);
|
|
} else {
|
|
GetFrame()->RemoveLight(this);
|
|
}
|
|
|
|
CGuiWidget::SetIsVisible(visible);
|
|
}
|
|
|
|
CLight CGuiLight::BuildLight() const {
|
|
CLight ret = CLight::BuildLocalAmbient(CVector3f::Zero(), CColor(0.f, 0.f, 0.f));
|
|
CVector3f pos = GetWorldPosition();
|
|
CVector3f dir = GetWorldTransform().GetColumn(kDY);
|
|
CColor color = GetColor();
|
|
switch (xb8_type) {
|
|
case kLT_Spot:
|
|
ret = CLight::BuildSpot(pos, dir, color, xbc_spotCutoff);
|
|
break;
|
|
case kLT_Point:
|
|
ret = CLight::BuildPoint(pos, color);
|
|
break;
|
|
case kLT_Directional:
|
|
ret = CLight::BuildDirectional(dir, color);
|
|
break;
|
|
case kLT_Custom:
|
|
ret = CLight::BuildCustom(pos, dir, color, xc0_distC, xc4_distL, xc8_distQ, xcc_angleC,
|
|
xd0_angleL, xd4_angleQ);
|
|
default:
|
|
break;
|
|
}
|
|
|
|
ret.SetAttenuation(xc0_distC, xc4_distL, xc8_distQ);
|
|
ret.SetAngleAttenuation(xcc_angleC, xd0_angleL, xd4_angleQ);
|
|
ret.SetLightId(xd8_lightId);
|
|
return ret;
|
|
}
|
|
|
|
FourCC CGuiLight::GetWidgetTypeID() const {
|
|
return 'LITE';
|
|
}
|