Skip to content

Commit

Permalink
Fixing layering issues with text and textures (#99)
Browse files Browse the repository at this point in the history
  • Loading branch information
Kbz-8 authored Oct 28, 2024
2 parents 7724001 + 245d556 commit 51427dc
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 18 deletions.
30 changes: 12 additions & 18 deletions runtime/Includes/Core/Graphics.inl
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,17 @@ namespace mlx
NonOwningPtr<Text> text = p_scene->GetTextFromPositionAndColor(str, Vec2f{ static_cast<float>(x), static_cast<float>(y) }, vec_color);
if(!text)
{
Text& new_text = p_scene->CreateText(str);
new_text.SetPosition(Vec2f{ static_cast<float>(x), static_cast<float>(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<float>(x), static_cast<float>(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> texture, int x, int y)
Expand All @@ -62,20 +59,17 @@ namespace mlx
NonOwningPtr<Sprite> sprite = p_scene->GetSpriteFromTextureAndPosition(texture, Vec2f{ static_cast<float>(x), static_cast<float>(y) });
if(!sprite)
{

Sprite& new_sprite = p_scene->CreateSprite(texture);
new_sprite.SetPosition(Vec2f{ static_cast<float>(x), static_cast<float>(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<float>(x), static_cast<float>(y) });

}
else if(!p_scene->IsTextureAtGivenDrawLayer(texture, m_draw_layer))
p_scene->BringToDrawLayer(sprite.Get(), m_draw_layer);
}

void GraphicsSupport::TryEraseSpritesInScene(NonOwningPtr<Texture> texture) noexcept
Expand Down
1 change: 1 addition & 0 deletions runtime/Includes/Graphics/Scene.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace mlx
inline void BindFont(std::shared_ptr<Font> font) { Verify((bool)font, "invalid fond pointer"); p_bound_font = font; }

void BringToFront(NonOwningPtr<Drawable> drawable);
void BringToDrawLayer(NonOwningPtr<Drawable> drawable, std::uint64_t draw_layer);

inline void ResetScene() { m_drawables.clear(); }

Expand Down
11 changes: 11 additions & 0 deletions runtime/Sources/Graphics/Scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,4 +124,15 @@ namespace mlx
return;
std::rotate(it, it + 1, m_drawables.end());
}
void Scene::BringToDrawLayer(NonOwningPtr<Drawable> 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> drawable_ptr)
{
return drawable_ptr.get() == drawable.Get();
});
if (m_drawables.size() > draw_layer)
return;
std::swap(*it, *(m_drawables.begin() + draw_layer));
}
}

0 comments on commit 51427dc

Please sign in to comment.