Compare commits

...

6 commits

20 changed files with 141 additions and 30 deletions

View file

@ -22,6 +22,7 @@ The project will be built using VCPKG and MSVC
* Qt 6.8.3 or higher, with MSVC toolchain * Qt 6.8.3 or higher, with MSVC toolchain
* CMake * CMake
* Git (for cloning the repo, optional) * Git (for cloning the repo, optional)
* QScintilla already built (see [docs/qscintilla.md](./docs/qscintilla.md)) *\*likely temporary\**
To start, clone the repository: To start, clone the repository:
@ -37,10 +38,14 @@ Now, generate the build files with cmake via the vcpkg preset:
cmake -Bbuild . --preset vcpkg cmake -Bbuild . --preset vcpkg
Then, finally, build in release mode: Then, finally, build in release mode\*:
cmake --build build --config Release cmake --build build --config Release
The compiled binaries should then be placed in `./build/bin/` and should be ready for redistribution without any further work. The compiled binaries should then be placed in `./build/bin/` and should be ready for redistribution without any further work.
If any of the compilation steps fail, or the binaries fail to execute, please create an issue so that this can be corrected. If any of the compilation steps fail, or the binaries fail to execute, please create an issue so that this can be corrected.
\* Release mode is necessary as debug mode copies DLLs that are not linked to the output binary
DEVELOPER NOTE: AKA Not for you. If you get CUSTOM COMMAND BUILD errors just keep rerunning build

View file

@ -4,7 +4,7 @@ project(openblocks VERSION 0.1.0)
set(OpenGL_GL_PREFERENCE "GLVND") set(OpenGL_GL_PREFERENCE "GLVND")
if (MSVC) if (MSVC)
add_compile_options(/W4 /WX) add_compile_options(/W4)
else() else()
add_compile_options(-Wall -Wextra -pedantic -Wno-unused-parameter) add_compile_options(-Wall -Wextra -pedantic -Wno-unused-parameter)
endif() endif()

View file

@ -13,5 +13,5 @@ add_executable(autogen
) )
set_target_properties(autogen PROPERTIES OUTPUT_NAME "autogen") set_target_properties(autogen PROPERTIES OUTPUT_NAME "autogen")
target_link_libraries(autogen -lclang) target_link_libraries(autogen ${CLANG_LIBRARY})
target_include_directories(autogen PUBLIC "src" ${CLANG_INCLUDE_DIRS}) target_include_directories(autogen PUBLIC "src" ${CLANG_INCLUDE_DIR})

View file

