Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
197 changes: 39 additions & 158 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,174 +1,55 @@
include(FetchContent)
cmake_minimum_required(VERSION 3.15)
project(selaura LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
cmake_minimum_required(VERSION 3.5.0)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

project(Selaura)
set(CLIENT_VERSION "0.30")

if (WIN32)
add_compile_definitions(SELAURA_WINDOWS)
elseif(ANDROID)
add_compile_definitions(SELAURA_ANDROID)
elseif(UNIX)
add_compile_definitions(SELAURA_LINUX)
endif()

set(CLIENT_VERSION "0.20")

if (CMAKE_BUILD_TYPE STREQUAL "Release")
set(DEVELOPER_MODE "")
elseif (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(DEVELOPER_MODE " Dev")
endif()

add_compile_definitions(
CLIENT_VERSION=\"${CLIENT_VERSION}\"
DEVELOPER_MODE=\"${DEVELOPER_MODE}\"
)
add_compile_definitions(SELAURA_WINDOWS)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if (CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
message(STATUS "Selaura: Clang-cl detected (beware there may be issues using this, as it is not tested).")
else()
message(FATAL_ERROR "Selaura: Native Clang is not supported on Windows. Use MSVC or Clang-cl.")
endif ()
elseif (NOT CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
message(FATAL_ERROR "Selaura: Only MSVC or Clang-cl are supported on Windows.")
endif ()

if (MSVC)
add_compile_options($<$<CONFIG:Release>:/Gw>)
add_compile_options(/bigobj)
add_compile_options(/utf-8)
add_compile_options(/await)

if (CMAKE_BUILD_TYPE STREQUAL "Release")
add_compile_definitions(BUILD_TYPE_RELEASE)
add_compile_options(/O2 /Oi /Gy /Gw /GF /fp:fast /Gd /MT /Ob2)
elseif (CMAKE_BUILD_TYPE STREQUAL "Debug")
add_compile_definitions(BUILD_TYPE_DEBUG)
add_compile_options(/Od /Zi /MT)
endif()

set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
else()
if (CMAKE_BUILD_TYPE STREQUAL "Release")
add_compile_definitions(BUILD_TYPE_RELEASE)
add_compile_options(-O3)
elseif (CMAKE_BUILD_TYPE STREQUAL "Debug")
add_compile_definitions(BUILD_TYPE_DEBUG)
add_compile_options(-O0 -g)
endif()
endif()
elseif (ANDROID)

file(GLOB_RECURSE SOURCE "src/*.cpp" "src/*.hpp")
file(GLOB_RECURSE LIB "include/*.cpp" "include/*.h")
add_compile_definitions(SELAURA_ANDROID)
message(STATUS "Selaura: Building for Android (${CMAKE_SYSTEM_NAME} - ${CMAKE_SYSTEM_PROCESSOR})")
if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
message(FATAL_ERROR "Selaura: Clang is required for Android.")
endif ()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++" CACHE STRING "" FORCE)

add_library(Selaura SHARED "src/load/main.cpp" ${SOURCE} ${LIB})
elseif (UNIX)

target_include_directories(Selaura PRIVATE
"src"
"include"
${glm_SOURCE_DIR}
)
add_compile_definitions(SELAURA_LINUX)
if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
message(FATAL_ERROR "Selaura: Clang is required on Linux.")
endif ()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -fPIC" CACHE STRING "" FORCE)

if(MSVC)
add_compile_options(/bigobj /utf-8 /Oi /Gy /Gw /GF /fp:fast /Gd /MT /Ob2)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MT")
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /DEBUG")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /DEBUG")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
else()
add_compile_options(-fvisibility=hidden -fPIC -fno-stack-check)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -O3")
endif()
message(FATAL_ERROR "Selaura: ${CMAKE_SYSTEM_NAME} (${CMAKE_SYSTEM_PROCESSOR}) is not supported")
endif ()

FetchContent_Declare(
fmt
GIT_REPOSITORY https://github.com/fmtlib/fmt.git
GIT_TAG master
)
FetchContent_Declare(
entt
GIT_REPOSITORY https://github.com/skypjack/entt.git
GIT_TAG d4014c74dc3793aba95ae354d6e23a026c2796db
)
FetchContent_Declare(
typesafe
GIT_REPOSITORY https://github.com/foonathan/type_safe.git
GIT_TAG cdf334cd8e5fcb5e21ab470decdfcbd190ef7347
)
FetchContent_Declare(
libhat
GIT_REPOSITORY https://github.com/BasedInc/libhat.git
GIT_TAG master
)
FetchContent_Declare(
magic_enum
GIT_REPOSITORY https://github.com/Neargye/magic_enum.git
GIT_TAG master
)
FetchContent_Declare(
LuaBridge
GIT_REPOSITORY https://github.com/kunitoki/LuaBridge3.git
GIT_TAG master
)
FetchContent_Declare(
cpp-i18n
GIT_REPOSITORY https://github.com/Sinan-Karakaya/cpp-i18n.git
GIT_TAG main
)
FetchContent_Declare(
glm
GIT_REPOSITORY https://github.com/g-truc/glm.git
GIT_TAG master
)
FetchContent_Declare(
imgui
GIT_REPOSITORY https://github.com/ocornut/imgui.git
GIT_TAG features/shadows
)
FetchContent_Declare(
spdlog
GIT_REPOSITORY https://github.com/gabime/spdlog.git
GIT_TAG v1.x
add_compile_definitions(
CLIENT_VERSION=\"${CLIENT_VERSION}\"
)

if (MSVC)
FetchContent_Declare(
minhook
GIT_REPOSITORY https://github.com/TsudaKageyu/minhook.git
GIT_TAG master
)
else()
FetchContent_Declare(
dobby
GIT_REPOSITORY https://github.com/selauraclient/Dobby
GIT_TAG master
)
endif()

set(DOBBY_DEBUG OFF)
set(DOBBY_GENERATE_SHARED OFF)

FetchContent_MakeAvailable(fmt entt typesafe libhat magic_enum LuaBridge glm cpp-i18n spdlog)
if (MSVC)
FetchContent_MakeAvailable(minhook)
else()
FetchContent_MakeAvailable(dobby)
endif()

target_include_directories(Selaura PUBLIC ${cpp-i18n_SOURCE_DIR}/include)

FetchContent_GetProperties(imgui)
if(NOT imgui_POPULATED)
FetchContent_Populate(imgui)
add_library(ImGui STATIC
"${imgui_SOURCE_DIR}/imgui.cpp"
"${imgui_SOURCE_DIR}/imgui_demo.cpp"
"${imgui_SOURCE_DIR}/imgui_draw.cpp"
"${imgui_SOURCE_DIR}/imgui_tables.cpp"
"${imgui_SOURCE_DIR}/imgui_widgets.cpp"
)
target_include_directories(ImGui PUBLIC ${imgui_SOURCE_DIR})
endif()

if(MSVC)
target_link_libraries(Selaura PRIVATE fmt::fmt EnTT::EnTT type_safe libhat ImGui magic_enum LuaBridge glm cpp-i18n spdlog minhook)
else()
target_link_libraries(Selaura PRIVATE fmt::fmt EnTT::EnTT type_safe libhat ImGui magic_enum LuaBridge glm cpp-i18n spdlog dobby_static)
endif()

if (ANDROID)
target_link_libraries(Selaura PRIVATE log)
endif()
add_subdirectory(include)
add_subdirectory(src-bedrock)
add_subdirectory(src-client)
add_subdirectory(src-native-plugin)
89 changes: 89 additions & 0 deletions include/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
cmake_minimum_required(VERSION 3.15)
project(selaura LANGUAGES CXX)

if(NOT CPM_SOURCE_CACHE)
set(CPM_SOURCE_CACHE "${CMAKE_BINARY_DIR}/.cpmcache")
endif()

if(NOT EXISTS "${CMAKE_BINARY_DIR}/cmake/CPM.cmake")
file(DOWNLOAD
https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/CPM.cmake
"${CMAKE_BINARY_DIR}/cmake/CPM.cmake"
TLS_VERIFY ON)
endif()
include("${CMAKE_BINARY_DIR}/cmake/CPM.cmake")

CPMAddPackage(
NAME fmt
GITHUB_REPOSITORY fmtlib/fmt
GIT_TAG master
)

CPMAddPackage(
NAME entt
GITHUB_REPOSITORY skypjack/entt
GIT_TAG d4014c74dc3793aba95ae354d6e23a026c2796db
)

CPMAddPackage(
NAME libhat
GITHUB_REPOSITORY BasedInc/libhat
GIT_TAG master
)

CPMAddPackage(
NAME spdlog
GITHUB_REPOSITORY gabime/spdlog
GIT_TAG v1.x
)

CPMAddPackage(
NAME gsl
GITHUB_REPOSITORY microsoft/GSL
GIT_TAG v4.0.0
)

CPMAddPackage(
NAME glm
GITHUB_REPOSITORY g-truc/glm
GIT_TAG master
)

if(MSVC)
CPMAddPackage(
NAME minhook
GITHUB_REPOSITORY TsudaKageyu/minhook
GIT_TAG master
)
else()
CPMAddPackage(
NAME dobby
GITHUB_REPOSITORY selauraclient/Dobby
GIT_TAG master
)
endif()

set(DOBBY_DEBUG OFF CACHE BOOL "Dobby debug mode")
set(DOBBY_GENERATE_SHARED OFF CACHE BOOL "Dobby generate shared library")

add_library(selaura INTERFACE)
add_library(selaura::selaura ALIAS selaura)

target_include_directories(selaura INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}
)

if(MSVC)
target_link_libraries(selaura INTERFACE minhook)
else()
target_link_libraries(selaura INTERFACE dobby)
endif()

target_link_libraries(selaura INTERFACE
fmt
EnTT::EnTT
libhat
spdlog::spdlog
GSL::gsl
glm
)
13 changes: 13 additions & 0 deletions src-bedrock/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
set(SELAURA_BEDROCK_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR} PARENT_SCOPE)

FILE(GLOB_RECURSE IMGUI_FILES "${CMAKE_CURRENT_SOURCE_DIR}/render/imgui/*.cpp")

set(SELAURA_BEDROCK_SOURCES
${IMGUI_FILES}
${CMAKE_CURRENT_SOURCE_DIR}/render/directx_hk.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src-client/bgfx/bgfx.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src-client/gui/ScreenView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src-client/renderer/screen/MinecraftUIRenderContext.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src-client/uri/GameArguments.cpp
PARENT_SCOPE
)
5 changes: 5 additions & 0 deletions src-bedrock/api.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#ifdef SELAURA_WINDOWS
#define MCAPI __declspec(dllimport)
#else
#define MCAPI
#endif
37 changes: 37 additions & 0 deletions src-bedrock/render/directx_hk.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include "directx_hk.hpp"
#ifdef SELAURA_WINDOWS
#include "../../src-client/core/instance.hpp"
#include "../../src-client/memory/trampolines.hpp"

HRESULT IDXGIFactory2_hk_CreateSwapChainForCoreWindow(IDXGIFactory2* _thisptr, IUnknown* pDevice, IUnknown* pWindow, const DXGI_SWAP_CHAIN_DESC1* pDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) {
winrt::com_ptr<IDXGIFactory5> factory;
if (SUCCEEDED(CreateDXGIFactory1(IID_PPV_ARGS(factory.put())))) {
if (SUCCEEDED(factory->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &selaura::options::tearing_feature_enabled,sizeof(selaura::options::tearing_feature_enabled)))) {
selaura::options::tearing_feature_enabled = true;
}
}

spdlog::debug("DirectX Tearing Support: {}", selaura::options::tearing_feature_enabled);

DXGI_SWAP_CHAIN_DESC1 desc = *pDesc;
if (!selaura::options::vsync && selaura::options::tearing_feature_enabled) {
desc.Flags |= DXGI_PRESENT_ALLOW_TEARING;
}

auto ofunc = selaura::trampolines::IDXGIFactory2_CreateSwapChainForCoreWindow;
return ofunc(_thisptr, pDevice, pWindow, &desc, pRestrictToOutput, ppSwapChain);
}

HRESULT IDXGISwapChain_hk_Present(IDXGISwapChain3* _thisptr, UINT SyncInterval, UINT Flags) {
auto ofunc = selaura::trampolines::IDXGISwapChain_Present;

static bool refreshed = false;
if (!refreshed) {
refreshed = true;
return DXGI_ERROR_DEVICE_RESET;
}

return ofunc(_thisptr, SyncInterval, Flags);
}

#endif
19 changes: 19 additions & 0 deletions src-bedrock/render/directx_hk.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once

#ifdef SELAURA_WINDOWS
#include <Windows.h>
#include <d3d11.h>
#include <d3d12.h>
#include <dxgi1_5.h>
#include <spdlog/spdlog.h>

#include "imgui/imgui.h"
#include "imgui/backends/imgui_impl_dx11.h"
#include "imgui/backends/imgui_impl_dx12.h"

#include "../../src-client/memory/patterns.hpp"

HRESULT IDXGIFactory2_hk_CreateSwapChainForCoreWindow(IDXGIFactory2* _thisptr, IUnknown* pDevice, IUnknown* pWindow, const DXGI_SWAP_CHAIN_DESC1* pDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain);
HRESULT IDXGISwapChain_hk_Present(IDXGISwapChain3* _thisptr, UINT SyncInterval, UINT Flags);

#endif
Loading
Loading