#include "CAngle.h" #include "U_Log.h" #include "CScriptFieldsManager.h" #include "U_Scripting.h" CAngle::CAngle() { m_degrees = 0.0f; } CAngle::CAngle(float rad) { m_degrees = AngleUtils::normalizeTo360(AngleUtils::Rad2Deg(rad)); } CAngle::CAngle(const CAngle& copy) { m_degrees = copy.m_degrees; } CAngle::operator float() const { return asRadians(); } float CAngle::asDegrees() const { return m_degrees; } float CAngle::asRadians() const { return AngleUtils::Deg2Rad(m_degrees); } float CAngle::asDegrees180() const { return AngleUtils::normalizeTo180(m_degrees); } float CAngle::asRadians180() const { return AngleUtils::Deg2Rad(AngleUtils::normalizeTo180(m_degrees)); } void CAngle::wrap_inner_value() { m_degrees = AngleUtils::normalizeTo360(m_degrees); } void CAngle::clamp360deg(float degmin, float degmax) { m_degrees = glm::clamp(m_degrees, degmin, degmax); } void CAngle::clamp180deg(float degmin, float degmax) { float wrapped180 = asDegrees180(); wrapped180 = glm::clamp(wrapped180, degmin, degmax); setDegrees(wrapped180); } void CAngle::clamp360rad(float radmin, float radmax) { float rad360 = asRadians(); rad360 = glm::clamp(rad360, radmin, radmax); setRadians(rad360); } void CAngle::clamp180rad(float radmin, float radmax) { float rad180 = asRadians180(); rad180 = glm::clamp(rad180, radmin, radmax); setRadians(rad180); } CAngle& CAngle::operator=(const CAngle& right) { m_degrees = const_cast(right).m_degrees; return *this; } bool CAngle::operator==(const CAngle& right) const { return m_degrees == right.m_degrees; } bool CAngle::operator!=(const CAngle& right) const { return m_degrees != right.m_degrees; } bool CAngle::operator<(const CAngle& right) const { return m_degrees < right.m_degrees; } bool CAngle::operator>(const CAngle& right) const { return m_degrees > right.m_degrees; } bool CAngle::operator<=(const CAngle& right) const { return m_degrees <= right.m_degrees; } bool CAngle::operator>=(const CAngle& right) const { return m_degrees >= right.m_degrees; } CAngle CAngle::operator+(const CAngle& right) const { CAngle angl; angl.m_degrees = m_degrees; angl += right; return angl; } CAngle& CAngle::operator+=(const CAngle& right) { m_degrees += right.m_degrees; wrap_inner_value(); return *this; } CAngle CAngle::operator-(const CAngle& right) const { CAngle angl; angl.m_degrees = m_degrees; angl -= right; return angl; } CAngle& CAngle::operator-=(const CAngle& right) { m_degrees -= right.m_degrees; wrap_inner_value(); return *this; } CAngle CAngle::operator*(const CAngle& right) const { CAngle angl; angl.m_degrees = m_degrees; angl *= right; return angl; } CAngle& CAngle::operator*=(const CAngle& right) { m_degrees *= right.m_degrees; wrap_inner_value(); return *this; } CAngle CAngle::operator/(const CAngle& right) const { CAngle angl; angl.m_degrees = m_degrees; angl /= right; return angl; } CAngle& CAngle::operator/=(const CAngle& right) { m_degrees /= right.m_degrees; wrap_inner_value(); return *this; } CAngle CAngle::operator-() const { return CAngle::degrees(-CAngle::asDegrees180()); } CAngle CAngle::degrees(float angl) { return { AngleUtils::Rad2Deg(angl) }; } CAngle CAngle::radians(float angl) { return { angl }; } void CAngle::setDegrees(float deg) { m_degrees = AngleUtils::normalizeTo360(deg); } void CAngle::setRadians(float deg) { m_degrees = AngleUtils::normalizeTo360(AngleUtils::Rad2Deg(deg)); } bool CAngle::V_ScriptInit(std::shared_ptr state, sol::table table) { auto fieldsMan = CScriptFieldsManager::CreateFieldsManager(table); auto scDegrees = std::make_unique( [this](sol::state_view st) -> sol::object { return ScriptUtils::ToObject(asDegrees(), st); }, [this](sol::object obj) -> void { setDegrees(obj.as()); }); auto scDegrees180 = std::make_unique( [this](sol::state_view st) -> sol::object { return ScriptUtils::ToObject(asDegrees180(), st); }, [this](sol::object obj) -> void { setDegrees(obj.as()); }); auto scRadians = std::make_unique( [this](sol::state_view st) -> sol::object { return ScriptUtils::ToObject(asRadians(), st); }, [this](sol::object obj) -> void { setRadians(obj.as()); }); auto scRadians180 = std::make_unique( [this](sol::state_view st) -> sol::object { return ScriptUtils::ToObject(asRadians180(), st); }, [this](sol::object obj) -> void { setRadians(obj.as()); }); fieldsMan->AddField("degrees", std::move(scDegrees)); fieldsMan->AddField("degrees180", std::move(scDegrees180)); fieldsMan->AddField("radians", std::move(scRadians)); fieldsMan->AddField("radians180", std::move(scRadians180)); table.set("__type", "angle"); auto meta = fieldsMan->CreateMetaTable(table); meta.set_function("__add", [table](sol::object obj_right, sol::this_state ts) mutable -> sol::object { CAngle angle_left = ScriptUtils::FromObject(table); CAngle angle_right = ScriptUtils::FromObject(obj_right); return ScriptUtils::ToObject(angle_left + angle_right, ts); }); meta.set_function("__sub", [table](sol::object obj_right, sol::this_state ts) mutable -> sol::object { CAngle angle_left = ScriptUtils::FromObject(table); CAngle angle_right = ScriptUtils::FromObject(obj_right); return ScriptUtils::ToObject(angle_left - angle_right, ts); }); meta.set_function("__mul", [table](sol::object obj_right, sol::this_state ts) mutable -> sol::object { CAngle angle_left = ScriptUtils::FromObject(table); CAngle angle_right = ScriptUtils::FromObject(obj_right); return ScriptUtils::ToObject(angle_left * angle_right, ts); }); meta.set_function("__div", [table](sol::object obj_right, sol::this_state ts) mutable -> sol::object { CAngle angle_left = ScriptUtils::FromObject(table); CAngle angle_right = ScriptUtils::FromObject(obj_right); return ScriptUtils::ToObject(angle_left / angle_right, ts); }); meta.set_function("__unm", [table](sol::this_state ts) mutable -> sol::object { CAngle angle_left = ScriptUtils::FromObject(table); return ScriptUtils::ToObject(-angle_left, ts); }); return true; } CAngles::~CAngles() {} //HACK bool CAngles::V_ScriptInit(std::shared_ptr _state, sol::table table) { sol::state_view state(table.lua_state()); sol::table pitch = state.create_table(); sol::table yaw = state.create_table(); sol::table roll = state.create_table(); table.set_function("toQuat", [table](sol::this_state ts) mutable -> sol::object { CAngles self_euler = ScriptUtils::FromObject(table); glm::quat quat = AngleUtils::AnglesToQuat(self_euler); return ScriptUtils::ToObject(quat, ts); }); pitch = Pitch.GetScriptTable(_state); yaw = Yaw.GetScriptTable(_state); roll = Roll.GetScriptTable(_state); table[1] = table["x"] = table["pitch"] = pitch; table[2] = table["y"] = table["yaw"] = yaw; table[3] = table["z"] = table["roll"] = roll; table.set("__type", "angles"); return true; }