@ -12,6 +12,7 @@
#include "object/codegen.h" #include "object/codegen.h"
#include "data/analysis.h" #include "data/analysis.h"
#include "data/codegen.h" #include "data/codegen.h"
#include "util.h"
// namespace data { // namespace data {
// #include "data/analysis.h" // #include "data/analysis.h"
@ -22,13 +23,17 @@ namespace fs = std::filesystem;
// https://clang.llvm.org/docs/LibClang.html // https://clang.llvm.org/docs/LibClang.html
int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) { int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
const char* cargs[] = { "-x", "c++", "-I", srcRoot.c_str(), "-D__AUTOGEN__", 0 }; std::string srcRootStr = string_of(srcRoot);
std::string srcPathStr = string_of(srcPath);
std::string outPathStr = string_of(outPath);
const char* cargs[] = { "-xc++", "-std=c++17", "-I", srcRootStr.c_str(), "-D__AUTOGEN__", 0 };
// THANK YOU SO MUCH THIS STACKOVERFLOW ANSWER IS SO HELPFUL // THANK YOU SO MUCH THIS STACKOVERFLOW ANSWER IS SO HELPFUL
// https://stackoverflow.com/a/59206378/16255372 // https://stackoverflow.com/a/59206378/16255372
CXIndex index = clang_createIndex(0, 0); CXIndex index = clang_createIndex(0, 0);
CXTranslationUnit unit = clang_parseTranslationUnit( CXTranslationUnit unit = clang_parseTranslationUnit(
index, index,
srcPath.c_str(), cargs, 5, srcPathStr.c_str(), cargs, 5,
nullptr, 0, nullptr, 0,
CXTranslationUnit_None); CXTranslationUnit_None);
@ -55,15 +60,16 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
enum_::AnalysisState enumAnlyState; enum_::AnalysisState enumAnlyState;
fs::path relpath = fs::relative(srcPath, srcRoot); fs::path relpath = fs::relative(srcPath, srcRoot);
printf("[AUTOGEN] Processing file %s...\n", relpath.c_str()); std::string relpathStr = string_of(relpath);
object::analyzeClasses(cursor, srcRoot, &objectAnlyState); printf("[AUTOGEN] Processing file %s...\n", relpathStr.c_str());
data::analyzeClasses(cursor, srcRoot, &dataAnlyState); object::analyzeClasses(cursor, srcRootStr, &objectAnlyState);
enum_::analyzeClasses(cursor, srcRoot, &enumAnlyState); data::analyzeClasses(cursor, srcRootStr, &dataAnlyState);
enum_::analyzeClasses(cursor, srcRootStr, &enumAnlyState);
fs::create_directories(outPath.parent_path()); // Make sure generated dir exists before we try writing to it fs::create_directories(outPath.parent_path()); // Make sure generated dir exists before we try writing to it
printf("[AUTOGEN] Generating file %s...\n", relpath.c_str()); printf("[AUTOGEN] Generating file %s...\n", relpathStr.c_str());
std::ofstream outStream(outPath); std::ofstream outStream(outPathStr);
if (!objectAnlyState.classes.empty() || !dataAnlyState.classes.empty()) { if (!objectAnlyState.classes.empty() || !dataAnlyState.classes.empty()) {
outStream << "/////////////////////////////////////////////////////////////////////////////////////////\n"; outStream << "/////////////////////////////////////////////////////////////////////////////////////////\n";
@ -72,15 +78,15 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
} }
for (auto& [_, clazz] : objectAnlyState.classes) { for (auto& [_, clazz] : objectAnlyState.classes) {
object::writeCodeForClass(outStream, relpath, clazz); object::writeCodeForClass(outStream, relpathStr, clazz);
} }
for (auto& [_, clazz] : dataAnlyState.classes) { for (auto& [_, clazz] : dataAnlyState.classes) {
data::writeCodeForClass(outStream, relpath, clazz); data::writeCodeForClass(outStream, relpathStr, clazz);
} }
for (auto& [_, clazz] : enumAnlyState.classes) { for (auto& [_, clazz] : enumAnlyState.classes) {
enum_::writeCodeForClass(outStream, relpath, clazz); enum_::writeCodeForClass(outStream, relpathStr, clazz);
} }
outStream.close(); outStream.close();

View file

@ -162,7 +162,7 @@ static void processClass(CXCursor cur, AnalysisState* state, std::string classNa
anly.name = className; anly.name = className;
anly.baseClass = baseClass; anly.baseClass = baseClass;
anly.headerPath = headerPath; anly.headerPath = string_of(headerPath);
// Add misc flags and options // Add misc flags and options
auto instanceDef = findAnnotation(cur, "OB::def_inst"); auto instanceDef = findAnnotation(cur, "OB::def_inst");

View file

@ -108,4 +108,8 @@ std::optional<std::string> findAnnotation(CXCursor cur, std::string annotationNa
return CXChildVisit_Break; return CXChildVisit_Break;
}); });
return ret; return ret;
}
std::string string_of(std::filesystem::path path) {
return path.string();
} }

View file

@ -5,6 +5,7 @@
#include <map> #include <map>
#include <optional> #include <optional>
#include <string> #include <string>
#include <filesystem>
typedef std::function<CXChildVisitResult(CXCursor cursor, CXCursor parent)> X_CXCursorVisitor; typedef std::function<CXChildVisitResult(CXCursor cursor, CXCursor parent)> X_CXCursorVisitor;
@ -19,4 +20,6 @@ std::string x_clang_toString(CXString string);
// "name": "Hello!", "world": "Test", "read_only": "" // "name": "Hello!", "world": "Test", "read_only": ""
std::map<std::string, std::string> parseAnnotationString(std::string src); std::map<std::string, std::string> parseAnnotationString(std::string src);
std::optional<std::string> findAnnotation(CXCursor cur, std::string annotationName); std::optional<std::string> findAnnotation(CXCursor cur, std::string annotationName);
std::string string_of(std::filesystem::path path);

