diff --git a/client/src/main.cpp b/client/src/main.cpp index 5cb545c..1857d26 100644 --- a/client/src/main.cpp +++ b/client/src/main.cpp @@ -41,6 +41,8 @@ int main() { glfwMakeContextCurrent(window); glewInit(); + dataModel->Init(); + workspace = dataModel->workspace; simulationInit(); renderInit(window, 1200, 900); diff --git a/editor/mainwindow.cpp b/editor/mainwindow.cpp index 2043434..7b271e7 100644 --- a/editor/mainwindow.cpp +++ b/editor/mainwindow.cpp @@ -18,6 +18,7 @@ #include "objects/part.h" #include "qitemselectionmodel.h" #include "qobject.h" +#include "qsysinfo.h" SelectedTool selectedTool; @@ -25,6 +26,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { + dataModel->Init(); + workspace = dataModel->workspace; + ui->setupUi(this); timer.start(33, this); setMouseTracking(true); diff --git a/src/common.cpp b/src/common.cpp index 183c5f6..3816179 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -5,7 +5,9 @@ Camera camera(glm::vec3(0.0, 0.0, 3.0)); //std::vector parts; -std::shared_ptr workspace = Workspace::New(); +std::shared_ptr dataModel = DataModel::New(); +std::shared_ptr workspace = dataModel->workspace; +// std::shared_ptr workspace = Workspace::New(); std::optional hierarchyPreUpdateHandler; std::optional hierarchyPostUpdateHandler; diff --git a/src/common.h b/src/common.h index 2600cfc..d1ea23c 100644 --- a/src/common.h +++ b/src/common.h @@ -14,6 +14,7 @@ typedef std::function oldSelection, std::vecto // TEMPORARY COMMON DATA FOR VARIOUS INTERNAL COMPONENTS extern Camera camera; +extern std::shared_ptr dataModel; extern std::shared_ptr workspace; extern std::optional hierarchyPreUpdateHandler; extern std::optional hierarchyPostUpdateHandler; diff --git a/src/objects/base/instance.h b/src/objects/base/instance.h index a9e861e..d75001e 100644 --- a/src/objects/base/instance.h +++ b/src/objects/base/instance.h @@ -45,6 +45,8 @@ protected: virtual ~Instance(); virtual void OnParentUpdated(std::optional> oldParent, std::optional> newParent); + + template inline std::shared_ptr shared() { return std::dynamic_pointer_cast(this->shared_from_this()); } public: const static InstanceType TYPE; std::string name; diff --git a/src/objects/base/service.cpp b/src/objects/base/service.cpp new file mode 100644 index 0000000..c206bda --- /dev/null +++ b/src/objects/base/service.cpp @@ -0,0 +1,4 @@ +#include "service.h" +#include + +Service::Service(std::weak_ptr root) : dataModel(root) {} \ No newline at end of file diff --git a/src/objects/base/service.h b/src/objects/base/service.h new file mode 100644 index 0000000..ea167dd --- /dev/null +++ b/src/objects/base/service.h @@ -0,0 +1,12 @@ +#pragma once + +// Services are top-level singletons and belong to a specific DataModel +// They serve one specific task and can be accessed using game:GetService +#include "objects/datamodel.h" +#include +class Service { +protected: + std::weak_ptr dataModel; + + Service(std::weak_ptr root); +}; \ No newline at end of file diff --git a/src/objects/datamodel.cpp b/src/objects/datamodel.cpp new file mode 100644 index 0000000..ea09ec9 --- /dev/null +++ b/src/objects/datamodel.cpp @@ -0,0 +1,21 @@ +#include "datamodel.h" +#include "workspace.h" +#include + +const InstanceType DataModel::TYPE = { + .super = &Instance::TYPE, + .className = "DataModel", + .constructor = nullptr, +}; + +const InstanceType* DataModel::GetClass() { + return &TYPE; +} + +DataModel::DataModel() + : Instance(&TYPE) { +} + +void DataModel::Init() { + this->workspace = std::make_shared(shared()); +} \ No newline at end of file diff --git a/src/objects/datamodel.h b/src/objects/datamodel.h new file mode 100644 index 0000000..02a3408 --- /dev/null +++ b/src/objects/datamodel.h @@ -0,0 +1,21 @@ +#pragma once + +#include "base.h" +#include + +class Workspace; + +// The root instance to all objects in the hierarchy +class DataModel : public Instance { +//private: +public: + const static InstanceType TYPE; + + std::shared_ptr workspace; + + DataModel(); + void Init(); + + static inline std::shared_ptr New() { return std::make_shared(); }; + virtual const InstanceType* GetClass() override; +}; \ No newline at end of file diff --git a/src/objects/workspace.cpp b/src/objects/workspace.cpp index 9b75220..7886908 100644 --- a/src/objects/workspace.cpp +++ b/src/objects/workspace.cpp @@ -3,12 +3,13 @@ const InstanceType Workspace::TYPE = { .super = &Instance::TYPE, .className = "Workspace", - .constructor = &Workspace::Create, + // .constructor = &Workspace::Create, + .explorerIcon = "workspace", }; const InstanceType* Workspace::GetClass() { return &TYPE; } -Workspace::Workspace(): Instance(&TYPE) { +Workspace::Workspace(std::weak_ptr dataModel): Instance(&TYPE), Service(dataModel) { } diff --git a/src/objects/workspace.h b/src/objects/workspace.h index a70eebe..d29e1f0 100644 --- a/src/objects/workspace.h +++ b/src/objects/workspace.h @@ -1,16 +1,17 @@ #pragma once #include "base.h" +#include "objects/base/service.h" #include -class Workspace : public Instance { +class Workspace : public Instance, Service { //private: public: const static InstanceType TYPE; - Workspace(); + Workspace(std::weak_ptr dataModel); - static inline std::shared_ptr New() { return std::make_shared(); }; - static inline InstanceRef Create() { return std::make_shared(); }; + // static inline std::shared_ptr New() { return std::make_shared(); }; + // static inline InstanceRef Create() { return std::make_shared(); }; virtual const InstanceType* GetClass() override; }; \ No newline at end of file