diff --git a/runtime/Includes/Core/Graphics.inl b/runtime/Includes/Core/Graphics.inl index c0df6e5..5bbd14d 100644 --- a/runtime/Includes/Core/Graphics.inl +++ b/runtime/Includes/Core/Graphics.inl @@ -40,20 +40,17 @@ namespace mlx NonOwningPtr text = p_scene->GetTextFromPositionAndColor(str, Vec2f{ static_cast(x), static_cast(y) }, vec_color); if(!text) { - Text& new_text = p_scene->CreateText(str); - new_text.SetPosition(Vec2f{ static_cast(x), static_cast(y) }); - new_text.SetColor(std::move(vec_color)); - // if(m_pixelput_called) + if(m_pixelput_called) { m_draw_layer++; - // m_pixelput_called = false; + m_pixelput_called = false; } + Text& new_text = p_scene->CreateText(str); + new_text.SetPosition(Vec2f{ static_cast(x), static_cast(y) }); + new_text.SetColor(std::move(vec_color)); } else if(!p_scene->IsTextAtGivenDrawLayer(str, m_draw_layer)) - { - p_scene->BringToFront(text.Get()); - m_draw_layer++; - } + p_scene->BringToDrawLayer(text.Get(), m_draw_layer); } void GraphicsSupport::TexturePut(NonOwningPtr texture, int x, int y) @@ -62,20 +59,17 @@ namespace mlx NonOwningPtr sprite = p_scene->GetSpriteFromTextureAndPosition(texture, Vec2f{ static_cast(x), static_cast(y) }); if(!sprite) { - - Sprite& new_sprite = p_scene->CreateSprite(texture); - new_sprite.SetPosition(Vec2f{ static_cast(x), static_cast(y) }); if(m_pixelput_called) { m_draw_layer++; m_pixelput_called = false; - } - } - else if(!p_scene->IsTextureAtGivenDrawLayer(texture, m_draw_layer)) - { - p_scene->BringToFront(sprite.Get()); - m_draw_layer++; + } + Sprite& new_sprite = p_scene->CreateSprite(texture); + new_sprite.SetPosition(Vec2f{ static_cast(x), static_cast(y) }); + } + else if(!p_scene->IsTextureAtGivenDrawLayer(texture, m_draw_layer)) + p_scene->BringToDrawLayer(sprite.Get(), m_draw_layer); } void GraphicsSupport::TryEraseSpritesInScene(NonOwningPtr texture) noexcept diff --git a/runtime/Includes/Graphics/Scene.h b/runtime/Includes/Graphics/Scene.h index d7f2e2a..0d46488 100644 --- a/runtime/Includes/Graphics/Scene.h +++ b/runtime/Includes/Graphics/Scene.h @@ -27,6 +27,7 @@ namespace mlx inline void BindFont(std::shared_ptr font) { Verify((bool)font, "invalid fond pointer"); p_bound_font = font; } void BringToFront(NonOwningPtr drawable); + void BringToDrawLayer(NonOwningPtr drawable, std::uint64_t draw_layer); inline void ResetScene() { m_drawables.clear(); } diff --git a/runtime/Sources/Graphics/Scene.cpp b/runtime/Sources/Graphics/Scene.cpp index f7752e6..f64afe7 100644 --- a/runtime/Sources/Graphics/Scene.cpp +++ b/runtime/Sources/Graphics/Scene.cpp @@ -124,4 +124,15 @@ namespace mlx return; std::rotate(it, it + 1, m_drawables.end()); } + void Scene::BringToDrawLayer(NonOwningPtr drawable, std::uint64_t draw_layer) + { + MLX_PROFILE_FUNCTION(); + auto it = std::find_if(m_drawables.begin(), m_drawables.end(), [&drawable](std::shared_ptr drawable_ptr) + { + return drawable_ptr.get() == drawable.Get(); + }); + if (m_drawables.size() > draw_layer) + return; + std::swap(*it, *(m_drawables.begin() + draw_layer)); + } }