#include #include #include #include namespace mlx { Scene::Scene(SceneDescriptor desc) : m_descriptor(std::move(desc)) { MLX_PROFILE_FUNCTION(); Verify((bool)m_descriptor.renderer, "invalid renderer"); } Sprite& Scene::CreateSprite(NonOwningPtr texture) noexcept { MLX_PROFILE_FUNCTION(); std::shared_ptr sprite = std::make_shared(*m_descriptor.renderer, texture); m_sprites.push_back(sprite); return *sprite; } NonOwningPtr Scene::GetSpriteFromTextureAndPosition(NonOwningPtr texture, const Vec2f& position) const { MLX_PROFILE_FUNCTION(); auto it = std::find_if(m_sprites.begin(), m_sprites.end(), [&texture, &position](std::shared_ptr sprite) { return sprite->GetTexture() == texture && sprite->GetPosition().x == position.x && sprite->GetPosition().y == position.y; }); return (it != m_sprites.end() ? it->get() : nullptr); } void Scene::BringToFront(NonOwningPtr sprite) { MLX_PROFILE_FUNCTION(); auto it = std::find_if(m_sprites.begin(), m_sprites.end(), [&sprite](std::shared_ptr sprite_ptr) { return sprite_ptr.get() == sprite.Get(); }); if(it == m_sprites.end()) return; std::rotate(it, it + 1, m_sprites.end()); } void Scene::TryEraseSpriteFromTexture(NonOwningPtr texture) { MLX_PROFILE_FUNCTION(); auto it = m_sprites.begin(); do { it = std::find_if(m_sprites.begin(), m_sprites.end(), [&texture](std::shared_ptr sprite) { return sprite->GetTexture() == texture; }); m_sprites.erase(it); } while(it != m_sprites.end()); } }