diff --git a/apps/sample-gui/MediaTool.cpp b/apps/sample-gui/MediaTool.cpp index 819bd8f..51e422c 100644 --- a/apps/sample-gui/MediaTool.cpp +++ b/apps/sample-gui/MediaTool.cpp @@ -6,6 +6,7 @@ #include "WebClientView.h" #include "TabbedPanelWidget.h" #include "TopBar.h" +#include "TextNode.h" #include "StatusBar.h" #include "HorizontalSpacer.h" diff --git a/apps/sample-gui/audio_editor/AudioEditorView.cpp b/apps/sample-gui/audio_editor/AudioEditorView.cpp index a0bb338..b207d83 100644 --- a/apps/sample-gui/audio_editor/AudioEditorView.cpp +++ b/apps/sample-gui/audio_editor/AudioEditorView.cpp @@ -2,6 +2,7 @@ #include "Label.h" #include "Color.h" +#include "TextNode.h" AudioEditorView::AudioEditorView() { diff --git a/apps/sample-gui/image_editor/ImageEditorView.cpp b/apps/sample-gui/image_editor/ImageEditorView.cpp index ff05aa9..70bc5e0 100644 --- a/apps/sample-gui/image_editor/ImageEditorView.cpp +++ b/apps/sample-gui/image_editor/ImageEditorView.cpp @@ -2,6 +2,7 @@ #include "Label.h" #include "Color.h" +#include "TextNode.h" ImageEditorView::ImageEditorView() { diff --git a/apps/sample-gui/text_editor/TextEditorView.cpp b/apps/sample-gui/text_editor/TextEditorView.cpp index 6a6e972..051b052 100644 --- a/apps/sample-gui/text_editor/TextEditorView.cpp +++ b/apps/sample-gui/text_editor/TextEditorView.cpp @@ -1,6 +1,8 @@ #include "HorizontalSpacer.h" #include "TextEditorView.h" #include "VerticalSpacer.h" +#include "TextNode.h" + #include TextEditorView::TextEditorView() diff --git a/apps/sample-gui/web_client/WebClientView.cpp b/apps/sample-gui/web_client/WebClientView.cpp index 752389c..8ee2012 100644 --- a/apps/sample-gui/web_client/WebClientView.cpp +++ b/apps/sample-gui/web_client/WebClientView.cpp @@ -2,6 +2,7 @@ #include "Label.h" #include "Color.h" +#include "TextNode.h" WebClientView::WebClientView() { diff --git a/src/client/TabbedPanelWidget.cpp b/src/client/TabbedPanelWidget.cpp index a3d8a32..15d156f 100644 --- a/src/client/TabbedPanelWidget.cpp +++ b/src/client/TabbedPanelWidget.cpp @@ -2,6 +2,7 @@ #include "StackWidget.h" #include "HorizontalSpacer.h" #include "VerticalSpacer.h" +#include "TextNode.h" #include "Button.h" TabbedPanelWidget::TabbedPanelWidget() diff --git a/src/geometry/Point.h b/src/geometry/Point.h index ac5c549..1623f9d 100644 --- a/src/geometry/Point.h +++ b/src/geometry/Point.h @@ -9,7 +9,7 @@ class Point { public: - Point(double x, double y, double z = 0); + Point(double x = 0, double y = 0, double z = 0); Point(const DiscretePoint& point); @@ -33,6 +33,17 @@ public: double getDeltaY(const Point& point) const; + bool operator==(const Point& rhs) const + { + return (mX == rhs.mX) + && (mY == rhs.mY) + && (mZ == rhs.mZ); + } + bool operator!=(const Point& rhs) const + { + return !operator==(rhs); + } + private: double mX{0}; double mY{0}; diff --git a/src/graphics/DrawingContext.cpp b/src/graphics/DrawingContext.cpp index d7b4d1d..cdf44fb 100644 --- a/src/graphics/DrawingContext.cpp +++ b/src/graphics/DrawingContext.cpp @@ -12,7 +12,6 @@ DrawingContext::DrawingContext(DrawingSurface* surface, FontsManager* fontsManager, DrawingMode requestedDrawingMode) : mSurface(surface), mDrawingMode(requestedDrawingMode), - mScene(std::make_unique()), mFontsManager(fontsManager) { mPainter = PainterFactory::Create(mDrawingMode); @@ -23,11 +22,6 @@ std::unique_ptr DrawingContext::Create(DrawingSurface* surface, return std::make_unique(surface, fontsManager, requestedDrawingMode); } -Scene* DrawingContext::getScene() const -{ - return mScene.get(); -} - DrawingSurface* DrawingContext::getSurface() const { return mSurface; @@ -40,6 +34,10 @@ FontsManager* DrawingContext::getFontsManager() const void DrawingContext::paint() { - mScene->update(mFontsManager, mDrawingMode == DrawingMode::RASTER ? mSurface->getImage() : nullptr); + if (mDrawingMode == DrawingMode::GRAPH) + { + mSurface->getScene()->update(mFontsManager); + } + mPainter->paint(this); } diff --git a/src/graphics/DrawingContext.h b/src/graphics/DrawingContext.h index 3140a54..ab02755 100644 --- a/src/graphics/DrawingContext.h +++ b/src/graphics/DrawingContext.h @@ -3,7 +3,6 @@ #include #include -class Scene; class AbstractPainter; class DrawingSurface; class FontsManager; @@ -21,8 +20,6 @@ public: static std::unique_ptr Create(DrawingSurface* surface, FontsManager* fontsManager, DrawingMode requestedDrawingMode); - Scene* getScene() const; - DrawingSurface* getSurface() const; FontsManager* getFontsManager() const; @@ -33,7 +30,7 @@ private: DrawingMode mDrawingMode; FontsManager* mFontsManager{nullptr}; DrawingSurface* mSurface{nullptr}; - std::unique_ptr mScene; + std::unique_ptr mPainter; }; diff --git a/src/graphics/DrawingSurface.cpp b/src/graphics/DrawingSurface.cpp index abfe459..5f7dd38 100644 --- a/src/graphics/DrawingSurface.cpp +++ b/src/graphics/DrawingSurface.cpp @@ -1,6 +1,14 @@ #include "DrawingSurface.h" #include "Image.h" +#include "Scene.h" + +#include "RootNode.h" + +DrawingSurface::DrawingSurface() +{ + +} std::unique_ptr DrawingSurface::Create() { @@ -23,6 +31,15 @@ unsigned DrawingSurface::getHeight() const return mHeight; } +Scene* DrawingSurface::getScene() +{ + if (!mScene) + { + mScene = std::make_unique(); + } + return mScene.get(); +} + Image* DrawingSurface::getImage() { if (!mBackingImage) diff --git a/src/graphics/DrawingSurface.h b/src/graphics/DrawingSurface.h index c89a1e9..07b9c44 100644 --- a/src/graphics/DrawingSurface.h +++ b/src/graphics/DrawingSurface.h @@ -2,13 +2,15 @@ #include +class Scene; + template class Image; class DrawingSurface { public: - DrawingSurface() = default; + DrawingSurface(); virtual ~DrawingSurface() = default; static std::unique_ptr Create(); @@ -21,8 +23,11 @@ public: Image* getImage(); + Scene* getScene(); + protected: unsigned mWidth = 0; unsigned mHeight = 0; + std::unique_ptr mScene; std::unique_ptr > mBackingImage; }; diff --git a/src/graphics/opengl/OpenGlMeshPainter.cpp b/src/graphics/opengl/OpenGlMeshPainter.cpp index d0d903e..ebe5807 100644 --- a/src/graphics/opengl/OpenGlMeshPainter.cpp +++ b/src/graphics/opengl/OpenGlMeshPainter.cpp @@ -2,6 +2,7 @@ #include "DrawingContext.h" #include "DrawingSurface.h" +#include "SceneModel.h" #include "TriMesh.h" #include "OpenGlShaderProgram.h" @@ -64,12 +65,12 @@ void OpenGlMeshPainter::paint(const std::vector& verts, const std::vector int vertexColorLocation = glGetUniformLocation(mShaderProgram->getHandle(), "ourColor"); glUniform4f(vertexColorLocation, float(color[0]), float(color[1]), float(color[2]), float(color[3])); - //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glBindVertexArray(0); } -void OpenGlMeshPainter::paint(TriMesh* mesh, DrawingContext* context) +void OpenGlMeshPainter::paint(SceneModel* model, DrawingContext* context) { if (!mShaderProgram) { @@ -85,27 +86,29 @@ void OpenGlMeshPainter::paint(TriMesh* mesh, DrawingContext* context) const auto width = float(surface->getWidth()); const auto height = float(surface->getHeight()); + auto mesh = dynamic_cast(model->getMesh()); + + auto transform = model->getTransform(); + auto vertices = mesh->getVerticesFlat(); for (std::size_t idx = 0; idxgetFaceNodeIds(); - std::vector color(4, 1.0f); - if (mesh->hasVectorAttribute("Color")) - { - auto mesh_color = mesh->getVectorAttribute("Color"); - color = {float(mesh_color[0]), float(mesh_color[1]), float(mesh_color[2]), float(mesh_color[3])}; - } + auto model_color = model->getColor().getAsVectorDouble(); + std::vector color = {float(model_color[0]), float(model_color[1]), float(model_color[2]), float(model_color[3])}; paint(vertices, indices, color); } diff --git a/src/graphics/opengl/OpenGlMeshPainter.h b/src/graphics/opengl/OpenGlMeshPainter.h index c59f14c..d3cf7d7 100644 --- a/src/graphics/opengl/OpenGlMeshPainter.h +++ b/src/graphics/opengl/OpenGlMeshPainter.h @@ -5,14 +5,14 @@ class DrawingContext; class OpenGlShaderProgram; -class TriMesh; +class SceneModel; class OpenGlMeshPainter { public: OpenGlMeshPainter(); - void paint(TriMesh* mesh, DrawingContext* context); + void paint(SceneModel* model, DrawingContext* context); private: void initializeShader(); diff --git a/src/graphics/opengl/OpenGlPainter.cpp b/src/graphics/opengl/OpenGlPainter.cpp index 838bce2..809911c 100644 --- a/src/graphics/opengl/OpenGlPainter.cpp +++ b/src/graphics/opengl/OpenGlPainter.cpp @@ -3,6 +3,9 @@ #include "DrawingContext.h" #include "DrawingSurface.h" #include "Scene.h" +#include "SceneItem.h" +#include "SceneModel.h" +#include "SceneText.h" #include "TriMesh.h" @@ -51,18 +54,19 @@ void OpenGlPainter::paint(DrawingContext* context) glClearColor(0.5, 0.5, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); - const auto num_mesh = context->getScene()->getNumMeshes(); - for (std::size_t idx=0 ; idx< num_mesh; idx++) + for(unsigned idx=0; idxgetSurface()->getScene()->getNumItems(); idx++) { - auto mesh = context->getScene()->getMesh(idx); - mMeshPainter->paint(mesh, context); + auto scene_item = context->getSurface()->getScene()->getItem(idx); + if (scene_item->getType() == SceneItem::Type::MODEL) + { + mMeshPainter->paint(dynamic_cast(scene_item), context); + } + else + { + mTextPainter->paint(dynamic_cast(scene_item), context); + break; + } } - auto text_data = context->getScene()->getTextData(); - for (const auto& text_item : context->getScene()->getTextData()) - { - mTextPainter->paint(text_item, context); - break; - } glFlush(); } diff --git a/src/graphics/opengl/OpenGlTextPainter.cpp b/src/graphics/opengl/OpenGlTextPainter.cpp index ce79d69..727bf05 100644 --- a/src/graphics/opengl/OpenGlTextPainter.cpp +++ b/src/graphics/opengl/OpenGlTextPainter.cpp @@ -10,6 +10,8 @@ #include "OpenGlShaderProgram.h" #include "TextData.h" +#include "SceneText.h" + #include "File.h" #ifdef _WIN32 @@ -69,7 +71,7 @@ void OpenGlTextPainter::initializeBuffers() glBindVertexArray(0); } -void OpenGlTextPainter::paint(const TextData& textData, DrawingContext* context) +void OpenGlTextPainter::paint(SceneText* text, DrawingContext* context) { if (!mShaderProgram) { @@ -81,12 +83,15 @@ void OpenGlTextPainter::paint(const TextData& textData, DrawingContext* context) initializeBuffers(); } - initializeTextures(textData, context); + auto text_data = text->getTextData(); + + initializeTextures(text_data, context); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glUseProgram(mShaderProgram->getHandle()); + glUniform3f(glGetUniformLocation(mShaderProgram->getHandle(), "textColor"), 0.0, 0.0, 0.0); const auto width = float(context->getSurface()->getWidth()); @@ -97,9 +102,11 @@ void OpenGlTextPainter::paint(const TextData& textData, DrawingContext* context) glActiveTexture(GL_TEXTURE0); glBindVertexArray(mVertexArray); - float x = textData.mLocation.GetX(); - const float y = height - textData.mLocation.GetY(); - for (auto c : textData.mContent) + auto transform = text->getTransform(); + + float x = transform.getLocation().getX(); + const float y = height - transform.getLocation().getY(); + for (auto c : text_data.mContent) { auto texture = mFontTextures[c].get(); diff --git a/src/graphics/opengl/OpenGlTextPainter.h b/src/graphics/opengl/OpenGlTextPainter.h index 8c425ba..fb943ad 100644 --- a/src/graphics/opengl/OpenGlTextPainter.h +++ b/src/graphics/opengl/OpenGlTextPainter.h @@ -8,13 +8,14 @@ class OpenGlFontTexture; class OpenGlShaderProgram; class TextData; +class SceneText; class OpenGlTextPainter { public: OpenGlTextPainter(); - void paint(const TextData& textData, DrawingContext* context); + void paint(SceneText* text, DrawingContext* context); private: void initializeShader(); diff --git a/src/mesh/AbstractMesh.h b/src/mesh/AbstractMesh.h index a27414e..86183ed 100644 --- a/src/mesh/AbstractMesh.h +++ b/src/mesh/AbstractMesh.h @@ -3,5 +3,15 @@ class AbstractMesh { public: + + enum class MeshType + { + LINE, + TRI, + QUAD + }; + virtual ~AbstractMesh() = default; + + virtual MeshType getType() const = 0; }; diff --git a/src/mesh/TriMesh.h b/src/mesh/TriMesh.h index c310e20..f58ed0f 100644 --- a/src/mesh/TriMesh.h +++ b/src/mesh/TriMesh.h @@ -59,6 +59,11 @@ public: std::vector getVectorAttribute(const std::string& tag) const; + MeshType getType() const + { + return MeshType::TRI; + } + private: std::unordered_map > mVectorAttributes; VecNodes mNodes; diff --git a/src/ui_elements/desktop_elements/Window.cpp b/src/ui_elements/desktop_elements/Window.cpp index f528ce9..b175c99 100644 --- a/src/ui_elements/desktop_elements/Window.cpp +++ b/src/ui_elements/desktop_elements/Window.cpp @@ -5,9 +5,10 @@ #include "KeyboardEvent.h" #include "Widget.h" -#include "VisualLayer.h" #include "Scene.h" #include "TriMesh.h" +#include "RootNode.h" +#include "TransformNode.h" #include "AbstractPainter.h" #include "DrawingContext.h" @@ -119,7 +120,10 @@ void Window::doPaint(mt::Screen* screen) { mPlatformWindow->beforePaint(screen); - mDrawingContext->getScene()->syncLayers(mWidget->getLayers()); + if (mScene && mScene->getRootNode()->getNumChildren() == 0) + { + mScene->getRootNode()->addChild(mWidget->getRootNode()); + } mDrawingContext->paint(); diff --git a/src/ui_elements/widgets/Button.cpp b/src/ui_elements/widgets/Button.cpp index 458e7f1..b7abde8 100644 --- a/src/ui_elements/widgets/Button.cpp +++ b/src/ui_elements/widgets/Button.cpp @@ -2,7 +2,8 @@ #include "TextNode.h" #include "GeometryNode.h" -#include "VisualLayer.h" +#include "TransformNode.h" + #include "MouseEvent.h" #include @@ -32,7 +33,7 @@ void Button::setLabel(const std::string& text) if (text != mLabel) { mLabel = text; - mDirty = true; + mContentDirty = true; } } @@ -53,36 +54,36 @@ void Button::onMyMouseEvent(const MouseEvent* event) } } -void Button::onPaintEvent(const PaintEvent* event) +bool Button::isDirty() const { - if (!needsUpdate()) - { - return; - } - mLayers.clear(); - - if (mDirty) - { - mMyLayers.clear(); - if(!mVisible) - { - return; - } - addBackground(event); - - if(!mLabel.empty()) - { - unsigned fontOffset = unsigned(mLabel.size()) * 4; - auto middle = DiscretePoint(mLocation.GetX() + mSize.mWidth/2 - fontOffset, mLocation.GetY() + mSize.mHeight/2 + 4); - - auto textLayer = VisualLayer::Create(); - auto node = TextNode::Create(mLabel, middle); - node->setFillColor(mBackgroundColor); - textLayer->setTextNode(std::move(node)); - mMyLayers.push_back(std::move(textLayer)); - } - mDirty = false; - addMyLayers(); - } - + return Widget::isDirty() || mContentDirty; +} + +void Button::doPaint(const PaintEvent* event) +{ + updateBackground(event); + updateLabel(event); +} + +void Button::updateLabel(const PaintEvent* event) +{ + unsigned fontOffset = unsigned(mLabel.size()) * 4; + auto middle = DiscretePoint(mLocation.GetX() + mSize.mWidth/2 - fontOffset, mLocation.GetY() + mSize.mHeight/2 + 4); + + if (!mTextNode) + { + mTextNode = TextNode::Create(mLabel, middle); + mRootNode->addChild(mTextNode.get()); + } + + if (mMaterialDirty) + { + mTextNode->setFillColor(mBackgroundColor); + } + + if (mContentDirty) + { + mTextNode->setContent(mLabel); + mContentDirty = false; + } } diff --git a/src/ui_elements/widgets/Button.h b/src/ui_elements/widgets/Button.h index b93fe9d..e6c3632 100644 --- a/src/ui_elements/widgets/Button.h +++ b/src/ui_elements/widgets/Button.h @@ -8,6 +8,7 @@ class PaintEvent; class MouseEvent; +class TextNode; class Button : public Widget { @@ -25,13 +26,19 @@ public: protected: void onMyMouseEvent(const MouseEvent* event) override; - void onPaintEvent(const PaintEvent* event) override; + bool isDirty() const override; + void doPaint(const PaintEvent* event) override; + + void updateLabel(const PaintEvent* event); private: std::string mLabel; clickFunc mClickFunc; Color mCachedColor; Color mClickedColor; + + std::unique_ptr mTextNode; + bool mContentDirty{true}; }; using ButtonUPtr = std::unique_ptr