From 918b80ae69118c3433ff00109edc6c4641a2c5e8 Mon Sep 17 00:00:00 2001 From: Almamu Date: Sat, 26 Apr 2025 04:14:18 +0200 Subject: [PATCH] chore: change all is/as castings to use typeid so no string comparison takes place --- .../Application/CWallpaperApplication.cpp | 2 +- .../Application/CWallpaperApplication.h | 2 +- src/WallpaperEngine/Core/CObject.cpp | 3 +- src/WallpaperEngine/Core/CObject.h | 22 +++++++++----- src/WallpaperEngine/Core/CProject.cpp | 4 +-- src/WallpaperEngine/Core/CProject.h | 2 +- src/WallpaperEngine/Core/CWallpaper.cpp | 5 ++-- src/WallpaperEngine/Core/CWallpaper.h | 29 +++++++++++-------- src/WallpaperEngine/Core/Objects/CImage.cpp | 4 +-- src/WallpaperEngine/Core/Objects/CImage.h | 5 ---- .../Core/Objects/CParticle.cpp | 4 +-- src/WallpaperEngine/Core/Objects/CParticle.h | 5 ---- src/WallpaperEngine/Core/Objects/CSound.cpp | 4 +-- src/WallpaperEngine/Core/Objects/CSound.h | 5 ---- .../Effects/Constants/CShaderConstant.cpp | 7 ----- .../Effects/Constants/CShaderConstant.h | 26 ++++++++--------- .../Constants/CShaderConstantFloat.cpp | 5 +--- .../Effects/Constants/CShaderConstantFloat.h | 5 ---- .../Constants/CShaderConstantInteger.cpp | 5 +--- .../Constants/CShaderConstantInteger.h | 5 ---- .../Constants/CShaderConstantProperty.cpp | 5 +--- .../Constants/CShaderConstantProperty.h | 5 ---- .../Constants/CShaderConstantVector2.cpp | 5 +--- .../Constants/CShaderConstantVector2.h | 5 ---- .../Constants/CShaderConstantVector3.cpp | 5 +--- .../Constants/CShaderConstantVector3.h | 5 ---- .../Constants/CShaderConstantVector4.cpp | 5 +--- .../Constants/CShaderConstantVector4.h | 5 ---- .../Core/Objects/Particles/CInitializer.h | 22 ++++++++++++++ .../Core/Projects/CProperty.cpp | 17 ++++------- src/WallpaperEngine/Core/Projects/CProperty.h | 24 ++++++++------- .../Core/Projects/CPropertyBoolean.cpp | 8 +++-- .../Core/Projects/CPropertyBoolean.h | 5 +--- .../Core/Projects/CPropertyColor.cpp | 10 ++++--- .../Core/Projects/CPropertyColor.h | 3 +- .../Core/Projects/CPropertyCombo.cpp | 6 ++-- .../Core/Projects/CPropertyCombo.h | 3 +- .../Core/Projects/CPropertySlider.cpp | 8 +++-- .../Core/Projects/CPropertySlider.h | 3 +- .../Core/Projects/CPropertyText.cpp | 8 +++-- .../Core/Projects/CPropertyText.h | 3 +- .../Core/UserSettings/CUserSettingBoolean.cpp | 4 +-- .../Core/UserSettings/CUserSettingBoolean.h | 1 - .../Core/UserSettings/CUserSettingFloat.cpp | 4 +-- .../Core/UserSettings/CUserSettingFloat.h | 1 - .../Core/UserSettings/CUserSettingValue.cpp | 3 -- .../Core/UserSettings/CUserSettingValue.h | 21 ++++++++------ .../Core/UserSettings/CUserSettingVector3.cpp | 4 +-- .../Core/UserSettings/CUserSettingVector3.h | 1 - .../Core/Wallpapers/CScene.cpp | 4 +-- src/WallpaperEngine/Core/Wallpapers/CScene.h | 2 -- .../Core/Wallpapers/CVideo.cpp | 4 +-- src/WallpaperEngine/Core/Wallpapers/CVideo.h | 2 -- src/WallpaperEngine/Core/Wallpapers/CWeb.cpp | 4 +-- src/WallpaperEngine/Core/Wallpapers/CWeb.h | 2 -- src/WallpaperEngine/Render/CObject.cpp | 3 +- src/WallpaperEngine/Render/CObject.h | 28 ++++++++++-------- src/WallpaperEngine/Render/CWallpaper.cpp | 3 +- src/WallpaperEngine/Render/CWallpaper.h | 24 ++++++++------- src/WallpaperEngine/Render/Objects/CImage.cpp | 4 +-- src/WallpaperEngine/Render/Objects/CImage.h | 2 -- src/WallpaperEngine/Render/Objects/CSound.cpp | 4 +-- src/WallpaperEngine/Render/Objects/CSound.h | 2 -- .../Render/Wallpapers/CScene.cpp | 4 +-- .../Render/Wallpapers/CScene.h | 2 -- .../Render/Wallpapers/CVideo.cpp | 4 +-- .../Render/Wallpapers/CVideo.h | 2 -- .../Render/Wallpapers/CWeb.cpp | 4 +-- src/WallpaperEngine/Render/Wallpapers/CWeb.h | 2 -- 69 files changed, 187 insertions(+), 267 deletions(-) diff --git a/src/WallpaperEngine/Application/CWallpaperApplication.cpp b/src/WallpaperEngine/Application/CWallpaperApplication.cpp index 52eccf8..21b1f5b 100644 --- a/src/WallpaperEngine/Application/CWallpaperApplication.cpp +++ b/src/WallpaperEngine/Application/CWallpaperApplication.cpp @@ -197,7 +197,7 @@ void CWallpaperApplication::loadBackgrounds () { } } -std::shared_ptr CWallpaperApplication::loadBackground (const std::string& bg) { +std::unique_ptr CWallpaperApplication::loadBackground (const std::string& bg) { const auto container = std::make_shared (); this->setupContainer (container, bg); diff --git a/src/WallpaperEngine/Application/CWallpaperApplication.h b/src/WallpaperEngine/Application/CWallpaperApplication.h index af9ca48..7af5d53 100644 --- a/src/WallpaperEngine/Application/CWallpaperApplication.h +++ b/src/WallpaperEngine/Application/CWallpaperApplication.h @@ -89,7 +89,7 @@ class CWallpaperApplication { * @param bg * @return */ - [[nodiscard]] std::shared_ptr loadBackground (const std::string& bg); + [[nodiscard]] std::unique_ptr loadBackground (const std::string& bg); /** * Prepares all background's values and updates their properties if required */ diff --git a/src/WallpaperEngine/Core/CObject.cpp b/src/WallpaperEngine/Core/CObject.cpp index 5a5a0df..7cb0ae5 100644 --- a/src/WallpaperEngine/Core/CObject.cpp +++ b/src/WallpaperEngine/Core/CObject.cpp @@ -17,11 +17,10 @@ using namespace WallpaperEngine::Assets; using namespace WallpaperEngine::Core::UserSettings; CObject::CObject ( - const Wallpapers::CScene* scene, const CUserSettingBoolean* visible, int id, std::string name, std::string type, + const Wallpapers::CScene* scene, const CUserSettingBoolean* visible, int id, std::string name, const CUserSettingVector3* origin, const CUserSettingVector3* scale, const CUserSettingVector3* angles, std::vector dependencies ) : - m_type (std::move(type)), m_visible (visible), m_id (id), m_name (std::move(name)), diff --git a/src/WallpaperEngine/Core/CObject.h b/src/WallpaperEngine/Core/CObject.h index d824894..6495acb 100644 --- a/src/WallpaperEngine/Core/CObject.h +++ b/src/WallpaperEngine/Core/CObject.h @@ -32,17 +32,23 @@ class CObject { static const CObject* fromJSON (const json& data, const Wallpapers::CScene* scene, const std::shared_ptr& container); template [[nodiscard]] const T* as () const { - assert (is ()); - return reinterpret_cast (this); + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] T* as () { - assert (is ()); - return reinterpret_cast (this); + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] bool is () const { - return this->m_type == T::Type; + return typeid (*this) == typeid(T); } [[nodiscard]] const std::vector& getDependencies () const; @@ -58,13 +64,13 @@ class CObject { protected: CObject ( - const Wallpapers::CScene* scene, const CUserSettingBoolean* visible, int id, std::string name, std::string type, + const Wallpapers::CScene* scene, const CUserSettingBoolean* visible, int id, std::string name, const CUserSettingVector3* origin, const CUserSettingVector3* scale, const CUserSettingVector3* angles, std::vector dependencies); - private: - const std::string m_type; + virtual ~CObject () = default; + private: const CUserSettingBoolean* m_visible; int m_id; const std::string m_name; diff --git a/src/WallpaperEngine/Core/CProject.cpp b/src/WallpaperEngine/Core/CProject.cpp index af8cd92..7540b0b 100644 --- a/src/WallpaperEngine/Core/CProject.cpp +++ b/src/WallpaperEngine/Core/CProject.cpp @@ -34,7 +34,7 @@ CProject::~CProject () { this->m_properties.clear (); } -std::shared_ptr CProject::fromFile (const std::string& filename, std::shared_ptr container) { +std::unique_ptr CProject::fromFile (const std::string& filename, std::shared_ptr container) { json content = json::parse (container->readFileAsString (filename)); const auto dependency = jsonFindDefault (content, "dependency", "No dependency"); @@ -71,7 +71,7 @@ std::shared_ptr CProject::fromFile (const std::string& filename, std:: } } - std::shared_ptr project = std::make_shared ( + std::unique_ptr project = std::make_unique ( jsonFindRequired (content, "title", "Project title missing"), type, jsonFindDefault (content, "workshopid", std::to_string (backgroundId--)), diff --git a/src/WallpaperEngine/Core/CProject.h b/src/WallpaperEngine/Core/CProject.h index c643086..4757ef1 100644 --- a/src/WallpaperEngine/Core/CProject.h +++ b/src/WallpaperEngine/Core/CProject.h @@ -26,7 +26,7 @@ class CProject { bool supportsaudioprocessing, const std::map& properties); ~CProject(); - static std::shared_ptr fromFile (const std::string& filename, std::shared_ptr container); + static std::unique_ptr fromFile (const std::string& filename, std::shared_ptr container); [[nodiscard]] const CWallpaper* getWallpaper () const; [[nodiscard]] const std::string& getTitle () const; diff --git a/src/WallpaperEngine/Core/CWallpaper.cpp b/src/WallpaperEngine/Core/CWallpaper.cpp index d8ccfb9..36bc0be 100644 --- a/src/WallpaperEngine/Core/CWallpaper.cpp +++ b/src/WallpaperEngine/Core/CWallpaper.cpp @@ -4,9 +4,8 @@ using namespace WallpaperEngine::Core; -CWallpaper::CWallpaper (std::string type, const CProject& project) : - m_project (project), - m_type (std::move(type)) {} +CWallpaper::CWallpaper (const CProject& project) : + m_project (project) {} const CProject& CWallpaper::getProject () const { return this->m_project; diff --git a/src/WallpaperEngine/Core/CWallpaper.h b/src/WallpaperEngine/Core/CWallpaper.h index c47a42a..c7eb12b 100644 --- a/src/WallpaperEngine/Core/CWallpaper.h +++ b/src/WallpaperEngine/Core/CWallpaper.h @@ -10,30 +10,35 @@ class CProject; class CWallpaper { public: - template const T* as () const { - assert (is ()); - return reinterpret_cast (this); + template [[nodiscard]] const T* as () const { + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } - template T* as () { - assert (is ()); - return reinterpret_cast (this); + template [[nodiscard]] T* as () { + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } - template bool is () const { - return this->m_type == T::Type; + template [[nodiscard]] bool is () const { + return typeid(*this) == typeid(T); } - CWallpaper (std::string type, const CProject& project); - const CProject& getProject () const; protected: friend class CProject; + explicit CWallpaper (const CProject& project); + virtual ~CWallpaper() = default; + private: const CProject& m_project; - - const std::string m_type; }; } // namespace WallpaperEngine::Core diff --git a/src/WallpaperEngine/Core/Objects/CImage.cpp b/src/WallpaperEngine/Core/Objects/CImage.cpp index 134d4ab..a192941 100644 --- a/src/WallpaperEngine/Core/Objects/CImage.cpp +++ b/src/WallpaperEngine/Core/Objects/CImage.cpp @@ -18,7 +18,7 @@ CImage::CImage ( const CUserSettingFloat* alpha, float brightness, uint32_t colorBlendMode, glm::vec2 parallaxDepth, bool fullscreen, bool passthrough, bool autosize, std::vector effects, std::vector dependencies ) : - CObject (scene, visible, id, std::move(name), Type, origin, scale, angles, std::move(dependencies)), + CObject (scene, visible, id, std::move(name), origin, scale, angles, std::move(dependencies)), m_size (size), m_parallaxDepth (parallaxDepth), m_material (material), @@ -139,5 +139,3 @@ bool CImage::isAutosize () const { const std::vector& CImage::getEffects () const { return this->m_effects; } - -const std::string CImage::Type = "image"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/CImage.h b/src/WallpaperEngine/Core/Objects/CImage.h index 299a1da..c8a06a2 100644 --- a/src/WallpaperEngine/Core/Objects/CImage.h +++ b/src/WallpaperEngine/Core/Objects/CImage.h @@ -93,11 +93,6 @@ class CImage : public CObject { bool fullscreen, bool passthrough, bool autosize, std::vector effects, std::vector dependencies); - /** - * Type value used to differentiate the different types of objects in a background - */ - static const std::string Type; - private: /** The image's size */ const glm::vec2 m_size; diff --git a/src/WallpaperEngine/Core/Objects/CParticle.cpp b/src/WallpaperEngine/Core/Objects/CParticle.cpp index 4e659e2..2a9062a 100644 --- a/src/WallpaperEngine/Core/Objects/CParticle.cpp +++ b/src/WallpaperEngine/Core/Objects/CParticle.cpp @@ -51,7 +51,7 @@ CParticle::CParticle ( const std::vector& emitters, const std::vector& initializers, std::vector dependencies ) : - CObject (scene, visible, id, name, Type, origin, scale, angles, std::move(dependencies)), + CObject (scene, visible, id, name, origin, scale, angles, std::move(dependencies)), m_starttime (starttime), m_maxcount (maxcount), m_controlpoints (controlpoints), @@ -69,5 +69,3 @@ const std::vector& CParticle::getControlPoints const std::vector& CParticle::getInitializers () const { return this->m_initializers; } - -const std::string CParticle::Type = "particle"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/CParticle.h b/src/WallpaperEngine/Core/Objects/CParticle.h index 38b663a..9ff1ba3 100644 --- a/src/WallpaperEngine/Core/Objects/CParticle.h +++ b/src/WallpaperEngine/Core/Objects/CParticle.h @@ -43,11 +43,6 @@ class CParticle : public CObject { const std::vector& emitters, const std::vector& initializers, std::vector dependencies); - /** - * Type value used to differentiate the different types of objects in a background - */ - static const std::string Type; - private: /** The time at which the particle system should start emitting */ const uint32_t m_starttime; diff --git a/src/WallpaperEngine/Core/Objects/CSound.cpp b/src/WallpaperEngine/Core/Objects/CSound.cpp index 4ab25fc..d55a174 100644 --- a/src/WallpaperEngine/Core/Objects/CSound.cpp +++ b/src/WallpaperEngine/Core/Objects/CSound.cpp @@ -11,7 +11,7 @@ CSound::CSound ( const CUserSettingVector3* origin, const CUserSettingVector3* scale, const CUserSettingVector3* angles, bool repeat, std::vector sounds, std::vector dependencies ) : - CObject (scene, visible, id, std::move(name), Type, origin, scale, angles, std::move(dependencies)), + CObject (scene, visible, id, std::move(name), origin, scale, angles, std::move(dependencies)), m_repeat (repeat), m_sounds (std::move(sounds)) {} @@ -51,5 +51,3 @@ const std::vector& CSound::getSounds () const { bool CSound::isRepeat () const { return this->m_repeat; } - -const std::string CSound::Type = "sound"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/CSound.h b/src/WallpaperEngine/Core/Objects/CSound.h index 2535da3..5aca8ea 100644 --- a/src/WallpaperEngine/Core/Objects/CSound.h +++ b/src/WallpaperEngine/Core/Objects/CSound.h @@ -39,11 +39,6 @@ class CSound : public CObject { const CUserSettingVector3* origin, const CUserSettingVector3* scale, const CUserSettingVector3* angles, bool repeat, std::vector sounds, std::vector dependencies); - /** - * Type value used to differentiate the different types of objects in a background - */ - static const std::string Type; - private: /** If the sounds should repeat or not */ bool m_repeat; diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.cpp index d94ddc8..2f7f343 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.cpp @@ -3,10 +3,3 @@ #include using namespace WallpaperEngine::Core::Objects::Effects::Constants; - -CShaderConstant::CShaderConstant (std::string type) : - m_type (std::move(type)) {} - -const std::string& CShaderConstant::getType () const { - return this->m_type; -} diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h index d418e6e..df80be6 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h @@ -10,33 +10,31 @@ namespace WallpaperEngine::Core::Objects::Effects::Constants { */ class CShaderConstant : public DynamicValues::CDynamicValue { public: - explicit CShaderConstant (std::string type); + virtual ~CShaderConstant () = default; template [[nodiscard]] const T* as () const { - assert (is ()); - return reinterpret_cast (this); + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] T* as () { - assert (is ()); - return reinterpret_cast (this); + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] bool is () const { - return this->m_type == T::Type; + return typeid (*this) == typeid(T); } - /** - * @return The type name of this constant - */ - [[nodiscard]] const std::string& getType () const; - /** * @return String representation of the constant's value */ [[nodiscard]] virtual std::string toString () const = 0; - - private: - const std::string m_type; }; } // namespace WallpaperEngine::Core::Objects::Effects::Constants diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.cpp index 854ac6e..43eb304 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.cpp @@ -2,13 +2,10 @@ using namespace WallpaperEngine::Core::Objects::Effects::Constants; -CShaderConstantFloat::CShaderConstantFloat (float value) : - CShaderConstant (Type) { +CShaderConstantFloat::CShaderConstantFloat (float value) { this->update (value); } std::string CShaderConstantFloat::toString () const { return std::to_string (this->getFloat ()); } - -const std::string CShaderConstantFloat::Type = "float"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h index d128348..6cc3eff 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h @@ -12,11 +12,6 @@ class CShaderConstantFloat : public CShaderConstant { public: explicit CShaderConstantFloat (float value); - /** - * Type string indicator - */ - static const std::string Type; - [[nodiscard]] std::string toString () const override; }; } // namespace WallpaperEngine::Core::Objects::Effects::Constants diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.cpp index 1f1e9d2..766d3a3 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.cpp @@ -2,13 +2,10 @@ using namespace WallpaperEngine::Core::Objects::Effects::Constants; -CShaderConstantInteger::CShaderConstantInteger (int32_t value) : - CShaderConstant (Type) { +CShaderConstantInteger::CShaderConstantInteger (int32_t value) { this->update (value); } std::string CShaderConstantInteger::toString () const { return std::to_string (this->getInt ()); } - -const std::string CShaderConstantInteger::Type = "int"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h index 7b83b5e..da70241 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h @@ -12,11 +12,6 @@ class CShaderConstantInteger : public CShaderConstant { public: explicit CShaderConstantInteger (int32_t value); - /** - * Type string indicator - */ - static const std::string Type; - [[nodiscard]] std::string toString () const override; }; } // namespace WallpaperEngine::Core::Objects::Effects::Constants diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantProperty.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantProperty.cpp index b9c93e2..1e12906 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantProperty.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantProperty.cpp @@ -3,13 +3,10 @@ using namespace WallpaperEngine::Core::Objects::Effects::Constants; -CShaderConstantProperty::CShaderConstantProperty (const CProperty* property) : - CShaderConstant (Type) { +CShaderConstantProperty::CShaderConstantProperty (const CProperty* property) { property->connectOutgoing (this); } std::string CShaderConstantProperty::toString () const { return "no string representation yet!"; } - -const std::string CShaderConstantProperty::Type = "property"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantProperty.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantProperty.h index 7ff49bd..281acba 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantProperty.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantProperty.h @@ -15,11 +15,6 @@ class CShaderConstantProperty : public CShaderConstant { public: explicit CShaderConstantProperty (const CProperty* property); - /** - * Type string indicator - */ - static const std::string Type; - [[nodiscard]] std::string toString () const override; }; } // namespace WallpaperEngine::Core::Objects::Effects::Constants diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector2.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector2.cpp index 21c4b88..28b7a35 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector2.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector2.cpp @@ -2,8 +2,7 @@ using namespace WallpaperEngine::Core::Objects::Effects::Constants; -CShaderConstantVector2::CShaderConstantVector2 (glm::vec2 value) : - CShaderConstant (Type) { +CShaderConstantVector2::CShaderConstantVector2 (glm::vec2 value) { this->update (value); } @@ -17,5 +16,3 @@ std::string CShaderConstantVector2::toString () const { return result; } - -const std::string CShaderConstantVector2::Type = "vec2"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector2.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector2.h index b03ffb4..e9d6f3a 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector2.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector2.h @@ -14,11 +14,6 @@ class CShaderConstantVector2 : public CShaderConstant { public: explicit CShaderConstantVector2 (glm::vec2 value); - /** - * Type string indicator - */ - static const std::string Type; - [[nodiscard]] std::string toString () const override; }; } // namespace WallpaperEngine::Core::Objects::Effects::Constants diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.cpp index 41b3ff7..b588d28 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.cpp @@ -2,8 +2,7 @@ using namespace WallpaperEngine::Core::Objects::Effects::Constants; -CShaderConstantVector3::CShaderConstantVector3 (glm::vec3 value) : - CShaderConstant (Type) { +CShaderConstantVector3::CShaderConstantVector3 (glm::vec3 value) { this->update (value); } @@ -19,5 +18,3 @@ std::string CShaderConstantVector3::toString () const { return result; } - -const std::string CShaderConstantVector3::Type = "vec3"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h index c74945d..693d124 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h @@ -13,11 +13,6 @@ class CShaderConstantVector3 : public CShaderConstant { public: explicit CShaderConstantVector3 (glm::vec3 value); - /** - * Type string indicator - */ - static const std::string Type; - [[nodiscard]] std::string toString () const override; }; } // namespace WallpaperEngine::Core::Objects::Effects::Constants diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector4.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector4.cpp index e0503f2..4cf2ee1 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector4.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector4.cpp @@ -2,8 +2,7 @@ using namespace WallpaperEngine::Core::Objects::Effects::Constants; -CShaderConstantVector4::CShaderConstantVector4 (glm::vec4 value) : - CShaderConstant (Type) { +CShaderConstantVector4::CShaderConstantVector4 (glm::vec4 value) { this->update (value); } @@ -21,5 +20,3 @@ std::string CShaderConstantVector4::toString () const { return result; } - -const std::string CShaderConstantVector4::Type = "vec4"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector4.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector4.h index 5723b7c..119662d 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector4.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector4.h @@ -13,11 +13,6 @@ class CShaderConstantVector4 : public CShaderConstant { public: explicit CShaderConstantVector4 (glm::vec4 value); - /** - * Type string indicator - */ - static const std::string Type; - [[nodiscard]] std::string toString () const override; }; } // namespace WallpaperEngine::Core::Objects::Effects::Constants diff --git a/src/WallpaperEngine/Core/Objects/Particles/CInitializer.h b/src/WallpaperEngine/Core/Objects/Particles/CInitializer.h index e012651..b3884cb 100644 --- a/src/WallpaperEngine/Core/Objects/Particles/CInitializer.h +++ b/src/WallpaperEngine/Core/Objects/Particles/CInitializer.h @@ -13,6 +13,26 @@ class CInitializer { public: static const CInitializer* fromJSON (const json& data); + template [[nodiscard]] const T* as () const { + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); + } + + template [[nodiscard]] T* as () { + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); + } + + template [[nodiscard]] bool is () const { + return typeid (*this) == typeid(T); + } + /** * @return The name of the particle initializer, indicates what type of initialization to do */ @@ -25,6 +45,8 @@ class CInitializer { protected: CInitializer (uint32_t id, std::string name); + virtual ~CInitializer() = default; + private: /** ID for ordering purposes */ const uint32_t m_id; diff --git a/src/WallpaperEngine/Core/Projects/CProperty.cpp b/src/WallpaperEngine/Core/Projects/CProperty.cpp index 4daf795..f2fc13a 100644 --- a/src/WallpaperEngine/Core/Projects/CProperty.cpp +++ b/src/WallpaperEngine/Core/Projects/CProperty.cpp @@ -13,15 +13,15 @@ using namespace WallpaperEngine::Core::Projects; CProperty* CProperty::fromJSON (const json& data, const std::string& name) { const auto type = jsonFindRequired (data, "type", "Project properties must have the type field"); - if (*type == CPropertyColor::Type) + if (*type == "color") return CPropertyColor::fromJSON (data, name); - if (*type == CPropertyBoolean::Type) + if (*type == "bool") return CPropertyBoolean::fromJSON (data, name); - if (*type == CPropertySlider::Type) + if (*type == "slider") return CPropertySlider::fromJSON (data, name); - if (*type == CPropertyCombo::Type) + if (*type == "combo") return CPropertyCombo::fromJSON (data, name); - if (*type == CPropertyText::Type) + if (*type == "text") return CPropertyText::fromJSON (data, name); // show the error and ignore this property @@ -31,8 +31,7 @@ CProperty* CProperty::fromJSON (const json& data, const std::string& name) { return nullptr; } -CProperty::CProperty (std::string name, std::string type, std::string text) : - m_type (std::move(type)), +CProperty::CProperty (std::string name, std::string text) : m_name (std::move(name)), m_text (std::move(text)) {} @@ -52,10 +51,6 @@ const std::string& CProperty::getName () const { return this->m_name; } -const std::string& CProperty::getType () const { - return this->m_type; -} - const std::string& CProperty::getText () const { return this->m_text; } \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Projects/CProperty.h b/src/WallpaperEngine/Core/Projects/CProperty.h index bc39f38..7348828 100644 --- a/src/WallpaperEngine/Core/Projects/CProperty.h +++ b/src/WallpaperEngine/Core/Projects/CProperty.h @@ -19,17 +19,23 @@ class CProperty : public CDynamicValue { static CProperty* fromJSON (const json& data, const std::string& name); template [[nodiscard]] const T* as () const { - assert (is ()); - return reinterpret_cast (this); + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] T* as () { - assert (is ()); - return reinterpret_cast (this); + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] bool is () const { - return this->m_type == T::Type; + return typeid (*this) == typeid(T); } /** @@ -47,9 +53,9 @@ class CProperty : public CDynamicValue { */ [[nodiscard]] const std::string& getName () const; /** - * @return Type of the property + * @return Textual type representation of this property */ - [[nodiscard]] const std::string& getType () const; + [[nodiscard]] virtual const char* getType () const = 0; /** * @return Text of the property */ @@ -64,12 +70,10 @@ class CProperty : public CDynamicValue { protected: void propagate () const override; - CProperty (std::string name, std::string type, std::string text); + CProperty (std::string name, std::string text); /** Functions to call when this property's value changes */ mutable std::vector m_subscriptions; - /** Type of property */ - const std::string m_type; /** Name of the property */ const std::string m_name; /** Description of the property for the user */ diff --git a/src/WallpaperEngine/Core/Projects/CPropertyBoolean.cpp b/src/WallpaperEngine/Core/Projects/CPropertyBoolean.cpp index f996012..3aec61d 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertyBoolean.cpp +++ b/src/WallpaperEngine/Core/Projects/CPropertyBoolean.cpp @@ -31,7 +31,9 @@ std::string CPropertyBoolean::dump () const { return ss.str (); } -CPropertyBoolean::CPropertyBoolean (bool value, std::string name, std::string text) : - CProperty (std::move(name), Type, std::move(text)) {} +const char* CPropertyBoolean::getType () const { + return "bool"; +} -const std::string CPropertyBoolean::Type = "bool"; \ No newline at end of file +CPropertyBoolean::CPropertyBoolean (bool value, std::string name, std::string text) : + CProperty (std::move(name), std::move(text)) {} diff --git a/src/WallpaperEngine/Core/Projects/CPropertyBoolean.h b/src/WallpaperEngine/Core/Projects/CPropertyBoolean.h index bbea454..e5614f2 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertyBoolean.h +++ b/src/WallpaperEngine/Core/Projects/CPropertyBoolean.h @@ -12,12 +12,9 @@ class CPropertyBoolean final : public CProperty { public: static CPropertyBoolean* fromJSON (const json& data, std::string name); - /** @inheritdoc */ [[nodiscard]] std::string dump () const override; - /** @inheritdoc */ void set (const std::string& value) override; - - static const std::string Type; + [[nodiscard]] const char* getType () const override; private: CPropertyBoolean (bool value, std::string name, std::string text); diff --git a/src/WallpaperEngine/Core/Projects/CPropertyColor.cpp b/src/WallpaperEngine/Core/Projects/CPropertyColor.cpp index f6e78dc..9236159 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertyColor.cpp +++ b/src/WallpaperEngine/Core/Projects/CPropertyColor.cpp @@ -45,9 +45,11 @@ std::string CPropertyColor::dump () const { return ss.str (); } -CPropertyColor::CPropertyColor (const std::string& color, std::string name, std::string text) : - CProperty (std::move(name), Type, std::move(text)) { - this->set (color); +const char* CPropertyColor::getType () const { + return "color"; } -const std::string CPropertyColor::Type = "color"; \ No newline at end of file +CPropertyColor::CPropertyColor (const std::string& color, std::string name, std::string text) : + CProperty (std::move(name), std::move(text)) { + this->set (color); +} diff --git a/src/WallpaperEngine/Core/Projects/CPropertyColor.h b/src/WallpaperEngine/Core/Projects/CPropertyColor.h index ab9b875..fb82c25 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertyColor.h +++ b/src/WallpaperEngine/Core/Projects/CPropertyColor.h @@ -16,8 +16,7 @@ class CPropertyColor final : public CProperty { [[nodiscard]] std::string dump () const override; void set (const std::string& value) override; - - static const std::string Type; + [[nodiscard]] const char* getType () const override; private: CPropertyColor (const std::string& color, std::string name, std::string text); diff --git a/src/WallpaperEngine/Core/Projects/CPropertyCombo.cpp b/src/WallpaperEngine/Core/Projects/CPropertyCombo.cpp index a15a00a..0331316 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertyCombo.cpp +++ b/src/WallpaperEngine/Core/Projects/CPropertyCombo.cpp @@ -40,7 +40,7 @@ CPropertyCombo* CPropertyCombo::fromJSON (const json& data, std::string name) { CPropertyCombo::CPropertyCombo ( std::string name, std::string text, const std::string& defaultValue, std::vector values ) : - CProperty (std::move(name), Type, std::move(text)), + CProperty (std::move(name), std::move(text)), m_values (std::move(values)) { this->set (defaultValue); } @@ -108,4 +108,6 @@ int CPropertyCombo::translateValueToIndex (const std::string& value) const { return index; } -const std::string CPropertyCombo::Type = "combo"; \ No newline at end of file +const char* CPropertyCombo::getType () const { + return "combo"; +} diff --git a/src/WallpaperEngine/Core/Projects/CPropertyCombo.h b/src/WallpaperEngine/Core/Projects/CPropertyCombo.h index 05ec1b7..ee27a45 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertyCombo.h +++ b/src/WallpaperEngine/Core/Projects/CPropertyCombo.h @@ -30,8 +30,7 @@ class CPropertyCombo final : public CProperty { [[nodiscard]] std::string dump () const override; void set (const std::string& value) override; int translateValueToIndex (const std::string& value) const; - - static const std::string Type; + [[nodiscard]] const char* getType () const override; private: CPropertyCombo ( diff --git a/src/WallpaperEngine/Core/Projects/CPropertySlider.cpp b/src/WallpaperEngine/Core/Projects/CPropertySlider.cpp index 5b01505..326bf2e 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertySlider.cpp +++ b/src/WallpaperEngine/Core/Projects/CPropertySlider.cpp @@ -53,13 +53,15 @@ void CPropertySlider::set (const std::string& value) { this->update (newValue); } +const char* CPropertySlider::getType () const { + return "slider"; +} + CPropertySlider::CPropertySlider (float value, const std::string& name, const std::string& text, float min, float max, float step) : - CProperty (name, Type, text), + CProperty (name, text), m_min (min), m_max (max), m_step (step) { this->update (value); } - -const std::string CPropertySlider::Type = "slider"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Projects/CPropertySlider.h b/src/WallpaperEngine/Core/Projects/CPropertySlider.h index ce12f37..52bf716 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertySlider.h +++ b/src/WallpaperEngine/Core/Projects/CPropertySlider.h @@ -28,8 +28,7 @@ class CPropertySlider final : public CProperty { [[nodiscard]] const float& getStep () const; [[nodiscard]] std::string dump () const override; void set (const std::string& value) override; - - static const std::string Type; + [[nodiscard]] const char* getType () const override; private: CPropertySlider (float value, const std::string& name, const std::string& text, float min, float max, float step); diff --git a/src/WallpaperEngine/Core/Projects/CPropertyText.cpp b/src/WallpaperEngine/Core/Projects/CPropertyText.cpp index 4133c2a..1254ccf 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertyText.cpp +++ b/src/WallpaperEngine/Core/Projects/CPropertyText.cpp @@ -26,7 +26,9 @@ void CPropertyText::set (const std::string& value) { this->m_text = value; } -CPropertyText::CPropertyText (std::string name, std::string text) : - CProperty (std::move(name), Type, std::move(text)) {} +const char* CPropertyText::getType () const { + return "text"; +} -const std::string CPropertyText::Type = "text"; \ No newline at end of file +CPropertyText::CPropertyText (std::string name, std::string text) : + CProperty (std::move(name), std::move(text)) {} diff --git a/src/WallpaperEngine/Core/Projects/CPropertyText.h b/src/WallpaperEngine/Core/Projects/CPropertyText.h index b4f01cf..8661a22 100644 --- a/src/WallpaperEngine/Core/Projects/CPropertyText.h +++ b/src/WallpaperEngine/Core/Projects/CPropertyText.h @@ -13,8 +13,7 @@ class CPropertyText final : public CProperty { static CPropertyText* fromJSON (const json& data, std::string name); [[nodiscard]] std::string dump () const override; void set (const std::string& value) override; - - static const std::string Type; + [[nodiscard]] const char* getType () const override; private: CPropertyText (std::string name, std::string text); diff --git a/src/WallpaperEngine/Core/UserSettings/CUserSettingBoolean.cpp b/src/WallpaperEngine/Core/UserSettings/CUserSettingBoolean.cpp index 7f4fce3..34e14a4 100644 --- a/src/WallpaperEngine/Core/UserSettings/CUserSettingBoolean.cpp +++ b/src/WallpaperEngine/Core/UserSettings/CUserSettingBoolean.cpp @@ -18,7 +18,7 @@ using namespace WallpaperEngine::Core::UserSettings; CUserSettingBoolean::CUserSettingBoolean ( bool hasCondition, bool defaultValue, const Projects::CProperty* source, std::string expectedValue ) : - CUserSettingValue (Type), + CUserSettingValue (), m_hasCondition (hasCondition), m_source (source), m_expectedValue (std::move(expectedValue)) { @@ -91,5 +91,3 @@ const CUserSettingBoolean* CUserSettingBoolean::fromJSON (const nlohmann::json& const CUserSettingBoolean* CUserSettingBoolean::fromScalar (const bool value) { return new CUserSettingBoolean (false, value, nullptr, ""); } - -std::string CUserSettingBoolean::Type = "boolean"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/UserSettings/CUserSettingBoolean.h b/src/WallpaperEngine/Core/UserSettings/CUserSettingBoolean.h index 87e0b32..b2b1961 100644 --- a/src/WallpaperEngine/Core/UserSettings/CUserSettingBoolean.h +++ b/src/WallpaperEngine/Core/UserSettings/CUserSettingBoolean.h @@ -14,7 +14,6 @@ class CUserSettingBoolean : public CUserSettingValue { static const CUserSettingBoolean* fromJSON (const nlohmann::json& data, const CProject& project); static const CUserSettingBoolean* fromScalar (bool value); - static std::string Type; private: CUserSettingBoolean ( diff --git a/src/WallpaperEngine/Core/UserSettings/CUserSettingFloat.cpp b/src/WallpaperEngine/Core/UserSettings/CUserSettingFloat.cpp index 6e63f6b..e2d22ba 100644 --- a/src/WallpaperEngine/Core/UserSettings/CUserSettingFloat.cpp +++ b/src/WallpaperEngine/Core/UserSettings/CUserSettingFloat.cpp @@ -15,7 +15,7 @@ using namespace WallpaperEngine::Core::UserSettings; CUserSettingFloat::CUserSettingFloat ( bool hasCondition, float defaultValue, const Projects::CProperty* source, std::string expectedValue ) : - CUserSettingValue (Type), + CUserSettingValue (), m_default (defaultValue), m_hasCondition (hasCondition), m_source (source), @@ -85,5 +85,3 @@ const CUserSettingFloat* CUserSettingFloat::fromJSON (const nlohmann::json& data const CUserSettingFloat* CUserSettingFloat::fromScalar (const float value) { return new CUserSettingFloat (false, value, nullptr, ""); } - -std::string CUserSettingFloat::Type = "float"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/UserSettings/CUserSettingFloat.h b/src/WallpaperEngine/Core/UserSettings/CUserSettingFloat.h index 8243d61..b2f1c13 100644 --- a/src/WallpaperEngine/Core/UserSettings/CUserSettingFloat.h +++ b/src/WallpaperEngine/Core/UserSettings/CUserSettingFloat.h @@ -14,7 +14,6 @@ class CUserSettingFloat : public CUserSettingValue { static const CUserSettingFloat* fromJSON (const nlohmann::json& data, const CProject& project); static const CUserSettingFloat* fromScalar (float value); - static std::string Type; private: CUserSettingFloat ( diff --git a/src/WallpaperEngine/Core/UserSettings/CUserSettingValue.cpp b/src/WallpaperEngine/Core/UserSettings/CUserSettingValue.cpp index 5e22ef2..5bcb172 100644 --- a/src/WallpaperEngine/Core/UserSettings/CUserSettingValue.cpp +++ b/src/WallpaperEngine/Core/UserSettings/CUserSettingValue.cpp @@ -3,6 +3,3 @@ #include using namespace WallpaperEngine::Core::UserSettings; - -CUserSettingValue::CUserSettingValue (std::string type) : - m_type (std::move(type)) {} \ No newline at end of file diff --git a/src/WallpaperEngine/Core/UserSettings/CUserSettingValue.h b/src/WallpaperEngine/Core/UserSettings/CUserSettingValue.h index bf21a61..90ee8f7 100644 --- a/src/WallpaperEngine/Core/UserSettings/CUserSettingValue.h +++ b/src/WallpaperEngine/Core/UserSettings/CUserSettingValue.h @@ -10,23 +10,26 @@ using namespace WallpaperEngine::Core::DynamicValues; class CUserSettingValue : public CDynamicValue { public: template [[nodiscard]] const T* as () const { - assert (is ()); - return reinterpret_cast (this); + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] T* as () { - assert (is ()); - return reinterpret_cast (this); + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] bool is () const { - return this->m_type == T::Type; + return typeid (*this) == typeid(T); } protected: - explicit CUserSettingValue (std::string type); - - private: - const std::string m_type; + virtual ~CUserSettingValue() = default; }; } // namespace WallpaperEngine::Core::UserSettings diff --git a/src/WallpaperEngine/Core/UserSettings/CUserSettingVector3.cpp b/src/WallpaperEngine/Core/UserSettings/CUserSettingVector3.cpp index bfa8a19..24b6c9d 100644 --- a/src/WallpaperEngine/Core/UserSettings/CUserSettingVector3.cpp +++ b/src/WallpaperEngine/Core/UserSettings/CUserSettingVector3.cpp @@ -15,7 +15,7 @@ using namespace WallpaperEngine::Core::UserSettings; CUserSettingVector3::CUserSettingVector3 ( bool hasCondition, glm::vec3 defaultValue, const Projects::CProperty* source, std::string expectedValue ) : - CUserSettingValue (Type), + CUserSettingValue (), m_hasCondition (hasCondition), m_source (source), m_expectedValue (std::move(expectedValue)) { @@ -85,5 +85,3 @@ const CUserSettingVector3* CUserSettingVector3::fromJSON (const nlohmann::json& const CUserSettingVector3* CUserSettingVector3::fromScalar (const glm::vec3 value) { return new CUserSettingVector3 (false, value, nullptr, ""); } - -std::string CUserSettingVector3::Type = "color"; \ No newline at end of file diff --git a/src/WallpaperEngine/Core/UserSettings/CUserSettingVector3.h b/src/WallpaperEngine/Core/UserSettings/CUserSettingVector3.h index a4a3ff3..cdc7d06 100644 --- a/src/WallpaperEngine/Core/UserSettings/CUserSettingVector3.h +++ b/src/WallpaperEngine/Core/UserSettings/CUserSettingVector3.h @@ -16,7 +16,6 @@ class CUserSettingVector3 : public CUserSettingValue { static const CUserSettingVector3* fromJSON (const nlohmann::json& data, const CProject& project); static const CUserSettingVector3* fromScalar (glm::vec3 value); - static std::string Type; private: CUserSettingVector3 ( diff --git a/src/WallpaperEngine/Core/Wallpapers/CScene.cpp b/src/WallpaperEngine/Core/Wallpapers/CScene.cpp index 6c399bf..af97234 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CScene.cpp +++ b/src/WallpaperEngine/Core/Wallpapers/CScene.cpp @@ -18,7 +18,7 @@ CScene::CScene ( float cameraShakeAmplitude, float cameraShakeRoughness, float cameraShakeSpeed, const CUserSettingVector3* clearColor, const Scenes::CProjection* orthogonalProjection, glm::vec3 skylightColor ) : - CWallpaper (Type, project), + CWallpaper (project), m_container (std::move(container)), m_camera (camera), m_ambientColor (ambientColor), @@ -167,5 +167,3 @@ const Scenes::CProjection* CScene::getOrthogonalProjection () const { const glm::vec3& CScene::getSkylightColor () const { return this->m_skylightColor; } - -const std::string CScene::Type = "scene"; diff --git a/src/WallpaperEngine/Core/Wallpapers/CScene.h b/src/WallpaperEngine/Core/Wallpapers/CScene.h index 428f09b..da705bb 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CScene.h +++ b/src/WallpaperEngine/Core/Wallpapers/CScene.h @@ -52,8 +52,6 @@ class CScene : public CWallpaper { float cameraShakeAmplitude, float cameraShakeRoughness, float cameraShakeSpeed, const CUserSettingVector3* clearColor, const Scenes::CProjection* orthogonalProjection, glm::vec3 skylightColor); - static const std::string Type; - void insertObject (const CObject* object); [[nodiscard]] std::shared_ptr getContainer () const; diff --git a/src/WallpaperEngine/Core/Wallpapers/CVideo.cpp b/src/WallpaperEngine/Core/Wallpapers/CVideo.cpp index e4d2dbc..3192417 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CVideo.cpp +++ b/src/WallpaperEngine/Core/Wallpapers/CVideo.cpp @@ -6,11 +6,9 @@ using namespace WallpaperEngine::Core; using namespace WallpaperEngine::Core::Wallpapers; CVideo::CVideo (std::string filename, const CProject& project) : - CWallpaper (Type, project), + CWallpaper (project), m_filename (std::move(filename)) {} const std::string& CVideo::getFilename () const { return this->m_filename; } - -const std::string CVideo::Type = "video"; diff --git a/src/WallpaperEngine/Core/Wallpapers/CVideo.h b/src/WallpaperEngine/Core/Wallpapers/CVideo.h index a37362a..1a62c23 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CVideo.h +++ b/src/WallpaperEngine/Core/Wallpapers/CVideo.h @@ -21,7 +21,5 @@ class CVideo : public CWallpaper { friend class CWallpaper; const std::string m_filename; - - static const std::string Type; }; } // namespace WallpaperEngine::Core diff --git a/src/WallpaperEngine/Core/Wallpapers/CWeb.cpp b/src/WallpaperEngine/Core/Wallpapers/CWeb.cpp index 6949d9f..24906df 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CWeb.cpp +++ b/src/WallpaperEngine/Core/Wallpapers/CWeb.cpp @@ -10,7 +10,5 @@ const std::string& CWeb::getFilename () const { } CWeb::CWeb (std::string filename, const CProject& project) : - CWallpaper (Type, project), + CWallpaper (project), m_filename (std::move(filename)) {} - -const std::string CWeb::Type = "web"; diff --git a/src/WallpaperEngine/Core/Wallpapers/CWeb.h b/src/WallpaperEngine/Core/Wallpapers/CWeb.h index e4c670b..0fd0848 100644 --- a/src/WallpaperEngine/Core/Wallpapers/CWeb.h +++ b/src/WallpaperEngine/Core/Wallpapers/CWeb.h @@ -29,8 +29,6 @@ namespace WallpaperEngine::Core::Wallpapers const std::string m_filename; - static const std::string Type; - private: }; } \ No newline at end of file diff --git a/src/WallpaperEngine/Render/CObject.cpp b/src/WallpaperEngine/Render/CObject.cpp index d3b3e0d..ea666df 100644 --- a/src/WallpaperEngine/Render/CObject.cpp +++ b/src/WallpaperEngine/Render/CObject.cpp @@ -6,9 +6,8 @@ using namespace WallpaperEngine; using namespace WallpaperEngine::Render; using namespace WallpaperEngine::Render::Wallpapers; -CObject::CObject (Wallpapers::CScene* scene, std::string type, const Core::CObject* object) : +CObject::CObject (Wallpapers::CScene* scene, const Core::CObject* object) : Helpers::CContextAware (scene), - m_type (std::move (type)), m_scene (scene), m_object (object) {} diff --git a/src/WallpaperEngine/Render/CObject.h b/src/WallpaperEngine/Render/CObject.h index b0714d5..0a066e5 100644 --- a/src/WallpaperEngine/Render/CObject.h +++ b/src/WallpaperEngine/Render/CObject.h @@ -14,18 +14,24 @@ class CScene; namespace WallpaperEngine::Render { class CObject : public Helpers::CContextAware { public: - template const T* as () const { - assert (is ()); - return reinterpret_cast (this); + template [[nodiscard]] const T* as () const { + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } - template T* as () { - assert (is ()); - return reinterpret_cast (this); + template [[nodiscard]] T* as () { + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } - template bool is () { - return this->m_type == T::Type; + template [[nodiscard]] bool is () const { + return typeid (*this) == typeid(T); } virtual void render () = 0; @@ -35,12 +41,10 @@ class CObject : public Helpers::CContextAware { [[nodiscard]] int getId () const; protected: - CObject (Wallpapers::CScene* scene, std::string type, const Core::CObject* object); - ~CObject () override = default; + CObject (Wallpapers::CScene* scene, const Core::CObject* object); + virtual ~CObject () override = default; private: - std::string m_type; - Wallpapers::CScene* m_scene; const Core::CObject* m_object; }; diff --git a/src/WallpaperEngine/Render/CWallpaper.cpp b/src/WallpaperEngine/Render/CWallpaper.cpp index 32984fc..4c545fe 100644 --- a/src/WallpaperEngine/Render/CWallpaper.cpp +++ b/src/WallpaperEngine/Render/CWallpaper.cpp @@ -11,7 +11,7 @@ using namespace WallpaperEngine::Render; CWallpaper::CWallpaper ( - const Core::CWallpaper* wallpaperData, std::string type, CRenderContext& context,CAudioContext& audioContext, + const Core::CWallpaper* wallpaperData, CRenderContext& context,CAudioContext& audioContext, const CWallpaperState::TextureUVsScaling& scalingMode, const WallpaperEngine::Assets::ITexture::TextureFlags& clampMode ) : @@ -26,7 +26,6 @@ CWallpaper::CWallpaper ( a_TexCoord (GL_NONE), m_vaoBuffer (GL_NONE), m_destFramebuffer (GL_NONE), - m_type (std::move (type)), m_audioContext (audioContext), m_state (scalingMode, clampMode) { // generate the VAO to stop opengl from complaining diff --git a/src/WallpaperEngine/Render/CWallpaper.h b/src/WallpaperEngine/Render/CWallpaper.h index d571ce4..6d17b1f 100644 --- a/src/WallpaperEngine/Render/CWallpaper.h +++ b/src/WallpaperEngine/Render/CWallpaper.h @@ -30,21 +30,27 @@ class CContextAware; class CWallpaper : public Helpers::CContextAware { public: - template [[nodiscard]]const T* as () const { - assert (is ()); - return reinterpret_cast (this); + template [[nodiscard]] const T* as () const { + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] T* as () { - assert (is ()); - return reinterpret_cast (this); + if (is ()) { + return static_cast (this); + } + + throw std::bad_cast (); } template [[nodiscard]] bool is () const { - return this->m_type == T::Type; + return typeid (*this) == typeid(T); } - ~CWallpaper () override; + virtual ~CWallpaper () override; /** * Performs a render pass of the wallpaper @@ -154,7 +160,7 @@ class CWallpaper : public Helpers::CContextAware { protected: CWallpaper ( - const Core::CWallpaper* wallpaperData, std::string type, CRenderContext& context, CAudioContext& audioContext, + const Core::CWallpaper* wallpaperData, CRenderContext& context, CAudioContext& audioContext, const CWallpaperState::TextureUVsScaling& scalingMode, const WallpaperEngine::Assets::ITexture::TextureFlags& clampMode); @@ -189,8 +195,6 @@ class CWallpaper : public Helpers::CContextAware { GLuint m_destFramebuffer; /** Setups OpenGL's shaders for this wallpaper backbuffer */ void setupShaders (); - /** The type of background this wallpaper is */ - std::string m_type; /** List of FBOs registered for this wallpaper */ std::map> m_fbos; /** Audio context that is using this wallpaper */ diff --git a/src/WallpaperEngine/Render/Objects/CImage.cpp b/src/WallpaperEngine/Render/Objects/CImage.cpp index a31569f..bfda036 100644 --- a/src/WallpaperEngine/Render/Objects/CImage.cpp +++ b/src/WallpaperEngine/Render/Objects/CImage.cpp @@ -5,7 +5,7 @@ using namespace WallpaperEngine; using namespace WallpaperEngine::Render::Objects; CImage::CImage (Wallpapers::CScene* scene, const Core::Objects::CImage* image) : - Render::CObject (scene, Type, image), + Render::CObject (scene, image), m_texture (nullptr), m_sceneSpacePosition (GL_NONE), m_copySpacePosition (GL_NONE), @@ -481,5 +481,3 @@ GLuint CImage::getTexCoordCopy () const { GLuint CImage::getTexCoordPass () const { return this->m_texcoordPass; } - -const std::string CImage::Type = "image"; \ No newline at end of file diff --git a/src/WallpaperEngine/Render/Objects/CImage.h b/src/WallpaperEngine/Render/Objects/CImage.h index 900ae13..76c1684 100644 --- a/src/WallpaperEngine/Render/Objects/CImage.h +++ b/src/WallpaperEngine/Render/Objects/CImage.h @@ -56,8 +56,6 @@ class CImage final : public CObject { void pinpongFramebuffer (std::shared_ptr* drawTo, std::shared_ptr* asInput); protected: - static const std::string Type; - void setupPasses (); void updateScreenSpacePosition (); diff --git a/src/WallpaperEngine/Render/Objects/CSound.cpp b/src/WallpaperEngine/Render/Objects/CSound.cpp index 05f94b1..9e17301 100644 --- a/src/WallpaperEngine/Render/Objects/CSound.cpp +++ b/src/WallpaperEngine/Render/Objects/CSound.cpp @@ -5,7 +5,7 @@ using namespace WallpaperEngine::Render::Objects; CSound::CSound (Wallpapers::CScene* scene, const Core::Objects::CSound* sound) : - CObject (scene, Type, sound), + CObject (scene, sound), m_sound (sound) { if (this->getContext ().getApp ().getContext ().settings.audio.enabled) this->load (); @@ -38,5 +38,3 @@ void CSound::load () { } void CSound::render () {} - -const std::string CSound::Type = "sound"; \ No newline at end of file diff --git a/src/WallpaperEngine/Render/Objects/CSound.h b/src/WallpaperEngine/Render/Objects/CSound.h index 4ad1478..64de7e8 100644 --- a/src/WallpaperEngine/Render/Objects/CSound.h +++ b/src/WallpaperEngine/Render/Objects/CSound.h @@ -20,8 +20,6 @@ class CSound final : public CObject { void render () override; protected: - static const std::string Type; - void load (); private: diff --git a/src/WallpaperEngine/Render/Wallpapers/CScene.cpp b/src/WallpaperEngine/Render/Wallpapers/CScene.cpp index 519c0b2..2e99471 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CScene.cpp +++ b/src/WallpaperEngine/Render/Wallpapers/CScene.cpp @@ -21,7 +21,7 @@ CScene::CScene ( const CWallpaperState::TextureUVsScaling& scalingMode, const WallpaperEngine::Assets::ITexture::TextureFlags& clampMode ) : - CWallpaper (scene, Type, context, audioContext, scalingMode, clampMode), + CWallpaper (scene, context, audioContext, scalingMode, clampMode), m_mousePosition (), m_mousePositionLast (), m_parallaxDisplacement () { @@ -271,5 +271,3 @@ glm::vec2* CScene::getParallaxDisplacement () { const std::vector& CScene::getObjectsByRenderOrder () const { return this->m_objectsByRenderOrder; } - -const std::string CScene::Type = "scene"; diff --git a/src/WallpaperEngine/Render/Wallpapers/CScene.h b/src/WallpaperEngine/Render/Wallpapers/CScene.h index 06daa8e..9273ca4 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CScene.h +++ b/src/WallpaperEngine/Render/Wallpapers/CScene.h @@ -38,8 +38,6 @@ class CScene final : public CWallpaper { friend class CWallpaper; - static const std::string Type; - private: Render::CObject* createObject (const Core::CObject* object); diff --git a/src/WallpaperEngine/Render/Wallpapers/CVideo.cpp b/src/WallpaperEngine/Render/Wallpapers/CVideo.cpp index 963e519..74eb71a 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CVideo.cpp +++ b/src/WallpaperEngine/Render/Wallpapers/CVideo.cpp @@ -16,7 +16,7 @@ CVideo::CVideo ( const CWallpaperState::TextureUVsScaling& scalingMode, const WallpaperEngine::Assets::ITexture::TextureFlags& clampMode ) : - CWallpaper (video, Type, context, audioContext, scalingMode, clampMode), + CWallpaper (video, context, audioContext, scalingMode, clampMode), m_mpvGl (nullptr), m_paused (false), m_width (16), @@ -141,5 +141,3 @@ int CVideo::getWidth () const { int CVideo::getHeight () const { return this->m_height; } - -const std::string CVideo::Type = "video"; diff --git a/src/WallpaperEngine/Render/Wallpapers/CVideo.h b/src/WallpaperEngine/Render/Wallpapers/CVideo.h index 0a44271..e3a62e1 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CVideo.h +++ b/src/WallpaperEngine/Render/Wallpapers/CVideo.h @@ -28,8 +28,6 @@ class CVideo final : public CWallpaper { friend class CWallpaper; - static const std::string Type; - private: mpv_handle* m_mpv; mpv_render_context* m_mpvGl; diff --git a/src/WallpaperEngine/Render/Wallpapers/CWeb.cpp b/src/WallpaperEngine/Render/Wallpapers/CWeb.cpp index b667d94..7c89c53 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CWeb.cpp +++ b/src/WallpaperEngine/Render/Wallpapers/CWeb.cpp @@ -15,7 +15,7 @@ CWeb::CWeb ( CWebBrowserContext& browserContext, const CWallpaperState::TextureUVsScaling& scalingMode, const WallpaperEngine::Assets::ITexture::TextureFlags& clampMode ) : - CWallpaper (web, Type, context, audioContext, scalingMode, clampMode), + CWallpaper (web, context, audioContext, scalingMode, clampMode), m_browserContext (browserContext), m_browser (), m_client (), @@ -122,5 +122,3 @@ CWeb::~CWeb () { delete this->m_renderHandler; } - -const std::string CWeb::Type = "web"; \ No newline at end of file diff --git a/src/WallpaperEngine/Render/Wallpapers/CWeb.h b/src/WallpaperEngine/Render/Wallpapers/CWeb.h index 0f6f4e0..a57fb4a 100644 --- a/src/WallpaperEngine/Render/Wallpapers/CWeb.h +++ b/src/WallpaperEngine/Render/Wallpapers/CWeb.h @@ -45,8 +45,6 @@ class CWeb : public CWallpaper friend class CWallpaper; - static const std::string Type; - private: WallpaperEngine::WebBrowser::CWebBrowserContext& m_browserContext; CefRefPtr m_browser;