diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index d82a657..b530437 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1 +1,5 @@ +find_package(Qt5Widgets CONFIG REQUIRED) + +add_subdirectory(common) add_subdirectory(leveleditor) +add_subdirectory(materialeditor) diff --git a/tools/common/CMakeLists.txt b/tools/common/CMakeLists.txt new file mode 100644 index 0000000..6aff008 --- /dev/null +++ b/tools/common/CMakeLists.txt @@ -0,0 +1,12 @@ +set(INCLUDE_FILES + include/renderwindow.h) + +qt5_wrap_cpp(EDITOR_SRC ${INCLUDE_FILES}) + +add_library(EditorCommon + src/qt.cpp + src/renderwindow.cpp + src/editorstyle.cpp + ${EDITOR_SRC}) +target_include_directories(EditorCommon PUBLIC include) +target_link_libraries(EditorCommon PRIVATE Engine Qt5::Widgets) diff --git a/tools/leveleditor/include/context.h b/tools/common/include/context.h similarity index 100% rename from tools/leveleditor/include/context.h rename to tools/common/include/context.h diff --git a/tools/leveleditor/include/editorstyle.h b/tools/common/include/editorstyle.h similarity index 100% rename from tools/leveleditor/include/editorstyle.h rename to tools/common/include/editorstyle.h diff --git a/tools/leveleditor/include/renderwindow.h b/tools/common/include/renderwindow.h similarity index 100% rename from tools/leveleditor/include/renderwindow.h rename to tools/common/include/renderwindow.h diff --git a/tools/leveleditor/src/editorstyle.cpp b/tools/common/src/editorstyle.cpp similarity index 100% rename from tools/leveleditor/src/editorstyle.cpp rename to tools/common/src/editorstyle.cpp diff --git a/tools/common/src/qt.cpp b/tools/common/src/qt.cpp new file mode 100644 index 0000000..523e555 --- /dev/null +++ b/tools/common/src/qt.cpp @@ -0,0 +1,26 @@ +#include +#include + +#include "platform.h" + +static std::vector extensionList; + +std::vector platform::getRequiredExtensions() { + QVulkanInstance instance; + instance.create(); + + for(const auto& extension : instance.extensions()) + extensionList.push_back(extension.data()); + + instance.destroy(); + + std::vector extensions; + for(const auto& extension : extensionList) + extensions.push_back(extension.c_str()); + + return extensions; +} + +uint32_t platform::getTime() { + return 0; +} diff --git a/tools/leveleditor/src/renderwindow.cpp b/tools/common/src/renderwindow.cpp similarity index 100% rename from tools/leveleditor/src/renderwindow.cpp rename to tools/common/src/renderwindow.cpp diff --git a/tools/leveleditor/CMakeLists.txt b/tools/leveleditor/CMakeLists.txt index 40adaab..06209cd 100644 --- a/tools/leveleditor/CMakeLists.txt +++ b/tools/leveleditor/CMakeLists.txt @@ -1,17 +1,11 @@ -find_package(Qt5Widgets CONFIG REQUIRED) - set(INCLUDE_FILES - include/mainwindow.h - include/renderwindow.h - include/editorstyle.h) + include/mainwindow.h) qt5_wrap_cpp(EDITOR_SRC ${INCLUDE_FILES}) add_executable(LevelEditor src/main.cpp src/mainwindow.cpp - src/renderwindow.cpp - src/editorstyle.cpp ${EDITOR_SRC}) target_include_directories(LevelEditor PRIVATE include) -target_link_libraries(LevelEditor Qt5::Widgets Engine ToolWindowManager) +target_link_libraries(LevelEditor Qt5::Widgets Engine ToolWindowManager EditorCommon) diff --git a/tools/leveleditor/src/main.cpp b/tools/leveleditor/src/main.cpp index 01c4a5b..63be598 100644 --- a/tools/leveleditor/src/main.cpp +++ b/tools/leveleditor/src/main.cpp @@ -2,7 +2,6 @@ #include #include "mainwindow.h" -#include "platform.h" #include "context.h" #include "renderer.h" #include "worldmanager.h" @@ -10,28 +9,6 @@ #include "ecs.h" #include "editorstyle.h" -static std::vector extensionList; - -std::vector platform::getRequiredExtensions() { - QVulkanInstance instance; - instance.create(); - - for(const auto& extension : instance.extensions()) - extensionList.push_back(extension.data()); - - instance.destroy(); - - std::vector extensions; - for(const auto& extension : extensionList) - extensions.push_back(extension.c_str()); - - return extensions; -} - -uint32_t platform::getTime() { - return 0; -} - int main(int argc, char* argv[]) { QApplication app(argc, argv); app.setStyle(new EditorStyle()); diff --git a/tools/materialeditor/CMakeLists.txt b/tools/materialeditor/CMakeLists.txt new file mode 100644 index 0000000..0e753fc --- /dev/null +++ b/tools/materialeditor/CMakeLists.txt @@ -0,0 +1,12 @@ +set(INCLUDE_FILES + include/mainwindow.h) + +qt5_wrap_cpp(EDITOR_SRC ${INCLUDE_FILES}) + +add_executable(MaterialEditor + src/main.cpp + src/mainwindow.cpp + ${EDITOR_SRC}) +target_include_directories(MaterialEditor PRIVATE include) +target_link_libraries(MaterialEditor Qt5::Widgets Engine ToolWindowManager EditorCommon) + diff --git a/tools/materialeditor/include/mainwindow.h b/tools/materialeditor/include/mainwindow.h new file mode 100644 index 0000000..1b41e7d --- /dev/null +++ b/tools/materialeditor/include/mainwindow.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +struct Context; + +class MainWindow : public QMainWindow { +public: + MainWindow(Context& context); + +private: + Context& context; + QVulkanInstance* instance = nullptr; +}; + diff --git a/tools/materialeditor/src/main.cpp b/tools/materialeditor/src/main.cpp new file mode 100644 index 0000000..ff7bb3d --- /dev/null +++ b/tools/materialeditor/src/main.cpp @@ -0,0 +1,43 @@ +#include +#include + +#include "mainwindow.h" +#include "platform.h" +#include "context.h" +#include "renderer.h" +#include "worldmanager.h" +#include "assetmanager.h" +#include "ecs.h" +#include "editorstyle.h" + +int main(int argc, char* argv[]) { + QApplication app(argc, argv); + app.setStyle(new EditorStyle()); + + GraphicsConfig config; + config.shadowResolution = 256; + config.dofDownscale = 2; + config.filterPCF = true; + config.enableImgui = false; + + Context context; + context.renderer = new Renderer(config); + + assetManager.setRenderer(context.renderer); + + worldManager.loadWorld("test.world"); + worldManager.switchWorld("test.world"); + + EntityID entity = ECS::createEntity(worldManager.getCurrentWorld()); + + auto cameraTransform = ECS::addComponent(entity); + cameraTransform->position = glm::vec3(5, 5, 5); + + auto cameraComponent = ECS::addComponent(entity); + cameraComponent->fov = 70.0f; + + MainWindow window(context); + window.show(); + + return app.exec(); +} diff --git a/tools/materialeditor/src/mainwindow.cpp b/tools/materialeditor/src/mainwindow.cpp new file mode 100644 index 0000000..b7dff1d --- /dev/null +++ b/tools/materialeditor/src/mainwindow.cpp @@ -0,0 +1,69 @@ +#include "mainwindow.h" + +#include +#include +#include +#include +#include + +#include "renderwindow.h" +#include "renderer.h" + +MainWindow::MainWindow(Context& context) : context(context) { + setWindowTitle("Material Editor"); + resize(1280, 720); + + QMenuBar* mainMenuBar = new QMenuBar(); + setMenuBar(mainMenuBar); + + QMenu* fileMenu = new QMenu("File"); + mainMenuBar->addMenu(fileMenu); + + // file + { + QAction* newAction = new QAction("New"); + newAction->setIcon(QIcon::fromTheme("document-new")); + newAction->setShortcut(QKeySequence("CTRL+N")); + fileMenu->addAction(newAction); + + QAction* openAction = new QAction("Open"); + openAction->setIcon(QIcon::fromTheme("document-open")); + openAction->setShortcut(QKeySequence("CTRL+O")); + fileMenu->addAction(openAction); + + QAction* openRecentAction = new QAction("Open Recent..."); + openRecentAction->setIcon(QIcon::fromTheme("document-open-recent")); + fileMenu->addAction(openRecentAction); + + fileMenu->addSeparator(); + + QAction* saveAction = new QAction("Save"); + saveAction->setIcon(QIcon::fromTheme("document-save")); + saveAction->setShortcut(QKeySequence("CTRL+S")); + fileMenu->addAction(saveAction); + + QAction* saveAsAction = new QAction("Save As..."); + saveAsAction->setIcon(QIcon::fromTheme("document-save-as")); + saveAsAction->setShortcut(QKeySequence("CTRL+SHIFT+S")); + fileMenu->addAction(saveAsAction); + + fileMenu->addSeparator(); + + QAction* quitAction = new QAction("Quit"); + connect(quitAction, &QAction::triggered, QCoreApplication::quit); + quitAction->setIcon(QIcon::fromTheme("application-exit")); + quitAction->setShortcut(QKeySequence("CTRL+Q")); + fileMenu->addAction(quitAction); + } + + instance = new QVulkanInstance(); + instance->setVkInstance(context.renderer->getInstance()); + instance->create(); + + RendererWindow* window = new RendererWindow(context); + window->setVulkanInstance(instance); + + QWidget* wrapper = QWidget::createWindowContainer(window); + setCentralWidget(wrapper); +} +