42
cmake/FindClang.cmake Normal file
View file

@ -0,0 +1,42 @@
# Modified from QGIS' FindQScintilla.cmake by Thomas Moenicke, Larry Schaffer
add_library(Clang::Clang UNKNOWN IMPORTED)
FIND_PATH(CLANG_INCLUDE_DIR
NAMES clang-c/Index.h
PATHS
$ENV{LIB_DIR}/include
/usr/local/include
/usr/include
${VCPKG_INSTALLED_DIR}/x64-windows/include
"C:/Program Files/LLVM/include"
PATH_SUFFIXES ${CLANG_PATH_SUFFIXES}
)
set(CLANG_LIBRARY_NAMES
libclang
clang
)
find_library(CLANG_LIBRARY
NAMES ${CLANG_LIBRARY_NAMES}
PATHS
$ENV{LIB_DIR}/lib
/usr/local/lib
/usr/lib
${VCPKG_INSTALLED_DIR}/x64-windows/lib
"C:/Program Files/LLVM/lib"
)
get_filename_component(CLANG_LIB_DIR ${CLANG_LIBRARY} DIRECTORY)
list(TRANSFORM CLANG_LIBRARY_NAMES APPEND ".dll" OUTPUT_VARIABLE CLANG_DLL_NAMES)
find_file(CLANG_DLLS
NAMES ${CLANG_DLL_NAMES}
PATHS
$ENV{LIB_DIR}/bin
/usr/local/bin
/usr/bin
${VCPKG_INSTALLED_DIR}/x64-windows/bin
"C:/Program Files/LLVM/bin"
)

View file

@ -1,5 +1,12 @@
# Modified from QGIS' FindQScintilla.cmake by Thomas Moenicke, Larry Schaffer # Modified from QGIS' FindQScintilla.cmake by Thomas Moenicke, Larry Schaffer
add_library(QScintilla::QScintilla UNKNOWN IMPORTED)
### NECESSARY TO PREVENT staticMetaObject ERROR!!! See qscintilla.prf AKA qmake config
if(WIN32)
add_compile_definitions(QSCINTILLA_DLL)
endif()
FIND_PATH(QSCINTILLA_INCLUDE_DIR FIND_PATH(QSCINTILLA_INCLUDE_DIR
NAMES Qsci/qsciglobal.h NAMES Qsci/qsciglobal.h
PATHS PATHS
@ -7,6 +14,7 @@ FIND_PATH(QSCINTILLA_INCLUDE_DIR
$ENV{LIB_DIR}/include $ENV{LIB_DIR}/include
/usr/local/include /usr/local/include
/usr/include /usr/include
${VCPKG_INSTALLED_DIR}/x64-windows/include
PATH_SUFFIXES ${QSCINTILLA_PATH_SUFFIXES} PATH_SUFFIXES ${QSCINTILLA_PATH_SUFFIXES}
) )
@ -29,4 +37,20 @@ PATHS
/usr/local/lib /usr/local/lib
/usr/local/lib/qt${QT_VERSION_MAJOR} /usr/local/lib/qt${QT_VERSION_MAJOR}
/usr/lib /usr/lib
${VCPKG_INSTALLED_DIR}/x64-windows/lib
)
get_filename_component(QSCINTILLA_LIB_DIR ${QSCINTILLA_LIBRARY} DIRECTORY)
list(TRANSFORM QSCINTILLA_LIBRARY_NAMES APPEND ".dll" OUTPUT_VARIABLE QSCINTILLA_DLL_NAMES)
find_file(QSCINTILLA_DLLS
NAMES ${QSCINTILLA_DLL_NAMES}
PATHS
"${QT_LIBRARY_DIR}"
$ENV{LIB_DIR}/lib
/usr/local/lib
/usr/local/lib/qt${QT_VERSION_MAJOR}
/usr/lib
${QSCINTILLA_LIB_DIR}
${VCPKG_INSTALLED_DIR}/x64-windows/lib
) )

View file

