From 2d6f1c8edb11613f2c61872a062c6325ab40eb6b Mon Sep 17 00:00:00 2001 From: Andreas Drewke Date: Wed, 22 Jan 2025 15:12:05 +0100 Subject: [PATCH] Editor: added our source handlers, they got ripped out with a-gui modularization --- ext/a-gui/src/agui/gui/nodes/GUIImageNode.cpp | 25 +++- ext/a-gui/src/agui/gui/nodes/GUIImageNode.h | 50 +++++++- .../tests/asw/Mesh_Interaction_Table.fbx.tm | Bin 122462 -> 128470 bytes src/tdme/tools/editor/Editor.cpp | 117 ++++++++++++++++++ 4 files changed, 189 insertions(+), 3 deletions(-) diff --git a/ext/a-gui/src/agui/gui/nodes/GUIImageNode.cpp b/ext/a-gui/src/agui/gui/nodes/GUIImageNode.cpp index cd3590493..e120588e3 100644 --- a/ext/a-gui/src/agui/gui/nodes/GUIImageNode.cpp +++ b/ext/a-gui/src/agui/gui/nodes/GUIImageNode.cpp @@ -54,6 +54,7 @@ using agui::utilities::Exception; using agui::utilities::StringTools; int GUIImageNode::thumbnailTextureIdx = 0; +vector> GUIImageNode::sourceHandlers; GUIImageNode::GUIImageNode( GUIScreenNode* screenNode, @@ -115,6 +116,20 @@ GUIImageNode::GUIImageNode( if (Math::abs(rotation) > Math::EPSILON) rotate(rotation); } +void GUIImageNode::clearSourceHandlers() { + sourceHandlers.clear(); +} + +void GUIImageNode::addSourceHandler(SourceHandler* sourceHandler) { + sourceHandlers.push_back(unique_ptr(sourceHandler)); +} + +void GUIImageNode::assignTexture(GUITexture* texture, bool releaseTextureReference) { + + this->texture = texture; + this->releaseTextureReference = texture != nullptr?releaseTextureReference:false; +} + void GUIImageNode::disposeTexture() { if (texture != nullptr) { GUI::getTextureManager()->removeTexture(texture->getId()); @@ -144,12 +159,18 @@ const string& GUIImageNode::getSource() { void GUIImageNode::setSource(const string& source) { disposeTexture(); + // use source handlers + for (const auto& sourceHandler: sourceHandlers) { + if (sourceHandler->setSource(this, source) == true) { + // we handled the source with success + break; + } + } this->source = source; if (source.empty() == false) { // load it if (this->texture == nullptr) { - this->texture = source.empty() == true?nullptr:screenNode->getImage(source); - this->releaseTextureReference = false; + assignTexture(source.empty() == true?nullptr:screenNode->getImage(source), false); } } this->textureId = texture == nullptr?0:GUI::getTextureManager()->addTexture(texture, 0); diff --git a/ext/a-gui/src/agui/gui/nodes/GUIImageNode.h b/ext/a-gui/src/agui/gui/nodes/GUIImageNode.h index d8f7fff31..f426f43b3 100644 --- a/ext/a-gui/src/agui/gui/nodes/GUIImageNode.h +++ b/ext/a-gui/src/agui/gui/nodes/GUIImageNode.h @@ -1,6 +1,8 @@ #pragma once #include +#include +#include #include #include @@ -14,6 +16,8 @@ #include using std::string; +using std::unique_ptr; +using std::vector; // namespaces namespace agui { @@ -34,12 +38,32 @@ class agui::gui::nodes::GUIImageNode final : public GUITextureBaseNode { friend class agui::gui::GUIParser; +public: + /** + * Source handler + */ + struct SourceHandler { + /** + * Destructor + */ + virtual ~SourceHandler() { + } + + /** + * Set image source + * @param imageNode image node + * @param source source + * @returns success + */ + virtual bool setSource(GUIImageNode* imageNode, const string& source) = 0; + }; private: bool releaseTextureReference { false }; string source; GUITexture* texture { nullptr }; AGUI_STATIC_DLL_IMPEXT static int thumbnailTextureIdx; + AGUI_STATIC_DLL_IMPEXT static vector> sourceHandlers; /** * Release texture @@ -117,10 +141,34 @@ class agui::gui::nodes::GUIImageNode final const string getNodeType() override; public: + /** + * Clear source handlers + */ + static void clearSourceHandlers(); + + /** + * Add source handler + * @param sourceHandler source handler + */ + static void addSourceHandler(SourceHandler* sourceHandler); + + /** + * Allocate thumbnail texture index + */ + inline static int allocateThumbnailTextureIdx() { + return thumbnailTextureIdx++; + } + + /** + * Assign texture + * @param texture texture + * @param releaseTextureReference release texture reference on dispose + */ + void assignTexture(GUITexture* texture, bool releaseTextureReference); + // overridden methods void dispose() override; - /** * @returns texture */ diff --git a/resources/tests/asw/Mesh_Interaction_Table.fbx.tm b/resources/tests/asw/Mesh_Interaction_Table.fbx.tm index 53ae00e5ca6cc34caa041f9e5f8255dbda0d04a1..f489e25f1d6b0a95ba67b1d8859aeebe90a211b8 100644 GIT binary patch delta 6122 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 fkq6;tayy`!G4aM`Z{ delta 73 zcmV-P0Ji_u>j&Pv2ND4Q000V9L`_8?O>bmnYyk-nkrG3ZS7-qQv%CWV0h7Q11(U`C f`mxCQ0h7H12$$2{0d9lA1h>Hi0S?)hLEZr)f3X@w diff --git a/src/tdme/tools/editor/Editor.cpp b/src/tdme/tools/editor/Editor.cpp index 70545622f..411b78d88 100644 --- a/src/tdme/tools/editor/Editor.cpp +++ b/src/tdme/tools/editor/Editor.cpp @@ -7,8 +7,13 @@ #include #include +#include +#include +#include #include +#include +#include #include #include #include @@ -18,12 +23,15 @@ #include #include #include +#include +#include #include #include #include #include #include #include +#include #include using std::make_unique; @@ -36,7 +44,12 @@ using tdme::tools::editor::Editor; using tdme::utilities::Time; using agui::gui::GUI; +using agui::gui::fileio::PNGTextureReader; +using agui::gui::nodes::GUIImageNode; +using agui::gui::nodes::GUIScreenNode; +using tdme::engine::fileio::models::ModelReader; +using tdme::engine::fileio::prototypes::PrototypeReader; using tdme::engine::prototype::Prototype; using tdme::engine::prototype::Prototype_Type; using tdme::engine::tools::FileSystemTools; @@ -46,12 +59,16 @@ using tdme::engine::Engine; using tdme::engine::SimplePartition; using tdme::engine::Version; using tdme::minitscript::EngineMinitScript; +using tdme::os::filesystem::FileSystem; +using tdme::os::filesystem::FileSystemInterface; using tdme::tools::editor::controllers::EditorScreenController; using tdme::tools::editor::misc::PopUps; using tdme::tools::editor::misc::Tools; using tdme::tools::editor::views::EditorView; using tdme::tools::editor::views::View; using tdme::utilities::Console; +using tdme::utilities::Exception; +using tdme::utilities::Time; Editor* Editor::instance = nullptr; @@ -79,6 +96,106 @@ int Editor::main(int argc, char** argv) Console::printLine(); // EngineMinitScript::initialize(); + // source handlers + { + // tm files + class TMSourceHandler: public GUIImageNode::SourceHandler { + bool setSource(GUIImageNode* imageNode, const string& source) { + if (StringTools::endsWith(StringTools::toLowerCase(source), ".tm") == false) return false; + // + try { + vector thumbnailPNGData; + if (FileSystem::getInstance()->getThumbnailAttachment( + FileSystem::getInstance()->getPathName(source), + FileSystem::getInstance()->getFileName(source), + thumbnailPNGData + ) == true) { + // + auto thumbnailTexture = PNGTextureReader::read("tdme.gui.guiimagenode." + to_string(GUIImageNode::allocateThumbnailTextureIdx()), thumbnailPNGData, true); + if (thumbnailTexture != nullptr) { + imageNode->assignTexture(thumbnailTexture, true); + } else { + imageNode->assignTexture(imageNode->getScreenNode()->getImage("resources/engine/images/mesh_big.png"), false); + } + } else { + imageNode->assignTexture(imageNode->getScreenNode()->getImage("resources/engine/images/mesh_big.png"), false); + } + } catch (Exception& exception) { + Console::printLine("TMSourceHandler::setSource(): " + string(exception.what())); + } + // + return true; + } + }; + GUIImageNode::addSourceHandler(new TMSourceHandler()); + } + { + // tm files + class TModelSourceHandler: public GUIImageNode::SourceHandler { + bool setSource(GUIImageNode* imageNode, const string& source) { + if (StringTools::endsWith(StringTools::toLowerCase(source), ".tmodel") == false) return false; + // + try { + vector thumbnailPNGData; + if (PrototypeReader::readThumbnail( + FileSystem::getInstance()->getPathName(source), + FileSystem::getInstance()->getFileName(source), + thumbnailPNGData + ) == true) { + // + auto thumbnailTexture = PNGTextureReader::read("tdme.gui.guiimagenode." + to_string(GUIImageNode::allocateThumbnailTextureIdx()), thumbnailPNGData, true); + if (thumbnailTexture != nullptr) { + imageNode->assignTexture(thumbnailTexture, true); + } else { + imageNode->assignTexture(imageNode->getScreenNode()->getImage("resources/engine/images/tdme_big.png"), false); + } + } else { + imageNode->assignTexture(imageNode->getScreenNode()->getImage("resources/engine/images/tdme_big.png"), false); + } + } catch (Exception& exception) { + Console::printLine("TModelSourceHandler::setSource(): " + string(exception.what())); + } + // + return true; + } + }; + GUIImageNode::addSourceHandler(new TModelSourceHandler()); + } + { + // tm files + class XMLSourceHandler: public GUIImageNode::SourceHandler { + bool setSource(GUIImageNode* imageNode, const string& source) { + if (StringTools::endsWith(StringTools::toLowerCase(source), ".xml") == false) return false; + // + try { + imageNode->assignTexture(imageNode->getScreenNode()->getImage("resources/engine/images/gui_big.png"), false); + } catch (Exception& exception) { + Console::printLine("XMLSourceHandler::setSource(): " + string(exception.what())); + } + // + return true; + } + }; + GUIImageNode::addSourceHandler(new XMLSourceHandler()); + } + { + // other files + class OtherSourceHandler: public GUIImageNode::SourceHandler { + bool setSource(GUIImageNode* imageNode, const string& source) { + // other model without thumbnail + for (const auto& extension: ModelReader::getModelExtensions()) { + if (StringTools::endsWith(StringTools::toLowerCase(source), "." + extension) == true) { + imageNode->assignTexture(imageNode->getScreenNode()->getImage("resources/engine/images/mesh_big.png"), false); + // done + return true; + } + } + // + return false; + } + }; + GUIImageNode::addSourceHandler(new OtherSourceHandler()); + } // auto tdmeEditor = new Editor(); return tdmeEditor->run(argc, argv, "Editor", nullptr, Application::WINDOW_HINT_MAXIMIZED);