aboutsummaryrefslogtreecommitdiff
path: root/extension/src/openvic-extension/classes
diff options
context:
space:
mode:
Diffstat (limited to 'extension/src/openvic-extension/classes')
-rw-r--r--extension/src/openvic-extension/classes/GFXPieChartTexture.hpp78
1 files changed, 41 insertions, 37 deletions
diff --git a/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp b/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
index 3610efb..50616d9 100644
--- a/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
+++ b/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
@@ -11,6 +11,7 @@ namespace OpenVic {
GDCLASS(GFXPieChartTexture, godot::ImageTexture)
public:
+ using godot_pie_chart_data_t = godot::TypedArray<godot::Dictionary>;
struct slice_t {
godot::String name;
godot::Color colour;
@@ -29,56 +30,45 @@ namespace OpenVic {
godot::Error _generate_pie_chart_image();
- protected:
- static void _bind_methods();
-
public:
- GFXPieChartTexture();
-
- // Position must be centred and normalised so that coords are in [-1, 1].
- slice_t const* get_slice(godot::Vector2 const& position) const;
-
- using godot_pie_chart_data_t = godot::TypedArray<godot::Dictionary>;
-
- /* Set slices given an Array of Dictionaries, each with the following key-value entries:
- * - colour: Color
- * - weight: float */
- godot::Error set_slices_array(godot_pie_chart_data_t const& new_slices);
-
- /* Generate slice data from a distribution of HasIdentifierAndColour derived objects, sorted by their weight.
+ /* Generate slice data from a distribution of objects satisfying HasGetIdentifierAndGetColour, sorted by their weight.
* The resulting Array of Dictionaries can be used as an argument for set_slices_array. */
template<typename Container>
static godot_pie_chart_data_t distribution_to_slices_array(Container const& dist)
requires(
(
- /* fixed_point_map_t<T const*>, T derived from HasIdentifierAndColour */
- utility::is_specialization_of_v<Container, tsl::ordered_map> &&
- std::derived_from<std::remove_pointer_t<typename Container::key_type>, HasIdentifierAndColour> &&
- std::is_same_v<typename Container::mapped_type, fixed_point_t>
- ) || (
- /* IndexedMap<T, fixed_point_t>, T derived from HasIdentifierAndColour */
- utility::is_specialization_of_v<Container, IndexedMap> &&
- std::derived_from<typename Container::key_t, HasIdentifierAndColour> &&
- std::is_same_v<typename Container::value_t, fixed_point_t>
+ /* ordered_map<T const*, mapped_type>, T derived from HasIdentifierAndColour */
+ utility::is_specialization_of_v<Container, tsl::ordered_map>
+ /* IndexedMap<T, mapped_type>, T derived from HasIdentifierAndColour */
+ || utility::is_specialization_of_v<Container, IndexedMap>
)
+ && HasGetIdentifierAndGetColour<std::remove_pointer_t<typename Container::key_type>>
+ && std::convertible_to<typename Container::mapped_type, float>
) {
using namespace godot;
- using entry_t = std::pair<HasIdentifierAndColour const*, fixed_point_t>;
+
+ using key_type = std::remove_pointer_t<typename Container::key_type>;
+ using entry_t = std::pair<key_type const*, float>;
+
std::vector<entry_t> sorted_dist;
+ sorted_dist.reserve(dist.size());
if constexpr (utility::is_specialization_of_v<Container, tsl::ordered_map>) {
- sorted_dist.reserve(dist.size());
- for (entry_t const& entry : dist) {
- ERR_CONTINUE_MSG(
- entry.first == nullptr, vformat("Null distribution key with value %f", entry.second.to_float())
- );
- sorted_dist.push_back(entry);
+ for (auto const& [key, non_float_value] : dist) {
+ const float value = static_cast<float>(non_float_value);
+
+ ERR_CONTINUE_MSG(key == nullptr, vformat("Null distribution key with value %f", value));
+
+ if (value != 0.0f) {
+ sorted_dist.emplace_back(key, value);
+ }
}
} else {
for (size_t index = 0; index < dist.size(); ++index) {
- fixed_point_t const& value = dist[index];
- if (value != 0) {
- HasIdentifierAndColour const* key = &dist(index);
+ const float value = static_cast<float>(dist[index]);
+
+ if (value != 0.0f) {
+ key_type const* key = &dist(index);
sorted_dist.emplace_back(key, value);
}
}
@@ -92,16 +82,30 @@ namespace OpenVic {
ERR_FAIL_COND_V(array.resize(sorted_dist.size()) != OK, {});
for (size_t idx = 0; idx < array.size(); ++idx) {
- auto const& [key, val] = sorted_dist[idx];
+ auto const& [key, value] = sorted_dist[idx];
Dictionary sub_dict;
sub_dict[_slice_identifier_key()] = Utilities::std_to_godot_string(key->get_identifier());
sub_dict[_slice_colour_key()] = Utilities::to_godot_color(key->get_colour());
- sub_dict[_slice_weight_key()] = val.to_float();
+ sub_dict[_slice_weight_key()] = value;
array[idx] = std::move(sub_dict);
}
return array;
}
+ protected:
+ static void _bind_methods();
+
+ public:
+ GFXPieChartTexture();
+
+ // Position must be centred and normalised so that coords are in [-1, 1].
+ slice_t const* get_slice(godot::Vector2 const& position) const;
+
+ /* Set slices given an Array of Dictionaries, each with the following key-value entries:
+ * - colour: Color
+ * - weight: float */
+ godot::Error set_slices_array(godot_pie_chart_data_t const& new_slices);
+
/* Create a GFXPieChartTexture using the specified GFX::PieChart. Returns nullptr if gfx_pie_chart fails. */
static godot::Ref<GFXPieChartTexture> make_gfx_pie_chart_texture(GFX::PieChart const* gfx_pie_chart);