diff --git a/configure.py b/configure.py index 916cea8d..fa538a78 100755 --- a/configure.py +++ b/configure.py @@ -50,6 +50,7 @@ COMPLETE_OBJECTS = [ "Kyoto/Basics/COsContextDolphin", "Kyoto/Basics/CSWDataDolphin", "Kyoto/Audio/CSfxHandle", + "Kyoto/Graphics/CLight", "Kyoto/Graphics/CGX", "Kyoto/Particles/CIntElement", "Kyoto/Particles/CWarp", diff --git a/obj_files.mk b/obj_files.mk index bcce9060..164ab068 100644 --- a/obj_files.mk +++ b/obj_files.mk @@ -507,7 +507,7 @@ KYOTO_1 :=\ $(BUILD_DIR)/asm/Kyoto/Text/CWordInstruction.o\ $(BUILD_DIR)/asm/Kyoto/Text/CBlockInstruction.o\ $(BUILD_DIR)/asm/Kyoto/Text/CFont.o\ - $(BUILD_DIR)/asm/Kyoto/Graphics/CLight.o\ + $(BUILD_DIR)/src/Kyoto/Graphics/CLight.o\ $(BUILD_DIR)/asm/Kyoto/Graphics/CCubeModel.o\ $(BUILD_DIR)/src/Kyoto/Graphics/CGX.o\ $(BUILD_DIR)/asm/Kyoto/Graphics/CTevCombiners.o\ diff --git a/src/Kyoto/Graphics/CLight.cpp b/src/Kyoto/Graphics/CLight.cpp index ead14aca..adea10ee 100644 --- a/src/Kyoto/Graphics/CLight.cpp +++ b/src/Kyoto/Graphics/CLight.cpp @@ -1,13 +1,15 @@ +#include + #include "Kyoto/Graphics/CLight.hpp" #include "Kyoto/Math/CMath.hpp" #include "rstl/math.hpp" +static const float gkEpsilon32 = FLT_EPSILON; + const CVector3f CLight::kDefaultPosition(0.f, 0.f, 0.f); const CVector3f CLight::kDefaultDirection(0.f, -1.f, 0.f); -static const float gkEpsilon32 = FLT_EPSILON; - CLight::CLight(ELightType type, const CVector3f& position, const CVector3f& direction, const CColor& color, float cutoff) : x0_pos(position) @@ -52,10 +54,12 @@ CLight CLight::BuildLocalAmbient(const CVector3f& pos, const CColor& col) { return CLight(kLT_LocalAmbient, pos, kDefaultDirection, col, 180.f); } + CLight CLight::BuildDirectional(const CVector3f& direction, const CColor& col) { return CLight(kLT_Directional, kDefaultPosition, direction, col, 180.f); } + CLight CLight::BuildPoint(const CVector3f& pos, const CColor& color) { return CLight(kLT_Point, pos, kDefaultDirection, color, 180.f); } @@ -71,6 +75,7 @@ CLight CLight::BuildCustom(const CVector3f& pos, const CVector3f& dir, const CCo return CLight(pos, dir, color, distC, distL, distQ, angleC, angleL, angleQ); } + void CLight::SetAttenuation(float constant, float linear, float quadratic) { x24_distC = constant; x28_distL = linear; @@ -79,6 +84,7 @@ void CLight::SetAttenuation(float constant, float linear, float quadratic) { x4c_24_intensityDirty = true; } + void CLight::SetAngleAttenuation(float constant, float linear, float quadratic) { x30_angleC = constant; x34_angleL = linear; @@ -105,9 +111,10 @@ float CLight::GetRadius() const { return x44_cachedRadius; } + float CLight::CalculateLightRadius() const { if (x28_distL < gkEpsilon32 && x2c_distQ < gkEpsilon32) { - return FLT_MAX; + return 3.0E36f; } float intensity = GetIntensity(); @@ -140,6 +147,11 @@ float CLight::GetIntensity() const { } return x48_cachedIntensity; } +// Hack for float ordering +static void StrippedFunc() { + static float f1 = -1.f; + static float f2 = 0.f; +} CVector3f CLight::GetNormalIndependentLightingAtPoint(const CVector3f& point) const { CVector3f floatCol(x18_color.GetRed(), x18_color.GetGreen(), x18_color.GetBlue());