#include #include #include #include namespace mlx { Sprite& Scene::CreateSprite(NonOwningPtr texture) noexcept { MLX_PROFILE_FUNCTION(); Verify((bool)texture, "Scene: invalid texture (internal mlx issue, please report to devs)"); #pragma omp parallel for for(auto& sprite : m_sprites) { if(texture->GetWidth() == sprite->GetTexture()->GetWidth() && texture->GetHeight() == sprite->GetTexture()->GetHeight()) { std::shared_ptr new_sprite = std::make_shared(sprite->GetMesh(), texture); m_sprites.push_back(new_sprite); return *new_sprite; } } std::shared_ptr sprite = std::make_shared(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; }); if(it != m_sprites.end()) m_sprites.erase(it); } while(it != m_sprites.end()); } bool Scene::IsTextureAtGivenDrawLayer(NonOwningPtr texture, std::uint64_t draw_layer) const { MLX_PROFILE_FUNCTION(); if(draw_layer >= m_sprites.size()) return false; return m_sprites[draw_layer]->GetTexture() == texture; } }