diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6393f1960..d4ed1fb2b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,7 +16,7 @@ on: env: QT_VERSION: 5.15.2 - QTCREATOR_VERSION: 10.0.2 + QTCREATOR_VERSION: 11.0.3 VERSION: 2024.1 THUNDER_RELEASE: ${{ startsWith(github.ref, 'refs/tags/2') }} @@ -135,7 +135,7 @@ jobs: needs: version env: - QTCREATOR_VERSION: 10.0.2 + QTCREATOR_VERSION: 11.0.3 steps: - name: Checkout repository @@ -170,7 +170,7 @@ jobs: needs: version env: - QTCREATOR_VERSION: 10.0.2 + QTCREATOR_VERSION: 11.0.3 steps: - name: Checkout repository diff --git a/engine/includes/components/actor.h b/engine/includes/components/actor.h index d04f52c8c..a95203723 100644 --- a/engine/includes/components/actor.h +++ b/engine/includes/components/actor.h @@ -10,7 +10,7 @@ class Transform; class Prefab; class ENGINE_EXPORT Actor : public Object { - A_REGISTER(Actor, Object, Scene) + A_REGISTER(Actor, Object, Actor) A_PROPERTIES( A_PROPERTY(bool, enabled, Actor::isEnabled, Actor::setEnabled), diff --git a/engine/includes/components/gui/frame.h b/engine/includes/components/gui/frame.h index e70ff0120..eb6329fe8 100644 --- a/engine/includes/components/gui/frame.h +++ b/engine/includes/components/gui/frame.h @@ -1,12 +1,23 @@ #ifndef FRAME_H #define FRAME_H -#include "image.h" +#include "widget.h" -class ENGINE_EXPORT Frame : public Image { - A_REGISTER(Frame, Image, Components/UI) +class Mesh; +class MaterialInstance; - A_NOPROPERTIES() +class ENGINE_EXPORT Frame : public Widget { + A_REGISTER(Frame, Widget, Components/UI) + + A_PROPERTIES( + A_PROPERTY(Vector4, corners, Frame::corners, Frame::setCorners), + A_PROPERTY(float, borderWidth, Frame::borderWidth, Frame::setBorderWidth), + A_PROPERTYEX(Vector4, color, Frame::color, Frame::setColor, "editor=Color"), + A_PROPERTYEX(Vector4, topColor, Frame::topColor, Frame::setTopColor, "editor=Color"), + A_PROPERTYEX(Vector4, rightColor, Frame::rightColor, Frame::setRightColor, "editor=Color"), + A_PROPERTYEX(Vector4, bottomColor, Frame::bottomColor, Frame::setBottomColor, "editor=Color"), + A_PROPERTYEX(Vector4, leftColor, Frame::leftColor, Frame::setLeftColor, "editor=Color") + ) A_NOMETHODS() A_NOENUMS() @@ -19,17 +30,41 @@ class ENGINE_EXPORT Frame : public Image { float borderWidth() const; void setBorderWidth(float width); - Vector4 borderColor() const; - void setBorderColor(Vector4 color); + Vector4 color() const; + void setColor(const Vector4 color); + + Vector4 topColor() const; + void setTopColor(Vector4 color); + + Vector4 rightColor() const; + void setRightColor(Vector4 color); + + Vector4 bottomColor() const; + void setBottomColor(Vector4 color); + + Vector4 leftColor() const; + void setLeftColor(Vector4 color); - void setMaterial(Material *material) override; + void setBorderColor(Vector4 color); protected: void boundChanged(const Vector2 &bounds) override; -private: - Vector4 m_borderColor; + void draw(CommandBuffer &buffer) override; + +protected: Vector4 m_cornerRadius; + Vector4 m_frameColor; + Vector4 m_topColor; + Vector4 m_rightColor; + Vector4 m_bottomColor; + Vector4 m_leftColor; + + Vector2 m_meshSize; + + Mesh *m_mesh; + + MaterialInstance *m_material; float m_borderWidth; diff --git a/engine/includes/components/gui/image.h b/engine/includes/components/gui/image.h index 0cd1a8839..6cb39e3a7 100644 --- a/engine/includes/components/gui/image.h +++ b/engine/includes/components/gui/image.h @@ -6,9 +6,9 @@ #include #include -class MaterialInstance; class Mesh; class Texture; +class MaterialInstance; class ENGINE_EXPORT Image : public Widget { A_REGISTER(Image, Widget, Components/UI) @@ -57,7 +57,7 @@ class ENGINE_EXPORT Image : public Widget { void setDrawMode(int mode); protected: - void draw(CommandBuffer &buffer, uint32_t layer) override; + void draw(CommandBuffer &buffer) override; void loadUserData(const VariantMap &data) override; VariantMap saveUserData() const override; diff --git a/engine/includes/components/gui/label.h b/engine/includes/components/gui/label.h index 509f355f8..abcd23f49 100644 --- a/engine/includes/components/gui/label.h +++ b/engine/includes/components/gui/label.h @@ -53,7 +53,7 @@ class ENGINE_EXPORT Label : public Widget { void setClipOffset(const Vector2 &offset); private: - void draw(CommandBuffer &buffer, uint32_t layer) override; + void draw(CommandBuffer &buffer) override; void loadData(const VariantList &data) override; void loadUserData(const VariantMap &data) override; @@ -76,8 +76,6 @@ class ENGINE_EXPORT Label : public Widget { Vector2 m_clipOffset; - Label *m_label; - Font *m_font; MaterialInstance *m_material; diff --git a/engine/includes/components/gui/layout.h b/engine/includes/components/gui/layout.h index beb3288f5..66e549a05 100644 --- a/engine/includes/components/gui/layout.h +++ b/engine/includes/components/gui/layout.h @@ -15,16 +15,19 @@ class ENGINE_EXPORT Layout { ~Layout(); void addLayout(Layout *layout); - void addWidget(Widget *widget); + void addTransform(RectTransform *transform); void insertLayout(int index, Layout *layout); - void insertWidget(int index, Widget *widget); + void insertTransform(int index, RectTransform *transform); void removeLayout(Layout *layout); - void removeWidget(Widget *widget); + void removeTransform(RectTransform *transform); int indexOf(const Layout *layout) const; - int indexOf(const Widget *widget) const; + int indexOf(const RectTransform *transform) const; + + RectTransform *rectTransform(); + void setRectTransform(RectTransform *transform); int count() const; @@ -49,10 +52,12 @@ class ENGINE_EXPORT Layout { Vector2 m_position; - Widget *m_attachedWidget; - Layout *m_parentLayout; + RectTransform *m_attachedTransform; + + RectTransform *m_rectTransform; + float m_spacing; int m_direction; diff --git a/engine/includes/components/gui/progressbar.h b/engine/includes/components/gui/progressbar.h index 97b139a00..f57cbaf19 100644 --- a/engine/includes/components/gui/progressbar.h +++ b/engine/includes/components/gui/progressbar.h @@ -3,16 +3,17 @@ #include "frame.h" -class ENGINE_EXPORT ProgressBar : public Frame { +class ENGINE_EXPORT ProgressBar : public Widget { A_REGISTER(ProgressBar, Widget, Components/UI) A_PROPERTIES( A_PROPERTY(float, from, ProgressBar::from, ProgressBar::setFrom), A_PROPERTY(float, to, ProgressBar::to, ProgressBar::setTo), A_PROPERTY(float, value, ProgressBar::value, ProgressBar::setValue), - A_PROPERTYEX(Frame *, progress, ProgressBar::progress, ProgressBar::setProgress, "editor=Component"), A_PROPERTYEX(Vector4, backgroundColor, ProgressBar::backgroundColor, ProgressBar::setBackgroundColor, "editor=Color"), - A_PROPERTYEX(Vector4, progressColor, ProgressBar::progressColor, ProgressBar::setProgressColor, "editor=Color") + A_PROPERTYEX(Vector4, progressColor, ProgressBar::progressColor, ProgressBar::setProgressColor, "editor=Color"), + A_PROPERTYEX(Frame *, background, ProgressBar::background, ProgressBar::setBackground, "editor=Component"), + A_PROPERTYEX(Frame *, progress, ProgressBar::progress, ProgressBar::setProgress, "editor=Component") ) A_NOMETHODS() A_NOENUMS() @@ -29,15 +30,18 @@ class ENGINE_EXPORT ProgressBar : public Frame { float value() const; void setValue(float value); - Frame *progress() const; - void setProgress(Frame *frame); - Vector4 backgroundColor() const; void setBackgroundColor(const Vector4 color); Vector4 progressColor() const; void setProgressColor(const Vector4 color); + Frame *progress() const; + void setProgress(Frame *frame); + + Frame *background() const; + void setBackground(Frame *frame); + private: void loadUserData(const VariantMap &data) override; VariantMap saveUserData() const override; @@ -52,12 +56,13 @@ class ENGINE_EXPORT ProgressBar : public Frame { Vector4 m_backgroundColor; Vector4 m_progressColor; + Frame *m_progress; + Frame *m_background; + float m_from; float m_to; float m_value; - Frame *m_progress; - }; #endif // PROGRESSBAR_H diff --git a/engine/includes/components/gui/recttransform.h b/engine/includes/components/gui/recttransform.h index ec38c5911..d87fcac5e 100644 --- a/engine/includes/components/gui/recttransform.h +++ b/engine/includes/components/gui/recttransform.h @@ -13,9 +13,8 @@ class ENGINE_EXPORT RectTransform : public Transform { A_PROPERTY(Vector2, size, RectTransform::size, RectTransform::setSize), A_PROPERTY(Vector2, minAnchors, RectTransform::minAnchors, RectTransform::setMinAnchors), A_PROPERTY(Vector2, maxAnchors, RectTransform::maxAnchors, RectTransform::setMaxAnchors), - A_PROPERTY(Vector2, offsetMin, RectTransform::offsetMin, RectTransform::setOffsetMin), - A_PROPERTY(Vector2, offsetMax, RectTransform::offsetMax, RectTransform::setOffsetMax), - A_PROPERTY(Vector2, pivot, RectTransform::pivot, RectTransform::setPivot) + A_PROPERTY(Vector2, pivot, RectTransform::pivot, RectTransform::setPivot), + A_PROPERTY(Vector4, margin, RectTransform::margin, RectTransform::setMargin) ) A_NOMETHODS() @@ -36,13 +35,8 @@ class ENGINE_EXPORT RectTransform : public Transform { void setAnchors(const Vector2 minimum, const Vector2 maximum); - Vector2 offsetMin() const; - void setOffsetMin(const Vector2 offset); - - Vector2 offsetMax() const; - void setOffsetMax(const Vector2 offset); - - void setOffsets(const Vector2 minimum, const Vector2 maximum); + Vector4 margin() const; + void setMargin(const Vector4 margin); bool isHovered(float x, float y) const; @@ -54,25 +48,34 @@ class ENGINE_EXPORT RectTransform : public Transform { Matrix4 worldTransform() const override; + AABBox bound() const; + private: - void setDirty(bool dirty) override; + friend class Layout; + + void setDirty() override; void cleanDirty() const override; void notify(); void recalcSize(); + void resetSize(); private: + list m_subscribers; + + Vector4 m_margin; + Vector2 m_bottomLeft; Vector2 m_topRight; Vector2 m_pivot; Vector2 m_minAnchors; Vector2 m_maxAnchors; Vector2 m_size; - list m_subscribers; Layout *m_layout; + Layout *m_attachedLayout; }; diff --git a/engine/includes/components/gui/textinput.h b/engine/includes/components/gui/textinput.h index b52bd6b12..4c16b7180 100644 --- a/engine/includes/components/gui/textinput.h +++ b/engine/includes/components/gui/textinput.h @@ -1,14 +1,23 @@ #ifndef TEXTINPUT_H #define TEXTINPUT_H -#include "frame.h" +#include "widget.h" class Label; - -class ENGINE_EXPORT TextInput : public Frame { - A_REGISTER(TextInput, Frame, Components/UI) - - A_NOPROPERTIES() +class Frame; + +class ENGINE_EXPORT TextInput : public Widget { + A_REGISTER(TextInput, Widget, Components/UI) + + A_PROPERTIES( + A_PROPERTY(string, text, TextInput::text, TextInput::setText), + A_PROPERTYEX(Vector4, textColor, TextInput::textColor, TextInput::setTextColor, "editor=Color"), + A_PROPERTYEX(Vector4, backgroundColor, TextInput::backgroundColor, TextInput::setBackgroundColor, "editor=Color"), + A_PROPERTYEX(Vector4, hoverColor, TextInput::hoverColor, TextInput::setHoverColor, "editor=Color"), + A_PROPERTYEX(Vector4, pressedColor, TextInput::pressedColor, TextInput::setPressedColor, "editor=Color"), + A_PROPERTYEX(Label *, textComponent, TextInput::textComponent, TextInput::setTextComponent, "editor=Component"), + A_PROPERTYEX(Frame *, background, TextInput::background, TextInput::setBackground, "editor=Component") + ) A_METHODS( A_SIGNAL(TextInput::focusIn), A_SIGNAL(TextInput::focusOut), @@ -19,15 +28,27 @@ class ENGINE_EXPORT TextInput : public Frame { public: TextInput(); - Label *textComponent() const; - void setTextComponent(Label *label); - string text() const; void setText(const string text); Vector4 textColor() const; void setTextColor(Vector4 color); + Vector4 backgroundColor() const; + void setBackgroundColor(Vector4 color); + + Vector4 hoverColor() const; + void setHoverColor(Vector4 color); + + Vector4 pressedColor() const; + void setPressedColor(Vector4 color); + + Label *textComponent() const; + void setTextComponent(Label *label); + + Frame *background() const; + void setBackground(Frame *frame); + public: // signals void focusIn(); void focusOut(); @@ -53,6 +74,8 @@ class ENGINE_EXPORT TextInput : public Frame { Label *m_cursor; Label *m_label; + Frame *m_background; + int32_t m_cursorPosition; float m_fadeDuration; diff --git a/engine/includes/components/gui/widget.h b/engine/includes/components/gui/widget.h index f7e0cd9f4..6536c90d1 100644 --- a/engine/includes/components/gui/widget.h +++ b/engine/includes/components/gui/widget.h @@ -3,7 +3,6 @@ #include "../nativebehaviour.h" -class Layout; class RectTransform; class CommandBuffer; @@ -21,17 +20,18 @@ class ENGINE_EXPORT Widget : public NativeBehaviour { Widget(); ~Widget(); + string style() const; + void setStyle(const string style); + Widget *parentWidget(); RectTransform *rectTransform() const; - bool isVisible() const; - - static Widget *focusWidget(); + bool isInternal(); - virtual void draw(CommandBuffer &buffer, uint32_t layer); + void makeInternal(); - virtual AABBox bound() const; + static Widget *focusWidget(); public: // slots void lower(); @@ -39,6 +39,8 @@ class ENGINE_EXPORT Widget : public NativeBehaviour { void raise(); protected: + virtual void draw(CommandBuffer &buffer); + virtual void boundChanged(const Vector2 &size); void setRectTransform(RectTransform *transform); @@ -51,23 +53,27 @@ class ENGINE_EXPORT Widget : public NativeBehaviour { void setParent(Object *parent, int32_t position = -1, bool force = false) override; - static void setFocusWidget(Widget *widget); - void drawGizmosSelected() override; + static void setFocusWidget(Widget *widget); + private: void setSystem(ObjectSystem *system) override; private: + friend class PipelineContext; friend class RectTransform; - friend class Layout; + friend class UiLoader; + + string m_style; Widget *m_parent; RectTransform *m_transform; - Layout *m_attachedLayout; static Widget *m_focusWidget; + bool m_internal; + }; #endif // WIDGET_H diff --git a/engine/includes/components/renderable.h b/engine/includes/components/renderable.h index e4a63f29b..975d74bc4 100644 --- a/engine/includes/components/renderable.h +++ b/engine/includes/components/renderable.h @@ -22,8 +22,6 @@ class ENGINE_EXPORT Renderable : public NativeBehaviour { Renderable(); ~Renderable(); - virtual void draw(CommandBuffer &buffer, uint32_t layer); - virtual AABBox bound() const; virtual int priority() const; @@ -32,6 +30,8 @@ class ENGINE_EXPORT Renderable : public NativeBehaviour { virtual void setMaterial(Material *material); protected: + virtual void draw(CommandBuffer &buffer, uint32_t layer); + virtual AABBox localBound() const; void loadUserData(const VariantMap &data) override; @@ -43,6 +43,8 @@ class ENGINE_EXPORT Renderable : public NativeBehaviour { void setSystem(ObjectSystem *system) override; protected: + friend class PipelineContext; + vector m_materials; uint32_t m_surfaceType; diff --git a/engine/includes/components/transform.h b/engine/includes/components/transform.h index e7f7e107b..d2ccc60d2 100644 --- a/engine/includes/components/transform.h +++ b/engine/includes/components/transform.h @@ -42,9 +42,6 @@ class ENGINE_EXPORT Transform : public Component { Vector3 scale() const; void setScale(const Vector3 scale); - bool dirty() const; - virtual void setDirty(bool dirty); - Transform *parentTransform() const; void setParentTransform(Transform *parent, bool force = false); @@ -63,6 +60,7 @@ class ENGINE_EXPORT Transform : public Component { protected: const list &children() const; + virtual void setDirty(); virtual void cleanDirty() const; protected: diff --git a/engine/includes/editor/viewport/viewport.h b/engine/includes/editor/viewport/viewport.h index 617b00196..ead5c5318 100644 --- a/engine/includes/editor/viewport/viewport.h +++ b/engine/includes/editor/viewport/viewport.h @@ -35,9 +35,12 @@ class ENGINE_EXPORT Viewport : public QWidget { float gridCell(); - bool isGamePaused(); + bool isGamePaused() const; void setGamePaused(bool pause); + bool isLiveUpdate() const; + void setLiveUpdate(bool update); + void setGameView(bool enabled); void setGridEnabled(bool enabled); @@ -97,6 +100,7 @@ protected slots: bool m_gameView; bool m_gamePaused; + bool m_liveUpdate; }; diff --git a/engine/includes/gizmos.h b/engine/includes/gizmos.h index 8c0eb2e5a..055ca1ea0 100644 --- a/engine/includes/gizmos.h +++ b/engine/includes/gizmos.h @@ -14,8 +14,6 @@ class CommandBuffer; class ENGINE_EXPORT Gizmos { public: - static void setViewProjection(const Matrix4 &view, const Matrix4 &projection); - static void drawBox(const Vector3 ¢er, const Vector3 &size, const Vector4 &color, const Matrix4 &transform = Matrix4()); static void drawIcon(const Vector3 ¢er, const Vector2 &size, const string &name, const Vector4 &color, const Matrix4 &transform = Matrix4()); static void drawMesh(Mesh &mesh, const Vector4 &color, const Matrix4 &transform = Matrix4()); diff --git a/engine/includes/pipelinecontext.h b/engine/includes/pipelinecontext.h index eab213ff1..e36011871 100644 --- a/engine/includes/pipelinecontext.h +++ b/engine/includes/pipelinecontext.h @@ -42,7 +42,9 @@ class ENGINE_EXPORT PipelineContext : public Object { void cameraReset(); - void drawRenderers(uint32_t layer, const list &list); + void drawRenderers(const list &list, uint32_t layer, uint32_t flags = 0); + + void drawWidgets(); void setMaxTexture(uint32_t size); @@ -57,7 +59,6 @@ class ENGINE_EXPORT PipelineContext : public Object { list &sceneComponents(); list &culledComponents(); list &sceneLights(); - list &uiComponents(); list frustumCulling(const array &frustum, list &list, AABBox &bb); diff --git a/engine/src/components/gui/abstractbutton.cpp b/engine/src/components/gui/abstractbutton.cpp index 6a85f49bf..4338ef9bf 100644 --- a/engine/src/components/gui/abstractbutton.cpp +++ b/engine/src/components/gui/abstractbutton.cpp @@ -3,6 +3,7 @@ #include "components/gui/recttransform.h" #include "components/gui/frame.h" #include "components/gui/label.h" +#include "components/gui/image.h" #include "components/actor.h" #include "components/textrender.h" @@ -381,6 +382,7 @@ void AbstractButton::composeComponent() { Actor *background = Engine::composeActor(gBackground, "Background", actor()); Frame *frame = static_cast(background->component(gBackground)); frame->setCorners(Vector4(gCorner)); + frame->makeInternal(); setBackground(frame); // Add label @@ -388,6 +390,7 @@ void AbstractButton::composeComponent() { Label *label = static_cast