mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-08-03 23:36:59 -04:00
Use the Color type for Light colours in Lua
This commit is contained in:
parent
b988190fba
commit
be0cbb7277
@ -82,7 +82,7 @@ message(STATUS "Configuring OpenMW...")
|
|||||||
set(OPENMW_VERSION_MAJOR 0)
|
set(OPENMW_VERSION_MAJOR 0)
|
||||||
set(OPENMW_VERSION_MINOR 49)
|
set(OPENMW_VERSION_MINOR 49)
|
||||||
set(OPENMW_VERSION_RELEASE 0)
|
set(OPENMW_VERSION_RELEASE 0)
|
||||||
set(OPENMW_LUA_API_REVISION 75)
|
set(OPENMW_LUA_API_REVISION 76)
|
||||||
set(OPENMW_POSTPROCESSING_API_REVISION 2)
|
set(OPENMW_POSTPROCESSING_API_REVISION 2)
|
||||||
|
|
||||||
set(OPENMW_VERSION_COMMITHASH "")
|
set(OPENMW_VERSION_COMMITHASH "")
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <components/esm3/loadligh.hpp>
|
#include <components/esm3/loadligh.hpp>
|
||||||
#include <components/lua/luastate.hpp>
|
#include <components/lua/luastate.hpp>
|
||||||
#include <components/lua/util.hpp>
|
#include <components/lua/util.hpp>
|
||||||
|
#include <components/misc/color.hpp>
|
||||||
#include <components/misc/resourcehelpers.hpp>
|
#include <components/misc/resourcehelpers.hpp>
|
||||||
#include <components/resource/resourcesystem.hpp>
|
#include <components/resource/resourcesystem.hpp>
|
||||||
|
|
||||||
@ -62,7 +63,13 @@ namespace
|
|||||||
if (rec["radius"] != sol::nil)
|
if (rec["radius"] != sol::nil)
|
||||||
light.mData.mRadius = rec["radius"];
|
light.mData.mRadius = rec["radius"];
|
||||||
if (rec["color"] != sol::nil)
|
if (rec["color"] != sol::nil)
|
||||||
light.mData.mColor = rec["color"];
|
{
|
||||||
|
sol::object color = rec["color"];
|
||||||
|
if (color.is<Misc::Color>())
|
||||||
|
light.mData.mColor = color.as<Misc::Color>().toRGBA();
|
||||||
|
else
|
||||||
|
light.mData.mColor = color.as<uint32_t>();
|
||||||
|
}
|
||||||
setRecordFlag(rec, "isCarriable", ESM::Light::Carry, light);
|
setRecordFlag(rec, "isCarriable", ESM::Light::Carry, light);
|
||||||
setRecordFlag(rec, "isDynamic", ESM::Light::Dynamic, light);
|
setRecordFlag(rec, "isDynamic", ESM::Light::Dynamic, light);
|
||||||
setRecordFlag(rec, "isFire", ESM::Light::Fire, light);
|
setRecordFlag(rec, "isFire", ESM::Light::Fire, light);
|
||||||
@ -104,7 +111,8 @@ namespace MWLua
|
|||||||
record["value"] = sol::readonly_property([](const ESM::Light& rec) -> int { return rec.mData.mValue; });
|
record["value"] = sol::readonly_property([](const ESM::Light& rec) -> int { return rec.mData.mValue; });
|
||||||
record["duration"] = sol::readonly_property([](const ESM::Light& rec) -> int { return rec.mData.mTime; });
|
record["duration"] = sol::readonly_property([](const ESM::Light& rec) -> int { return rec.mData.mTime; });
|
||||||
record["radius"] = sol::readonly_property([](const ESM::Light& rec) -> int { return rec.mData.mRadius; });
|
record["radius"] = sol::readonly_property([](const ESM::Light& rec) -> int { return rec.mData.mRadius; });
|
||||||
record["color"] = sol::readonly_property([](const ESM::Light& rec) -> int { return rec.mData.mColor; });
|
record["color"] = sol::readonly_property(
|
||||||
|
[](const ESM::Light& rec) -> Misc::Color { return Misc::Color::fromRGB(rec.mData.mColor); });
|
||||||
record["isCarriable"] = sol::readonly_property(
|
record["isCarriable"] = sol::readonly_property(
|
||||||
[](const ESM::Light& rec) -> bool { return rec.mData.mFlags & ESM::Light::Carry; });
|
[](const ESM::Light& rec) -> bool { return rec.mData.mFlags & ESM::Light::Carry; });
|
||||||
record["isDynamic"] = sol::readonly_property(
|
record["isDynamic"] = sol::readonly_property(
|
||||||
|
@ -6,13 +6,12 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <system_error>
|
#include <system_error>
|
||||||
|
|
||||||
|
#include <components/sceneutil/util.hpp>
|
||||||
|
|
||||||
namespace Misc
|
namespace Misc
|
||||||
{
|
{
|
||||||
Color::Color(float r, float g, float b, float a)
|
Color::Color(float r, float g, float b, float a)
|
||||||
: mR(std::clamp(r, 0.f, 1.f))
|
: mValue(std::clamp(r, 0.f, 1.f), std::clamp(g, 0.f, 1.f), std::clamp(b, 0.f, 1.f), std::clamp(a, 0.f, 1.f))
|
||||||
, mG(std::clamp(g, 0.f, 1.f))
|
|
||||||
, mB(std::clamp(b, 0.f, 1.f))
|
|
||||||
, mA(std::clamp(a, 0.f, 1.f))
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -27,26 +26,31 @@ namespace Misc
|
|||||||
{
|
{
|
||||||
if (hex.size() != 6)
|
if (hex.size() != 6)
|
||||||
throw std::logic_error(std::string("Invalid hex color: ") += hex);
|
throw std::logic_error(std::string("Invalid hex color: ") += hex);
|
||||||
std::array<float, 3> rgb;
|
Color col;
|
||||||
for (size_t i = 0; i < rgb.size(); i++)
|
col.mValue.a() = 1;
|
||||||
|
for (size_t i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
auto sub = hex.substr(i * 2, 2);
|
auto sub = hex.substr(i * 2, 2);
|
||||||
int v = 0;
|
int v = 0;
|
||||||
auto [_, ec] = std::from_chars(sub.data(), sub.data() + sub.size(), v, 16);
|
auto [_, ec] = std::from_chars(sub.data(), sub.data() + sub.size(), v, 16);
|
||||||
if (ec != std::errc())
|
if (ec != std::errc())
|
||||||
throw std::logic_error(std::string("Invalid hex color: ") += hex);
|
throw std::logic_error(std::string("Invalid hex color: ") += hex);
|
||||||
rgb[i] = v / 255.0f;
|
col.mValue[i] = v / 255.0f;
|
||||||
}
|
}
|
||||||
return Color(rgb[0], rgb[1], rgb[2], 1);
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
Color Color::fromRGB(unsigned int value)
|
||||||
|
{
|
||||||
|
return Color(SceneUtil::colourFromRGB(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Color::toHex() const
|
std::string Color::toHex() const
|
||||||
{
|
{
|
||||||
std::string result(6, '0');
|
std::string result(6, '0');
|
||||||
std::array<float, 3> rgb = { mR, mG, mB };
|
for (size_t i = 0; i < 3; i++)
|
||||||
for (size_t i = 0; i < rgb.size(); i++)
|
|
||||||
{
|
{
|
||||||
int b = static_cast<int>(rgb[i] * 255.0f);
|
int b = static_cast<int>(mValue[i] * 255.0f);
|
||||||
char* start = result.data() + i * 2;
|
char* start = result.data() + i * 2;
|
||||||
if (b < 16)
|
if (b < 16)
|
||||||
start++;
|
start++;
|
||||||
@ -59,6 +63,6 @@ namespace Misc
|
|||||||
|
|
||||||
bool operator==(const Color& l, const Color& r)
|
bool operator==(const Color& l, const Color& r)
|
||||||
{
|
{
|
||||||
return l.mR == r.mR && l.mG == r.mG && l.mB == r.mB && l.mA == r.mA;
|
return l.mValue == r.mValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,31 +3,38 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <osg/Vec4>
|
||||||
|
|
||||||
namespace Misc
|
namespace Misc
|
||||||
{
|
{
|
||||||
class Color
|
class Color
|
||||||
{
|
{
|
||||||
|
explicit Color(osg::Vec4&& value)
|
||||||
|
: mValue(value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Color() = default;
|
||||||
Color(float r, float g, float b, float a);
|
Color(float r, float g, float b, float a);
|
||||||
|
|
||||||
float r() const { return mR; }
|
float r() const { return mValue.r(); }
|
||||||
float g() const { return mG; }
|
float g() const { return mValue.g(); }
|
||||||
float b() const { return mB; }
|
float b() const { return mValue.b(); }
|
||||||
float a() const { return mA; }
|
float a() const { return mValue.a(); }
|
||||||
|
|
||||||
std::string toString() const;
|
std::string toString() const;
|
||||||
|
|
||||||
static Color fromHex(std::string_view hex);
|
static Color fromHex(std::string_view hex);
|
||||||
|
static Color fromRGB(unsigned int value);
|
||||||
|
|
||||||
std::string toHex() const;
|
std::string toHex() const;
|
||||||
|
unsigned int toRGBA() const { return mValue.asRGBA(); }
|
||||||
|
|
||||||
friend bool operator==(const Color& l, const Color& r);
|
friend bool operator==(const Color& l, const Color& r);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float mR;
|
osg::Vec4 mValue;
|
||||||
float mG;
|
|
||||||
float mB;
|
|
||||||
float mA;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1673,7 +1673,7 @@
|
|||||||
-- @field #number value
|
-- @field #number value
|
||||||
-- @field #number duration
|
-- @field #number duration
|
||||||
-- @field #number radius
|
-- @field #number radius
|
||||||
-- @field #number color
|
-- @field openmw.util#Color color
|
||||||
-- @field #boolean isCarriable True if the light can be carried by actors and appears up in their inventory.
|
-- @field #boolean isCarriable True if the light can be carried by actors and appears up in their inventory.
|
||||||
-- @field #boolean isDynamic If true, the light will apply to actors and other moving objects
|
-- @field #boolean isDynamic If true, the light will apply to actors and other moving objects
|
||||||
-- @field #boolean isFire True if the light acts like a fire.
|
-- @field #boolean isFire True if the light acts like a fire.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user