@ -14,6 +14,7 @@ include_directories(${Stb_INCLUDE_DIR})
# PkgConfig packages # PkgConfig packages
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_check_modules(LUAJIT REQUIRED luajit) pkg_check_modules(LUAJIT REQUIRED luajit)
link_directories(${LUAJIT_LIBRARY_DIRS})
# Run autogen # Run autogen
file(GLOB_RECURSE AUTOGEN_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/src" "src/objects/*.h" "src/datatypes/*.h" "src/enum/*.h") file(GLOB_RECURSE AUTOGEN_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/src" "src/objects/*.h" "src/datatypes/*.h" "src/enum/*.h")
@ -28,7 +29,7 @@ foreach (SRC ${AUTOGEN_SOURCES})
OUTPUT "${OUT_PATH}" OUTPUT "${OUT_PATH}"
DEPENDS autogen DEPENDS autogen
DEPENDS "${SRC_PATH}" DEPENDS "${SRC_PATH}"
COMMAND "${CMAKE_BINARY_DIR}/autogen/autogen" "${CMAKE_CURRENT_SOURCE_DIR}/src" "${SRC_PATH}" "${OUT_PATH}" COMMAND "$<TARGET_FILE:autogen>" "${CMAKE_CURRENT_SOURCE_DIR}/src" "${SRC_PATH}" "${OUT_PATH}"
) )
list(APPEND AUTOGEN_OUTS "${OUT_PATH}") list(APPEND AUTOGEN_OUTS "${OUT_PATH}")
@ -42,8 +43,9 @@ file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h")
list(APPEND SOURCES ${AUTOGEN_OUTS}) list(APPEND SOURCES ${AUTOGEN_OUTS})
add_library(openblocks STATIC ${SOURCES}) add_library(openblocks STATIC ${SOURCES})
set_target_properties(openblocks PROPERTIES OUTPUT_NAME "openblocks") set_target_properties(openblocks PROPERTIES OUTPUT_NAME "openblocks")
target_link_directories(openblocks PUBLIC ${LUAJIT_LIBRARY_DIRS})
target_link_libraries(openblocks ${GLEW_LIBRARIES} ${LUAJIT_LIBRARIES} OpenGL::GL ReactPhysics3D::ReactPhysics3D pugixml::pugixml) target_link_libraries(openblocks ${GLEW_LIBRARIES} ${LUAJIT_LIBRARIES} OpenGL::GL ReactPhysics3D::ReactPhysics3D pugixml::pugixml)
target_include_directories(openblocks PUBLIC "src" "../include" ${LUAJIT_INCLUDE_DIR}) target_include_directories(openblocks PUBLIC "src" "../include" ${LUAJIT_INCLUDE_DIRS})
add_dependencies(openblocks autogen_build autogen) add_dependencies(openblocks autogen_build autogen)
# Windows-specific dependencies # Windows-specific dependencies

View file

@ -4,6 +4,7 @@
#include <pugixml.hpp> #include <pugixml.hpp>
#include <sstream> #include <sstream>
#include <iomanip> #include <iomanip>
#include <algorithm>
Color3::Color3(float r, float g, float b) : r(std::clamp(r, 0.f, 1.f)), g(std::clamp(g, 0.f, 1.f)), b(std::clamp(b, 0.f, 1.f)) {}; Color3::Color3(float r, float g, float b) : r(std::clamp(r, 0.f, 1.f)), g(std::clamp(g, 0.f, 1.f)), b(std::clamp(b, 0.f, 1.f)) {};
Color3::Color3(const glm::vec3& vec) : r(std::clamp(vec.x, 0.f, 1.f)), g(std::clamp(vec.y, 0.f, 1.f)), b(std::clamp(vec.z, 0.f, 1.f)) {}; Color3::Color3(const glm::vec3& vec) : r(std::clamp(vec.x, 0.f, 1.f)), g(std::clamp(vec.y, 0.f, 1.f)), b(std::clamp(vec.z, 0.f, 1.f)) {};

View file

@ -3,7 +3,6 @@
#include "error/data.h" #include "error/data.h"
#include "logger.h" #include "logger.h"
#include "variant.h" // IWYU pragma: keep #include "variant.h" // IWYU pragma: keep
#include <luajit-2.1/lua.h>
#include <memory> #include <memory>
#include <optional> #include <optional>
#include "objects/base/instance.h" #include "objects/base/instance.h"

View file

@ -3,8 +3,6 @@
#include "variant.h" #include "variant.h"
#include "lua.h" #include "lua.h"
#include <cstdio> #include <cstdio>
#include <luajit-2.1/lauxlib.h>
#include <luajit-2.1/lua.h>
#include <pugixml.hpp> #include <pugixml.hpp>
#include <memory> #include <memory>
#include <vector> #include <vector>

View file

@ -5,8 +5,9 @@
#include "error/data.h" #include "error/data.h"
#include <glm/ext/vector_float3.hpp> #include <glm/ext/vector_float3.hpp>
#include <glm/geometric.hpp> #include <glm/geometric.hpp>
#include <reactphysics3d/mathematics/Vector3.h>
namespace reactphysics3d { class Vector3; }; // namespace reactphysics3d { class Vector3; };
class DEF_DATA Vector3 { class DEF_DATA Vector3 {
AUTOGEN_PREAMBLE_DATA AUTOGEN_PREAMBLE_DATA

View file

@ -1,7 +1,7 @@
#pragma once #pragma once
extern "C" { extern "C" {
#include <luajit-2.1/luajit.h> #include <luajit.h>
#include <luajit-2.1/lauxlib.h> #include <lauxlib.h>
#include <luajit-2.1/lualib.h> #include <lualib.h>
#include <luajit-2.1/lua.h> #include <lua.h>
} }

View file

@ -1,5 +1,7 @@
#include "defaultmeshes.h" #include "defaultmeshes.h"
#pragma warning( disable : 4305 )
static float CUBE_VERTICES[] = { static float CUBE_VERTICES[] = {
// positions // normals // texture coords // positions // normals // texture coords
0.5, -0.5, -0.5, -0.0, -0.0, -1.0, 1.0, 0.0, 0.5, -0.5, -0.5, -0.0, -0.0, -1.0, 1.0, 0.0,

15
docs/qscintilla.md Normal file
View file

@ -0,0 +1,15 @@
In order to build openblocks on Windows, qscintilla will need to already be installed.
To do this, first download the source archive from [`https://www.riverbankcomputing.com/static/Downloads/QScintilla/2.14.1/QScintilla_src-2.14.1.tar.gz`](https://www.riverbankcomputing.com/static/Downloads/QScintilla/2.14.1/QScintilla_src-2.14.1.tar.gz)
Next, launch the *x64 Native Tools Command Prompt for VS 2022*, and cd into the directory that you extracted the archive to
Now, run `qmake` from your Qt's bin directory to configure it
Once that's done, build and install the project using `nmake install`
The library should now automatically be installed into your Qt installed directory
---
To uninstall the library, run `nmake uninstall`

View file

@ -100,6 +100,13 @@ if (WIN32)
# No sense adding opengl-sw given that hardware acceleration is necessary, anyway # No sense adding opengl-sw given that hardware acceleration is necessary, anyway
# Also don't want to clutter with plugins, add only needed ones # Also don't want to clutter with plugins, add only needed ones
# Copy over QScintilla DLLs
# TODO: Use a better approach?
add_custom_command(
TARGET editor POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${QSCINTILLA_DLLS} $<TARGET_FILE_DIR:editor>
)
# Copy qt.conf to override default plugins location # Copy qt.conf to override default plugins location
add_custom_command( add_custom_command(
TARGET editor POST_BUILD TARGET editor POST_BUILD

View file

@ -73,7 +73,7 @@ MainWindow::MainWindow(QWidget *parent)
if (isDarkMode()) if (isDarkMode())
QIcon::setFallbackThemeName("editor-dark"); QIcon::setFallbackThemeName("editor-dark");
else else
QIcon::setFallbackThemeName("editor"); QIcon::setThemeName("editor");
// qApp->setStyle(QStyleFactory::create("fusion")); // qApp->setStyle(QStyleFactory::create("fusion"));
defaultMessageHandler = qInstallMessageHandler(logQtMessage); defaultMessageHandler = qInstallMessageHandler(logQtMessage);

View file

@ -6,7 +6,9 @@
{ "name": "pugixml", "version>=": "1.15" }, { "name": "pugixml", "version>=": "1.15" },
"sdl2", "sdl2",
"stb", "stb",
"reactphysics3d" "reactphysics3d",
"pkgconf",
"luajit"
], ],
"overrides": [ "overrides": [
{ {