diff --git a/engine/includes/components/meshrender.h b/engine/includes/components/meshrender.h index 7e2e8e598..4c92944a1 100644 --- a/engine/includes/components/meshrender.h +++ b/engine/includes/components/meshrender.h @@ -22,9 +22,6 @@ class ENGINE_EXPORT MeshRender : public Renderable { Mesh *mesh() const; void setMesh(Mesh *mesh); - Material *material() const; - void setMaterial(Material *material); - private: AABBox localBound() const override; @@ -35,11 +32,11 @@ class ENGINE_EXPORT MeshRender : public Renderable { void composeComponent() override; + void setProperty(const char *name, const Variant &value) override; + private: Mesh *m_mesh; - MaterialInstance *m_material; - }; #endif // MESHRENDER_H diff --git a/engine/includes/components/particlerender.h b/engine/includes/components/particlerender.h index 70a2d6719..449a71b79 100644 --- a/engine/includes/components/particlerender.h +++ b/engine/includes/components/particlerender.h @@ -46,8 +46,6 @@ class ENGINE_EXPORT ParticleRender : public Renderable { vector m_buffers; vector m_particles; - vector m_materials; - vector m_ejectionTime; vector m_count; diff --git a/engine/includes/components/renderable.h b/engine/includes/components/renderable.h index bc2eb7fce..a5c85107f 100644 --- a/engine/includes/components/renderable.h +++ b/engine/includes/components/renderable.h @@ -7,6 +7,9 @@ class CommandBuffer; +class Material; +class MaterialInstance; + class ENGINE_EXPORT Renderable : public NativeBehaviour { A_REGISTER(Renderable, NativeBehaviour, General) @@ -25,12 +28,23 @@ class ENGINE_EXPORT Renderable : public NativeBehaviour { virtual int priority() const; + Material *material() const; + virtual void setMaterial(Material *material); + protected: virtual AABBox localBound() const; + void loadUserData(const VariantMap &data) override; + VariantMap saveUserData() const override; + private: void setSystem(ObjectSystem *system) override; +protected: + vector m_materials; + + uint32_t m_surfaceType; + private: mutable AABBox m_localBox; mutable AABBox m_worldBox; diff --git a/engine/includes/components/skinnedmeshrender.h b/engine/includes/components/skinnedmeshrender.h index 8767a1ea2..7b452a9a2 100644 --- a/engine/includes/components/skinnedmeshrender.h +++ b/engine/includes/components/skinnedmeshrender.h @@ -14,9 +14,9 @@ class ENGINE_EXPORT SkinnedMeshRender : public Renderable { A_PROPERTIES( A_PROPERTY(Vector3, boundsCenter, SkinnedMeshRender::boundsCenter, SkinnedMeshRender::setBoundsCenter), A_PROPERTY(Vector3, boundsExtent, SkinnedMeshRender::boundsExtent, SkinnedMeshRender::setBoundsExtent), - A_PROPERTYEX(Armature *, armature, SkinnedMeshRender::armature, SkinnedMeshRender::setArmature, "editor=Component"), A_PROPERTYEX(MeshGroup *, mesh, SkinnedMeshRender::mesh, SkinnedMeshRender::setMesh, "editor=Asset"), - A_PROPERTYEX(Material *, material, SkinnedMeshRender::material, SkinnedMeshRender::setMaterial, "editor=Asset") + A_PROPERTYEX(Material *, material, SkinnedMeshRender::material, SkinnedMeshRender::setMaterial, "editor=Asset"), + A_PROPERTYEX(Armature *, armature, SkinnedMeshRender::armature, SkinnedMeshRender::setArmature, "editor=Component") ) A_NOMETHODS() @@ -32,9 +32,6 @@ class ENGINE_EXPORT SkinnedMeshRender : public Renderable { Mesh *mesh() const; void setMesh(Mesh *mesh); - Material *material() const; - void setMaterial(Material *material); - Armature *armature() const; void setArmature(Armature *armature); @@ -46,6 +43,8 @@ class ENGINE_EXPORT SkinnedMeshRender : public Renderable { void loadUserData(const VariantMap &data) override; VariantMap saveUserData() const override; + void setMaterial(Material *material) override; + void onReferenceDestroyed() override; void drawGizmosSelected() override; @@ -55,8 +54,6 @@ class ENGINE_EXPORT SkinnedMeshRender : public Renderable { Mesh *m_mesh; - MaterialInstance *m_material; - Armature *m_armature; }; diff --git a/engine/includes/components/spriterender.h b/engine/includes/components/spriterender.h index fb3bb0841..ff490e6f2 100644 --- a/engine/includes/components/spriterender.h +++ b/engine/includes/components/spriterender.h @@ -14,8 +14,8 @@ class ENGINE_EXPORT SpriteRender : public Renderable { A_REGISTER(SpriteRender, Renderable, Components/2D) A_PROPERTIES( - A_PROPERTYEX(Sprite *, sprite, SpriteRender::sprite, SpriteRender::setSprite, "editor=Asset"), A_PROPERTYEX(Material *, material, SpriteRender::material, SpriteRender::setMaterial, "editor=Asset"), + A_PROPERTYEX(Sprite *, sprite, SpriteRender::sprite, SpriteRender::setSprite, "editor=Asset"), A_PROPERTYEX(Vector4, color, SpriteRender::color, SpriteRender::setColor, "editor=Color"), A_PROPERTY(string, item, SpriteRender::item, SpriteRender::setItem), A_PROPERTY(Vector2, size, SpriteRender::size, SpriteRender::setSize), @@ -41,9 +41,6 @@ class ENGINE_EXPORT SpriteRender : public Renderable { SpriteRender(); ~SpriteRender(); - Material *material() const; - void setMaterial(Material *material); - Sprite *sprite() const; void setSprite(Sprite *sprite); @@ -65,6 +62,8 @@ class ENGINE_EXPORT SpriteRender : public Renderable { int layer() const; void setLayer(int layer); + void setMaterial(Material *material) override; + static bool composeMesh(Sprite *sprite, int key, Mesh *spriteMesh, Vector2 &size, int mode, bool resetSize, float scale = 1.0f); private: @@ -97,8 +96,6 @@ class ENGINE_EXPORT SpriteRender : public Renderable { Texture *m_texture; - MaterialInstance *m_material; - Mesh *m_mesh; Mesh *m_customMesh; diff --git a/engine/includes/components/textrender.h b/engine/includes/components/textrender.h index d6795365d..5450cd55d 100644 --- a/engine/includes/components/textrender.h +++ b/engine/includes/components/textrender.h @@ -45,7 +45,6 @@ class ENGINE_EXPORT TextRender : public Renderable { Font *font() const; void setFont(Font *font); - Material *material() const; void setMaterial(Material *material); int fontSize() const; @@ -96,8 +95,6 @@ class ENGINE_EXPORT TextRender : public Renderable { Font *m_font; - MaterialInstance *m_material; - Mesh *m_mesh; int32_t m_size; diff --git a/engine/includes/components/tilemaprender.h b/engine/includes/components/tilemaprender.h index f05f6afdc..2e1b4cfb0 100644 --- a/engine/includes/components/tilemaprender.h +++ b/engine/includes/components/tilemaprender.h @@ -24,8 +24,7 @@ class ENGINE_EXPORT TileMapRender : public Renderable { TileMap *tileMap() const; void setTileMap(TileMap *map); - Material *material() const; - void setMaterial(Material *material); + void setMaterial(Material *material) override; int layer() const; void setLayer(int layer); @@ -45,8 +44,6 @@ class ENGINE_EXPORT TileMapRender : public Renderable { private: TileMap *m_tileMap; - MaterialInstance *m_material; - int m_layer; }; diff --git a/engine/includes/resources/material.h b/engine/includes/resources/material.h index 529d3c2b5..aa4cf7961 100644 --- a/engine/includes/resources/material.h +++ b/engine/includes/resources/material.h @@ -124,7 +124,7 @@ class ENGINE_EXPORT Material : public Resource { struct UniformItem { string name; - Variant value; + Variant defaultValue; size_t size; @@ -188,17 +188,23 @@ class ENGINE_EXPORT MaterialInstance { void setMatrix4(const char *name, const Matrix4 *value, int32_t count = 1); - void setValue(const char *name, const void *value); - virtual void setTexture(const char *name, Texture *value); + uint32_t paramCount() const; + string paramName(uint32_t index) const; + Variant paramValue(uint32_t index) const; + uint16_t surfaceType() const; void setSurfaceType(uint16_t type); +protected: + void setBufferValue(const char *name, const void *value); + protected: friend class Material; map m_textureOverride; + map m_paramOverride; Material *m_material; diff --git a/engine/src/components/baselight.cpp b/engine/src/components/baselight.cpp index c00067501..d9cc33d8d 100644 --- a/engine/src/components/baselight.cpp +++ b/engine/src/components/baselight.cpp @@ -9,8 +9,8 @@ #include "mesh.h" namespace { -const char *uniParams = "uni.params"; -const char *uniColor = "uni.color"; +const char *uniParams = "params"; +const char *uniColor = "color"; }; /*! diff --git a/engine/src/components/gui/frame.cpp b/engine/src/components/gui/frame.cpp index 147e1299b..f717011fa 100644 --- a/engine/src/components/gui/frame.cpp +++ b/engine/src/components/gui/frame.cpp @@ -3,9 +3,9 @@ #include "resources/material.h" namespace { - const char *gBorderColor = "uni.borderColor"; - const char *gBorderWidth = "uni.borderWidth"; - const char *gCornerRadius = "uni.cornerRadius"; + const char *gBorderColor = "borderColor"; + const char *gBorderWidth = "borderWidth"; + const char *gCornerRadius = "cornerRadius"; }; Frame::Frame() : diff --git a/engine/src/components/gui/image.cpp b/engine/src/components/gui/image.cpp index 06f134f86..e280e21a8 100644 --- a/engine/src/components/gui/image.cpp +++ b/engine/src/components/gui/image.cpp @@ -15,7 +15,7 @@ namespace { const char *gBasemap = "BaseMap"; const char *gOverride = "texture0"; - const char *gColor = "uni.color0"; + const char *gColor = "color0"; const char *gDefaultSprite = ".embedded/DefaultSprite.mtl"; }; diff --git a/engine/src/components/gui/label.cpp b/engine/src/components/gui/label.cpp index e68c4fb78..b290320f9 100644 --- a/engine/src/components/gui/label.cpp +++ b/engine/src/components/gui/label.cpp @@ -17,8 +17,7 @@ namespace { const char *gFont = "Font"; const char *gOverride = "texture0"; - - const char *gClipRect = "uni.clipRect"; + const char *gClipRect = "clipRect"; }; /*! diff --git a/engine/src/components/meshrender.cpp b/engine/src/components/meshrender.cpp index e1cd09e2b..24c0d18a5 100644 --- a/engine/src/components/meshrender.cpp +++ b/engine/src/components/meshrender.cpp @@ -6,11 +6,9 @@ #include "pipelinecontext.h" #include "mesh.h" -#include "material.h" namespace { const char *gMesh = "Mesh"; -const char *gMaterial = "Material"; } /*! @@ -22,8 +20,7 @@ const char *gMaterial = "Material"; */ MeshRender::MeshRender() : - m_mesh(nullptr), - m_material(nullptr) { + m_mesh(nullptr) { } /*! @@ -31,12 +28,12 @@ MeshRender::MeshRender() : */ void MeshRender::draw(CommandBuffer &buffer, uint32_t layer) { Actor *a = actor(); - if(m_mesh && m_material && layer & a->layers() && a->transform()) { + if(m_mesh && !m_materials.empty() && layer & a->layers() && a->transform()) { buffer.setObjectId(a->uuid()); - buffer.setMaterialId(m_material->material()->uuid()); + buffer.setMaterialId(m_materials[0]->material()->uuid()); buffer.setColor(Vector4(1.0f)); - buffer.drawMesh(a->transform()->worldTransform(), m_mesh, 0, layer, m_material); + buffer.drawMesh(a->transform()->worldTransform(), m_mesh, 0, layer, m_materials[0]); } } /*! @@ -59,66 +56,32 @@ Mesh *MeshRender::mesh() const { */ void MeshRender::setMesh(Mesh *mesh) { m_mesh = mesh; - if(m_mesh && m_material == nullptr) { + if(m_mesh && m_materials.empty()) { setMaterial(m_mesh->material()); } } -/*! - Returns an instantiated Material assigned to MeshRender. -*/ -Material *MeshRender::material() const { - if(m_material) { - return m_material->material(); - } - return nullptr; -} -/*! - Creates a new instance of \a material and assigns it. -*/ -void MeshRender::setMaterial(Material *material) { - if(m_material) { - delete m_material; - m_material = nullptr; - } - if(material) { - m_material = material->createInstance(); - } -} /*! \internal */ void MeshRender::loadUserData(const VariantMap &data) { - Component::loadUserData(data); - { - auto it = data.find(gMesh); - if(it != data.end()) { - setMesh(Engine::loadResource((*it).second.toString())); - } - } - if(m_mesh) { - auto it = data.find(gMaterial); - if(it != data.end()) { - setMaterial(Engine::loadResource((*it).second.toString())); - } + Renderable::loadUserData(data); + + auto it = data.find(gMesh); + if(it != data.end()) { + setMesh(Engine::loadResource((*it).second.toString())); } } /*! \internal */ VariantMap MeshRender::saveUserData() const { - VariantMap result = Component::saveUserData(); - { - string ref = Engine::reference(mesh()); - if(!ref.empty()) { - result[gMesh] = ref; - } - } - { - string ref = Engine::reference(material()); - if(!ref.empty()) { - result[gMaterial] = ref; - } + VariantMap result(Renderable::saveUserData()); + + string ref = Engine::reference(mesh()); + if(!ref.empty()) { + result[gMesh] = ref; } + return result; } /*! @@ -128,3 +91,9 @@ void MeshRender::composeComponent() { setMesh(PipelineContext::defaultCube()); setMaterial(Engine::loadResource(".embedded/DefaultMesh.mtl")); } +/*! + \internal +*/ +void MeshRender::setProperty(const char *name, const Variant &value) { + Renderable::setProperty(name, value); +} diff --git a/engine/src/components/particlerender.cpp b/engine/src/components/particlerender.cpp index 62099c7c3..c934dc60e 100644 --- a/engine/src/components/particlerender.cpp +++ b/engine/src/components/particlerender.cpp @@ -32,10 +32,6 @@ ParticleRender::~ParticleRender() { if(m_effect) { m_effect->unsubscribe(this); } - - for(auto it : m_materials) { - delete it; - } } /*! \internal diff --git a/engine/src/components/renderable.cpp b/engine/src/components/renderable.cpp index 019f2f9a2..24f184c97 100644 --- a/engine/src/components/renderable.cpp +++ b/engine/src/components/renderable.cpp @@ -4,6 +4,12 @@ #include "systems/rendersystem.h" +#include "material.h" + +namespace { + const char *gMaterial = "Material"; +} + /*! \class Renderable \brief Base class for every object which can be drawn on the screen. @@ -13,12 +19,17 @@ */ Renderable::Renderable() : - m_transformHash(0) { + m_transformHash(0), + m_surfaceType(Material::Static) { } Renderable::~Renderable() { static_cast(system())->removeRenderable(this); + + for(auto it : m_materials) { + delete it; + } } /*! Returns a bound box of the renderable object. @@ -48,6 +59,33 @@ void Renderable::draw(CommandBuffer &buffer, uint32_t layer) { int Renderable::priority() const { return 0; } +/*! + Returns a first instantiated Material assigned to this Renderable. +*/ +Material *Renderable::material() const { + if(!m_materials.empty()) { + return m_materials.front()->material(); + } + return nullptr; +} +/*! + Creates a new instance of \a material and assigns it. +*/ +void Renderable::setMaterial(Material *material) { + if(!m_materials.empty()) { + delete m_materials[0]; + m_materials[0] = nullptr; + } + + if(material) { + MaterialInstance *instance = material->createInstance(static_cast(m_surfaceType)); + if(m_materials.empty()) { + m_materials.push_back(instance); + } else { + m_materials[0] = instance; + } + } +} /*! \internal */ @@ -57,6 +95,36 @@ AABBox Renderable::localBound() const { /*! \internal */ +void Renderable::loadUserData(const VariantMap &data) { + auto it = data.find(gMaterial); + if(it != data.end()) { + list materials; + + for(auto &mat : (*it).second.toList()) { + materials.push_back(Engine::loadResource(mat.toString())); + } + + setMaterial(materials.front()); + } +} +/*! + \internal +*/ +VariantMap Renderable::saveUserData() const { + VariantMap result(Component::saveUserData()); + + VariantList materials; + for(auto it : m_materials) { + materials.push_back(Engine::reference(it->material())); + } + + result[gMaterial] = materials; + + return result; +} +/*! + \internal +*/ void Renderable::setSystem(ObjectSystem *system) { Object::setSystem(system); diff --git a/engine/src/components/skinnedmeshrender.cpp b/engine/src/components/skinnedmeshrender.cpp index d58105f6e..76e86f7ea 100644 --- a/engine/src/components/skinnedmeshrender.cpp +++ b/engine/src/components/skinnedmeshrender.cpp @@ -14,7 +14,6 @@ namespace { const char *gMesh = "Mesh"; -const char *gMaterial = "Material"; const char *gArmature= "Armature"; const char *gMatrices = "skinMatrices"; } @@ -29,22 +28,22 @@ const char *gMatrices = "skinMatrices"; SkinnedMeshRender::SkinnedMeshRender() : m_mesh(nullptr), - m_material(nullptr), m_armature(nullptr) { m_bounds.radius = 0.0f; + m_surfaceType = Material::Skinned; } /*! \internal */ void SkinnedMeshRender::draw(CommandBuffer &buffer, uint32_t layer) { Actor *a = actor(); - if(m_mesh && m_material && layer & a->layers()) { + if(m_mesh && !m_materials.empty() && layer & a->layers()) { buffer.setObjectId(a->uuid()); - buffer.setMaterialId(m_material->material()->uuid()); + buffer.setMaterialId(m_materials[0]->material()->uuid()); buffer.setColor(Vector4(1.0f)); - buffer.drawMesh(a->transform()->worldTransform(), m_mesh, 0, layer, m_material); + buffer.drawMesh(a->transform()->worldTransform(), m_mesh, 0, layer, m_materials[0]); } } /*! @@ -86,28 +85,14 @@ void SkinnedMeshRender::setMesh(Mesh *mesh) { } } } -/*! - Returns an instantiated Material assigned to SkinnedMeshRender. -*/ -Material *SkinnedMeshRender::material() const { - if(m_material) { - return m_material->material(); - } - return nullptr; -} /*! Creates a new instance of \a material and assigns it. */ void SkinnedMeshRender::setMaterial(Material *material) { - if(material) { - if(m_material) { - delete m_material; - } - m_material = material->createInstance(Material::Skinned); - if(m_armature) { - Texture *t = m_armature->texture(); - m_material->setTexture(gMatrices, t); - } + Renderable::setMaterial(material); + + if(!m_materials.empty() && m_armature) { + m_materials[0]->setTexture(gMatrices, m_armature->texture()); } } /*! @@ -123,8 +108,8 @@ void SkinnedMeshRender::setArmature(Armature *armature) { m_armature = armature; if(m_armature) { connect(m_armature, _SIGNAL(destroyed()), this, _SLOT(onReferenceDestroyed())); - if(m_material) { - m_material->setTexture(gMatrices, m_armature->texture()); + if(!m_materials.empty()) { + m_materials[0]->setTexture(gMatrices, m_armature->texture()); } } } @@ -132,50 +117,35 @@ void SkinnedMeshRender::setArmature(Armature *armature) { \internal */ void SkinnedMeshRender::loadUserData(const VariantMap &data) { - Component::loadUserData(data); - { - auto it = data.find(gMesh); - if(it != data.end()) { - setMesh(Engine::loadResource((*it).second.toString())); - } - } - if(m_mesh) { - auto it = data.find(gMaterial); - if(it != data.end()) { - setMaterial(Engine::loadResource((*it).second.toString())); - } + Renderable::loadUserData(data); + + auto it = data.find(gMesh); + if(it != data.end()) { + setMesh(Engine::loadResource((*it).second.toString())); } - { - auto it = data.find(gArmature); - if(it != data.end()) { - uint32_t uuid = uint32_t((*it).second.toInt()); - Object *object = Engine::findObject(uuid, Engine::findRoot(this)); - setArmature(dynamic_cast(object)); - } + + it = data.find(gArmature); + if(it != data.end()) { + uint32_t uuid = uint32_t((*it).second.toInt()); + Object *object = Engine::findObject(uuid, Engine::findRoot(this)); + setArmature(dynamic_cast(object)); } } /*! \internal */ VariantMap SkinnedMeshRender::saveUserData() const { - VariantMap result = Component::saveUserData(); - { - string ref = Engine::reference(mesh()); - if(!ref.empty()) { - result[gMesh] = ref; - } - } - { - string ref = Engine::reference(material()); - if(!ref.empty()) { - result[gMaterial] = ref; - } + VariantMap result(Renderable::saveUserData()); + + string ref = Engine::reference(mesh()); + if(!ref.empty()) { + result[gMesh] = ref; } - { - if(m_armature) { - result[gArmature] = int(m_armature->uuid()); - } + + if(m_armature) { + result[gArmature] = int(m_armature->uuid()); } + return result; } diff --git a/engine/src/components/spotlight.cpp b/engine/src/components/spotlight.cpp index 815a48ce9..bef8a1103 100644 --- a/engine/src/components/spotlight.cpp +++ b/engine/src/components/spotlight.cpp @@ -8,8 +8,8 @@ #include "gizmos.h" namespace { -const char *uni_position = "uni.position"; -const char *uni_direction = "uni.direction"; +const char *uni_position = "position"; +const char *uni_direction = "direction"; }; /*! diff --git a/engine/src/components/spriterender.cpp b/engine/src/components/spriterender.cpp index dd327a84e..56805a46e 100644 --- a/engine/src/components/spriterender.cpp +++ b/engine/src/components/spriterender.cpp @@ -11,12 +11,11 @@ #include -#define MATERIAL "Material" -#define BASEMAP "BaseMap" - -#define OVERRIDE "texture0" - -#define DEFAULTSPRITE ".embedded/DefaultSprite.mtl" +namespace { +const char *gBaseMap = "BaseMap"; +const char *gOverride = "texture0"; +const char *gDefaultSprite = ".embedded/DefaultSprite.mtl"; +} static hash hash_str; @@ -40,7 +39,6 @@ SpriteRender::SpriteRender() : m_size(1.0f), m_sprite(nullptr), m_texture(nullptr), - m_material(nullptr), m_mesh(PipelineContext::defaultPlane()), m_customMesh(nullptr), m_hash(0), @@ -55,22 +53,20 @@ SpriteRender::~SpriteRender() { } Engine::unloadResource(m_customMesh); - - delete m_material; } /*! \internal */ void SpriteRender::draw(CommandBuffer &buffer, uint32_t layer) { Actor *a = actor(); - if(m_mesh && m_material && layer & a->layers()) { + if(m_mesh && !m_materials.empty() && layer & a->layers()) { buffer.setObjectId(a->uuid()); buffer.setColor(m_color); - buffer.setMaterialId(m_material->material()->uuid()); + buffer.setMaterialId(material()->uuid()); buffer.drawMesh(a->transform()->worldTransform(), (m_customMesh) ? m_customMesh : m_mesh, - 0, layer, m_material); + 0, layer, m_materials.front()); } } /*! @@ -84,31 +80,6 @@ AABBox SpriteRender::localBound() const { } return Renderable::localBound(); } -/*! - Returns an instantiated Material assigned to SpriteRender. -*/ -Material *SpriteRender::material() const { - if(m_material) { - return m_material->material(); - } - return nullptr; -} -/*! - Creates a new instance of \a material and assigns it. -*/ -void SpriteRender::setMaterial(Material *material) { - if(!m_material || m_material->material() != material) { - if(m_material) { - delete m_material; - m_material = nullptr; - } - - if(material) { - m_material = material->createInstance(); - m_material->setTexture(OVERRIDE, texture()); - } - } -} /*! Returns a sprite. */ @@ -123,11 +94,12 @@ void SpriteRender::setSprite(Sprite *sprite) { m_sprite->unsubscribe(this); } m_sprite = sprite; + if(m_sprite) { m_sprite->subscribe(&SpriteRender::spriteUpdated, this); composeMesh(); - if(m_material) { - m_material->setTexture(OVERRIDE, m_sprite->texture()); + if(!m_materials.empty()) { + m_materials[0]->setTexture(gOverride, m_sprite->texture()); } } } @@ -148,10 +120,11 @@ void SpriteRender::setTexture(Texture *texture) { m_sprite->unsubscribe(this); m_sprite = nullptr; } + m_texture = texture; - if(m_material) { + if(!m_materials.empty()) { composeMesh(); - m_material->setTexture(OVERRIDE, m_texture); + m_materials[0]->setTexture(gOverride, m_texture); } } /*! @@ -224,44 +197,40 @@ void SpriteRender::setLayer(int layer) { \internal */ void SpriteRender::loadUserData(const VariantMap &data) { - Component::loadUserData(data); - { - auto it = data.find(MATERIAL); - if(it != data.end()) { - setMaterial(Engine::loadResource((*it).second.toString())); - } - } - { - auto it = data.find(BASEMAP); - if(it != data.end()) { - setSprite(Engine::loadResource((*it).second.toString())); - } + Renderable::loadUserData(data); + + auto it = data.find(gBaseMap); + if(it != data.end()) { + setSprite(Engine::loadResource((*it).second.toString())); } } /*! \internal */ VariantMap SpriteRender::saveUserData() const { - VariantMap result = Component::saveUserData(); - { - Material *m = material(); - string ref = Engine::reference(m); - if(!ref.empty()) { - result[MATERIAL] = ref; - } - } - { - Sprite *t = sprite(); - string ref = Engine::reference(t); - if(!ref.empty()) { - result[BASEMAP] = ref; - } + VariantMap result(Renderable::saveUserData()); + + Sprite *t = sprite(); + string ref = Engine::reference(t); + if(!ref.empty()) { + result[gBaseMap] = ref; } + return result; } /*! \internal */ +void SpriteRender::setMaterial(Material *material) { + Renderable::setMaterial(material); + + if(!m_materials.empty()) { + m_materials[0]->setTexture(gOverride, texture()); + } +} +/*! + \internal +*/ bool SpriteRender::composeMesh(Sprite *sprite, int key, Mesh *spriteMesh, Vector2 &size, int mode, bool resetSize, float scale) { if(mode == Sliced || mode == Tiled) { if(!sprite) { @@ -456,7 +425,7 @@ bool SpriteRender::composeTiled(Mesh *mesh, Vector2 &size, Vector3 &delta, float \internal */ void SpriteRender::composeComponent() { - setMaterial(Engine::loadResource(DEFAULTSPRITE)); + setMaterial(Engine::loadResource(gDefaultSprite)); } /*! \internal @@ -489,11 +458,15 @@ void SpriteRender::spriteUpdated(int state, void *ptr) { SpriteRender *p = static_cast(ptr); if(state == ResourceState::Ready) { - p->m_material->setTexture(OVERRIDE, p->m_sprite->texture()); + if(!p->m_materials.empty()) { + p->m_materials[0]->setTexture(gOverride, p->m_sprite->texture()); + } p->composeMesh(); } else if(state == ResourceState::ToBeDeleted) { p->m_sprite = nullptr; - p->m_material->setTexture(OVERRIDE, nullptr); + if(!p->m_materials.empty()) { + p->m_materials[0]->setTexture(gOverride, nullptr); + } p->composeMesh(); } } diff --git a/engine/src/components/textrender.cpp b/engine/src/components/textrender.cpp index 1961e1cfa..dd8abed85 100644 --- a/engine/src/components/textrender.cpp +++ b/engine/src/components/textrender.cpp @@ -12,10 +12,10 @@ #include -#define FONT "Font" -#define MATERIAL "Material" - -#define OVERRIDE "texture0" +namespace { + const char *gFont = "Font"; + const char *gOverride = "texture0"; +}; /*! \class TextRender @@ -28,7 +28,6 @@ TextRender::TextRender() : m_color(1.0f), m_font(nullptr), - m_material(nullptr), m_mesh(Engine::objectCreate()), m_size(16), m_alignment(Left), @@ -39,7 +38,7 @@ TextRender::TextRender() : Material *material = Engine::loadResource(".embedded/DefaultFont.shader"); if(material) { - m_material = material->createInstance(); + m_materials.push_back(material->createInstance()); } } @@ -53,12 +52,12 @@ TextRender::~TextRender() { */ void TextRender::draw(CommandBuffer &buffer, uint32_t layer) { Actor *a = actor(); - if(m_mesh && m_material && layer & a->layers() && !m_text.empty()) { + if(m_mesh && !m_materials.empty() && layer & a->layers() && !m_text.empty()) { buffer.setObjectId(a->uuid()); - buffer.setMaterialId(m_material->material()->uuid()); + buffer.setMaterialId(material()->uuid()); buffer.setColor(m_color); - buffer.drawMesh(a->transform()->worldTransform(), m_mesh, 0, layer, m_material); + buffer.drawMesh(a->transform()->worldTransform(), m_mesh, 0, layer, m_materials.front()); } } /*! @@ -91,37 +90,20 @@ void TextRender::setFont(Font *font) { m_font = font; if(m_font) { m_font->subscribe(&TextRender::fontUpdated, this); - if(m_material) { - m_material->setTexture(OVERRIDE, m_font->texture()); + if(!m_materials.empty()) { + m_materials.front()->setTexture(gOverride, m_font->texture()); } } composeMesh(m_font, m_mesh, m_size, m_text, m_alignment, m_kerning, m_wrap, m_boundaries); } -/*! - Returns an instantiated Material assigned to TextRender. -*/ -Material *TextRender::material() const { - if(m_material) { - return m_material->material(); - } - return nullptr; -} /*! Creates a new instance of \a material and assigns it. */ void TextRender::setMaterial(Material *material) { - if(!m_material || m_material->material() != material) { - if(m_material) { - delete m_material; - m_material = nullptr; - } + Renderable::setMaterial(material); - if(material) { - m_material = material->createInstance(); - if(m_font) { - m_material->setTexture(OVERRIDE, m_font->texture()); - } - } + if(m_font && !m_materials.empty()) { + m_materials.front()->setTexture(gOverride, m_font->texture()); } } /*! @@ -206,44 +188,31 @@ void TextRender::setKerning(const bool kerning) { \internal */ void TextRender::loadData(const VariantList &data) { - Component::loadData(data); + Renderable::loadData(data); composeMesh(m_font, m_mesh, m_size, m_text, m_alignment, m_kerning, m_wrap, m_boundaries); } /*! \internal */ void TextRender::loadUserData(const VariantMap &data) { - Component::loadUserData(data); + Renderable::loadUserData(data); - auto it = data.find(FONT); + auto it = data.find(gFont); if(it != data.end()) { setFont(Engine::loadResource((*it).second.toString())); } - - it = data.find(MATERIAL); - if(it != data.end()) { - setMaterial(Engine::loadResource((*it).second.toString())); - } } /*! \internal */ VariantMap TextRender::saveUserData() const { - VariantMap result = Component::saveUserData(); - { - Font *o = font(); - string ref = Engine::reference(o); - if(!ref.empty()) { - result[FONT] = ref; - } - } - { - Material *o = material(); - string ref = Engine::reference(o); - if(!ref.empty()) { - result[MATERIAL] = ref; - } + VariantMap result(Renderable::saveUserData()); + + string ref = Engine::reference(font()); + if(!ref.empty()) { + result[gFont] = ref; } + return result; } /*! diff --git a/engine/src/components/tilemaprender.cpp b/engine/src/components/tilemaprender.cpp index 3e4e6fe30..3ff2812fa 100644 --- a/engine/src/components/tilemaprender.cpp +++ b/engine/src/components/tilemaprender.cpp @@ -15,6 +15,7 @@ namespace { const char *gTileMap = "TileMap"; const char *gMaterial = "Material"; +const char *gOverride = "texture0"; } /*! @@ -28,7 +29,6 @@ const char *gMaterial = "Material"; TileMapRender::TileMapRender() : m_tileMap(nullptr), - m_material(nullptr), m_layer(0) { } @@ -37,12 +37,12 @@ TileMapRender::TileMapRender() : */ void TileMapRender::draw(CommandBuffer &buffer, uint32_t layer) { Actor *a = actor(); - if(m_tileMap && m_material && layer & a->layers() && a->transform()) { + if(m_tileMap && !m_materials.empty() && layer & a->layers() && a->transform()) { buffer.setObjectId(a->uuid()); - buffer.setMaterialId(m_material->material()->uuid()); + buffer.setMaterialId(material()->uuid()); buffer.setColor(Vector4(1.0f)); - buffer.drawMesh(a->transform()->worldTransform(), m_tileMap->tileMesh(), 0, layer, m_material); + buffer.drawMesh(a->transform()->worldTransform(), m_tileMap->tileMesh(), 0, layer, m_materials.front()); } } /*! @@ -70,43 +70,28 @@ void TileMapRender::setTileMap(TileMap *map) { TileSet *tileSet = m_tileMap->tileSet(); if(tileSet) { Texture *texture = tileSet->spriteSheet() ? tileSet->spriteSheet()->texture() : nullptr; - if(m_material && texture) { - m_material->setTexture("texture0", texture); + if(texture && !m_materials.empty()) { + m_materials.front()->setTexture(gOverride, texture); } } } } -/*! - Returns an instantiated Material assigned to TileMapRender. - If no material is assigned, it returns nullptr. -*/ -Material *TileMapRender::material() const { - if(m_material) { - return m_material->material(); - } - return nullptr; -} /*! Creates a new instance of \a material and assigns it. */ void TileMapRender::setMaterial(Material *material) { - if(m_material) { - delete m_material; - m_material = nullptr; - } - if(material) { - m_material = material->createInstance(); + Renderable::setMaterial(material); - if(m_tileMap) { - TileSet *tileSet = m_tileMap->tileSet(); - if(tileSet) { - Texture *texture = tileSet->spriteSheet() ? tileSet->spriteSheet()->texture() : nullptr; - if(m_material && texture) { - m_material->setTexture("texture0", texture); - } + if(m_tileMap) { + TileSet *tileSet = m_tileMap->tileSet(); + if(tileSet) { + Texture *texture = tileSet->spriteSheet() ? tileSet->spriteSheet()->texture() : nullptr; + if(texture && !m_materials.empty()) { + m_materials.front()->setTexture(gOverride, texture); } } } + } /*! Returns the order layer for the tile map. diff --git a/engine/src/editor/viewport/viewport.cpp b/engine/src/editor/viewport/viewport.cpp index d317a585a..2b8c1d470 100644 --- a/engine/src/editor/viewport/viewport.cpp +++ b/engine/src/editor/viewport/viewport.cpp @@ -79,8 +79,8 @@ class Outline : public PipelineTask { m_width = SettingsManager::instance()->property(qPrintable(outlineWidth)).toFloat(); if(m_material) { - m_material->setFloat("uni.width", &m_width); - m_material->setVector4("uni.color", &m_color); + m_material->setFloat("width", &m_width); + m_material->setVector4("color", &m_color); } } @@ -273,9 +273,9 @@ class GridRender : public PipelineTask { rot = Quaternion(Vector3(1, 0, 0), 90.0f); } - m_grid->setBool("uni.ortho", &ortho); - m_grid->setFloat("uni.scale", &m_scale); - m_grid->setFloat("uni.width", &width); + m_grid->setBool("ortho", &ortho); + m_grid->setFloat("scale", &m_scale); + m_grid->setFloat("width", &width); CommandBuffer *buffer = context->buffer(); diff --git a/engine/src/filters/blur.cpp b/engine/src/filters/blur.cpp index 5267fec8a..55ebf90b5 100644 --- a/engine/src/filters/blur.cpp +++ b/engine/src/filters/blur.cpp @@ -34,7 +34,7 @@ void Blur::draw(CommandBuffer &buffer, Texture *source, RenderTarget *target) { m_direction.x = 1.0f; m_direction.y = 0.0f; - m_blurMaterial->setVector2("uni.direction", &m_direction); + m_blurMaterial->setVector2("direction", &m_direction); m_blurMaterial->setTexture(OVERRIDE, source); @@ -44,7 +44,7 @@ void Blur::draw(CommandBuffer &buffer, Texture *source, RenderTarget *target) { m_direction.x = 0.0f; m_direction.y = 1.0f; - m_blurMaterial->setVector2("uni.direction", &m_direction); + m_blurMaterial->setVector2("direction", &m_direction); m_blurMaterial->setTexture(OVERRIDE, m_tempTexture); @@ -55,9 +55,9 @@ void Blur::draw(CommandBuffer &buffer, Texture *source, RenderTarget *target) { void Blur::setParameters(const Vector2 &size, int32_t steps, const float *points) { if(m_blurMaterial) { - m_blurMaterial->setInteger("uni.steps", &steps); - m_blurMaterial->setFloat("uni.curve", points); - m_blurMaterial->setVector2("uni.size", &size); + m_blurMaterial->setInteger("steps", &steps); + m_blurMaterial->setFloat("curve", points); + m_blurMaterial->setVector2("size", &size); } } diff --git a/engine/src/pipelinetasks/ambientocclusion.cpp b/engine/src/pipelinetasks/ambientocclusion.cpp index 8af771e19..eb6fe93eb 100644 --- a/engine/src/pipelinetasks/ambientocclusion.cpp +++ b/engine/src/pipelinetasks/ambientocclusion.cpp @@ -96,7 +96,7 @@ AmbientOcclusion::AmbientOcclusion() : scale = MIX(0.1f, 1.0f, scale * scale); samplesKernel[i] *= scale; } - m_occlusion->setVector3("uni.samplesKernel", samplesKernel, KERNEL_SIZE); + m_occlusion->setVector3("samplesKernel", samplesKernel, KERNEL_SIZE); m_occlusion->setTexture("noiseMap", m_noiseTexture); } } @@ -153,9 +153,9 @@ void AmbientOcclusion::setSettings(const PostProcessSettings &settings) { m_power = settings.readValue(ambientPower).toFloat(); if(m_occlusion) { - m_occlusion->setFloat("uni.radius", &m_radius); - m_occlusion->setFloat("uni.bias", &m_bias); - m_occlusion->setFloat("uni.power", &m_power); + m_occlusion->setFloat("radius", &m_radius); + m_occlusion->setFloat("bias", &m_bias); + m_occlusion->setFloat("power", &m_power); } } diff --git a/engine/src/pipelinetasks/bloom.cpp b/engine/src/pipelinetasks/bloom.cpp index e7c88b855..6084de9d1 100644 --- a/engine/src/pipelinetasks/bloom.cpp +++ b/engine/src/pipelinetasks/bloom.cpp @@ -31,7 +31,7 @@ Bloom::Bloom() : Material *material = Engine::loadResource(".embedded/Downsample.shader"); if(material) { m_material = material->createInstance(); - m_material->setFloat("uni.threshold", &m_threshold); + m_material->setFloat("threshold", &m_threshold); } for(uint8_t i = 0; i < BLOOM_PASSES; i++) { @@ -107,7 +107,7 @@ void Bloom::resize(int32_t width, int32_t height) { void Bloom::setSettings(const PostProcessSettings &settings) { m_threshold = settings.readValue(bloomThreshold).toFloat(); - m_material->setFloat("uni.threshold", &m_threshold); + m_material->setFloat("threshold", &m_threshold); } void Bloom::setInput(int index, Texture *source) { diff --git a/engine/src/pipelinetasks/deferredlighting.cpp b/engine/src/pipelinetasks/deferredlighting.cpp index 7500033a2..e26b88bec 100644 --- a/engine/src/pipelinetasks/deferredlighting.cpp +++ b/engine/src/pipelinetasks/deferredlighting.cpp @@ -14,10 +14,10 @@ #include "commandbuffer.h" namespace { - const char *uniPosition = "uni.position"; - const char *uniDirection = "uni.direction"; - const char *uniRight = "uni.right"; - const char *uniUp = "uni.up"; + const char *uniPosition = "position"; + const char *uniDirection = "direction"; + const char *uniRight = "right"; + const char *uniUp = "up"; } DeferredLighting::DeferredLighting() : diff --git a/engine/src/pipelinetasks/reflections.cpp b/engine/src/pipelinetasks/reflections.cpp index 7debd31d5..aa2277d70 100644 --- a/engine/src/pipelinetasks/reflections.cpp +++ b/engine/src/pipelinetasks/reflections.cpp @@ -65,15 +65,44 @@ void Reflections::exec(PipelineContext *context) { if(m_combineMaterial) { // combine step buffer->setRenderTarget(m_combineTarget); - buffer->clearRenderTarget(); + //buffer->clearRenderTarget(); buffer->drawMesh(Matrix4(), PipelineContext::defaultPlane(), 0, CommandBuffer::UI, m_combineMaterial); } } void Reflections::setInput(int index, Texture *texture) { - m_combineTarget->setColorAttachment(0, texture); - - if(index == 2) { - m_outputs.front().second = texture; + switch(index) { + case 0: { // normalsMap + if(m_slrMaterial) { + m_slrMaterial->setTexture("normalsMap", texture); + } + if(m_combineMaterial) { + m_combineMaterial->setTexture("normalsMap", texture); + } + } break; + case 1: { // paramsMap + if(m_slrMaterial) { + m_slrMaterial->setTexture("paramsMap", texture); + } + if(m_combineMaterial) { + m_combineMaterial->setTexture("paramsMap", texture); + } + } break; + case 2: { // emissiveMap + if(m_slrMaterial) { + m_slrMaterial->setTexture("emissiveMap", texture); + } + //m_combineTarget->setColorAttachment(0, texture); + m_outputs.front().second = texture; + } break; + case 3: { // depthMap + if(m_slrMaterial) { + m_slrMaterial->setTexture("depthMap", texture); + } + if(m_combineMaterial) { + m_combineMaterial->setTexture("depthMap", texture); + } + } break; + default: break; } } diff --git a/engine/src/pipelinetasks/shadowmap.cpp b/engine/src/pipelinetasks/shadowmap.cpp index 5738f425d..97d6f7d12 100644 --- a/engine/src/pipelinetasks/shadowmap.cpp +++ b/engine/src/pipelinetasks/shadowmap.cpp @@ -32,12 +32,12 @@ namespace { const char *shadowmap("graphics.shadowmap"); - const char *uniLod = "uni.lod"; - const char *uniMatrix = "uni.matrix"; - const char *uniTiles = "uni.tiles"; - const char *uniBias = "uni.bias"; - const char *uniPlaneDistance = "uni.planeDistance"; - const char *uniShadows = "uni.shadows"; + const char *uniLod = "lod"; + const char *uniMatrix = "matrix"; + const char *uniTiles = "tiles"; + const char *uniBias = "bias"; + const char *uniPlaneDistance = "planeDistance"; + const char *uniShadows = "shadows"; }; ShadowMap::ShadowMap() : diff --git a/engine/src/resources/material.cpp b/engine/src/resources/material.cpp index bf702eec4..c87ab0c47 100644 --- a/engine/src/resources/material.cpp +++ b/engine/src/resources/material.cpp @@ -36,41 +36,104 @@ Texture *MaterialInstance::texture(const char *name) { } void MaterialInstance::setBool(const char *name, const bool *value, int32_t count) { - A_UNUSED(count); - setValue(name, value); + if(count > 1) { + VariantList list; + for(int32_t i = 0; i < count; i++) { + list.push_back(value[i]); + } + m_paramOverride[name] = list; + } else { + m_paramOverride[name] = *value; + } + + setBufferValue(name, value); } void MaterialInstance::setInteger(const char *name, const int32_t *value, int32_t count) { - A_UNUSED(count); - setValue(name, value); + if(count > 1) { + VariantList list; + for(int32_t i = 0; i < count; i++) { + list.push_back(value[i]); + } + m_paramOverride[name] = list; + } else { + m_paramOverride[name] = *value; + } + + setBufferValue(name, value); } void MaterialInstance::setFloat(const char *name, const float *value, int32_t count) { - A_UNUSED(count); - setValue(name, value); + if(count > 1) { + VariantList list; + for(int32_t i = 0; i < count; i++) { + list.push_back(value[i]); + } + m_paramOverride[name] = list; + } else { + m_paramOverride[name] = *value; + } + + setBufferValue(name, value); } void MaterialInstance::setVector2(const char *name, const Vector2 *value, int32_t count) { - A_UNUSED(count); - setValue(name, value); + if(count > 1) { + VariantList list; + for(int32_t i = 0; i < count; i++) { + list.push_back(value[i]); + } + m_paramOverride[name] = list; + } else { + m_paramOverride[name] = *value; + } + + setBufferValue(name, value); } void MaterialInstance::setVector3(const char *name, const Vector3 *value, int32_t count) { - A_UNUSED(count); - setValue(name, value); + if(count > 1) { + VariantList list; + for(int32_t i = 0; i < count; i++) { + list.push_back(value[i]); + } + m_paramOverride[name] = list; + } else { + m_paramOverride[name] = *value; + } + + setBufferValue(name, value); } void MaterialInstance::setVector4(const char *name, const Vector4 *value, int32_t count) { - A_UNUSED(count); - setValue(name, value); + if(count > 1) { + VariantList list; + for(int32_t i = 0; i < count; i++) { + list.push_back(value[i]); + } + m_paramOverride[name] = list; + } else { + m_paramOverride[name] = *value; + } + + setBufferValue(name, value); } void MaterialInstance::setMatrix4(const char *name, const Matrix4 *value, int32_t count) { - A_UNUSED(count); - setValue(name, value); + if(count > 1) { + VariantList list; + for(int32_t i = 0; i < count; i++) { + list.push_back(value[i]); + } + m_paramOverride[name] = list; + } else { + m_paramOverride[name] = *value; + } + + setBufferValue(name, value); } -void MaterialInstance::setValue(const char *name, const void *value) { +void MaterialInstance::setBufferValue(const char *name, const void *value) { for(auto &it : m_material->m_uniforms) { if(it.name == name) { if(m_uniformBuffer) { @@ -83,12 +146,31 @@ void MaterialInstance::setValue(const char *name, const void *value) { } void MaterialInstance::setTexture(const char *name, Texture *value) { - A_UNUSED(name); - A_UNUSED(value); - m_textureOverride[name] = value; } +uint32_t MaterialInstance::paramCount() const { + return m_material->m_uniforms.size(); +} + +string MaterialInstance::paramName(uint32_t index) const { + if(index < m_material->m_uniforms.size()) { + return m_material->m_uniforms[index].name; + } + return string(); +} + +Variant MaterialInstance::paramValue(uint32_t index) const { + if(index < m_material->m_uniforms.size()) { + auto it = m_paramOverride.find(m_material->m_uniforms[index].name); + if(it != m_paramOverride.end()) { + return it->second; + } + return m_material->m_uniforms[index].defaultValue; + } + return Variant(); +} + uint16_t MaterialInstance::surfaceType() const { return m_surfaceType; } @@ -289,7 +371,7 @@ void Material::loadUserData(const VariantMap &data) { VariantList list = u.toList(); auto f = list.begin(); - m_uniforms[i].value = (*f); + m_uniforms[i].defaultValue = (*f); ++f; m_uniforms[i].size = (*f).toInt(); ++f; @@ -352,29 +434,29 @@ bool Material::isUnloadable() { void Material::initInstance(MaterialInstance *instance) { if(instance) { for(auto &it : m_uniforms) { - switch(it.value.type()) { + switch(it.defaultValue.type()) { case MetaType::INTEGER: { - int32_t value = it.value.toInt(); + int32_t value = it.defaultValue.toInt(); instance->setInteger(it.name.c_str(), &value); } break; case MetaType::FLOAT: { - float value = it.value.toFloat(); + float value = it.defaultValue.toFloat(); instance->setFloat(it.name.c_str(), &value); } break; case MetaType::VECTOR2: { - Vector2 value = it.value.toVector2(); + Vector2 value = it.defaultValue.toVector2(); instance->setVector2(it.name.c_str(), &value); } break; case MetaType::VECTOR3: { - Vector3 value = it.value.toVector3(); + Vector3 value = it.defaultValue.toVector3(); instance->setVector3(it.name.c_str(), &value); } break; case MetaType::VECTOR4: { - Vector4 value = it.value.toVector4(); + Vector4 value = it.defaultValue.toVector4(); instance->setVector4(it.name.c_str(), &value); } break; case MetaType::MATRIX4: { - Matrix4 value = it.value.toMatrix4(); + Matrix4 value = it.defaultValue.toMatrix4(); instance->setMatrix4(it.name.c_str(), &value); } break; default: break; diff --git a/modules/editor/grapheditor/editor/graph/graphwidgets/linksrender.cpp b/modules/editor/grapheditor/editor/graph/graphwidgets/linksrender.cpp index 6af54c49c..ceaf2c2f9 100644 --- a/modules/editor/grapheditor/editor/graph/graphwidgets/linksrender.cpp +++ b/modules/editor/grapheditor/editor/graph/graphwidgets/linksrender.cpp @@ -14,7 +14,7 @@ #include namespace { - const char *gColor = "uni.color0"; + const char *gColor = "color0"; }; LinksRender::LinksRender() : diff --git a/modules/editor/shadertools/converter/shaderbuilder.cpp b/modules/editor/shadertools/converter/shaderbuilder.cpp index bfdb69b64..af9dd62f3 100644 --- a/modules/editor/shadertools/converter/shaderbuilder.cpp +++ b/modules/editor/shadertools/converter/shaderbuilder.cpp @@ -22,7 +22,7 @@ #include -#define FORMAT_VERSION 8 +#define FORMAT_VERSION 9 namespace { const char *gValue("value"); @@ -378,7 +378,7 @@ bool ShaderBuilder::parseProperties(const QDomElement &element, VariantMap &user data.push_back(value); data.push_back(size * count); - data.push_back("uni." + name.toStdString()); + data.push_back(name.toStdString()); uniforms.push_back(data); } diff --git a/modules/editor/shadertools/converter/shadernodegraph.cpp b/modules/editor/shadertools/converter/shadernodegraph.cpp index ae9fc2072..700152449 100644 --- a/modules/editor/shadertools/converter/shadernodegraph.cpp +++ b/modules/editor/shadertools/converter/shadernodegraph.cpp @@ -508,7 +508,7 @@ VariantMap ShaderNodeGraph::data(bool editor, ShaderRootNode *root) const { data.push_back(value); data.push_back(uint32_t(size * it.count)); - data.push_back("uni." + it.name.toStdString()); + data.push_back(it.name.toStdString()); uniforms.push_back(data); } diff --git a/thirdparty/next/src/core/metatype.cpp b/thirdparty/next/src/core/metatype.cpp index 385f69cfc..98358369c 100644 --- a/thirdparty/next/src/core/metatype.cpp +++ b/thirdparty/next/src/core/metatype.cpp @@ -57,7 +57,7 @@ typedef map > ConverterMap; bool toBoolean(void *to, const void *from, const uint32_t fromType) { PROFILE_FUNCTION(); bool result = true; - bool *r = static_cast(to); + bool *r = static_cast(to); switch(fromType) { case MetaType::INTEGER: { *r = *(static_cast(from)) != 0; } break; case MetaType::FLOAT: { *r = *(static_cast(from)) != 0; } break; @@ -76,13 +76,13 @@ bool toInteger(void *to, const void *from, const uint32_t fromType) { int *r = static_cast(to); switch(fromType) { case MetaType::BOOLEAN: { *r = (*(static_cast(from))) ? 1 : 0; } break; - case MetaType::FLOAT: { double f = *(static_cast(from)); *r = int(f); f -= *r; *r += (f >= 0.5f) ? 1 : 0; } break; + case MetaType::FLOAT: { float f = *(static_cast(from)); *r = int(f); f -= *r; *r += (f >= 0.5f) ? 1 : 0; } break; case MetaType::STRING: { - string s = *(static_cast(from)); + string s = *(static_cast(from)); char *end; - *r = strtol(s.c_str(), &end, 10); + *r = strtol(s.c_str(), &end, 10); } break; - default: { result = false; } break; + default: { result = false; } break; } return result; } @@ -122,6 +122,22 @@ bool toList(void *to, const void *from, const uint32_t fromType) { bool result = true; VariantList *r = static_cast(to); switch(fromType) { + case MetaType::BOOLEAN: { + bool v = *(static_cast(from)); + r->push_back(v); + } break; + case MetaType::INTEGER: { + int v = *(static_cast(from)); + r->push_back(v); + } break; + case MetaType::FLOAT: { + float v = *(static_cast(from)); + r->push_back(v); + } break; + case MetaType::STRING: { + string s = *(static_cast(from)); + r->push_back(s); + } break; case MetaType::VECTOR2: { const Vector2 v = *(reinterpret_cast(from)); for(int i = 0; i < 2; i++) { @@ -314,7 +330,11 @@ static ConverterMap s_Converters = { {MetaType::INTEGER, &toString}, {MetaType::FLOAT, &toString}}}, - {MetaType::VARIANTLIST,{{MetaType::VECTOR2, &toList}, + {MetaType::VARIANTLIST,{{MetaType::BOOLEAN, &toList}, + {MetaType::INTEGER, &toList}, + {MetaType::FLOAT, &toList}, + {MetaType::STRING, &toList}, + {MetaType::VECTOR2, &toList}, {MetaType::VECTOR3, &toList}, {MetaType::VECTOR4, &toList}, {MetaType::QUATERNION, &toList}, diff --git a/worldeditor/src/screens/propertyedit/nextobject.cpp b/worldeditor/src/screens/propertyedit/nextobject.cpp index d7c8c7526..197ce6404 100644 --- a/worldeditor/src/screens/propertyedit/nextobject.cpp +++ b/worldeditor/src/screens/propertyedit/nextobject.cpp @@ -214,6 +214,14 @@ void NextObject::buildObject(Object *object, const QString &path) { setProperty(qPrintable(p), QVariant(true)); } } + + for(auto &it : object->dynamicPropertyNames()) { + Variant value(object->property(it.c_str())); + MetaProperty property({}); + + setProperty(qPrintable(p + it.c_str()), qVariant(value, property, object)); + } + blockSignals(false); for(Object *it : object->getChildren()) { @@ -243,8 +251,15 @@ bool NextObject::event(QEvent *e) { const MetaObject *meta = o->metaObject(); int index = meta->indexOfProperty(qPrintable(propertyName)); - MetaProperty property(meta->property(index)); - Variant target(aVariant(value, current, property)); + + Variant target; + if(index > -1) { + MetaProperty property(meta->property(index)); + target = aVariant(value, current, property); + } else { + MetaProperty property({}); + target = aVariant(value, current, property); + } if(target.isValid() && current != target) { onObjectsChanged({o}, propertyName, target); @@ -531,16 +546,8 @@ void PropertyObject::redo() { Object *object = m_next->findById(m_object); if(object) { - const MetaObject *meta = object->metaObject(); - int index = meta->indexOfProperty(qPrintable(m_property)); - if(index > -1) { - MetaProperty property = meta->property(index); - if(property.isValid()) { - m_value = property.read(object); - - property.write(object, value); - } - } + m_value = object->property(qPrintable(m_property)); + object->setProperty(qPrintable(m_property), value); } m_next->onUpdated();