From ab6aaa0604d971dc07516a2705b6eac70f042396 Mon Sep 17 00:00:00 2001 From: Evgeny Prikazchikov Date: Sun, 1 Feb 2026 21:05:22 +0300 Subject: [PATCH 1/4] Editor: Sprite transform tool #1244 --- engine/includes/components/effectrender.h | 2 +- engine/includes/components/meshrender.h | 2 +- engine/includes/components/renderable.h | 10 +- .../includes/components/skinnedmeshrender.h | 2 +- engine/includes/components/spriterender.h | 9 +- engine/includes/components/textrender.h | 2 +- engine/includes/editor/projectsettings.h | 2 - engine/src/components/effectrender.cpp | 2 +- engine/src/components/meshrender.cpp | 2 +- engine/src/components/renderable.cpp | 4 +- engine/src/components/spriterender.cpp | 21 ++-- engine/src/components/textrender.cpp | 2 +- engine/src/components/tilemaprender.cpp | 2 +- .../src/editor/viewport/cameracontroller.cpp | 2 +- .../scenecomposer/objectcontroller.cpp | 2 + .../screens/scenecomposer/scenecomposer.cpp | 3 +- .../screens/scenecomposer/tools/movetool.cpp | 2 +- .../scenecomposer/tools/transformtool.cpp | 102 ++++++++++++++++++ .../scenecomposer/tools/transformtool.h | 20 ++++ 19 files changed, 158 insertions(+), 35 deletions(-) create mode 100644 worldeditor/src/screens/scenecomposer/tools/transformtool.cpp create mode 100644 worldeditor/src/screens/scenecomposer/tools/transformtool.h diff --git a/engine/includes/components/effectrender.h b/engine/includes/components/effectrender.h index e12da42bd..c8d1665ea 100644 --- a/engine/includes/components/effectrender.h +++ b/engine/includes/components/effectrender.h @@ -23,7 +23,7 @@ class ENGINE_EXPORT EffectRender : public Renderable { void deltaUpdate(float dt); private: - AABBox localBound() const override; + AABBox localBound() override; Mesh *meshToDraw(int instance) override; diff --git a/engine/includes/components/meshrender.h b/engine/includes/components/meshrender.h index fc5ff3585..dc380d5b1 100644 --- a/engine/includes/components/meshrender.h +++ b/engine/includes/components/meshrender.h @@ -32,7 +32,7 @@ class ENGINE_EXPORT MeshRender : public Renderable { protected: void setMaterialsList(const std::list &materials) override; - AABBox localBound() const override; + AABBox localBound() override; Mesh *meshToDraw(int instance) override; diff --git a/engine/includes/components/renderable.h b/engine/includes/components/renderable.h index 0769ef682..14fe638e7 100644 --- a/engine/includes/components/renderable.h +++ b/engine/includes/components/renderable.h @@ -1,7 +1,7 @@ #ifndef RENDERABLE_H #define RENDERABLE_H -#include "nativebehaviour.h" +#include #include @@ -16,15 +16,13 @@ class ENGINE_EXPORT Renderable : public NativeBehaviour { A_OBJECT(Renderable, NativeBehaviour, General) A_NOPROPERTIES() - A_METHODS( - A_METHOD(AABBox, Renderable::bound) - ) + A_NOMETHODS() public: Renderable(); ~Renderable(); - virtual AABBox bound() const; + virtual AABBox bound(); Material *material() const; virtual void setMaterial(Material *material); @@ -37,7 +35,7 @@ class ENGINE_EXPORT Renderable : public NativeBehaviour { virtual uint32_t subMesh(int instance) const; - virtual AABBox localBound() const; + virtual AABBox localBound(); virtual void setMaterialsList(const std::list &materials); diff --git a/engine/includes/components/skinnedmeshrender.h b/engine/includes/components/skinnedmeshrender.h index d5f7c8166..c367729ca 100644 --- a/engine/includes/components/skinnedmeshrender.h +++ b/engine/includes/components/skinnedmeshrender.h @@ -30,7 +30,7 @@ class ENGINE_EXPORT SkinnedMeshRender : public MeshRender { private: void setMaterialsList(const std::list &materials) override; - AABBox localBound() const override; + AABBox localBound() const; void onReferenceDestroyed() override; diff --git a/engine/includes/components/spriterender.h b/engine/includes/components/spriterender.h index 1928c2da8..73db16e66 100644 --- a/engine/includes/components/spriterender.h +++ b/engine/includes/components/spriterender.h @@ -1,11 +1,12 @@ #ifndef SPRITERENDER #define SPRITERENDER -#include "renderable.h" +#include + +#include +#include -class Sprite; class Texture; -class Material; class MaterialInstance; class Mesh; @@ -66,7 +67,7 @@ class ENGINE_EXPORT SpriteRender : public Renderable { void setMaterialsList(const std::list &materials) override; - AABBox localBound() const override; + AABBox localBound() override; void composeComponent() override; diff --git a/engine/includes/components/textrender.h b/engine/includes/components/textrender.h index 4a61d30f5..fc6ae4f67 100644 --- a/engine/includes/components/textrender.h +++ b/engine/includes/components/textrender.h @@ -64,7 +64,7 @@ class ENGINE_EXPORT TextRender : public Renderable { Mesh *meshToDraw(int instance) override; - AABBox localBound() const override; + AABBox localBound() override; void setMaterialsList(const std::list &materials) override; diff --git a/engine/includes/editor/projectsettings.h b/engine/includes/editor/projectsettings.h index ab9866c94..173c53958 100644 --- a/engine/includes/editor/projectsettings.h +++ b/engine/includes/editor/projectsettings.h @@ -134,8 +134,6 @@ class ENGINE_EXPORT ProjectSettings : public Object { TString m_myProjectsPath; - - TString m_firstMap; }; diff --git a/engine/src/components/effectrender.cpp b/engine/src/components/effectrender.cpp index 77273de07..4bc8b08f8 100644 --- a/engine/src/components/effectrender.cpp +++ b/engine/src/components/effectrender.cpp @@ -88,7 +88,7 @@ void EffectRender::setEffect(VisualEffect *effect) { /*! \internal */ -AABBox EffectRender::localBound() const { +AABBox EffectRender::localBound() { if(m_effect) { m_effect->bound(); } diff --git a/engine/src/components/meshrender.cpp b/engine/src/components/meshrender.cpp index 2faa53d96..3ddce68ff 100644 --- a/engine/src/components/meshrender.cpp +++ b/engine/src/components/meshrender.cpp @@ -56,7 +56,7 @@ void MeshRender::setMaterialsList(const std::list &materials) { /*! \internal */ -AABBox MeshRender::localBound() const { +AABBox MeshRender::localBound() { if(m_mesh) { return m_mesh->bound(); } diff --git a/engine/src/components/renderable.cpp b/engine/src/components/renderable.cpp index e38fdc98b..ad517f869 100644 --- a/engine/src/components/renderable.cpp +++ b/engine/src/components/renderable.cpp @@ -33,7 +33,7 @@ Renderable::~Renderable() { /*! Returns a bound box of the renderable object. */ -AABBox Renderable::bound() const { +AABBox Renderable::bound() { AABBox bb = localBound(); Transform *t = transform(); if(t) { @@ -119,7 +119,7 @@ void Renderable::setMaterialsList(const std::list &materials) { /*! \internal */ -AABBox Renderable::localBound() const { +AABBox Renderable::localBound() { return AABBox(); } /*! diff --git a/engine/src/components/spriterender.cpp b/engine/src/components/spriterender.cpp index 6f4e8dd67..c6e3ec267 100644 --- a/engine/src/components/spriterender.cpp +++ b/engine/src/components/spriterender.cpp @@ -9,9 +9,9 @@ #include namespace { - const char *gColor = "mainColor"; - const char *gTexture = "mainTexture"; - const char *gDefaultSprite = ".embedded/DefaultSprite.shader"; + const char *gColor("mainColor"); + const char *gTexture("mainTexture"); + const char *gDefaultSprite(".embedded/DefaultSprite.shader"); } /*! @@ -67,6 +67,7 @@ Mesh *SpriteRender::meshToDraw(int instance) { if(m_drawMode == Sprite::Simple) { m_size = mesh->bound().extent * 2.0f; } + } else { m_mesh = PipelineContext::defaultPlane(); } @@ -103,11 +104,10 @@ MaterialInstance *SpriteRender::materialInstance(int index) { /*! \internal */ -AABBox SpriteRender::localBound() const { - if(m_useCustom) { - return m_customMesh->bound(); - } else if(m_mesh) { - return m_mesh->bound(); +AABBox SpriteRender::localBound() { + Mesh *mesh = meshToDraw(0); + if(mesh) { + return mesh->bound(); } return Renderable::localBound(); } @@ -192,7 +192,10 @@ Vector2 SpriteRender::size() const { Sets a new \a size of sprite. */ void SpriteRender::setSize(const Vector2 &size) { - m_size = size; + if(m_size != size) { + m_size = size; + m_dirtyMesh = true; + } } /*! Returns a draw mode for the sprite. diff --git a/engine/src/components/textrender.cpp b/engine/src/components/textrender.cpp index f83f38c60..1910ec48e 100644 --- a/engine/src/components/textrender.cpp +++ b/engine/src/components/textrender.cpp @@ -248,7 +248,7 @@ void TextRender::composeComponent() { /*! \internal */ -AABBox TextRender::localBound() const { +AABBox TextRender::localBound() { if(m_mesh) { return m_mesh->bound(); } diff --git a/engine/src/components/tilemaprender.cpp b/engine/src/components/tilemaprender.cpp index 8c22edfa3..4c58b9365 100644 --- a/engine/src/components/tilemaprender.cpp +++ b/engine/src/components/tilemaprender.cpp @@ -41,7 +41,7 @@ Mesh *TileMapRender::meshToDraw(int instance) { /*! \internal */ -AABBox TileMapRender::localBound() const { +AABBox TileMapRender::localBound() { if(m_tileMap) { return m_tileMap->tileMesh()->bound(); } diff --git a/engine/src/editor/viewport/cameracontroller.cpp b/engine/src/editor/viewport/cameracontroller.cpp index b0cd13aae..48b0d0700 100644 --- a/engine/src/editor/viewport/cameracontroller.cpp +++ b/engine/src/editor/viewport/cameracontroller.cpp @@ -254,7 +254,7 @@ void CameraController::resetCamera() { m_cameras.clear(); m_cameras.push_back({rotation, position, dist, 0.0f, false}); - m_cameras.push_back({Vector3(), Vector3(0.0f, 0.0f, -10.0f), 0.0f, dist, true}); + m_cameras.push_back({Vector3(), Vector3(0.0f, 0.0f, 10.0f), 0.0f, dist, true}); m_currentCamera = 0; diff --git a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp index e046f7df8..292826445 100644 --- a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp +++ b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp @@ -29,6 +29,7 @@ #include "tools/movetool.h" #include "tools/rotatetool.h" #include "tools/scaletool.h" +#include "tools/transformtool.h" #include "tools/spline/splinetool.h" #include "actions/selectobjects.h" @@ -195,6 +196,7 @@ ObjectController::ObjectController(SceneComposer *editor) : new RotateTool(this), new ScaleTool(this), new SplineTool(this), + new TransformTool(this), }; } diff --git a/worldeditor/src/screens/scenecomposer/scenecomposer.cpp b/worldeditor/src/screens/scenecomposer/scenecomposer.cpp index 05292b027..c69fcf6ca 100644 --- a/worldeditor/src/screens/scenecomposer/scenecomposer.cpp +++ b/worldeditor/src/screens/scenecomposer/scenecomposer.cpp @@ -30,8 +30,6 @@ #include -#include - #include "actions/createobject.h" #include "actions/deleteobjects.h" #include "actions/pasteobjects.h" @@ -316,6 +314,7 @@ void SceneComposer::onSelectionChanged(const Object::ObjectList &objects) { for(auto it : m_toolButtons) { it->setVisible(it->property(gComponent).toString().toStdString() == t); } + m_toolButtons.front()->click(); } emit objectsSelected(objects); diff --git a/worldeditor/src/screens/scenecomposer/tools/movetool.cpp b/worldeditor/src/screens/scenecomposer/tools/movetool.cpp index 38353c6f0..32d7aa667 100644 --- a/worldeditor/src/screens/scenecomposer/tools/movetool.cpp +++ b/worldeditor/src/screens/scenecomposer/tools/movetool.cpp @@ -86,7 +86,7 @@ std::string MoveTool::name() const { } std::string MoveTool::toolTip() const { - return QObject::tr("Select and Translate objects").toStdString(); + return QObject::tr("Select and Move objects").toStdString(); } std::string MoveTool::shortcut() const { diff --git a/worldeditor/src/screens/scenecomposer/tools/transformtool.cpp b/worldeditor/src/screens/scenecomposer/tools/transformtool.cpp new file mode 100644 index 000000000..013ac0867 --- /dev/null +++ b/worldeditor/src/screens/scenecomposer/tools/transformtool.cpp @@ -0,0 +1,102 @@ +#include "transformtool.h" + +#include +#include +#include + +#include + +#include "../objectcontroller.h" + +TransformTool::TransformTool(ObjectController *controller) : + SelectTool(controller) { + +} +#include +void TransformTool::update(bool center, bool local, bool snap) { + SelectTool::update(center, local, snap); + + SelectTool::SelectList &list = m_controller->selectList(); + if(!list.isEmpty()) { + Actor *actor = list.back().object; + SpriteRender *render = actor->getComponent(); + if(render) { + bool isDrag = m_controller->isDrag(); + AABBox bb(render->bound()); + int axis = 0; + + Handles::s_Color = Handles::s_Normal; + m_world = Handles::rectTool(bb.center, bb.extent * 2.0f, axis, true, isDrag); + + if(isDrag) { + Transform *t = render->transform(); + Vector3 worldScale(t->worldScale()); + Vector2 delta(m_world - m_savedWorld); + + Vector2 size(render->size()); + Vector2 pivot(render->sprite()->pivot()); + + Vector2 min(-size * pivot); + Vector2 max(min + size); + + Vector3 positionOffset; + + if(Handles::s_Axes == (Handles::TOP | Handles::BOTTOM | Handles::LEFT | Handles::RIGHT)) { + positionOffset = Vector3(delta); + } else { + if(Handles::s_Axes & Handles::TOP) { + max.y += delta.y / worldScale.y; + positionOffset.y = delta.y * pivot.y; + } else if(Handles::s_Axes & Handles::BOTTOM) { + min.y += delta.y / worldScale.y; + positionOffset.y = delta.y * (1.0f - pivot.y); + } + if(Handles::s_Axes & Handles::LEFT) { + min.x += delta.x / worldScale.x; + positionOffset.x = delta.x * (1.0f - pivot.x); + } else if(Handles::s_Axes & Handles::RIGHT) { + max.x += delta.x / worldScale.x; + positionOffset.x = delta.x * pivot.x; + } + } + + render->setSize(max - min); + + t->setPosition(t->position() + positionOffset); + + m_savedWorld = m_world; + } + } + + Qt::CursorShape shape = Qt::ArrowCursor; + if(Handles::s_Axes == (Handles::TOP | Handles::BOTTOM | Handles::LEFT | Handles::RIGHT)) { + shape = Qt::SizeAllCursor; + } else if(Handles::s_Axes == (Handles::TOP | Handles::RIGHT)) { + shape = Qt::SizeBDiagCursor; + } else if(Handles::s_Axes == (Handles::TOP | Handles::LEFT)) { + shape = Qt::SizeFDiagCursor; + } else if(Handles::s_Axes == (Handles::BOTTOM | Handles::RIGHT)) { + shape = Qt::SizeFDiagCursor; + } else if(Handles::s_Axes == (Handles::BOTTOM | Handles::LEFT)) { + shape = Qt::SizeBDiagCursor; + } else if(Handles::s_Axes == Handles::TOP || Handles::s_Axes == Handles::BOTTOM) { + shape = Qt::SizeVerCursor; + } else if(Handles::s_Axes == Handles::LEFT || Handles::s_Axes == Handles::RIGHT) { + shape = Qt::SizeHorCursor; + } + + m_cursor = shape; + } +} + +std::string TransformTool::icon() const { + return ":/Images/editor/Transform.png"; +} + +std::string TransformTool::name() const { + return "Transform"; +} + +std::string TransformTool::component() const { + return SpriteRender::metaClass()->name(); +} diff --git a/worldeditor/src/screens/scenecomposer/tools/transformtool.h b/worldeditor/src/screens/scenecomposer/tools/transformtool.h new file mode 100644 index 000000000..65ee74a18 --- /dev/null +++ b/worldeditor/src/screens/scenecomposer/tools/transformtool.h @@ -0,0 +1,20 @@ +#ifndef TRANSFORMTOOL_H +#define TRANSFORMTOOL_H + +#include "selecttool.h" + +class TransformTool : public SelectTool { +public: + explicit TransformTool(ObjectController *controller); + + void update(bool center, bool local, bool snap) override; + +protected: + std::string icon() const override; + std::string name() const override; + + std::string component() const override; + +}; + +#endif // TRANSFORMTOOL_H From 7917fd12b8391b51be3fe61f617d6a9092b2ff55 Mon Sep 17 00:00:00 2001 From: Evgeny Prikazchikov Date: Sun, 1 Feb 2026 21:09:26 +0300 Subject: [PATCH 2/4] update --- engine/includes/components/tilemaprender.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/includes/components/tilemaprender.h b/engine/includes/components/tilemaprender.h index 849e84891..0b5fd0f2c 100644 --- a/engine/includes/components/tilemaprender.h +++ b/engine/includes/components/tilemaprender.h @@ -32,7 +32,7 @@ class ENGINE_EXPORT TileMapRender : public Renderable { void setLayer(int layer); private: - AABBox localBound() const override; + AABBox localBound() override; Mesh *meshToDraw(int instance) override; From 7c58025a744e95e8cb2b9dae7379d6d4d5cca7eb Mon Sep 17 00:00:00 2001 From: Evgeny Prikazchikov Date: Sun, 1 Feb 2026 21:14:19 +0300 Subject: [PATCH 3/4] update --- worldeditor/src/screens/scenecomposer/tools/transformtool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worldeditor/src/screens/scenecomposer/tools/transformtool.cpp b/worldeditor/src/screens/scenecomposer/tools/transformtool.cpp index 013ac0867..5a6d53f3b 100644 --- a/worldeditor/src/screens/scenecomposer/tools/transformtool.cpp +++ b/worldeditor/src/screens/scenecomposer/tools/transformtool.cpp @@ -12,7 +12,7 @@ TransformTool::TransformTool(ObjectController *controller) : SelectTool(controller) { } -#include + void TransformTool::update(bool center, bool local, bool snap) { SelectTool::update(center, local, snap); From aeed6ba0bcfd8585c9f666c627dd5e8448d95740 Mon Sep 17 00:00:00 2001 From: Evgeny Prikazchikov Date: Sun, 1 Feb 2026 22:19:56 +0300 Subject: [PATCH 4/4] Editor: Unable to render icons for imported sprites #1246 --- engine/includes/editor/assetconverter.h | 5 +++++ engine/src/editor/assetconverter.cpp | 15 ++++++++++++++- engine/src/editor/assetmanager.cpp | 16 ++++++++-------- .../particletools/converter/effectbuilder.cpp | 1 + .../editor/particletools/editor/particleedit.cpp | 2 +- .../editor/shadertools/editor/materialedit.ui | 2 +- .../src/managers/assetimporter/iconrender.cpp | 12 ++++++++---- 7 files changed, 38 insertions(+), 15 deletions(-) diff --git a/engine/includes/editor/assetconverter.h b/engine/includes/editor/assetconverter.h index fe880783f..7a4b0f000 100644 --- a/engine/includes/editor/assetconverter.h +++ b/engine/includes/editor/assetconverter.h @@ -53,6 +53,9 @@ class ENGINE_EXPORT AssetConverterSettings : public Object { AssetConverterSettings(); ~AssetConverterSettings(); + AssetConverter *converter(); + void setConverter(AssetConverter *converter); + uint32_t type() const; virtual StringList typeNames() const; @@ -139,6 +142,8 @@ class ENGINE_EXPORT AssetConverterSettings : public Object { static std::map m_defaultIcons; + AssetConverter *m_converter; + }; #endif // ASSETCONVERTER_H diff --git a/engine/src/editor/assetconverter.cpp b/engine/src/editor/assetconverter.cpp index 87802b3fa..4d5da5754 100644 --- a/engine/src/editor/assetconverter.cpp +++ b/engine/src/editor/assetconverter.cpp @@ -45,12 +45,25 @@ AssetConverterSettings::AssetConverterSettings() : m_modified(false), m_dir(false), m_version(0), - m_currentVersion(0) { + m_currentVersion(0), + m_converter(nullptr) { } AssetConverterSettings::~AssetConverterSettings() { +} +/*! + Returns assotiated AssetConverter. +*/ +AssetConverter *AssetConverterSettings::converter() { + return m_converter; +} +/*! + Sets assotiated asset \a converter. +*/ +void AssetConverterSettings::setConverter(AssetConverter *converter) { + m_converter = converter; } /*! Returns the asset type for conversion for more details see MetaType. diff --git a/engine/src/editor/assetmanager.cpp b/engine/src/editor/assetmanager.cpp index d4d9960c5..9878d45ff 100644 --- a/engine/src/editor/assetmanager.cpp +++ b/engine/src/editor/assetmanager.cpp @@ -309,12 +309,12 @@ AssetConverterSettings *AssetManager::fetchSettings(const TString &source) { AssetConverterSettings *settings = nullptr; if(!path.isEmpty() && File::exists(source)) { - TString suffix(Url(source).completeSuffix().toLower()); - auto it = m_converters.find(suffix); - - if(it != m_converters.end()) { - settings = it->second->createSettings(); + AssetConverter *converter = getConverter(source); + if(converter) { + settings = converter->createSettings(); + settings->setConverter(converter); } else { + TString suffix(Url(source).suffix().toLower()); CodeBuilder *currentBuilder = m_projectManager->currentBuilder(); CodeBuilder *builder = nullptr; for(auto it : m_builders) { @@ -424,7 +424,7 @@ Actor *AssetManager::createActor(const TString &source) { if(!source.isEmpty()) { TString uuid; TString path = source; - if(source.at(0) == '{') { + if(source.front() == '{') { uuid = source; path = uuidToPath(uuid); } else { @@ -433,7 +433,7 @@ Actor *AssetManager::createActor(const TString &source) { AssetConverterSettings *settings = fetchSettings(path); if(settings) { - AssetConverter *converter = getConverter(path); + AssetConverter *converter = settings->converter(); if(converter) { return converter->createActor(settings, uuid); } @@ -534,7 +534,7 @@ void AssetManager::onPerform() { } AssetConverter *AssetManager::getConverter(const TString &source) { - auto it = m_converters.find(Url(source).suffix().toLower()); + auto it = m_converters.find(Url(source).completeSuffix().toLower()); if(it != m_converters.end()) { return it->second; } diff --git a/modules/editor/particletools/converter/effectbuilder.cpp b/modules/editor/particletools/converter/effectbuilder.cpp index 1d5082dac..92b8378f7 100644 --- a/modules/editor/particletools/converter/effectbuilder.cpp +++ b/modules/editor/particletools/converter/effectbuilder.cpp @@ -49,6 +49,7 @@ float EffectBuilderSettings::thumbnailWarmup() const { void EffectBuilderSettings::setThumbnailWarmup(float value) { if(m_thumbnailWarmup != value) { m_thumbnailWarmup = value; + setModified(); } } diff --git a/modules/editor/particletools/editor/particleedit.cpp b/modules/editor/particletools/editor/particleedit.cpp index eba87e4b3..1dce467af 100644 --- a/modules/editor/particletools/editor/particleedit.cpp +++ b/modules/editor/particletools/editor/particleedit.cpp @@ -65,7 +65,7 @@ class ParticleProxy : public Object { ParticleEdit::ParticleEdit() : ui(new Ui::ParticleEdit), m_builder(new EffectBuilder), - m_controller(new CameraController()), + m_controller(new CameraController), m_light(nullptr), m_effect(nullptr), m_render(nullptr), diff --git a/modules/editor/shadertools/editor/materialedit.ui b/modules/editor/shadertools/editor/materialedit.ui index 426403643..845f844fb 100644 --- a/modules/editor/shadertools/editor/materialedit.ui +++ b/modules/editor/shadertools/editor/materialedit.ui @@ -7,7 +7,7 @@ 0 0 1024 - 800 + 600 diff --git a/worldeditor/src/managers/assetimporter/iconrender.cpp b/worldeditor/src/managers/assetimporter/iconrender.cpp index 5f882f1fb..430d55918 100644 --- a/worldeditor/src/managers/assetimporter/iconrender.cpp +++ b/worldeditor/src/managers/assetimporter/iconrender.cpp @@ -83,15 +83,19 @@ const QImage IconRender::render(const TString &uuid) { m_render->update(m_world); + QImage result; + if(m_color) { ByteArray data(m_color->getPixels(0)); - QImage result(data.data(), m_color->width(), m_color->height(), QImage::Format_RGBA8888); + result = QImage(data.data(), m_color->width(), m_color->height(), QImage::Format_RGBA8888); + + result = result.mirrored(); + } + if(object) { object->setParent(nullptr); delete object; - - return result.mirrored(); } - return QImage(); + return result; }