From 5e94fc7bab688dde8149cfbf545a6130101ee9ee Mon Sep 17 00:00:00 2001 From: Alexis Maiquez Date: Wed, 11 Sep 2019 09:15:50 +0200 Subject: [PATCH] + added parsing of dependencies for objects + added fbos parsing from effect files ~ cleaned up effect parsing code ~ support for texture target parsing in materials for texture render targets ~ changed way of modifying textures from passes to a more abstracted way ~ moved shader constants to it's own namespace Signed-off-by: Alexis Maiquez --- CMakeLists.txt | 19 +- src/WallpaperEngine/Core/CObject.cpp | 21 ++ src/WallpaperEngine/Core/CObject.h | 3 + src/WallpaperEngine/Core/Objects/CEffect.cpp | 204 ++++++++++++------ src/WallpaperEngine/Core/Objects/CEffect.h | 15 +- .../Core/Objects/Effects/CFBO.cpp | 40 ++++ .../Core/Objects/Effects/CFBO.h | 28 +++ .../{ => Constants}/CShaderConstant.cpp | 2 +- .../Effects/{ => Constants}/CShaderConstant.h | 2 +- .../{ => Constants}/CShaderConstantFloat.cpp | 2 +- .../{ => Constants}/CShaderConstantFloat.h | 2 +- .../CShaderConstantInteger.cpp | 2 +- .../{ => Constants}/CShaderConstantInteger.h | 2 +- .../CShaderConstantVector3.cpp | 2 +- .../{ => Constants}/CShaderConstantVector3.h | 2 +- .../Core/Objects/Images/CMaterial.cpp | 36 +++- .../Core/Objects/Images/CMaterial.h | 9 +- .../Objects/Images/Materials/CPassess.cpp | 11 +- .../Core/Objects/Images/Materials/CPassess.h | 17 +- src/WallpaperEngine/Render/Objects/CImage.cpp | 16 +- 20 files changed, 333 insertions(+), 102 deletions(-) create mode 100644 src/WallpaperEngine/Core/Objects/Effects/CFBO.cpp create mode 100644 src/WallpaperEngine/Core/Objects/Effects/CFBO.h rename src/WallpaperEngine/Core/Objects/Effects/{ => Constants}/CShaderConstant.cpp (63%) rename src/WallpaperEngine/Core/Objects/Effects/{ => Constants}/CShaderConstant.h (87%) rename src/WallpaperEngine/Core/Objects/Effects/{ => Constants}/CShaderConstantFloat.cpp (80%) rename src/WallpaperEngine/Core/Objects/Effects/{ => Constants}/CShaderConstantFloat.h (84%) rename src/WallpaperEngine/Core/Objects/Effects/{ => Constants}/CShaderConstantInteger.cpp (81%) rename src/WallpaperEngine/Core/Objects/Effects/{ => Constants}/CShaderConstantInteger.h (84%) rename src/WallpaperEngine/Core/Objects/Effects/{ => Constants}/CShaderConstantVector3.cpp (82%) rename src/WallpaperEngine/Core/Objects/Effects/{ => Constants}/CShaderConstantVector3.h (86%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 41446e9..df36a5d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,14 +98,17 @@ add_executable( src/WallpaperEngine/Core/Objects/CParticle.cpp src/WallpaperEngine/Core/Objects/CParticle.h - src/WallpaperEngine/Core/Objects/Effects/CShaderConstant.h - src/WallpaperEngine/Core/Objects/Effects/CShaderConstant.cpp - src/WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.h - src/WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.cpp - src/WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.h - src/WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.cpp - src/WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.h - src/WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.cpp + src/WallpaperEngine/Core/Objects/Effects/CFBO.h + src/WallpaperEngine/Core/Objects/Effects/CFBO.cpp + + src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h + src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.cpp + src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h + src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.cpp + src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h + src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.cpp + src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h + src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.cpp src/WallpaperEngine/Core/Objects/Particles/CControlPoint.cpp src/WallpaperEngine/Core/Objects/Particles/CControlPoint.h diff --git a/src/WallpaperEngine/Core/CObject.cpp b/src/WallpaperEngine/Core/CObject.cpp index b1ea1cf..6cf6f88 100644 --- a/src/WallpaperEngine/Core/CObject.cpp +++ b/src/WallpaperEngine/Core/CObject.cpp @@ -36,6 +36,7 @@ CObject* CObject::fromJSON (json data) auto angles_it = data.find ("angles"); auto name_it = data.find ("name"); auto effects_it = data.find ("effects"); + auto dependencies_it = data.find ("dependencies"); bool visible = true; @@ -128,6 +129,17 @@ CObject* CObject::fromJSON (json data) } } + if (dependencies_it != data.end () && (*dependencies_it).is_array () == true) + { + auto cur = (*dependencies_it).begin (); + auto end = (*dependencies_it).end (); + + for (; cur != end; cur ++) + { + object->insertDependency (*cur); + } + } + return object; } @@ -156,6 +168,11 @@ const std::vector& CObject::getEffects () const return this->m_effects; } +const std::vector& CObject::getDependencies () const +{ + return this->m_dependencies; +} + bool CObject::isVisible () { return this->m_visible; @@ -169,4 +186,8 @@ const int CObject::getId () const void CObject::insertEffect (Objects::CEffect* effect) { this->m_effects.push_back (effect); +} +void CObject::insertDependency (irr::u32 dependency) +{ + this->m_dependencies.push_back (dependency); } \ No newline at end of file diff --git a/src/WallpaperEngine/Core/CObject.h b/src/WallpaperEngine/Core/CObject.h index 9b1fa3f..67fb78a 100644 --- a/src/WallpaperEngine/Core/CObject.h +++ b/src/WallpaperEngine/Core/CObject.h @@ -25,6 +25,7 @@ namespace WallpaperEngine::Core template bool is () { return this->m_type == T::Type; } const std::vector& getEffects () const; + const std::vector& getDependencies () const; const int getId () const; const irr::core::vector3df& getOrigin () const; @@ -45,6 +46,7 @@ namespace WallpaperEngine::Core ); void insertEffect (Objects::CEffect* effect); + void insertDependency (irr::u32 dependency); private: std::string m_type; @@ -56,5 +58,6 @@ namespace WallpaperEngine::Core irr::core::vector3df m_angles; std::vector m_effects; + std::vector m_dependencies; }; }; diff --git a/src/WallpaperEngine/Core/Objects/CEffect.cpp b/src/WallpaperEngine/Core/Objects/CEffect.cpp index 60ddbd8..7c8b76f 100644 --- a/src/WallpaperEngine/Core/Objects/CEffect.cpp +++ b/src/WallpaperEngine/Core/Objects/CEffect.cpp @@ -4,10 +4,10 @@ #include "WallpaperEngine/Core/Core.h" #include "WallpaperEngine/Core/Objects/CImage.h" -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstant.h" -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.h" -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.h" -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h" #include "WallpaperEngine/FileSystem/FileSystem.h" @@ -46,6 +46,7 @@ CEffect* CEffect::fromJSON (json data, Core::CObject* object) auto preview_it = content.find ("preview"); auto passes_it = content.find ("passes"); auto dependencies_it = content.find ("dependencies"); + auto fbos_it = content.find ("fbos"); if (name_it == content.end ()) { @@ -85,35 +86,18 @@ CEffect* CEffect::fromJSON (json data, Core::CObject* object) object ); - auto cur = (*passes_it).begin (); - auto end = (*passes_it).end (); + CEffect::materialsFromJSON (passes_it, effect); + CEffect::dependencyFromJSON (dependencies_it, effect); - for (; cur != end; cur ++) + if (fbos_it != content.end ()) { - auto materialfile = (*cur).find ("material"); - - if (materialfile == (*cur).end ()) - { - throw std::runtime_error ("Effect pass must have a material file"); - } - - effect->insertMaterial ( - Images::CMaterial::fromFile ((*materialfile).get ().c_str ()) - ); - } - - cur = (*dependencies_it).begin (); - end = (*dependencies_it).end (); - - for (; cur != end; cur ++) - { - effect->insertDependency (*cur); + CEffect::fbosFromJSON (fbos_it, effect); } if (effectpasses_it != data.end ()) { - cur = (*effectpasses_it).begin (); - end = (*effectpasses_it).end (); + auto cur = (*effectpasses_it).begin (); + auto end = (*effectpasses_it).end (); for (int passNumber = 0; cur != end; cur ++, passNumber ++) { @@ -149,19 +133,19 @@ CEffect* CEffect::fromJSON (json data, Core::CObject* object) CImage* image = object->as (); - texture = (*(*image->getMaterial ()->getPasses ().begin ())->getTextures ()->begin ()); + texture = (*(*image->getMaterial ()->getPasses ().begin ())->getTextures ().begin ()); } else { texture = *texturesCur; } - std::vector* passTextures = (*passCur)->getTextures (); + std::vector passTextures = (*passCur)->getTextures (); - if (textureNumber < passTextures->size ()) - passTextures->at (textureNumber) = texture; + if (textureNumber < passTextures.size ()) + (*passCur)->setTexture (textureNumber, texture); else - passTextures->push_back (texture); + (*passCur)->insertTexture (texture); textureNumber ++; } @@ -169,43 +153,12 @@ CEffect* CEffect::fromJSON (json data, Core::CObject* object) if (combos_it != (*cur).end ()) { - auto comboCur = (*combos_it).begin (); - auto comboEnd = (*combos_it).end (); - - for (; comboCur != comboEnd; comboCur ++) - { - (*passCur)->insertCombo (comboCur.key (), *comboCur); - } + CEffect::combosFromJSON (combos_it, *passCur); } if (constants_it != (*cur).end ()) { - auto constantCur = (*constants_it).begin (); - auto constantEnd = (*constants_it).end (); - - for (; constantCur != constantEnd; constantCur ++) - { - Effects::CShaderConstant* constant = nullptr; - - if ((*constantCur).is_number_float () == true) - { - constant = new Effects::CShaderConstantFloat ((*constantCur).get ()); - } - else if ((*constantCur).is_number_integer () == true) - { - constant = new Effects::CShaderConstantInteger ((*constantCur).get ()); - } - else if ((*constantCur).is_string () == true) - { - constant = new Effects::CShaderConstantVector3 (WallpaperEngine::Core::ato3vf (*constantCur)); - } - else - { - throw std::runtime_error ("unknown shader constant type"); - } - - (*passCur)->insertConstant (constantCur.key (), constant); - } + CEffect::constantsFromJSON (constants_it, *passCur); } } } @@ -214,6 +167,101 @@ CEffect* CEffect::fromJSON (json data, Core::CObject* object) return effect; } +void CEffect::combosFromJSON (json::const_iterator combos_it, Core::Objects::Images::Materials::CPassess* pass) +{ + auto cur = (*combos_it).begin (); + auto end = (*combos_it).end (); + + for (; cur != end; cur ++) + { + pass->insertCombo (cur.key (), *cur); + } +} + +void CEffect::constantsFromJSON (json::const_iterator constants_it, Core::Objects::Images::Materials::CPassess* pass) +{ + auto cur = (*constants_it).begin (); + auto end = (*constants_it).end (); + + for (; cur != end; cur ++) + { + Effects::Constants::CShaderConstant* constant = nullptr; + + if ((*cur).is_number_float () == true) + { + constant = new Effects::Constants::CShaderConstantFloat ((*cur).get ()); + } + else if ((*cur).is_number_integer () == true) + { + constant = new Effects::Constants::CShaderConstantInteger ((*cur).get ()); + } + else if ((*cur).is_string () == true) + { + constant = new Effects::Constants::CShaderConstantVector3 (WallpaperEngine::Core::ato3vf (*cur)); + } + else + { + throw std::runtime_error ("unknown shader constant type"); + } + + pass->insertConstant (cur.key (), constant); + } +} + +void CEffect::fbosFromJSON (json::const_iterator fbos_it, CEffect* effect) +{ + auto cur = (*fbos_it).begin (); + auto end = (*fbos_it).end (); + + for (; cur != end; cur ++) + { + effect->insertFBO ( + Effects::CFBO::fromJSON (*cur) + ); + } +} + +void CEffect::dependencyFromJSON (json::const_iterator dependencies_it, CEffect* effect) +{ + auto cur = (*dependencies_it).begin (); + auto end = (*dependencies_it).end (); + + for (; cur != end; cur ++) + { + effect->insertDependency (*cur); + } +} + +void CEffect::materialsFromJSON (json::const_iterator passes_it, CEffect* effect) +{ + auto cur = (*passes_it).begin (); + auto end = (*passes_it).end (); + + for (; cur != end; cur ++) + { + auto materialfile = (*cur).find ("material"); + auto target = (*cur).find ("target"); + + if (materialfile == (*cur).end ()) + { + throw std::runtime_error ("Effect pass must have a material file"); + } + + if (target == (*cur).end ()) + { + effect->insertMaterial ( + Images::CMaterial::fromFile ((*materialfile).get ().c_str ()) + ); + } + else + { + effect->insertMaterial ( + Images::CMaterial::fromFile ((*materialfile).get ().c_str (), *target) + ); + } + } +} + const std::vector& CEffect::getDependencies () const { return this->m_dependencies; @@ -224,6 +272,27 @@ const std::vector& CEffect::getMaterials () const return this->m_materials; } +const std::vector& CEffect::getFbos () const +{ + return this->m_fbos; +} + +Effects::CFBO* CEffect::findFBO (const std::string& name) +{ + auto cur = this->m_fbos.begin (); + auto end = this->m_fbos.end (); + + for (; cur != end; cur ++) + { + if ((*cur)->getName () == name) + { + return (*cur); + } + } + + throw std::runtime_error ("cannot find fbo named " + name); +} + void CEffect::insertDependency (const std::string& dep) { this->m_dependencies.push_back (dep); @@ -232,4 +301,9 @@ void CEffect::insertDependency (const std::string& dep) void CEffect::insertMaterial (Images::CMaterial* material) { this->m_materials.push_back (material); +} + +void CEffect::insertFBO (Effects::CFBO* fbo) +{ + this->m_fbos.push_back (fbo); } \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/CEffect.h b/src/WallpaperEngine/Core/Objects/CEffect.h index ac84553..a463068 100644 --- a/src/WallpaperEngine/Core/Objects/CEffect.h +++ b/src/WallpaperEngine/Core/Objects/CEffect.h @@ -3,7 +3,8 @@ #include #include -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstant.h" +#include "WallpaperEngine/Core/Objects/Effects/CFBO.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h" #include "WallpaperEngine/Core/CObject.h" #include "WallpaperEngine/Core/Objects/Images/CMaterial.h" @@ -31,9 +32,20 @@ namespace WallpaperEngine::Core::Objects const std::vector& getDependencies () const; const std::vector& getMaterials () const; + const std::vector& getFbos () const; + + Effects::CFBO* findFBO (const std::string& name); protected: + static void constantsFromJSON (json::const_iterator constants_it, Core::Objects::Images::Materials::CPassess* pass); + static void combosFromJSON (json::const_iterator combos_it, Core::Objects::Images::Materials::CPassess* pass); + static void fbosFromJSON (json::const_iterator fbos_it, CEffect* effect); + static void dependencyFromJSON (json::const_iterator dependencies_it, CEffect* effect); + static void materialsFromJSON (json::const_iterator passes_it, CEffect* effect); + void insertDependency (const std::string& dep); void insertMaterial (Images::CMaterial* material); + void insertFBO (Effects::CFBO* fbo); + private: std::string m_name; std::string m_description; @@ -43,5 +55,6 @@ namespace WallpaperEngine::Core::Objects std::vector m_dependencies; std::vector m_materials; + std::vector m_fbos; }; } diff --git a/src/WallpaperEngine/Core/Objects/Effects/CFBO.cpp b/src/WallpaperEngine/Core/Objects/Effects/CFBO.cpp new file mode 100644 index 0000000..c585068 --- /dev/null +++ b/src/WallpaperEngine/Core/Objects/Effects/CFBO.cpp @@ -0,0 +1,40 @@ +#include "CFBO.h" + +#include + +using namespace WallpaperEngine::Core::Objects::Effects; + +CFBO::CFBO (std::string name, irr::f32 scale, std::string format) : + m_name (std::move(name)), + m_scale (scale), + m_format(std::move(format)) +{ +} + +CFBO* CFBO::fromJSON (json data) +{ + auto name_it = data.find ("name"); + auto scale_it = data.find ("scale"); + auto format_it = data.find ("format"); + + return new CFBO ( + *name_it, + *scale_it, + *format_it + ); +} + +const std::string& CFBO::getName () const +{ + return this->m_name; +} + +const irr::f32& CFBO::getScale () const +{ + return this->m_scale; +} + +const std::string& CFBO::getFormat () const +{ + return this->m_format; +} \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/Effects/CFBO.h b/src/WallpaperEngine/Core/Objects/Effects/CFBO.h new file mode 100644 index 0000000..679672b --- /dev/null +++ b/src/WallpaperEngine/Core/Objects/Effects/CFBO.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +#include +#include + +namespace WallpaperEngine::Core::Objects::Effects +{ + using json = nlohmann::json; + + class CFBO + { + public: + CFBO (std::string name, irr::f32 scale, std::string format); + + static CFBO* fromJSON (json data); + + const std::string& getName () const; + const irr::f32& getScale () const; + const std::string& getFormat () const; + + private: + std::string m_name; + irr::f32 m_scale; + std::string m_format; + }; +} \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstant.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.cpp similarity index 63% rename from src/WallpaperEngine/Core/Objects/Effects/CShaderConstant.cpp rename to src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.cpp index 2ed3226..995fc68 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstant.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.cpp @@ -1,6 +1,6 @@ #include "CShaderConstant.h" -using namespace WallpaperEngine::Core::Objects::Effects; +using namespace WallpaperEngine::Core::Objects::Effects::Constants; CShaderConstant::CShaderConstant (std::string type) : m_type (std::move(type)) diff --git a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstant.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h similarity index 87% rename from src/WallpaperEngine/Core/Objects/Effects/CShaderConstant.h rename to src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h index e038536..9d2688a 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstant.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h @@ -2,7 +2,7 @@ #include -namespace WallpaperEngine::Core::Objects::Effects +namespace WallpaperEngine::Core::Objects::Effects::Constants { class CShaderConstant { diff --git a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.cpp similarity index 80% rename from src/WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.cpp rename to src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.cpp index cf70921..c55cd4e 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.cpp @@ -1,6 +1,6 @@ #include "CShaderConstantFloat.h" -using namespace WallpaperEngine::Core::Objects::Effects; +using namespace WallpaperEngine::Core::Objects::Effects::Constants; CShaderConstantFloat::CShaderConstantFloat (irr::f32 value) : diff --git a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h similarity index 84% rename from src/WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.h rename to src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h index 625785a..bdcead1 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h @@ -5,7 +5,7 @@ #include #include -namespace WallpaperEngine::Core::Objects::Effects +namespace WallpaperEngine::Core::Objects::Effects::Constants { class CShaderConstantFloat : public CShaderConstant { diff --git a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.cpp similarity index 81% rename from src/WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.cpp rename to src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.cpp index 568bdf6..e7b7a59 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.cpp @@ -1,6 +1,6 @@ #include "CShaderConstantInteger.h" -using namespace WallpaperEngine::Core::Objects::Effects; +using namespace WallpaperEngine::Core::Objects::Effects::Constants; CShaderConstantInteger::CShaderConstantInteger (irr::s32 value) : diff --git a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h similarity index 84% rename from src/WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.h rename to src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h index eb6d1d2..4016230 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h @@ -5,7 +5,7 @@ #include #include -namespace WallpaperEngine::Core::Objects::Effects +namespace WallpaperEngine::Core::Objects::Effects::Constants { class CShaderConstantInteger : public CShaderConstant { diff --git a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.cpp b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.cpp similarity index 82% rename from src/WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.cpp rename to src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.cpp index d1fd1cb..2573818 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.cpp +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.cpp @@ -1,6 +1,6 @@ #include "CShaderConstantVector3.h" -using namespace WallpaperEngine::Core::Objects::Effects; +using namespace WallpaperEngine::Core::Objects::Effects::Constants; CShaderConstantVector3::CShaderConstantVector3 (irr::core::vector3df value) : diff --git a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.h b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h similarity index 86% rename from src/WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.h rename to src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h index faf1bdc..7abe9a4 100644 --- a/src/WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.h +++ b/src/WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h @@ -5,7 +5,7 @@ #include #include -namespace WallpaperEngine::Core::Objects::Effects +namespace WallpaperEngine::Core::Objects::Effects::Constants { class CShaderConstantVector3 : public CShaderConstant { diff --git a/src/WallpaperEngine/Core/Objects/Images/CMaterial.cpp b/src/WallpaperEngine/Core/Objects/Images/CMaterial.cpp index 71ee169..4f3583c 100644 --- a/src/WallpaperEngine/Core/Objects/Images/CMaterial.cpp +++ b/src/WallpaperEngine/Core/Objects/Images/CMaterial.cpp @@ -7,16 +7,32 @@ using namespace WallpaperEngine::Core::Objects::Images; -CMaterial::CMaterial () +CMaterial::CMaterial () : + m_target ("") { } -CMaterial* CMaterial::fromFile (irr::io::path filename) +CMaterial* CMaterial::fromFile (const irr::io::path& filename) { return fromJSON ( json::parse (WallpaperEngine::FileSystem::loadFullFile (filename)) ); } +CMaterial* CMaterial::fromFile (const irr::io::path& filename, const std::string& target) +{ + return fromJSON ( + json::parse (WallpaperEngine::FileSystem::loadFullFile (filename)), target + ); +} + +CMaterial* CMaterial::fromJSON (json data, const std::string& target) +{ + CMaterial* material = fromJSON (data); + + material->setTarget (target); + + return material; +} CMaterial* CMaterial::fromJSON (json data) { @@ -35,7 +51,7 @@ CMaterial* CMaterial::fromJSON (json data) for (; cur != end; cur ++) { material->insertPass ( - Materials::CPassess::fromJSON (*cur) + Materials::CPassess::fromJSON (*cur) ); } @@ -47,7 +63,21 @@ void CMaterial::insertPass (Materials::CPassess* mass) this->m_passes.push_back (mass); } +void CMaterial::setTarget (const std::string& target) +{ + this->m_target = target; +} + const std::vector & CMaterial::getPasses () const { return this->m_passes; +} +const std::string& CMaterial::getTarget () const +{ + return this->m_target; +} + +const bool CMaterial::hasTarget () const +{ + return this->m_target.empty () == false; } \ No newline at end of file diff --git a/src/WallpaperEngine/Core/Objects/Images/CMaterial.h b/src/WallpaperEngine/Core/Objects/Images/CMaterial.h index fe6d1fc..107c341 100644 --- a/src/WallpaperEngine/Core/Objects/Images/CMaterial.h +++ b/src/WallpaperEngine/Core/Objects/Images/CMaterial.h @@ -12,15 +12,22 @@ namespace WallpaperEngine::Core::Objects::Images class CMaterial { public: - static CMaterial* fromFile (irr::io::path filename); + static CMaterial* fromFile (const irr::io::path& filename); static CMaterial* fromJSON (json data); + static CMaterial* fromFile (const irr::io::path& filename, const std::string& target); + static CMaterial* fromJSON (json data, const std::string& target); void insertPass (Materials::CPassess* mass); const std::vector & getPasses () const; + const std::string& getTarget () const; + const bool hasTarget () const; protected: CMaterial (); + + void setTarget (const std::string& target); private: std::vector m_passes; + std::string m_target; }; }; diff --git a/src/WallpaperEngine/Core/Objects/Images/Materials/CPassess.cpp b/src/WallpaperEngine/Core/Objects/Images/Materials/CPassess.cpp index 2ed0daa..5873126 100644 --- a/src/WallpaperEngine/Core/Objects/Images/Materials/CPassess.cpp +++ b/src/WallpaperEngine/Core/Objects/Images/Materials/CPassess.cpp @@ -1,6 +1,6 @@ #include "CPassess.h" -using namespace WallpaperEngine::Core::Objects::Effects; +using namespace WallpaperEngine::Core::Objects::Effects::Constants; using namespace WallpaperEngine::Core::Objects::Images::Materials; CPassess::CPassess (std::string blending, std::string cullmode, std::string depthtest, std::string depthwrite, std::string shader) : @@ -110,14 +110,19 @@ void CPassess::insertTexture (const std::string& texture) this->m_textures.push_back (texture); } +void CPassess::setTexture (int index, const std::string& texture) +{ + this->m_textures.at (index) = texture; +} + void CPassess::insertCombo (const std::string& name, int value) { this->m_combos.insert (std::pair (name, value)); } -std::vector* CPassess::getTextures () +const std::vector& CPassess::getTextures () const { - return &this->m_textures; + return this->m_textures; } const std::map& CPassess::getConstants () const diff --git a/src/WallpaperEngine/Core/Objects/Images/Materials/CPassess.h b/src/WallpaperEngine/Core/Objects/Images/Materials/CPassess.h index a6d9eb4..6e3e042 100644 --- a/src/WallpaperEngine/Core/Objects/Images/Materials/CPassess.h +++ b/src/WallpaperEngine/Core/Objects/Images/Materials/CPassess.h @@ -2,7 +2,12 @@ #include -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstant.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h" + +namespace WallpaperEngine::Core::Objects +{ + class CEffect; +}; namespace WallpaperEngine::Core::Objects::Images::Materials { @@ -10,11 +15,12 @@ namespace WallpaperEngine::Core::Objects::Images::Materials class CPassess { + friend class Core::Objects::CEffect; public: static CPassess* fromJSON (json data); - std::vector* getTextures (); - const std::map& getConstants () const; + const std::vector& getTextures () const; + const std::map& getConstants () const; const std::map& getCombos () const; const std::string& getShader () const; @@ -24,12 +30,13 @@ namespace WallpaperEngine::Core::Objects::Images::Materials const std::string& getDepthWrite () const; void insertCombo (const std::string& name, int value); - void insertConstant (const std::string& name, Effects::CShaderConstant* constant); + void insertConstant (const std::string& name, Effects::Constants::CShaderConstant* constant); protected: CPassess (std::string blending, std::string cullmode, std::string depthtest, std::string depthwrite, std::string shader); void insertTexture (const std::string& texture); + void setTexture (int index, const std::string& texture); private: std::string m_blending; @@ -39,6 +46,6 @@ namespace WallpaperEngine::Core::Objects::Images::Materials std::string m_shader; std::vector m_textures; std::map m_combos; - std::map m_constants; + std::map m_constants; }; } diff --git a/src/WallpaperEngine/Render/Objects/CImage.cpp b/src/WallpaperEngine/Render/Objects/CImage.cpp index 3076af9..922ee99 100644 --- a/src/WallpaperEngine/Render/Objects/CImage.cpp +++ b/src/WallpaperEngine/Render/Objects/CImage.cpp @@ -10,14 +10,14 @@ #include "WallpaperEngine/Render/Shaders/Variables/CShaderVariableFloatPointer.h" #include "WallpaperEngine/Render/Shaders/Variables/CShaderVariableVector2Pointer.h" -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstant.h" -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstantFloat.h" -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstantInteger.h" -#include "WallpaperEngine/Core/Objects/Effects/CShaderConstantVector3.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstant.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantFloat.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantInteger.h" +#include "WallpaperEngine/Core/Objects/Effects/Constants/CShaderConstantVector3.h" using namespace WallpaperEngine; -using namespace WallpaperEngine::Core::Objects::Effects; +using namespace WallpaperEngine::Core::Objects::Effects::Constants; using namespace WallpaperEngine::Render::Objects; using namespace WallpaperEngine::Render::Shaders::Variables; @@ -128,11 +128,11 @@ void CImage::generateMaterial () void CImage::generatePass (Core::Objects::Images::Materials::CPassess* pass, Core::Objects::CEffect* effect) { - std::vector* textures = pass->getTextures (); + std::vector textures = pass->getTextures (); irr::video::SMaterial material; - auto texturesCur = textures->begin (); - auto texturesEnd = textures->end (); + auto texturesCur = textures.begin (); + auto texturesEnd = textures.end (); for (int textureNumber = 0; texturesCur != texturesEnd; texturesCur ++, textureNumber ++) {