From 6e350a3dc0b596b1f76fab3b943b67b7713ea4fa Mon Sep 17 00:00:00 2001 From: hop311 Date: Mon, 4 Dec 2023 00:12:16 +0000 Subject: Sim submodule update + extension compatibility --- .../src/openvic-extension/utility/Utilities.cpp | 114 ++++----------------- 1 file changed, 20 insertions(+), 94 deletions(-) (limited to 'extension/src/openvic-extension/utility/Utilities.cpp') diff --git a/extension/src/openvic-extension/utility/Utilities.cpp b/extension/src/openvic-extension/utility/Utilities.cpp index 5940373..e3bcce6 100644 --- a/extension/src/openvic-extension/utility/Utilities.cpp +++ b/extension/src/openvic-extension/utility/Utilities.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -12,6 +13,24 @@ using namespace godot; using namespace OpenVic; +/* Date formatted like this: "January 1, 1836" (with the month localised, if possible). */ +String Utilities::date_to_formatted_string(Date date) { + std::string const& month_name = date.get_month_name(); + const String day_and_year = " " + String::num_int64(date.get_day()) + ", " + String::num_int64(date.get_year()); + TranslationServer const* server = TranslationServer::get_singleton(); + if (server != nullptr) { + return server->translate(std_to_godot_string_name(month_name)) + day_and_year; + } else { + return std_to_godot_string(month_name) + day_and_year; + } +} + +Ref Utilities::load_resource(String const& path, String const& type_hint) { + ResourceLoader* loader = ResourceLoader::get_singleton(); + ERR_FAIL_NULL_V(loader, nullptr); + return loader->load(path, type_hint); +} + static Ref load_dds_image(String const& path) { gli::texture2d texture { gli::load_dds(Utilities::godot_to_std_string(path)) }; if (texture.empty()) { @@ -42,7 +61,7 @@ static Ref load_dds_image(String const& path) { PackedByteArray pixels; pixels.resize(size); - /* Index offset used to control whether we are reading */ + /* Index offset used to control whether we are reading */ const size_t rb_idx = 2 * needs_bgr_to_rgb; uint8_t const* ptr = static_cast(texture.data()); for (size_t i = 0; i < size; i += 4) { @@ -72,96 +91,3 @@ Ref Utilities::load_godot_font(String const& fnt_path, Ref cons } return font; } - -// Get the polar coordinates of a pixel relative to the center -static Vector2 getPolar(Vector2 UVin, Vector2 center) { - Vector2 relcoord = (UVin - center); - float dist = relcoord.length(); - float theta = std::numbers::pi / 2 + atan2(relcoord.y, relcoord.x); - if (theta < 0.0f) { - theta += std::numbers::pi * 2; - } - return { dist, theta }; -} - -// From thebookofshaders, returns a gradient falloff -static inline float parabola(float base, float x, float k) { - return powf(base * x * (1.0 - x), k); -} - -static inline float parabola_shadow(float base, float x) { - return base * x * x; -} - -static Color pie_chart_fragment( - Vector2 UV, float radius, Array const& stopAngles, Array const& colours, Vector2 shadow_displacement, - float shadow_tightness, float shadow_radius, float shadow_thickness, Color trim_colour, float trim_size, - float gradient_falloff, float gradient_base, bool donut, bool donut_inner_trim, float donut_inner_radius -) { - - Vector2 coords = getPolar(UV, { 0.5, 0.5 }); - float dist = coords.x; - float theta = coords.y; - - Vector2 shadow_polar = getPolar(UV, shadow_displacement); - float shadow_peak = radius + (radius - donut_inner_radius) / 2.0; - float shadow_gradient = - shadow_thickness + parabola_shadow(shadow_tightness * -10.0, shadow_polar.x + shadow_peak - shadow_radius); - - // Inner hole of the donut => make it transparent - if (donut && dist <= donut_inner_radius) { - return { 0.1, 0.1, 0.1, shadow_gradient }; - } - // Inner trim - else if (donut && donut_inner_trim && dist <= donut_inner_radius + trim_size) { - return { trim_colour, 1.0 }; - } - // Interior - else if (dist <= radius - trim_size) { - Color col { 1.0f, 0.0f, 0.0f }; - for (int i = 0; i < stopAngles.size(); i++) { - if (theta <= float(stopAngles[i])) { - col = colours[i]; - break; - } - } - float gradient = parabola(gradient_base, dist, gradient_falloff); - return { col * (1.0 - gradient), 1.0 }; - } - // Outer trim - else if (dist <= radius) { - return { trim_colour, 1.0 }; - } - // Outside the circle - else { - return { 0.1, 0.1, 0.1, shadow_gradient }; - } -} - -void Utilities::draw_pie_chart( - Ref image, Array const& stopAngles, Array const& colours, float radius, Vector2 shadow_displacement, - float shadow_tightness, float shadow_radius, float shadow_thickness, Color trim_colour, float trim_size, - float gradient_falloff, float gradient_base, bool donut, bool donut_inner_trim, float donut_inner_radius -) { - - ERR_FAIL_NULL_EDMSG(image, "Cannot draw pie chart to null image."); - const int32_t width = image->get_width(); - const int32_t height = image->get_height(); - ERR_FAIL_COND_EDMSG(width <= 0 || height <= 0, "Cannot draw pie chart to empty image."); - if (width != height) { - UtilityFunctions::push_warning("Drawing pie chart to non-square image: ", width, "x", height); - } - const int32_t size = std::min(width, height); - for (int32_t y = 0; y < size; ++y) { - for (int32_t x = 0; x < size; ++x) { - image->set_pixel( - x, y, - pie_chart_fragment( - Vector2 { static_cast(x), static_cast(y) } / size, radius, stopAngles, colours, - shadow_displacement, shadow_tightness, shadow_radius, shadow_thickness, trim_colour, trim_size, - gradient_falloff, gradient_base, donut, donut_inner_trim, donut_inner_radius - ) - ); - } - } -} -- cgit v1.2.3-56-ga3b1