From a597b0059f30e9d56331c6ece34fdcabb4028616 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 9 Dec 2024 20:15:41 +0100 Subject: making rendering fonts and UI --- src/crepe/facade/SDLContext.cpp | 43 +++++++++++++++++++++++++++++--------- src/crepe/facade/SDLContext.h | 10 ++++++++- src/crepe/system/RenderSystem.cpp | 4 ++-- src/crepe/system/RenderSystem.h | 2 +- src/example/rendering_particle.cpp | 18 ++++++++++++++-- 5 files changed, 61 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 6becf60..297763d 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include #include #include @@ -62,6 +64,10 @@ SDLContext::SDLContext() { if (!(IMG_Init(img_flags) & img_flags)) { throw runtime_error("SDLContext: SDL_image could not initialize!"); } + + if (TTF_Init() != 0) { + throw runtime_error("SDLContext: TTF could not initialize!"); + } } SDLContext::~SDLContext() { @@ -73,6 +79,7 @@ SDLContext::~SDLContext() { // TODO: how are we going to ensure that these are called from the same // thread that SDL_Init() was called on? This has caused problems for me // before. + TTF_Quit(); IMG_Quit(); SDL_Quit(); } @@ -281,10 +288,9 @@ void SDLContext::draw(const RenderContext & ctx) { &dstrect, angle, NULL, render_flip); } -SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { +SDLContext::CameraValues & SDLContext::set_camera(const Camera & cam) { const Camera::Data & cam_data = cam.data; - CameraValues ret_cam; // resize window int w, h; SDL_GetWindowSize(this->game_window.get(), &w, &h); @@ -292,9 +298,9 @@ SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { SDL_SetWindowSize(this->game_window.get(), cam.screen.x, cam.screen.y); } - vec2 & zoomed_viewport = ret_cam.zoomed_viewport; - vec2 & bar_size = ret_cam.bar_size; - vec2 & render_scale = ret_cam.render_scale; + vec2 & zoomed_viewport = this->camera_val.zoomed_viewport; + vec2 & bar_size = this->camera_val.bar_size; + vec2 & render_scale = this->camera_val.render_scale; zoomed_viewport = cam.viewport_size * cam_data.zoom; float screen_aspect = static_cast(cam.screen.x) / cam.screen.y; @@ -337,7 +343,7 @@ SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { // fill bg color SDL_RenderFillRect(this->game_renderer.get(), &bg); - return ret_cam; + return this->camera_val; } uint64_t SDLContext::get_ticks() const { return SDL_GetTicks64(); } @@ -366,6 +372,19 @@ SDLContext::texture_from_path(const std::string & path) { return img_texture; } +std::unique_ptr> +SDLContext::font_from_path(const std::string & path) { + + TTF_Font * lib_font = TTF_OpenFont(path.c_str(), 72); + if (!lib_font) { + throw runtime_error(format("SDLContext: font cannot be load from {}", path)); + } + std::unique_ptr> font; + font = {lib_font, [](TTF_Font * f){}}; + + return font; +} + ivec2 SDLContext::get_size(const Texture & ctx) { ivec2 size; SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &size.x, &size.y); @@ -377,7 +396,11 @@ void SDLContext::delay(int ms) const { SDL_Delay(ms); } std::vector SDLContext::get_events() { std::vector event_list; SDL_Event event; + const CameraValues & cam = this->camera_val; while (SDL_PollEvent(&event)) { + ivec2 mouse_pos; + mouse_pos.x = (event.button.x - cam.bar_size.x) / cam.render_scale.x; + mouse_pos.y = (event.button.y - cam.bar_size.y) / cam.render_scale.y; switch (event.type) { case SDL_QUIT: event_list.push_back(EventData{ @@ -401,7 +424,7 @@ std::vector SDLContext::get_events() { event_list.push_back(EventData{ .event_type = SDLContext::EventType::MOUSEDOWN, .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, + .mouse_position = mouse_pos, }); break; case SDL_MOUSEBUTTONUP: { @@ -410,21 +433,21 @@ std::vector SDLContext::get_events() { event_list.push_back(EventData{ .event_type = SDLContext::EventType::MOUSEUP, .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, + .mouse_position = mouse_pos, }); } break; case SDL_MOUSEMOTION: { event_list.push_back( EventData{.event_type = SDLContext::EventType::MOUSEMOVE, - .mouse_position = {event.motion.x, event.motion.y}, + .mouse_position = mouse_pos, .rel_mouse_move = {event.motion.xrel, event.motion.yrel}}); } break; case SDL_MOUSEWHEEL: { event_list.push_back(EventData{ .event_type = SDLContext::EventType::MOUSEWHEEL, - .mouse_position = {event.motion.x, event.motion.y}, + .mouse_position = mouse_pos, // TODO: why is this needed? .scroll_direction = event.wheel.y < 0 ? -1 : 1, .scroll_delta = event.wheel.preciseY, diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index e232511..b847c72 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -188,6 +189,9 @@ private: */ ivec2 get_size(const Texture & ctx); + std::unique_ptr> + font_from_path(const std::string & path); + private: //! Will use draw,clear_screen, present_screen, camera. friend class RenderSystem; @@ -198,6 +202,8 @@ private: */ void draw(const RenderContext & ctx); + void draw_text(const + //! Clears the screen, preparing for a new frame. void clear_screen(); @@ -208,7 +214,7 @@ private: * \brief sets the background of the camera (will be adjusted in future PR) * \param camera Reference to the Camera object. */ - CameraValues set_camera(const Camera & camera); + CameraValues & set_camera(const Camera & camera); private: //! the data needed to construct a sdl dst rectangle @@ -254,6 +260,8 @@ private: //! black bars rectangle to draw SDL_FRect black_bars[2] = {}; + + CameraValues camera_val; }; } // namespace crepe diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 26f2c85..74fed26 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -27,7 +27,7 @@ void RenderSystem::present_screen() { ctx.present_screen(); } -SDLContext::CameraValues RenderSystem::update_camera() { +SDLContext::CameraValues & RenderSystem::update_camera() { ComponentManager & mgr = this->mediator.component_manager; SDLContext & ctx = this->mediator.sdl_context; RefVector cameras = mgr.get_components_by_type(); @@ -38,7 +38,7 @@ SDLContext::CameraValues RenderSystem::update_camera() { if (!cam.active) continue; const Transform & transform = mgr.get_components_by_id(cam.game_object_id).front().get(); - SDLContext::CameraValues cam_val = ctx.set_camera(cam); + SDLContext::CameraValues & cam_val = ctx.set_camera(cam); cam_val.cam_pos = transform.position + cam.data.postion_offset; return cam_val; } diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index e270a6b..de26aa8 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -37,7 +37,7 @@ private: void present_screen(); //! Updates the active camera used for rendering. - SDLContext::CameraValues update_camera(); + SDLContext::CameraValues & update_camera(); //! Renders the whole screen void render(); diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 29d475d..b57ba04 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -1,3 +1,4 @@ +#include "api/Button.h" #include #include #include @@ -12,6 +13,8 @@ #include #include #include +#include +#include using namespace crepe; using namespace std; @@ -57,7 +60,7 @@ public: .order_in_layer = 2, .size = {0, 100}, .angle_offset = 0, - .position_offset = {100, 0}, + .position_offset = {0, 0}, }); auto & anim = game_object.add_component(test_sprite, 4, 4, @@ -66,12 +69,23 @@ public: .looping = false, }); anim.set_anim(2); - anim.active = false; + anim.pause(); auto & cam = game_object.add_component(ivec2{1280, 720}, vec2{400, 400}, Camera::Data{ .bg_color = Color::WHITE, }); + + function on_click = [&](){ cout << "button clicked" << std::endl; }; + function on_enter = [&](){ cout << "enter" << std::endl; }; + function on_exit = [&](){ cout << "exit" << std::endl; }; + + auto & button = game_object.add_component