Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CMake/Common.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ else ()
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)
endif ()

add_definitions(-DENGINE_CMAKE_SOURCE_DIRECTORY="${CMAKE_SOURCE_DIR}")
add_definitions(-DENGINE_CMAKE_BINARY_DIRECTORY="${CMAKE_BINARY_DIR}")

add_definitions(-DBUILD_CONFIG_DEBUG=$<IF:$<CONFIG:Debug>,1,0>)

add_definitions(-DPLATFORM_WINDOWS=$<IF:$<PLATFORM_ID:Windows>,1,0>)
Expand Down
29 changes: 22 additions & 7 deletions CMake/Target.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ option(BUILD_TEST "Build unit tests" ON)
option(BUILD_SAMPLE "Build sample" ON)

set(API_HEADER_DIR ${CMAKE_BINARY_DIR}/Generated/Api CACHE PATH "" FORCE)
set(META_HEADER_DIR ${CMAKE_BINARY_DIR}/Generated/Meta CACHE PATH "" FORCE)
set(BASIC_LIBS Common CACHE STRING "" FORCE)
set(BASIC_TEST_LIBS Test CACHE STRING "" FORCE)

Expand Down Expand Up @@ -127,14 +126,21 @@ function(AddRuntimeDependenciesCopyCommand)
string(REPLACE "->" ";" TEMP ${R})
list(GET TEMP 0 SRC)
list(GET TEMP 1 DST)
set(COPY_COMMAND ${SRC} $<TARGET_FILE_DIR:${PARAMS_NAME}>/${DST})
else ()
set(SRC ${R})
set(COPY_COMMAND ${SRC} $<TARGET_FILE_DIR:${PARAMS_NAME}>)
endif ()

