Compare commits

...

5 commits

18 changed files with 141 additions and 27 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
* CMake
* Git (for cloning the repo, optional)
* QScintilla already built (see [docs/qscintilla.md](./docs/qscintilla.md)) *\*likely temporary\**
To start, clone the repository:
@ -37,10 +38,14 @@ Now, generate the build files with cmake via the vcpkg preset:
cmake -Bbuild . --preset vcpkg
Then, finally, build in release mode:
Then, finally, build in release mode\*:
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.
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")
if (MSVC)
add_compile_options(/W4 /WX)
add_compile_options(/W4)
else()
add_compile_options(-Wall -Wextra -pedantic -Wno-unused-parameter)
endif()

View file

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

View file

@ -12,6 +12,7 @@
#include "object/codegen.h"
#include "data/analysis.h"
#include "data/codegen.h"
#include "util.h"
// namespace data {
// #include "data/analysis.h"
@ -22,13 +23,17 @@ namespace fs = std::filesystem;
// https://clang.llvm.org/docs/LibClang.html
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
// https://stackoverflow.com/a/59206378/16255372
CXIndex index = clang_createIndex(0, 0);
CXTranslationUnit unit = clang_parseTranslationUnit(
index,
srcPath.c_str(), cargs, 5,
srcPathStr.c_str(), cargs, 5,
nullptr, 0,
CXTranslationUnit_None);
@ -55,15 +60,16 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
enum_::AnalysisState enumAnlyState;
fs::path relpath = fs::relative(srcPath, srcRoot);
printf("[AUTOGEN] Processing file %s...\n", relpath.c_str());
object::analyzeClasses(cursor, srcRoot, &objectAnlyState);
data::analyzeClasses(cursor, srcRoot, &dataAnlyState);
enum_::analyzeClasses(cursor, srcRoot, &enumAnlyState);
std::string relpathStr = string_of(relpath);
printf("[AUTOGEN] Processing file %s...\n", relpathStr.c_str());
object::analyzeClasses(cursor, srcRootStr, &objectAnlyState);
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
printf("[AUTOGEN] Generating file %s...\n", relpath.c_str());
std::ofstream outStream(outPath);
printf("[AUTOGEN] Generating file %s...\n", relpathStr.c_str());
std::ofstream outStream(outPathStr);
if (!objectAnlyState.classes.empty() || !dataAnlyState.classes.empty()) {
outStream << "/////////////////////////////////////////////////////////////////////////////////////////\n";
@ -72,15 +78,15 @@ int processHeader(fs::path srcRoot, fs::path srcPath, fs::path outPath) {
}
for (auto& [_, clazz] : objectAnlyState.classes) {
object::writeCodeForClass(outStream, relpath, clazz);
object::writeCodeForClass(outStream, relpathStr, clazz);
}
for (auto& [_, clazz] : dataAnlyState.classes) {
data::writeCodeForClass(outStream, relpath, clazz);
data::writeCodeForClass(outStream, relpathStr, clazz);
}
for (auto& [_, clazz] : enumAnlyState.classes) {
enum_::writeCodeForClass(outStream, relpath, clazz);
enum_::writeCodeForClass(outStream, relpathStr, clazz);
}
outStream.close();

View file

@ -162,7 +162,7 @@ static void processClass(CXCursor cur, AnalysisState* state, std::string classNa
anly.name = className;
anly.baseClass = baseClass;
anly.headerPath = headerPath;
anly.headerPath = string_of(headerPath);
// Add misc flags and options
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 ret;
}
std::string string_of(std::filesystem::path path) {
return path.string();
}

View file

@ -5,6 +5,7 @@
#include <map>
#include <optional>
#include <string>
#include <filesystem>
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": ""
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
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
NAMES Qsci/qsciglobal.h
PATHS
@ -7,6 +14,7 @@ FIND_PATH(QSCINTILLA_INCLUDE_DIR
$ENV{LIB_DIR}/include
/usr/local/include
/usr/include
${VCPKG_INSTALLED_DIR}/x64-windows/include
PATH_SUFFIXES ${QSCINTILLA_PATH_SUFFIXES}
)
@ -29,4 +37,20 @@ PATHS
/usr/local/lib
/usr/local/lib/qt${QT_VERSION_MAJOR}
/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
find_package(PkgConfig REQUIRED)
pkg_check_modules(LUAJIT REQUIRED luajit)
link_directories(${LUAJIT_LIBRARY_DIRS})
# Run autogen
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}"
DEPENDS autogen
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}")
@ -42,8 +43,9 @@ file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h")
list(APPEND SOURCES ${AUTOGEN_OUTS})
add_library(openblocks STATIC ${SOURCES})
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_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)
# Windows-specific dependencies

View file

@ -4,6 +4,7 @@
#include <pugixml.hpp>
#include <sstream>
#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(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

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

View file

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

View file

@ -1,5 +1,7 @@
#include "defaultmeshes.h"
#pragma warning( disable : 4305 )
static float CUBE_VERTICES[] = {
// positions // normals // texture coords
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
# 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
add_custom_command(
TARGET editor POST_BUILD

View file

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

View file

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