From 005bc5885a5ff436982246f12e9cfa13231bcf82 Mon Sep 17 00:00:00 2001 From: Nemrav <> Date: Sun, 17 Nov 2024 16:28:59 -0400 Subject: billboards in game session --- .../singletons/MapItemSingleton.cpp | 142 +++++++++++++++++++++ .../singletons/MapItemSingleton.hpp | 34 +++++ 2 files changed, 176 insertions(+) create mode 100644 extension/src/openvic-extension/singletons/MapItemSingleton.cpp create mode 100644 extension/src/openvic-extension/singletons/MapItemSingleton.hpp (limited to 'extension/src/openvic-extension/singletons') diff --git a/extension/src/openvic-extension/singletons/MapItemSingleton.cpp b/extension/src/openvic-extension/singletons/MapItemSingleton.cpp new file mode 100644 index 0000000..57b5ccb --- /dev/null +++ b/extension/src/openvic-extension/singletons/MapItemSingleton.cpp @@ -0,0 +1,142 @@ + + +//billboards, projections, and progress bar + +#include "MapItemSingleton.hpp" +#include + +//#include + +#include + +#include + +#include "openvic-extension/singletons/GameSingleton.hpp" +#include "openvic-extension/utility/ClassBindings.hpp" +#include "openvic-extension/utility/Utilities.hpp" +#include "godot_cpp/variant/packed_vector2_array.hpp" +#include "godot_cpp/variant/typed_array.hpp" +#include "godot_cpp/variant/vector2.hpp" +#include "openvic-simulation/interface/GFXObject.hpp" +#include "openvic-simulation/utility/Logger.hpp" + +using namespace godot; +using namespace OpenVic; + +void MapItemSingleton::_bind_methods() { + /*OV_BIND_METHOD(MapItemSingleton::get_units); + OV_BIND_METHOD(MapItemSingleton::get_cultural_gun_model, { "culture" }); + OV_BIND_METHOD(MapItemSingleton::get_cultural_helmet_model, { "culture" }); + OV_BIND_METHOD(MapItemSingleton::get_flag_model, { "floating" }); + OV_BIND_METHOD(MapItemSingleton::get_buildings);*/ + //OV_BIND_METHOD(MapItemSingleton::get_billboard, {"name"}); + OV_BIND_METHOD(MapItemSingleton::get_billboards); + OV_BIND_METHOD(MapItemSingleton::get_province_positions); + +} + +MapItemSingleton* MapItemSingleton::get_singleton() { + return singleton; +} + +MapItemSingleton::MapItemSingleton() { + ERR_FAIL_COND(singleton != nullptr); + singleton = this; +} + +MapItemSingleton::~MapItemSingleton() { + ERR_FAIL_COND(singleton != this); + singleton = nullptr; +} + +// Get the billboard object from the loaded objects + +GFX::Billboard const* MapItemSingleton::get_billboard(std::string_view name, bool error_on_fail) const { + GameSingleton const* game_singleton = GameSingleton::get_singleton(); + ERR_FAIL_NULL_V(game_singleton, nullptr); + + GFX::Billboard const* billboard = + game_singleton->get_definition_manager().get_ui_manager().get_cast_object_by_identifier(name); + + if (error_on_fail) { + //ERR_FAIL_NULL_V_MSG(billboard, nullptr, vformat("Failed to find billboard \"%s\"", Utilities::std_to_godot_string(name))); + ERR_FAIL_NULL_V_MSG(billboard, nullptr, "Failed to find billboard inner"); + } + + return billboard; +} + +// repackage the billboard object into a godot dictionnary for the Billboard manager to work with +bool MapItemSingleton::add_billboard_dict(std::string_view name, TypedArray& billboard_dict_array) { + + static const StringName name_key = "name"; + static const StringName texture_key = "texture"; + static const StringName scale_key = "scale"; + static const StringName noOfFrames_key = "noFrames"; + //TODO: might need font, font_size, and offset keys in the future + + + GFX::Billboard const* billboard = get_billboard(name,false); + /*ERR_FAIL_NULL_V_MSG( + billboard, false, vformat( + "Failed to find \"%s\" billboard", Utilities::std_to_godot_string(name) + ) + );*/ + ERR_FAIL_NULL_V_MSG( + billboard, false, "Failed to find billboard" + ); + + Dictionary dict; + + dict[name_key] = Utilities::std_to_godot_string(billboard->get_name()); + dict[texture_key] = Utilities::std_to_godot_string(billboard->get_texture_file()); + dict[scale_key] = billboard->get_scale().to_float(); + dict[noOfFrames_key] = billboard->get_no_of_frames(); + + billboard_dict_array.push_back(dict); + + return true; +} + + +//get an array of all the billboard dictionnaries +TypedArray MapItemSingleton::get_billboards(){ + GameSingleton const* game_singleton = GameSingleton::get_singleton(); + ERR_FAIL_NULL_V(game_singleton, {}); + //InstanceManager const* instance_manager = game_singleton->get_instance_manager(); + //ERR_FAIL_NULL_V(instance_manager, {}); + + TypedArray ret; + + std::vector identifiers = + game_singleton->get_definition_manager().get_ui_manager().get_object_identifiers(); + + for(auto i : identifiers){ + GFX::Object const* obj = game_singleton->get_definition_manager().get_ui_manager().get_object_by_identifier(i); + if(obj->is_type()){ + add_billboard_dict(obj->get_name(),ret); + } + } + + return ret; +} + +PackedVector2Array MapItemSingleton::get_province_positions(){ + GameSingleton const* game_singleton = GameSingleton::get_singleton(); + ERR_FAIL_NULL_V(game_singleton, {}); + + /*std::vector prov_identifiers = + game_singleton->get_definition_manager().get_map_definition(). + get_province_definition_identifiers(); + */ + + PackedVector2Array billboard_pos = PackedVector2Array(); + + int prov_count = game_singleton->get_definition_manager().get_map_definition().get_province_definition_count(); + for(int i = 0; i < prov_count; i++){ + ProvinceDefinition const* prov = game_singleton->get_definition_manager().get_map_definition().get_province_definition_by_index(i); + billboard_pos.push_back(Vector2(prov->get_city_position().x,prov->get_city_position().y)); + } + + return billboard_pos; +} \ No newline at end of file diff --git a/extension/src/openvic-extension/singletons/MapItemSingleton.hpp b/extension/src/openvic-extension/singletons/MapItemSingleton.hpp new file mode 100644 index 0000000..5b10446 --- /dev/null +++ b/extension/src/openvic-extension/singletons/MapItemSingleton.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include + +#include +//#include +#include + +//billboards, projections, and progress bar + + +namespace OpenVic { + class MapItemSingleton : public godot::Object { + GDCLASS(MapItemSingleton, godot::Object) + + static inline MapItemSingleton* singleton = nullptr; + + protected: + static void _bind_methods(); + + public: + static MapItemSingleton* get_singleton(); + + MapItemSingleton(); + ~MapItemSingleton(); + + private: + GFX::Billboard const* get_billboard(std::string_view name, bool error_on_fail = true) const; + bool add_billboard_dict(std::string_view name, godot::TypedArray& billboard_dict_array); + godot::TypedArray get_billboards(); + godot::PackedVector2Array get_province_positions(); + }; + +} \ No newline at end of file -- cgit v1.2.3-56-ga3b1