if (IS_DIRECTORY ${SRC})
add_custom_command(
TARGET ${PARAMS_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SRC} $<TARGET_FILE_DIR:${PARAMS_NAME}>/${DST}
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${COPY_COMMAND}
)
else ()
add_custom_command(
TARGET ${PARAMS_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${R} $<TARGET_FILE_DIR:${PARAMS_NAME}>
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${COPY_COMMAND}
)
endif ()
endforeach()
Expand Down Expand Up @@ -214,7 +220,7 @@ function(GetTargetIncludeDirectoriesRecurse)
endfunction()

function(AddMirrorInfoSourceGenerationTarget)
cmake_parse_arguments(PARAMS "" "NAME;OUTPUT_SRC;OUTPUT_TARGET_NAME" "SEARCH_DIR;PUBLIC_INC;PRIVATE_INC;LIB" ${ARGN})
cmake_parse_arguments(PARAMS "DYNAMIC" "NAME;OUTPUT_SRC;OUTPUT_TARGET_NAME" "SEARCH_DIR;PUBLIC_INC;PRIVATE_INC;LIB" ${ARGN})

if (DEFINED PARAMS_PUBLIC_INC)
list(APPEND INC ${PARAMS_PUBLIC_INC})
Expand Down Expand Up @@ -242,6 +248,10 @@ function(AddMirrorInfoSourceGenerationTarget)
list(APPEND INC_ARGS ${ABSOLUTE_I})
endforeach()

if (${PARAMS_DYNAMIC})
list(APPEND DYNAMIC_ARG "-d")
endif ()

foreach (SEARCH_DIR ${PARAMS_SEARCH_DIR})
file(GLOB_RECURSE INPUT_HEADER_FILES "${SEARCH_DIR}/*.h")
foreach (INPUT_HEADER_FILE ${INPUT_HEADER_FILES})
Expand All @@ -254,7 +264,7 @@ function(AddMirrorInfoSourceGenerationTarget)

add_custom_command(
OUTPUT ${OUTPUT_SOURCE}
COMMAND "$<TARGET_FILE:MirrorTool>" "-i" ${INPUT_HEADER_FILE} "-o" ${OUTPUT_SOURCE} ${INC_ARGS}
COMMAND "$<TARGET_FILE:MirrorTool>" ${DYNAMIC_ARG} "-i" ${INPUT_HEADER_FILE} "-o" ${OUTPUT_SOURCE} ${INC_ARGS}
DEPENDS MirrorTool ${INPUT_HEADER_FILE}
)
endforeach()
Expand All @@ -274,7 +284,7 @@ function(AddMirrorInfoSourceGenerationTarget)
endfunction()

function(AddExecutable)
cmake_parse_arguments(PARAMS "SAMPLE;META" "NAME" "SRC;INC;LINK;LIB;DEP_TARGET;RES;REFLECT" ${ARGN})
cmake_parse_arguments(PARAMS "SAMPLE" "NAME" "SRC;INC;LINK;LIB;DEP_TARGET;RES;REFLECT" ${ARGN})

if (${PARAMS_SAMPLE} AND (NOT ${BUILD_SAMPLE}))
return()
Expand Down Expand Up @@ -332,13 +342,17 @@ function(AddExecutable)
endfunction()

function(AddLibrary)
cmake_parse_arguments(PARAMS "META" "NAME;TYPE" "SRC;PRIVATE_INC;PUBLIC_INC;PRIVATE_LINK;LIB;REFLECT" ${ARGN})
cmake_parse_arguments(PARAMS "" "NAME;TYPE" "SRC;PRIVATE_INC;PUBLIC_INC;PRIVATE_LINK;LIB;REFLECT" ${ARGN})

if ("${PARAMS_TYPE}" STREQUAL "SHARED")
list(APPEND PARAMS_PUBLIC_INC ${API_HEADER_DIR}/${PARAMS_NAME})
endif ()

if (DEFINED PARAMS_REFLECT)
if ("${PARAMS_TYPE}" STREQUAL "SHARED")
list(APPEND EXTRA_PARAMS DYNAMIC)
endif ()

AddMirrorInfoSourceGenerationTarget(
NAME ${PARAMS_NAME}
OUTPUT_SRC GENERATED_SRC
Expand All @@ -347,6 +361,7 @@ function(AddLibrary)
PUBLIC_INC ${PARAMS_PUBLIC_INC}
PRIVATE_INC ${PARAMS_PRIVATE_INC}
LIB ${PARAMS_LIB}
${EXTRA_PARAMS}
)
endif()

Expand Down
48 changes: 41 additions & 7 deletions Editor/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,54 @@ qt_add_executable(Editor ${SOURCES})
target_include_directories(Editor PRIVATE Include)
target_link_libraries(Editor PRIVATE Core RHI Runtime Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Quick)

# TODO config runtime dependencies in Windows
if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
set(PLATFORM_DEP_TARGET RHI-DirectX12 RHI-Vulkan)
else()
set(PLATFORM_DEP_TARGET RHI-Vulkan)
endif()
add_dependencies(Editor ${PLATFORM_DEP_TARGET})

file(GLOB_RECURSE QML_SOURCES QML/*.qml)
file(GLOB_RECURSE RESOURCES Resource/*)
if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
set(QT_WIN_DEPLOY_EXECUTABLE ${QT_LIB_PREFIX}/bin/windeployqt.exe)
set(QT_BUILDIN_QML_DIRECTORY ${QT_LIB_PREFIX}/qml)
add_custom_command(
TARGET Editor POST_BUILD
COMMAND ${QT_WIN_DEPLOY_EXECUTABLE} $<TARGET_FILE:Editor> --qmldir ${QT_BUILDIN_QML_DIRECTORY} --verbose 0
)
endif ()

list(APPEND RESOURCES_PENDING_SET_ALIAS ${QML_SOURCES} ${RESOURCES})
foreach (RESOURCE ${RESOURCES_PENDING_SET_ALIAS})
get_filename_component(FILENAME ${RESOURCE} NAME)
set_source_files_properties(${RESOURCE} PROPERTIES QT_RESOURCE_ALIAS ${FILENAME})
set(EDITOR_QML_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/Qml)
set(EDITOR_RESOURCE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/Qml/Resource)
get_filename_component(EDITOR_RESOURCE_ROOT_ABSOLUTE ${EDITOR_RESOURCE_ROOT} ABSOLUTE)

file(GLOB QML_SOURCES ${EDITOR_QML_ROOT}/*.qml)
file(GLOB_RECURSE RESOURCES ${EDITOR_RESOURCE_ROOT}/*)

list(
APPEND SINGLETON_QML_SOURCES
ETheme.qml)
target_compile_definitions(Editor PRIVATE -DSINGLETON_QML_SOURCES="${SINGLETON_QML_SOURCES}")

# QML only support placed in root dir
foreach (QML_SOURCE ${QML_SOURCES})
get_filename_component(ALIAS ${QML_SOURCE} NAME)
set_source_files_properties(${QML_SOURCE} PROPERTIES QT_RESOURCE_ALIAS ${ALIAS})
if (${ALIAS} IN_LIST SINGLETON_QML_SOURCES)
set_source_files_properties(${QML_SOURCE} PROPERTIES QT_QML_SINGLETON_TYPE true)
endif ()
endforeach ()

foreach (RESOURCE ${RESOURCES})
string(REPLACE ${EDITOR_RESOURCE_ROOT_ABSOLUTE} "Resource" ALIAS ${RESOURCE})
set_source_files_properties(${RESOURCE} PROPERTIES QT_RESOURCE_ALIAS ${ALIAS})
endforeach ()

qt_add_qml_module(
Editor
NO_CACHEGEN
NO_GENERATE_QMLDIR
URI editor
QML_FILES ${QML_SOURCES}
RESOURCES ${RESOURCES}
OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Generated/QmlModule
)
36 changes: 36 additions & 0 deletions Editor/Include/Editor/QmlEngine.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//
// Created by Kindem on 2024/12/31.
//

#pragma once

#include <unordered_set>

#include <QFileSystemWatcher>

#include <Core/Paths.h>
#include <Editor/Widget/QmlWidget.h>

namespace Editor {
class QmlEngine {
public:
static QmlEngine& Get();

~QmlEngine();

QUrl GetUrlFromShort(const std::string& inQmlShortFileName) const;
void Start();
void Stop();
void Register(QmlWidget* inWidget);
void Unregister(QmlWidget* inWidget);

private:
QmlEngine();

void ReloadSingletonTypes() const;

Common::Path qmlSourceDir;
std::unordered_set<QmlWidget*> widgets;
Common::UniqueRef<QFileSystemWatcher> watcher;
};
}
28 changes: 0 additions & 28 deletions Editor/Include/Editor/QmlHotReload.h

This file was deleted.

9 changes: 7 additions & 2 deletions Editor/Include/Editor/Widget/QmlWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,18 @@ namespace Editor {
Q_OBJECT

public:
explicit QmlWidget(const std::string& qmlFileName, QWidget* parent = nullptr);
explicit QmlWidget(std::string inShortQmlFileName, QWidget* inParent = nullptr);
~QmlWidget() override;

const std::string& GetShotQmlFileName() const;
const QUrl& GetUrl() const;
QQuickView* GetQuickView();
const QUrl& GetQmlUrl() const;
QWidget* GetQuickViewContainer() const;

private:
std::string shortQmlFileName;
QUrl url;
QQuickView* quickView;
QWidget* quickViewContainer;
};
}
16 changes: 16 additions & 0 deletions Editor/Include/Editor/Widget/WidgetSamples.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// Created by Kindem on 2025/1/5.
//

#pragma once

#include <Editor/Widget/QmlWidget.h>

namespace Editor {
class WidgetSamples final : public QmlWidget {
Q_OBJECT

public:
WidgetSamples();
};
}
5 changes: 0 additions & 5 deletions Editor/QML/launcher.qml

This file was deleted.

21 changes: 21 additions & 0 deletions Editor/Qml/EButton.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Controls.Basic

Button {
contentItem: Text {
text: parent.text
font.pixelSize: ETheme.contentFontSize
font.family: ETheme.fontFamily
color: ETheme.fontColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideNone
}

background: Rectangle {
implicitWidth: 50
color: parent.down ? ETheme.focusColor : ETheme.primaryColor
radius: 10
}
}
6 changes: 6 additions & 0 deletions Editor/Qml/ELauncher.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import QtQuick
import QtQuick.Controls

Rectangle {
color: ETheme.bgColor
}
36 changes: 36 additions & 0 deletions Editor/Qml/EText.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import QtQuick
import QtQuick.Controls

Text {
enum Style {
Title1,
Title2,
Title3,
Content
}

function getFontBold(style)
{
return style !== EText.Style.Content
}

function getFontPixelSize(style)
{
if (style === EText.Style.Title1) {
return ETheme.tiele1FontSize;
} else if (style === EText.Style.Title2) {
return ETheme.title2FontSize;
} else if (style === EText.Style.Title3) {
return ETheme.title3FontSize;
} else {
return ETheme.contentFontSize;
}
}

property int style: EText.Style.Content

font.bold: getFontBold(style)
font.pixelSize: getFontPixelSize(style)
font.family: ETheme.fontFamily
color: ETheme.fontColor
}
19 changes: 19 additions & 0 deletions Editor/Qml/ETheme.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
pragma Singleton

import QtQuick

QtObject {
property color bgColor: Qt.color('#212121')
property color primaryColor: Qt.color('#e74c3c')
property color focusColor: Qt.color('#c0392b')
property color secondaryColor: Qt.color('#f1c40f')
property color fontColor: Qt.color('#ecf0f1')

property FontLoader normalFont: FontLoader { source: Qt.url('Resource/Font/MiSans-Normal.ttf') }
property FontLoader boldFont: FontLoader { source: Qt.url('Resource/Font/MiSans-Bold.ttf') }
property int tiele1FontSize: 20
property int title2FontSize: 18
property int title3FontSize: 16
property int contentFontSize: 14
property string fontFamily: 'MiSans'
}
Loading
Loading