diff --git a/engine/includes/components/renderable.h b/engine/includes/components/renderable.h index abde9161c..0769ef682 100644 --- a/engine/includes/components/renderable.h +++ b/engine/includes/components/renderable.h @@ -30,7 +30,7 @@ class ENGINE_EXPORT Renderable : public NativeBehaviour { virtual void setMaterial(Material *material); int32_t materialsCount() const; - MaterialInstance *materialInstance(int index) const; + virtual MaterialInstance *materialInstance(int index); protected: virtual Mesh *meshToDraw(int instance); diff --git a/engine/includes/components/spriterender.h b/engine/includes/components/spriterender.h index 328b93715..641412d75 100644 --- a/engine/includes/components/spriterender.h +++ b/engine/includes/components/spriterender.h @@ -63,6 +63,8 @@ class ENGINE_EXPORT SpriteRender : public Renderable { void setMaterial(Material *material) override; + MaterialInstance *materialInstance(int index) override; + private: Mesh *meshToDraw(int instance) override; @@ -94,7 +96,8 @@ class ENGINE_EXPORT SpriteRender : public Renderable { bool m_useCustom; - bool m_dirty; + bool m_dirtyMesh; + bool m_dirtyMaterial; }; diff --git a/engine/includes/components/textrender.h b/engine/includes/components/textrender.h index bb6797581..4a61d30f5 100644 --- a/engine/includes/components/textrender.h +++ b/engine/includes/components/textrender.h @@ -21,7 +21,8 @@ class ENGINE_EXPORT TextRender : public Renderable { A_PROPERTYEX(Vector4, color, TextRender::color, TextRender::setColor, "editor=Color"), A_PROPERTY(bool, wordWrap, TextRender::wordWrap, TextRender::setWordWrap), A_PROPERTY(Vector2, size, TextRender::size, TextRender::setSize), - A_PROPERTY(bool, kerning, TextRender::kerning, TextRender::setKerning) + A_PROPERTY(bool, kerning, TextRender::kerning, TextRender::setKerning), + A_PROPERTY(int, layer, TextRender::layer, TextRender::setLayer) ) A_NOMETHODS() @@ -55,7 +56,12 @@ class ENGINE_EXPORT TextRender : public Renderable { bool kerning() const; void setKerning(const bool kerning); + int layer() const; + void setLayer(int layer); + private: + MaterialInstance *materialInstance(int index) override; + Mesh *meshToDraw(int instance) override; AABBox localBound() const override; @@ -85,13 +91,17 @@ class ENGINE_EXPORT TextRender : public Renderable { int m_alignment; + int m_priority; + float m_fontWeight; bool m_kerning; bool m_wrap; - bool m_dirty; + bool m_dirtyMesh; + + bool m_dirtyMaterial; }; diff --git a/engine/includes/resources/material.h b/engine/includes/resources/material.h index 8773ba85c..091564e01 100644 --- a/engine/includes/resources/material.h +++ b/engine/includes/resources/material.h @@ -302,6 +302,8 @@ class ENGINE_EXPORT MaterialInstance { void setTransform(Transform *transform); void setTransform(const Matrix4 &transform); + int32_t finalPriority() const; + int32_t priority() const; void setPriority(int32_t priority); diff --git a/engine/src/components/renderable.cpp b/engine/src/components/renderable.cpp index d8189afba..e38fdc98b 100644 --- a/engine/src/components/renderable.cpp +++ b/engine/src/components/renderable.cpp @@ -36,11 +36,13 @@ Renderable::~Renderable() { AABBox Renderable::bound() const { AABBox bb = localBound(); Transform *t = transform(); - uint32_t hash = t->hash(); - if(hash != m_transformHash || m_localBox != bb) { - m_localBox = bb; - m_worldBox = m_localBox * t->worldTransform(); - m_transformHash = hash; + if(t) { + uint32_t hash = t->hash(); + if(hash != m_transformHash || m_localBox != bb) { + m_localBox = bb; + m_worldBox = m_localBox * t->worldTransform(); + m_transformHash = hash; + } } return m_worldBox; } @@ -89,7 +91,7 @@ int32_t Renderable::materialsCount() const { /*! Returns a Material instance with \a index assigned to this Renderable. */ -MaterialInstance *Renderable::materialInstance(int index) const { +MaterialInstance *Renderable::materialInstance(int index) { if(m_materials.size() > index) { return m_materials[index]; } diff --git a/engine/src/components/spriterender.cpp b/engine/src/components/spriterender.cpp index 138c638d7..f5c6239bc 100644 --- a/engine/src/components/spriterender.cpp +++ b/engine/src/components/spriterender.cpp @@ -1,6 +1,4 @@ #include "components/spriterender.h" -#include "components/actor.h" -#include "components/transform.h" #include "resources/material.h" #include "resources/mesh.h" @@ -40,9 +38,9 @@ SpriteRender::SpriteRender() : m_mesh(PipelineContext::defaultPlane()), m_customMesh(Engine::objectCreate()), m_drawMode(Simple), - m_priority(0), m_useCustom(false), - m_dirty(true) { + m_dirtyMesh(true), + m_dirtyMaterial(true) { } @@ -58,7 +56,7 @@ SpriteRender::~SpriteRender() { \internal */ Mesh *SpriteRender::meshToDraw(int instance) { - if(m_dirty) { + if(m_dirtyMesh) { m_useCustom = false; if(m_sheet) { int hash = Mathf::hashString(m_item); @@ -80,7 +78,7 @@ Mesh *SpriteRender::meshToDraw(int instance) { m_mesh = PipelineContext::defaultPlane(); } - m_dirty = false; + m_dirtyMesh = false; } return (m_useCustom) ? m_customMesh : m_mesh; @@ -88,6 +86,24 @@ Mesh *SpriteRender::meshToDraw(int instance) { /*! \internal */ +MaterialInstance *SpriteRender::materialInstance(int index) { + if(m_dirtyMaterial && !m_materials.empty()) { + MaterialInstance *inst = m_materials.front(); + if(inst) { + inst->setTexture(gTexture, texture()); + inst->setVector4(gColor, &m_color); + inst->setTransform(transform()); + inst->setPriority(m_priority); + + m_dirtyMaterial = false; + } + } + + return Renderable::materialInstance(index); +} +/*! + \internal +*/ AABBox SpriteRender::localBound() const { if(m_useCustom) { return m_customMesh->bound(); @@ -119,10 +135,7 @@ void SpriteRender::setSprite(Sprite *sheet) { if(m_sheet) { m_sheet->subscribe(&SpriteRender::spriteUpdated, this); - m_dirty = true; - if(!m_materials.empty() && m_sheet->state() == Resource::Ready) { - m_materials[0]->setTexture(gTexture, m_sheet->page()); - } + m_dirtyMesh = m_dirtyMaterial = true; } } } @@ -130,7 +143,7 @@ void SpriteRender::setSprite(Sprite *sheet) { Returns current assigned texture. */ Texture *SpriteRender::texture() const { - if(m_sheet) { + if(m_sheet && m_sheet->state() == Resource::Ready) { return m_sheet->page(); } @@ -151,10 +164,7 @@ void SpriteRender::setTexture(Texture *texture) { m_texture->incRef(); } - m_dirty = true; - if(!m_materials.empty()) { - m_materials[0]->setTexture(gTexture, m_texture); - } + m_dirtyMesh = m_dirtyMaterial = true; } } /*! @@ -169,9 +179,7 @@ Vector4 SpriteRender::color() const { void SpriteRender::setColor(const Vector4 &color) { m_color = color; - for(auto it : m_materials) { - it->setVector4(gColor, &m_color); - } + m_dirtyMaterial = true; } /*! Returns the current item name of sprite from the sprite sheet. @@ -185,7 +193,7 @@ TString SpriteRender::item() const { void SpriteRender::setItem(const TString &item) { if(m_item != item) { m_item = item; - m_dirty = true; + m_dirtyMesh = true; } } /*! @@ -214,7 +222,7 @@ int SpriteRender::drawMode() const { void SpriteRender::setDrawMode(int mode) { if(m_drawMode != mode) { m_drawMode = mode; - m_dirty = true; + m_dirtyMesh = true; } } /*! @@ -229,9 +237,7 @@ int SpriteRender::layer() const { void SpriteRender::setLayer(int layer) { m_priority = layer; - for(auto it : m_materials) { - it->setPriority(m_priority); - } + m_dirtyMaterial = true; } /*! \internal @@ -239,11 +245,7 @@ void SpriteRender::setLayer(int layer) { void SpriteRender::setMaterial(Material *material) { Renderable::setMaterial(material); - for(auto it : m_materials) { - it->setTexture(gTexture, texture()); - it->setVector4(gColor, &m_color); - it->setTransform(transform()); - } + m_dirtyMaterial = true; } /*! \internal @@ -251,11 +253,7 @@ void SpriteRender::setMaterial(Material *material) { void SpriteRender::setMaterialsList(const std::list &materials) { Renderable::setMaterialsList(materials); - for(auto it : m_materials) { - it->setTexture(gTexture, texture()); - it->setVector4(gColor, &m_color); - it->setTransform(transform()); - } + m_dirtyMaterial = true; } /*! \internal @@ -271,17 +269,11 @@ void SpriteRender::spriteUpdated(int state, void *ptr) { switch(state) { case Resource::Ready: { - if(!p->m_materials.empty()) { - p->m_materials[0]->setTexture(gTexture, p->m_sheet->page()); - } - p->m_dirty = true; + p->m_dirtyMesh = p->m_dirtyMaterial = true; } break; case Resource::ToBeDeleted: { p->m_sheet = nullptr; - if(!p->m_materials.empty()) { - p->m_materials[0]->setTexture(gTexture, nullptr); - } - p->m_dirty = true; + p->m_dirtyMesh = p->m_dirtyMaterial = true; } break; default: break; } diff --git a/engine/src/components/textrender.cpp b/engine/src/components/textrender.cpp index 466c505a8..bc612b2d5 100644 --- a/engine/src/components/textrender.cpp +++ b/engine/src/components/textrender.cpp @@ -1,6 +1,4 @@ #include "components/textrender.h" -#include "components/actor.h" -#include "components/transform.h" #include "resources/mesh.h" #include "resources/font.h" @@ -9,8 +7,6 @@ #include "commandbuffer.h" #include "gizmos.h" -#include - namespace { const char *gColor("mainColor"); const char *gTexture("mainTexture"); @@ -31,10 +27,12 @@ TextRender::TextRender() : m_mesh(Engine::objectCreate()), m_size(16), m_alignment(Left), + m_priority(0), m_fontWeight(0.5f), m_kerning(true), m_wrap(false), - m_dirty(true) { + m_dirtyMesh(true), + m_dirtyMaterial(true) { m_mesh->makeDynamic(); @@ -57,10 +55,10 @@ TextRender::~TextRender() { */ Mesh *TextRender::meshToDraw(int instance) { A_UNUSED(instance); - if(m_dirty && !m_text.isEmpty()) { + if(m_dirtyMesh && m_font && !m_text.isEmpty()) { m_font->composeMesh(m_mesh, m_text, m_size, m_alignment, m_kerning, m_wrap, m_boundaries); - m_dirty = false; + m_dirtyMesh = false; } return m_text.isEmpty() ? nullptr : m_mesh; @@ -78,13 +76,7 @@ void TextRender::setText(const TString &text) { if(text != m_text) { m_text = text; - if(m_font) { - m_dirty = true; - - for(auto it : m_materials) { - it->setTexture(gTexture, m_font->page()); - } - } + m_dirtyMesh = m_dirtyMaterial = true; } } /*! @@ -108,11 +100,9 @@ void TextRender::setFont(Font *font) { if(m_font) { m_font->subscribe(&TextRender::fontUpdated, this); - for(auto it : m_materials) { - it->setTexture(gTexture, m_font->page()); - } + m_dirtyMaterial = true; } - m_dirty = true; + m_dirtyMesh = true; } } /*! @@ -121,13 +111,7 @@ void TextRender::setFont(Font *font) { void TextRender::setMaterial(Material *material) { Renderable::setMaterial(material); - if(m_font) { - for(auto it : m_materials) { - it->setTexture(gTexture, m_font->page()); - it->setFloat(gWeight, &m_fontWeight); - it->setTransform(transform()); - } - } + m_dirtyMaterial = true; } /*! Returns the size of the font. @@ -140,7 +124,7 @@ int TextRender::fontSize() const { */ void TextRender::setFontSize(int size) { m_size = size; - m_dirty = true; + m_dirtyMesh = true; } /*! Returns the color of the text to be drawn. @@ -153,9 +137,7 @@ Vector4 TextRender::color() const { */ void TextRender::setColor(const Vector4 &color) { m_color = color; - for(auto it : m_materials) { - it->setVector4(gColor, &m_color); - } + m_dirtyMaterial = true; } /*! Returns true if word wrap enabled; otherwise returns false. @@ -168,7 +150,7 @@ bool TextRender::wordWrap() const { */ void TextRender::setWordWrap(bool wrap) { m_wrap = wrap; - m_dirty = true; + m_dirtyMesh = true; } /*! Returns the boundaries of the text area. This parameter is involved in Word Wrap calculations. @@ -181,7 +163,7 @@ Vector2 TextRender::size() const { */ void TextRender::setSize(const Vector2 &boundaries) { m_boundaries = boundaries; - m_dirty = true; + m_dirtyMesh = true; } /*! Returns text alignment policy. @@ -194,7 +176,7 @@ int TextRender::align() const { */ void TextRender::setAlign(int alignment) { m_alignment = alignment; - m_dirty = true; + m_dirtyMesh = true; } /*! Returns true if glyph kerning enabled; otherwise returns false. @@ -209,15 +191,46 @@ bool TextRender::kerning() const { void TextRender::setKerning(const bool kerning) { if(m_kerning != kerning) { m_kerning = kerning; - m_dirty = true; + m_dirtyMesh = true; + } +} +/*! + Returns the redering layer. +*/ +int TextRender::layer() const { + return m_priority; +} +/*! + Sets the redering \a layer. +*/ +void TextRender::setLayer(int layer) { + m_priority = layer; + m_dirtyMaterial = true; +} +/*! + \internal +*/ +MaterialInstance *TextRender::materialInstance(int index) { + if(m_dirtyMaterial && !m_materials.empty()) { + MaterialInstance *inst = m_materials.front(); + if(inst) { + if(m_font) { + inst->setTexture(gTexture, m_font->page()); + } + inst->setVector4(gColor, &m_color); + inst->setFloat(gWeight, &m_fontWeight); + inst->setTransform(transform()); + inst->setPriority(m_priority); + } } + return Renderable::materialInstance(index); } /*! \internal */ bool TextRender::event(Event *ev) { if(ev->type() == Event::LanguageChange) { - m_dirty = true; + m_dirtyMesh = true; } return true; @@ -246,14 +259,7 @@ AABBox TextRender::localBound() const { void TextRender::setMaterialsList(const std::list &materials) { Renderable::setMaterialsList(materials); - for(auto it : m_materials) { - if(m_font) { - it->setTexture(gTexture, m_font->page()); - } - it->setVector4(gColor, &m_color); - it->setFloat(gWeight, &m_fontWeight); - it->setTransform(transform()); - } + m_dirtyMaterial = true; } /*! \internal @@ -267,6 +273,6 @@ void TextRender::drawGizmosSelected() { */ void TextRender::fontUpdated(int state, void *ptr) { if(state == Resource::Ready) { - static_cast(ptr)->m_dirty = true; + static_cast(ptr)->m_dirtyMesh = true; } } diff --git a/engine/src/pipelinecontext.cpp b/engine/src/pipelinecontext.cpp index 5f4e43602..43181fa7e 100644 --- a/engine/src/pipelinecontext.cpp +++ b/engine/src/pipelinecontext.cpp @@ -211,7 +211,7 @@ void PipelineContext::analizeGraph() { } // Renderables frustum culling if(m_frustumCulling) { - frustumCulling(camera->frustum(), m_sceneRenderables, m_culledRenderables, &m_worldBound); + frustumCulling(camera->frustum(), m_sceneRenderables, m_culledRenderables, &m_worldBound); } // Add lights diff --git a/engine/src/pipelinetask.cpp b/engine/src/pipelinetask.cpp index ef60f9149..ea13cae17 100644 --- a/engine/src/pipelinetask.cpp +++ b/engine/src/pipelinetask.cpp @@ -141,8 +141,8 @@ void PipelineTask::filterByLayer(const RenderList &in, GroupList &out, int layer } out.sort([](const Group &left, const Group &right) { - int p1 = left.instance->priority(); - int p2 = right.instance->priority(); + int p1 = left.instance->finalPriority(); + int p2 = right.instance->finalPriority(); if(p1 == p2) { return left.hash < right.hash; } diff --git a/engine/src/pipelinetasks/translucent.cpp b/engine/src/pipelinetasks/translucent.cpp index 626933cf2..4b146e206 100644 --- a/engine/src/pipelinetasks/translucent.cpp +++ b/engine/src/pipelinetasks/translucent.cpp @@ -3,8 +3,6 @@ #include "resources/rendertarget.h" #include "components/renderable.h" -#include "components/transform.h" -#include "components/camera.h" #include "commandbuffer.h" diff --git a/engine/src/resources/font.cpp b/engine/src/resources/font.cpp index 2cc0f7967..b9818fdb0 100644 --- a/engine/src/resources/font.cpp +++ b/engine/src/resources/font.cpp @@ -8,7 +8,6 @@ #include #include "texture.h" -#include "utils/atlas.h" #include "log.h" @@ -151,7 +150,7 @@ void Font::requestCharacters(const TString &characters) { s.push_back(buffer); - Texture *t = Engine::objectCreate("", this); + Texture *t = Engine::objectCreate("", this); t->resize(slot->bitmap.width, slot->bitmap.rows); t->clear(); t->addSurface(s); diff --git a/engine/src/resources/material.cpp b/engine/src/resources/material.cpp index 43ba82bb0..78b24f5d8 100644 --- a/engine/src/resources/material.cpp +++ b/engine/src/resources/material.cpp @@ -282,12 +282,18 @@ uint32_t MaterialInstance::hash() const { return static_cast(m_hash); } /*! - Returns a meterial instance priority used for sorting of rendering queue. + Returns the final material instance priority used for sorting of rendering queue. Calculated as Material::priority + priority */ -int32_t MaterialInstance::priority() const { +int32_t MaterialInstance::finalPriority() const { return m_material->m_priority + m_priority; } +/*! + Returns the instance priority. +*/ +int32_t MaterialInstance::priority() const { + return m_priority; +} /*! Sets the instance \a priority. */ diff --git a/modules/editor/texturetools/editor/spriteedit.cpp b/modules/editor/texturetools/editor/spriteedit.cpp index 6f19c63b0..1021b431a 100644 --- a/modules/editor/texturetools/editor/spriteedit.cpp +++ b/modules/editor/texturetools/editor/spriteedit.cpp @@ -114,23 +114,25 @@ void SpriteEdit::loadAsset(AssetConverterSettings *settings) { if(m_resource->state() > Resource::Loading) { Texture *texture = m_render->texture(); - Vector3 size(texture->width(), texture->height(), 0); + if(texture) { + Vector3 size(texture->width(), texture->height(), 0); - Transform *renderTransform = m_render->transform(); - renderTransform->setScale(size); - renderTransform->setPosition(size * 0.5f); + Transform *renderTransform = m_render->transform(); + renderTransform->setScale(size); + renderTransform->setPosition(size * 0.5f); - Vector2 scale(size.x / 20.0f, size.y / 20.0f); - m_checker->materialInstance(0)->setVector2("scale", &scale); + Vector2 scale(size.x / 20.0f, size.y / 20.0f); + m_checker->materialInstance(0)->setVector2("scale", &scale); - Transform *checkerTransform = m_checker->transform(); - checkerTransform->setScale(size); - checkerTransform->setPosition(size * 0.5f); + Transform *checkerTransform = m_checker->transform(); + checkerTransform->setScale(size); + checkerTransform->setPosition(size * 0.5f); - m_render->actor()->setEnabled(true); + m_render->actor()->setEnabled(true); - m_controller->setSettings(dynamic_cast(m_settings.front())); - m_controller->setSize(size.x, size.y); + m_controller->setSettings(dynamic_cast(m_settings.front())); + m_controller->setSize(size.x, size.y); + } } Object::connect(m_settings.front(), _SIGNAL(updated()), m_proxy, _SLOT(onUpdated())); diff --git a/modules/uikit/includes/components/image.h b/modules/uikit/includes/components/image.h index cb032a5cd..ad33db575 100644 --- a/modules/uikit/includes/components/image.h +++ b/modules/uikit/includes/components/image.h @@ -77,13 +77,17 @@ class UIKIT_EXPORT Image : public Widget { Sprite *m_sheet; + Texture *m_texture; + MaterialInstance *m_material; int m_hash; int m_drawMode; - bool m_dirty; + bool m_dirtyMesh; + + bool m_dirtyMaterial; }; diff --git a/modules/uikit/src/components/image.cpp b/modules/uikit/src/components/image.cpp index 9d7c17a4e..9fe43b1c5 100644 --- a/modules/uikit/src/components/image.cpp +++ b/modules/uikit/src/components/image.cpp @@ -28,10 +28,12 @@ Image::Image() : m_color(1.0f), m_mesh(Engine::objectCreate()), m_sheet(nullptr), + m_texture(nullptr), m_material(nullptr), m_hash(0), m_drawMode(Simple), - m_dirty(true) { + m_dirtyMesh(true), + m_dirtyMaterial(true) { Material *material = Engine::loadResource(gDefaultSprite); if(material) { @@ -51,7 +53,7 @@ Image::~Image() { \internal */ void Image::draw(CommandBuffer &buffer) { - if(m_dirty) { + if(m_dirtyMesh) { if(m_sheet) { Mesh *mesh = m_sheet->composeMesh(m_mesh, m_hash, static_cast(m_drawMode), m_size); if(mesh != m_mesh) { @@ -78,7 +80,7 @@ void Image::draw(CommandBuffer &buffer) { makeDefaultMesh(); } - m_dirty = false; + m_dirtyMesh = false; } RectTransform *rect = rectTransform(); @@ -92,6 +94,15 @@ void Image::draw(CommandBuffer &buffer) { m_material->setTransform(mat); + if(m_dirtyMaterial && m_material) { + m_material->setVector4(gColor, &m_color); + if(m_sheet) { + m_material->setTexture(gOverride, m_sheet->page()); + } else { + m_material->setTexture(gOverride, m_texture); + } + } + buffer.drawMesh(m_mesh, 0, Material::Translucent, *m_material); Widget::draw(buffer); @@ -117,10 +128,6 @@ void Image::setMaterial(Material *material) { if(material) { m_material = material->createInstance(); - m_material->setVector4(gColor, &m_color); - if(m_sheet) { - m_material->setTexture(gOverride, m_sheet->page()); - } } } } @@ -142,21 +149,26 @@ void Image::setSprite(Sprite *sheet) { m_sheet = sheet; if(m_sheet) { m_sheet->subscribe(&Image::spriteUpdated, this); - - setTexture(m_sheet->page()); } + + m_dirtyMaterial = true; } } /*! Replaces the current \a image with a new one. */ void Image::setTexture(Texture *image) { - if(image) { - image->incRef(); - } + if(image != m_texture) { + if(m_texture) { + m_texture->decRef(); + } - if(m_material) { - m_material->setTexture(gOverride, image); + m_texture = image; + if(m_texture) { + m_texture->incRef(); + } + + m_dirtyMaterial = true; } } /*! @@ -170,9 +182,7 @@ Vector4 Image::color() const { */ void Image::setColor(const Vector4 &color) { m_color = color; - if(m_material) { - m_material->setVector4(gColor, &m_color); - } + m_dirtyMaterial = true; } /*! Returns the current item name of sprite from the sprite sheet. @@ -187,7 +197,7 @@ void Image::setItem(const TString &item) { if(m_item != item) { m_item = item; m_hash = Mathf::hashString(m_item); - m_dirty = true; + m_dirtyMesh = true; } } /*! @@ -204,7 +214,7 @@ int Image::drawMode() const { void Image::setDrawMode(int mode) { if(m_drawMode != mode) { m_drawMode = mode; - m_dirty = true; + m_dirtyMesh = true; } } /*! @@ -216,7 +226,7 @@ void Image::boundChanged(const Vector2 &size) { if(m_size != size) { m_size = size; - m_dirty = true; + m_dirtyMesh = true; } } /*! @@ -253,19 +263,11 @@ void Image::spriteUpdated(int state, void *ptr) { switch(state) { case Resource::Ready: { - if(p->m_material) { - p->m_material->setTexture(gOverride, p->m_sheet->page()); - } - - p->m_dirty = true; + p->m_dirtyMesh = p->m_dirtyMaterial = true; } break; case Resource::ToBeDeleted: { p->m_sheet = nullptr; - if(p->m_material) { - p->m_material->setTexture(gOverride, nullptr); - } - - p->m_dirty = true; + p->m_dirtyMesh = p->m_dirtyMaterial = true; } break; default: break; } diff --git a/thirdparty/next/inc/core/object.h b/thirdparty/next/inc/core/object.h index 8ab5aea9a..36cee4bf6 100644 --- a/thirdparty/next/inc/core/object.h +++ b/thirdparty/next/inc/core/object.h @@ -20,7 +20,6 @@ #define OBJECT_H #include -#include #include #include #include diff --git a/thirdparty/next/inc/math/matrix4.h b/thirdparty/next/inc/math/matrix4.h index d8bf33f88..716f74990 100644 --- a/thirdparty/next/inc/math/matrix4.h +++ b/thirdparty/next/inc/math/matrix4.h @@ -29,6 +29,7 @@ class Quaternion; class NEXT_LIBRARY_EXPORT Matrix4 { public: Matrix4(); + Matrix4(const Matrix4 &matrix); Matrix4(const Matrix3 &matrix); Matrix4(const Vector3 &position, const Quaternion &rotation, const Vector3 &scale); diff --git a/thirdparty/next/src/math/matrix4.cpp b/thirdparty/next/src/math/matrix4.cpp index 4b60cf337..df1430f41 100644 --- a/thirdparty/next/src/math/matrix4.cpp +++ b/thirdparty/next/src/math/matrix4.cpp @@ -35,6 +35,12 @@ Matrix4::Matrix4() { identity(); } +Matrix4::Matrix4(const Matrix4 &matrix) { + mat[0] = matrix[0]; mat[4] = matrix[4]; mat[ 8] = matrix[8]; mat[12] = matrix[12]; + mat[1] = matrix[1]; mat[5] = matrix[5]; mat[ 9] = matrix[9]; mat[13] = matrix[13]; + mat[2] = matrix[2]; mat[6] = matrix[6]; mat[10] = matrix[10]; mat[14] = matrix[14]; + mat[3] = matrix[3]; mat[7] = matrix[7]; mat[11] = matrix[11]; mat[15] = matrix[15]; +} /*! Constructs a transform matrix with rotation \a matrix. */