CTexture.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #pragma once
  2. #include "Helpers/ContextAware.h"
  3. #include "TextureProvider.h"
  4. #include "WallpaperEngine/Data/Assets/Texture.h"
  5. #include "WallpaperEngine/VideoPlayback/MPV/GLPlayer.h"
  6. #include <GL/glew.h>
  7. #include <glm/vec4.hpp>
  8. #include <memory>
  9. #include <mpv/client.h>
  10. #include <mpv/render.h>
  11. #include <mpv/render_gl.h>
  12. #include <string>
  13. #include <vector>
  14. namespace WallpaperEngine::Render {
  15. class RenderContext;
  16. using namespace WallpaperEngine::Data::Assets;
  17. using namespace WallpaperEngine::VideoPlayback::MPV;
  18. /**
  19. * A normal texture file in WallpaperEngine's format
  20. */
  21. class CTexture final : public TextureProvider, public Helpers::ContextAware {
  22. public:
  23. explicit CTexture (RenderContext& context, TextureUniquePtr header);
  24. ~CTexture () override;
  25. [[nodiscard]] GLuint getTextureID (uint32_t imageIndex) const override;
  26. [[nodiscard]] uint32_t getTextureWidth (uint32_t imageIndex) const override;
  27. [[nodiscard]] uint32_t getTextureHeight (uint32_t imageIndex) const override;
  28. [[nodiscard]] uint32_t getRealWidth () const override;
  29. [[nodiscard]] uint32_t getRealHeight () const override;
  30. [[nodiscard]] TextureFormat getFormat () const override;
  31. [[nodiscard]] uint32_t getFlags () const override;
  32. [[nodiscard]] const glm::vec4* getResolution () const override;
  33. [[nodiscard]] const std::vector<FrameSharedPtr>& getFrames () const override;
  34. [[nodiscard]] bool isAnimated () const override;
  35. [[nodiscard]] uint32_t getSpritesheetCols () const override;
  36. [[nodiscard]] uint32_t getSpritesheetRows () const override;
  37. [[nodiscard]] uint32_t getSpritesheetFrames () const override;
  38. [[nodiscard]] float getSpritesheetDuration () const override;
  39. /** For video CTextures, playback only starts once usage count goes above zero (initializes mpv if needed) */
  40. void incrementUsageCount () const override;
  41. /** For video CTextures, playback only stops once usage count reaches zero (de-initializes mpv if needed) */
  42. void decrementUsageCount () const override;
  43. void update () const override;
  44. bool isReady () const override;
  45. [[nodiscard]] GLPlayer* getPlayer () const override { return this->m_player.get (); }
  46. /** Debug label for every image of the texture, shows up in renderdoc/apitrace */
  47. void label (const std::string& name) const;
  48. private:
  49. [[nodiscard]] const Texture& getHeader () const;
  50. void setupResolution ();
  51. GLint setupInternalFormat () const;
  52. void setupOpenGLParameters (uint32_t textureID) const;
  53. TextureUniquePtr m_header;
  54. GLuint* m_textureID = nullptr;
  55. glm::vec4 m_resolution {};
  56. GLPlayerUniquePtr m_player;
  57. };
  58. } // namespace WallpaperEngine::Assets