#include "pch.h" #include "LightSource.h" #include #include namespace Vivid2D::util { // ------------------- // 构造函数实现 // ------------------- // 构造函数:点光源/常规光源 LightSource::LightSource(const glm::vec2& pos, const Color& color, float intensity) : position(pos), color(colorToVector3f(color)), intensity(intensity), m_isAmbient(false) { } // 构造函数:环境光 LightSource::LightSource(const Color& color, float intensity) : position(glm::vec2(0.0f, 0.0f)), // 环境光位置通常不重要,设为 (0,0) color(colorToVector3f(color)), intensity(intensity), m_isAmbient(true) { } // ------------------- // 静态工具函数实现 // ------------------- /** * 静态工具函数:将 Color 转换为 glm::vec3 (归一化到 0.0-1.0) */ glm::vec3 LightSource::colorToVector3f(const Color& color) { return glm::vec3( (float)color.r / 255.0f, (float)color.g / 255.0f, (float)color.b / 255.0f ); } /** * 静态工具函数:将 glm::vec3 (0.0-1.0) 转换为 Color (0-255) */ Color LightSource::vector3fToColor(const glm::vec3& colorVec) { // 确保值在 [0.0, 1.0] 范围内 float r = std::min(1.0f, std::max(0.0f, colorVec.x)); float g = std::min(1.0f, std::max(0.0f, colorVec.y)); float b = std::min(1.0f, std::max(0.0f, colorVec.z)); // 转换为 0-255 整数,使用四舍五入 int red = (int)(r * 255.0f + 0.5f); int green = (int)(g * 255.0f + 0.5f); int blue = (int)(b * 255.0f + 0.5f); // 确保结果在 [0, 255] 范围内 red = std::min(255, std::max(0, red)); green = std::min(255, std::max(0, green)); blue = std::min(255, std::max(0, blue)); return Color(red, green, blue); } } // namespace Vivid2D