diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1a72797cd..c67c2fc03 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -365,6 +365,61 @@ jobs: name: ThunderEngine-freebsd-x64.7z path: ThunderEngine-freebsd-x64.7z + emscripten: + name: Emscripten + runs-on: ubuntu-latest + needs: version + + env: + EMSCRIPTEN_VERSION: 3.1.56 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Emscripten setup + run: | + git clone --depth 1 https://github.com/emscripten-core/emsdk.git ~/emsdk && + ~/emsdk/emsdk install ${{ env.EMSCRIPTEN_VERSION }} && ~/emsdk/emsdk activate ${{ env.EMSCRIPTEN_VERSION }} + + - name: Packages installation + run: | + sudo apt update && sudo apt install -y --no-install-recommends \ + ninja-build + + - name: Build setup + shell: bash + run: | + cmake -E make_directory ${{ runner.workspace }}/thunder/build + + - name: Configuration + shell: bash + working-directory: ${{ runner.workspace }}/thunder/build + run: | + source ~/emsdk/emsdk_env.sh && + emcmake cmake -G "Ninja" .. + + - name: Build + shell: bash + working-directory: ${{ runner.workspace }}/thunder/build + run: | + cmake --build . --config Release + + - name: Install + shell: bash + working-directory: ${{ runner.workspace }}/thunder/build + run: | + cmake --install . --config Release + 7z a -t7z ThunderEngine-webgl-x86.7z install-root/sdk/${VERSION}/emscripten + + - name: Upload Thunder + uses: actions/upload-artifact@v4 + with: + name: ThunderEngine-webgl-x86.7z + path: ${{ runner.workspace }}/thunder/build/ThunderEngine-webgl-x86.7z + github: name: Upload to GitHub releases runs-on: ubuntu-latest diff --git a/CMakeLists.txt b/CMakeLists.txt index b0ebbd93d..606d89247 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,9 +29,13 @@ set(tvosVersion "10.0") set(CMAKE_CXX_STANDARD 17) set(standardLibrary "libc++") -set(desktop NOT ("android" IN_LIST CMAKE_SYSTEM_NAME OR "ios" IN_LIST CMAKE_SYSTEM_NAME OR "tvos" IN_LIST CMAKE_SYSTEM_NAME)) +if(EMSCRIPTEN) + set(desktop false) +else() + set(desktop AND NOT ("android" IN_LIST CMAKE_SYSTEM_NAME OR "ios" IN_LIST CMAKE_SYSTEM_NAME OR "tvos" IN_LIST CMAKE_SYSTEM_NAME) ) +endif() -if (APPLE) +if(APPLE) set(bundle "${EDITOR_NAME}.app/Contents/MacOS/") else() set(bundle "") @@ -71,26 +75,30 @@ set(INC_PATH "${SDK_PATH}/include") set(TOOLS_PATH "${SDK_PATH}/tools") set(PLUGINS_PATH "${BIN_PATH}/plugins") -find_package(Qt5 COMPONENTS - Core - Gui - Widgets - QuickWidgets - Xml - Multimedia - Gamepad - Svg -) - -set(QT_BIN_DIR "$ENV{QT5_DIR}/bin") -set(QT_PLUGINS_DIR "$ENV{QT5_DIR}/plugins") -set(QT_QML_DIR "$ENV{QT5_DIR}/qml") +if(desktop) + find_package(Qt5 COMPONENTS + Core + Gui + Widgets + QuickWidgets + Xml + Multimedia + Gamepad + Svg + ) + + set(QT_BIN_DIR "$ENV{QT5_DIR}/bin") + set(QT_PLUGINS_DIR "$ENV{QT5_DIR}/plugins") + set(QT_QML_DIR "$ENV{QT5_DIR}/qml") +endif() # Add subdirectories add_subdirectory(thirdparty) add_subdirectory(engine) add_subdirectory(modules) -add_subdirectory(worldeditor) -add_subdirectory(builder) -add_subdirectory(tests) -add_subdirectory(build) +if(desktop) + add_subdirectory(worldeditor) + add_subdirectory(builder) + add_subdirectory(tests) + add_subdirectory(build) +endif() diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 294f74c4e..35b1ee297 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -3,77 +3,77 @@ cmake_minimum_required(VERSION 3.10) project(resources) if(desktop) - # Install Engine and Editor Resources - install(DIRECTORY ${RESOURCE_ROOT} - DESTINATION "${SDK_PATH}/resources" - FILES_MATCHING PATTERN "*" - ) + # Install Engine and Editor Resources + install(DIRECTORY ${RESOURCE_ROOT} + DESTINATION "${SDK_PATH}/resources" + FILES_MATCHING PATTERN "*" + ) - # Install Qt plugins - install(DIRECTORY ${QT_PLUGINS_DIR}/imageformats - DESTINATION "${PLATFORM_PATH}/plugins" - ) + # Install Qt plugins + install(DIRECTORY ${QT_PLUGINS_DIR}/imageformats + DESTINATION "${PLATFORM_PATH}/plugins" + ) - install(DIRECTORY ${QT_PLUGINS_DIR}/platforms - DESTINATION "${PLATFORM_PATH}/plugins" - ) + install(DIRECTORY ${QT_PLUGINS_DIR}/platforms + DESTINATION "${PLATFORM_PATH}/plugins" + ) - # Install QML plugins - install(DIRECTORY ${QT_QML_DIR}/QtGraphicalEffects - DESTINATION "${PLATFORM_PATH}/qml" - ) + # Install QML plugins + install(DIRECTORY ${QT_QML_DIR}/QtGraphicalEffects + DESTINATION "${PLATFORM_PATH}/qml" + ) - install(DIRECTORY ${QT_QML_DIR}/QtQuick - DESTINATION "${PLATFORM_PATH}/qml" - ) + install(DIRECTORY ${QT_QML_DIR}/QtQuick + DESTINATION "${PLATFORM_PATH}/qml" + ) - install(DIRECTORY ${QT_QML_DIR}/QtQuick.2 - DESTINATION "${PLATFORM_PATH}/qml" - ) + install(DIRECTORY ${QT_QML_DIR}/QtQuick.2 + DESTINATION "${PLATFORM_PATH}/qml" + ) - set(libPrefix "${QT_BIN_DIR}/") + set(libPrefix "${QT_BIN_DIR}/") - if(WIN32) - set(libSuffix "$<$:d>.dll") - endif() + if(WIN32) + set(libSuffix "$<$:d>.dll") + endif() - set(QT_LIBS - "Qt5Core" - "Qt5Gui" - "Qt5Xml" - "Qt5XmlPatterns" - "Qt5Network" - "Qt5Multimedia" - "Qt5QuickWidgets" - "Qt5Quick" - "Qt5QuickTemplates2" - "Qt5QuickShapes" - "Qt5QuickControls2" - "Qt5Qml" - "Qt5Svg" - "Qt5Widgets" - "Qt5Gamepad" - "Qt5Script" - ) + set(QT_LIBS + "Qt5Core" + "Qt5Gui" + "Qt5Xml" + "Qt5XmlPatterns" + "Qt5Network" + "Qt5Multimedia" + "Qt5QuickWidgets" + "Qt5Quick" + "Qt5QuickTemplates2" + "Qt5QuickShapes" + "Qt5QuickControls2" + "Qt5Qml" + "Qt5Svg" + "Qt5Widgets" + "Qt5Gamepad" + "Qt5Script" + ) - if (Qt5Core_VERSION VERSION_GREATER_EQUAL 5.14.0) - list(APPEND QT_LIBS "Qt5QmlModels") - list(APPEND QT_LIBS "Qt5QmlWorkerScript") + if (Qt5Core_VERSION VERSION_GREATER_EQUAL 5.14.0) + list(APPEND QT_LIBS "Qt5QmlModels") + list(APPEND QT_LIBS "Qt5QmlWorkerScript") endif() - list(TRANSFORM QT_LIBS PREPEND ${libPrefix}) - if(WIN32) - list(TRANSFORM QT_LIBS APPEND ${libSuffix}) + list(TRANSFORM QT_LIBS PREPEND ${libPrefix}) + if(WIN32) + list(TRANSFORM QT_LIBS APPEND ${libSuffix}) endif() - # Install Qt libraries - install(FILES ${QT_LIBS} - DESTINATION "${BIN_PATH}" - ) + # Install Qt libraries + install(FILES ${QT_LIBS} + DESTINATION "${BIN_PATH}" + ) - # Install Qt config - install(FILES "${CMAKE_SOURCE_DIR}/build/${OS_NAME}/qt.conf" - DESTINATION "${BIN_PATH}" - ) + # Install Qt config + install(FILES "${CMAKE_SOURCE_DIR}/build/${OS_NAME}/qt.conf" + DESTINATION "${BIN_PATH}" + ) endif() diff --git a/builder/CMakeLists.txt b/builder/CMakeLists.txt index 834ea290b..58200a448 100644 --- a/builder/CMakeLists.txt +++ b/builder/CMakeLists.txt @@ -29,12 +29,6 @@ if(UNIX AND NOT APPLE AND NOT LINUX) ) endif() -file(GLOB MOC_HEADERS - "*.h" -) - -QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) - add_definitions ( -DCOMPANY_NAME="${COMPANY_NAME}" -DBUILDER_NAME="${BUILDER_NAME}" @@ -43,7 +37,13 @@ add_definitions ( source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${${PROJECT_NAME}_srcFiles}) -if (desktop) +if(desktop) + file(GLOB MOC_HEADERS + "*.h" + ) + + QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) + add_executable(${BUILDER_NAME} ${${PROJECT_NAME}_srcFiles} ${MOC_SRCS}) target_link_libraries(${BUILDER_NAME} PRIVATE @@ -82,7 +82,7 @@ if (desktop) ) install(TARGETS ${BUILDER_NAME} - DESTINATION "${BIN_PATH}" + DESTINATION "${BIN_PATH}" ) endif() diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 075f2993b..d685815bb 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -8,7 +8,6 @@ file(GLOB ${PROJECT_NAME}_srcFiles "src/components/private/*.cpp" "src/resources/*.cpp" "src/systems/*.cpp" - "src/editor/*.cpp" "src/filters/*.cpp" "src/pipelinetasks/*.cpp" "src/utils/*.cpp" @@ -25,35 +24,13 @@ set(${PROJECT_NAME}_incPaths "../thirdparty/glfw/src" "../thirdparty/glfm/include" "../thirdparty/freetype/include" - "../thirdparty/assimp/include" "includes/components" "includes/resources" "includes/adapters" - "includes/editor" "includes/utils" "includes" ) -# This path is only needed on the BSDs -if(UNIX AND NOT APPLE AND NOT LINUX) - set(${PROJECT_NAME}_incPaths - ${${PROJECT_NAME}_incPaths} - ${Qt5Gui_INCLUDE_DIRS} - ${Qt5Svg_INCLUDE_DIRS} - ${Qt5Widgets_INCLUDE_DIRS} - ${Qt5Xml_INCLUDE_DIRS} - "/usr/local/include" - ) -endif() - -file(GLOB MOC_HEADERS - "includes/editor/*.h" - "includes/editor/viewport/*.h" - "includes/editor/converters/*.h" -) - -QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) - add_definitions ( -DCOMPANY_NAME="${COMPANY_NAME}" -DEDITOR_NAME="${EDITOR_NAME}" @@ -61,9 +38,35 @@ add_definitions ( source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${${PROJECT_NAME}_srcFiles}) -if (desktop) +if(desktop) + # This path is only needed on the BSDs + if(UNIX AND NOT APPLE AND NOT LINUX) + set(${PROJECT_NAME}_incPaths + ${${PROJECT_NAME}_incPaths} + ${Qt5Gui_INCLUDE_DIRS} + ${Qt5Svg_INCLUDE_DIRS} + ${Qt5Widgets_INCLUDE_DIRS} + ${Qt5Xml_INCLUDE_DIRS} + "/usr/local/include" + "includes/editor" + "../thirdparty/assimp/include" + ) + endif() + + file(GLOB MOC_HEADERS + "includes/editor/*.h" + "includes/editor/viewport/*.h" + "includes/editor/converters/*.h" + ) + + file(GLOB EDITOR_SOURCES + "src/editor/*.cpp" + ) + + QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) + # Dynamic Library - add_library(${PROJECT_NAME}-editor SHARED ${${PROJECT_NAME}_srcFiles} ${MOC_SRCS}) + add_library(${PROJECT_NAME}-editor SHARED ${${PROJECT_NAME}_srcFiles} ${MOC_SRCS} ${EDITOR_SOURCES}) target_link_libraries(${PROJECT_NAME}-editor PRIVATE assimp @@ -109,9 +112,9 @@ if (desktop) ${${PROJECT_NAME}_editorFiles} ) - if (WIN32) + if(WIN32) target_link_libraries(${PROJECT_NAME}-editor PRIVATE Shell32) - elseif (APPLE) + elseif(APPLE) target_link_libraries(${PROJECT_NAME}-editor PRIVATE "-framework IOKit") endif() @@ -123,22 +126,22 @@ if (desktop) ) set_target_properties(${PROJECT_NAME}-editor PROPERTIES - RUNTIME_OUTPUT_DIRECTORY_DEBUG "../${LIB_PATH}" - RUNTIME_OUTPUT_DIRECTORY_RELEASE "../${LIB_PATH}" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "../${LIB_PATH}" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "../${LIB_PATH}" ) install(TARGETS ${PROJECT_NAME}-editor - DESTINATION "${LIB_PATH}" + DESTINATION "${LIB_PATH}" ) install(FILES ${${PROJECT_NAME}_headers} - DESTINATION "${INC_PATH}/engine" + DESTINATION "${INC_PATH}/engine" ) install(DIRECTORY includes/editor/ - DESTINATION "${INC_PATH}/editor" - FILES_MATCHING PATTERN "*.h" - PATTERN "converters" EXCLUDE + DESTINATION "${INC_PATH}/editor" + FILES_MATCHING PATTERN "*.h" + PATTERN "converters" EXCLUDE ) endif() @@ -149,12 +152,26 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE NEXT_LIBRARY ) +target_sources(${PROJECT_NAME} PRIVATE + "src/adapters/platformadaptor.cpp" +) + target_include_directories(${PROJECT_NAME} PRIVATE ${${PROJECT_NAME}_incPaths}) -if (NOT desktop) +if(NOT desktop) target_compile_definitions(${PROJECT_NAME} PRIVATE THUNDER_MOBILE ) + + target_sources(${PROJECT_NAME} PRIVATE + "src/adapters/mobileadaptor.cpp" + ) + + if(EMSCRIPTEN) + target_sources(${PROJECT_NAME} PRIVATE + "src/adapters/emscriptenplatform.cpp" + ) + endif() endif() # Solve build error using Clang on BSDs @@ -168,5 +185,5 @@ set_target_properties(${PROJECT_NAME} PROPERTIES ) install(TARGETS ${PROJECT_NAME} - DESTINATION "${STATIC_PATH}" + DESTINATION "${STATIC_PATH}" ) diff --git a/engine/includes/adapters/emscriptenfile.h b/engine/includes/adapters/emscriptenfile.h new file mode 100644 index 000000000..39d3851b7 --- /dev/null +++ b/engine/includes/adapters/emscriptenfile.h @@ -0,0 +1,78 @@ +#ifndef EMSCRIPTENFILE_H +#define EMSCRIPTENFILE_H + +#include "file.h" +#include "log.h" + +#include +#include + +class EmscriptenFile : public File { +public: + StringList flist(const char *path) override { + StringList result; + for(auto const &dir_entry : std::filesystem::directory_iterator{path}) { + result.push_back(dir_entry.path()); + } + return result; + } + + bool mkdir(const char *path) override { + return std::filesystem::create_directory(path); + } + + bool fdelete(const char *path) override { + return std::filesystem::remove(path); + } + + bool exists(const char *path) override { + return std::filesystem::exists(path); + } + + bool isdir(const char *path) override { + return std::filesystem::is_directory(path); + } + + int fclose(_FILE *stream) override { + return ::fclose((FILE *)stream); + } + + _size_t fseek(_FILE *stream, uint64_t origin) override { + return ::fseek((FILE *)stream, origin, SEEK_SET); + } + + _FILE *fopen(const char *path, const char *mode) override { + FILE *fp = ::fopen(path, mode); + if(fp == nullptr) { + aWarning() << "[EmscriptenFile] Can't open file" << path; + } + + return fp; + } + + _size_t fread(void *ptr, _size_t size, _size_t count, _FILE *stream) override { + return ::fread(ptr, size, count, (FILE *)stream); + } + + _size_t fwrite(const void *ptr, _size_t size, _size_t count, _FILE *stream) override { + return ::fwrite(ptr, size, count, (FILE *)stream); + } + + _size_t fsize(_FILE *stream) override { + if(stream) { + ::fseek((FILE *)stream, 0, SEEK_END); + _size_t size = ::ftell((FILE *)stream); + ::fseek((FILE *)stream, 0, SEEK_SET); + + return size; + } + return 0; + } + + _size_t ftell(_FILE *stream) override { + return ::ftell((FILE *)stream); + } + +}; + +#endif // EMSCRIPTENFILE_H diff --git a/engine/includes/log.h b/engine/includes/log.h index 9e66803f8..22e4107b1 100644 --- a/engine/includes/log.h +++ b/engine/includes/log.h @@ -49,6 +49,8 @@ class ENGINE_EXPORT Log { Log &operator<<(const char *s); Log &operator<<(const std::string &value); + Log &operator<<(const Object *object); + Log &operator<<(const void *value); private: diff --git a/engine/src/adapters/emscriptenplatform.cpp b/engine/src/adapters/emscriptenplatform.cpp new file mode 100644 index 000000000..aa71a9585 --- /dev/null +++ b/engine/src/adapters/emscriptenplatform.cpp @@ -0,0 +1,7 @@ +const char *configLocation() { + return ""; +} + +const char *assetsLocation() { + return ""; +} diff --git a/engine/src/adapters/mobileadaptor.cpp b/engine/src/adapters/mobileadaptor.cpp index e4dfee278..f87f7a955 100644 --- a/engine/src/adapters/mobileadaptor.cpp +++ b/engine/src/adapters/mobileadaptor.cpp @@ -52,6 +52,11 @@ class DefaultHandler : public LogHandler { }; #endif +#define NONE -1 +#define RELEASE 0 +#define PRESS 1 +#define REPEAT 2 + static GLFMDisplay *gDisplay = nullptr; static Engine *g_pEngine = nullptr; @@ -165,10 +170,6 @@ void onFrame(GLFMDisplay *display) { Timer::update(); g_pEngine->update(); - - MobileAdaptor::s_oldMousePosition = MobileAdaptor::s_mousePosition; - - MobileAdaptor::s_mouseScrollDelta = 0.0f; } glfmSwapBuffers(display); @@ -213,7 +214,7 @@ bool onTouch(GLFMDisplay *, int touch, GLFMTouchPhase phase, double x, double y) MobileAdaptor::s_thumbs = Vector4(0.0f); } #else - if(phase < GLFMTouchPhaseEnded) { + if(phase < GLFMTouchPhaseCancelled) { if(touch == 0) { MobileAdaptor::s_oldMousePosition = MobileAdaptor::s_mousePosition; MobileAdaptor::s_mousePosition = Vector4(x, MobileAdaptor::s_height - y, @@ -228,7 +229,15 @@ bool onTouch(GLFMDisplay *, int touch, GLFMTouchPhase phase, double x, double y) default: break; } - s_touches[index] = std::make_pair(phase, MobileAdaptor::s_mousePosition); + int state = NONE; + switch(phase) { + case GLFMTouchPhaseBegan: state = PRESS; break; + case GLFMTouchPhaseMoved: state = REPEAT; break; + case GLFMTouchPhaseEnded: state = RELEASE; break; + default: break; + } + + s_touches[index] = std::make_pair(state, MobileAdaptor::s_mousePosition); } else { auto it = s_touches.find(touch); if(it != s_touches.end()) { @@ -240,7 +249,15 @@ bool onTouch(GLFMDisplay *, int touch, GLFMTouchPhase phase, double x, double y) } bool onKey(GLFMDisplay *, GLFMKeyCode keyCode, GLFMKeyAction action, int) { - s_keys[keyToInput(keyCode)] = action; + int state = NONE; + switch(action) { + case GLFMKeyActionPressed: state = PRESS; break; + case GLFMKeyActionRepeated: state = REPEAT; break; + case GLFMKeyActionReleased: state = RELEASE; break; + default: break; + } + + s_keys[keyToInput(keyCode)] = state; return true; } @@ -294,11 +311,30 @@ void MobileAdaptor::update() { s_inputString.clear(); for(auto &it : s_keys) { - if(it.second == GLFMKeyActionReleased) { - it.second = -1; + switch(it.second) { + case RELEASE: it.second = NONE; break; + case PRESS: it.second = REPEAT; break; + default: break; + } + } + + auto it = s_touches.begin(); + while(it != s_touches.end()) { + if(it->second.first == RELEASE) { + it = s_touches.erase(it); + } else { + if(it->second.first == PRESS) { + it->second.first = REPEAT; + } + + ++it; } } + MobileAdaptor::s_oldMousePosition = MobileAdaptor::s_mousePosition; + + MobileAdaptor::s_mouseScrollDelta = 0.0f; + PlatformAdaptor::update(); } @@ -339,17 +375,25 @@ uint32_t MobileAdaptor::screenHeight() const { bool MobileAdaptor::key(Input::KeyCode code) const { auto it = s_keys.find(code); if(it != s_keys.end()) { - return it->second != -1; + return it->second == PRESS || it->second == REPEAT; } return false; } bool MobileAdaptor::keyPressed(Input::KeyCode code) const { - return (s_keys[code] == GLFMKeyActionPressed); + auto it = s_keys.find(code); + if(it != s_keys.end()) { + return it->second == PRESS; + } + return false; } bool MobileAdaptor::keyReleased(Input::KeyCode code) const { - return (s_keys[code] == GLFMKeyActionReleased); + auto it = s_keys.find(code); + if(it != s_keys.end()) { + return it->second == RELEASE; + } + return false; } std::string MobileAdaptor::inputString() const { @@ -377,7 +421,7 @@ float MobileAdaptor::mouseScrollDelta() const { bool MobileAdaptor::mouseButton(int button) const { auto it = s_touches.find(button); if(it != s_touches.end()) { - return it->second.first < GLFMTouchPhaseCancelled; + return it->second.first == PRESS || it->second.first == REPEAT; } return false; } @@ -385,7 +429,7 @@ bool MobileAdaptor::mouseButton(int button) const { bool MobileAdaptor::mousePressed(int button) const { auto it = s_touches.find(button); if(it != s_touches.end()) { - return it->second.first == GLFMTouchPhaseBegan; + return it->second.first == PRESS; } return false; } @@ -393,7 +437,7 @@ bool MobileAdaptor::mousePressed(int button) const { bool MobileAdaptor::mouseReleased(int button) const { auto it = s_touches.find(button); if(it != s_touches.end()) { - return it->second.first == GLFMTouchPhaseEnded; + return it->second.first == RELEASE; } return false; } diff --git a/engine/src/editor/pluginmanager.cpp b/engine/src/editor/pluginmanager.cpp index df89261d6..6eafbb576 100644 --- a/engine/src/editor/pluginmanager.cpp +++ b/engine/src/editor/pluginmanager.cpp @@ -43,7 +43,7 @@ PluginManager::PluginManager() : m_initialWhiteList << "RenderGL" << "UiKit" << "Media" << "Bullet" << "Angel"; m_initialWhiteList << "MotionTools" << "ParticleTools" << "PipelineTools" << "QbsTools" << "ShaderTools"; - m_initialWhiteList << "TextEditor" << "TextureTools" << "TiledImporter" << "Timeline"; + m_initialWhiteList << "TextEditor" << "TextureTools" << "TiledImporter" << "Timeline" << "WebTools"; m_whiteList = m_initialWhiteList; } diff --git a/engine/src/engine.cpp b/engine/src/engine.cpp index bb38f223f..2716638d3 100644 --- a/engine/src/engine.cpp +++ b/engine/src/engine.cpp @@ -227,13 +227,6 @@ bool Engine::start() { return false; } - Camera *component = m_world->findChild(); - if(component == nullptr) { - aDebug() << "Camera not found creating a new one."; - Actor *camera = Engine::composeActor("Camera", "ActiveCamera", m_world); - camera->transform()->setPosition(Vector3(0.0f)); - } - #ifndef THUNDER_MOBILE while(m_platform->isValid()) { Timer::update(); @@ -254,12 +247,20 @@ void Engine::update() { // Active camera check Camera *camera = Camera::current(); if(camera == nullptr || !camera->isEnabled() || !camera->actor()->isEnabled()) { + camera = nullptr; for(auto it : m_world->findChildren()) { if(it->isEnabled() && it->actor()->isEnabled()) { // Get first active Camera camera = it; break; } } + + if(camera == nullptr) { + aDebug() << "Camera not found creating a new one."; + Actor *cameraActor = Engine::composeActor("Camera", "ActiveCamera", m_world); + camera = cameraActor->getComponent(); + } + Camera::setCurrent(camera); } diff --git a/engine/src/log.cpp b/engine/src/log.cpp index cfc0fd94a..9ccc307b3 100644 --- a/engine/src/log.cpp +++ b/engine/src/log.cpp @@ -67,7 +67,7 @@ void Log::setLogLevel(LogTypes level) { Writes the boolean value, \a b, to the stream and returns a reference to the stream. */ Log &Log::operator<<(bool b) { - m_stream << " " << b; + m_stream << " " << (b ? "true" : "false"); return *this; } /*! @@ -154,6 +154,10 @@ Log &Log::operator<<(const std::string &string) { m_stream << " " << string; return *this; } +Log &Log::operator<<(const Object *object) { + m_stream << " " << (object ? (object->name() + "(" + object->typeName() + ")") : "NULL"); + return *this; +} /*! Writes the pointer \a value, to the stream and returns a reference to the stream. */ diff --git a/engine/src/pipelinetasks/antialiasing.cpp b/engine/src/pipelinetasks/antialiasing.cpp index d84aacae6..a4a0442bf 100644 --- a/engine/src/pipelinetasks/antialiasing.cpp +++ b/engine/src/pipelinetasks/antialiasing.cpp @@ -12,8 +12,6 @@ namespace { const char *antialiasing("graphics.antialiasing"); }; - - AntiAliasing::AntiAliasing() : m_resultTarget(Engine::objectCreate()), m_material(nullptr) { @@ -30,7 +28,7 @@ AntiAliasing::AntiAliasing() : } Texture *resultTexture = Engine::objectCreate("AntiAliasing"); - resultTexture->setFormat(Texture::R11G11B10Float); + resultTexture->setFormat(Texture::RGB10A2); resultTexture->setFlags(Texture::Render); m_outputs.push_back(std::make_pair("Result", resultTexture)); diff --git a/engine/src/pipelinetasks/bloom.cpp b/engine/src/pipelinetasks/bloom.cpp index 408969037..5f5fc889a 100644 --- a/engine/src/pipelinetasks/bloom.cpp +++ b/engine/src/pipelinetasks/bloom.cpp @@ -36,7 +36,7 @@ Bloom::Bloom() : Material *downSample = Engine::loadResource(".embedded/Downsample.shader"); Material *blur = Engine::loadResource(".embedded/Blur.shader"); - m_blurTempTexture->setFormat(Texture::R11G11B10Float); + m_blurTempTexture->setFormat(Texture::RGB10A2); m_blurTempTexture->setFiltering(Texture::Bilinear); m_blurTempTexture->setFlags(Texture::Render); @@ -45,7 +45,7 @@ Bloom::Bloom() : for(uint8_t i = 0; i < BLOOM_PASSES; i++) { // Downsample m_bloomPasses[i].downTexture = Engine::objectCreate("downSampleTexture"); - m_bloomPasses[i].downTexture->setFormat(Texture::R11G11B10Float); + m_bloomPasses[i].downTexture->setFormat(Texture::RGB10A2); m_bloomPasses[i].downTexture->setFiltering(Texture::Bilinear); m_bloomPasses[i].downTexture->setFlags(Texture::Render); diff --git a/engine/src/pipelinetasks/deferredlighting.cpp b/engine/src/pipelinetasks/deferredlighting.cpp index 7e6ce9b7e..e39db1a91 100644 --- a/engine/src/pipelinetasks/deferredlighting.cpp +++ b/engine/src/pipelinetasks/deferredlighting.cpp @@ -71,7 +71,7 @@ void DeferredLighting::exec(PipelineContext &context) { Vector3 position(m[12], m[13], m[14]); Vector3 direction(m.rotation() * Vector3(0.0f, 1.0f, 0.0f)); - instance->setTransform(Matrix4(Vector3(m[12], m[13], m[14]), Quaternion(), Vector3(d))); + instance->setTransform(Matrix4(position, Quaternion(), Vector3(d))); instance->setVector3(uniPosition, &position); instance->setVector3(uniDirection, &direction); } diff --git a/engine/src/pipelinetasks/gbuffer.cpp b/engine/src/pipelinetasks/gbuffer.cpp index 4a52c74b1..b40ab427f 100644 --- a/engine/src/pipelinetasks/gbuffer.cpp +++ b/engine/src/pipelinetasks/gbuffer.cpp @@ -21,7 +21,7 @@ GBuffer::GBuffer() : setName("GBuffer"); Texture *emissive = Engine::objectCreate(G_EMISSIVE); - emissive->setFormat(Texture::R11G11B10Float); + emissive->setFormat(Texture::RGB10A2); emissive->setFlags(Texture::Render); m_outputs.push_back(make_pair(emissive->name(), emissive)); diff --git a/engine/src/pipelinetasks/reflections.cpp b/engine/src/pipelinetasks/reflections.cpp index 5d9e9c97b..74fd687f0 100644 --- a/engine/src/pipelinetasks/reflections.cpp +++ b/engine/src/pipelinetasks/reflections.cpp @@ -35,7 +35,7 @@ Reflections::Reflections() : m_outputs.push_back(std::make_pair("Result", nullptr)); Texture *slrTexture(Engine::objectCreate("localReflections")); - slrTexture->setFormat(Texture::RGBA32Float); + slrTexture->setFormat(Texture::RGB10A2); slrTexture->setFlags(Texture::Render); m_outputs.push_back(std::make_pair(slrTexture->name(), slrTexture)); diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index edda4afb3..5bb90cf05 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -2,7 +2,10 @@ cmake_minimum_required(VERSION 3.10) project(modules) -add_subdirectory(editor) +if(desktop) + add_subdirectory(editor) +endif() + add_subdirectory(media) add_subdirectory(physics/bullet) add_subdirectory(renders) diff --git a/modules/editor/editor.qbs b/modules/editor/editor.qbs index b59ce1273..603fb59c9 100644 --- a/modules/editor/editor.qbs +++ b/modules/editor/editor.qbs @@ -13,6 +13,7 @@ Project { "texturetools", "texteditor", "tiledimporter", - "timeline" + "timeline", + "webtools" ] } diff --git a/modules/editor/shadertools/converter/shaderbuilder.cpp b/modules/editor/shadertools/converter/shaderbuilder.cpp index 7b5e35893..5cea645ee 100644 --- a/modules/editor/shadertools/converter/shaderbuilder.cpp +++ b/modules/editor/shadertools/converter/shaderbuilder.cpp @@ -485,6 +485,10 @@ bool ShaderBuilder::parseShaderFormat(const QString &path, VariantMap &user, int } } + if(materialType == Material::LightFunction) { + define += "\n#define NO_INSTANCE"; + } + str = shaders[gVertex]; if(!str.empty()) { user[STATIC] = loadShader(str, define, pragmas); diff --git a/modules/editor/shadertools/shaders/Fullscreen.vert b/modules/editor/shadertools/shaders/Fullscreen.vert index c6f866514..b36bde4cc 100644 --- a/modules/editor/shadertools/shaders/Fullscreen.vert +++ b/modules/editor/shadertools/shaders/Fullscreen.vert @@ -2,6 +2,8 @@ #pragma flags +#define NO_INSTANCE + #include "ShaderLayout.h" layout(location = 0) in vec3 vertex; diff --git a/modules/editor/webtools/CMakeLists.txt b/modules/editor/webtools/CMakeLists.txt new file mode 100644 index 000000000..59fbc5e49 --- /dev/null +++ b/modules/editor/webtools/CMakeLists.txt @@ -0,0 +1,79 @@ +cmake_minimum_required(VERSION 3.10) + +project(webtools) + +file(GLOB ${PROJECT_NAME}_srcFiles + "*.cpp" + "converter/*.cpp" + "*.h" +) + +set(${PROJECT_NAME}_incPaths + "../../../" + "../../../engine/includes" + "../../../engine/includes/resources" + "../../../engine/includes/components" + "../../../engine/includes/editor" + "../../../thirdparty/next/inc" + "../../../thirdparty/next/inc/math" + "../../../thirdparty/next/inc/core" +) + +# This path is only needed on the BSDs +if(UNIX AND NOT APPLE AND NOT LINUX) + set(${PROJECT_NAME}_incPaths + ${${PROJECT_NAME}_incPaths} + "/usr/local/include" + ) +endif() + +if(desktop) + file(GLOB MOC_HEADERS + "*.h" + "converter/*.h" + ) + + QT5_ADD_RESOURCES(RES_SOURCES ${RESOURCES}) + QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) + + add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_srcFiles} ${MOC_SRCS} ${RES_SOURCES}) + + target_link_libraries(${PROJECT_NAME} PRIVATE + next-editor + engine-editor + Qt5::Core + Qt5::Gui + ) + + target_compile_definitions(${PROJECT_NAME} PRIVATE + SHARED_DEFINE + ) + + target_include_directories(${PROJECT_NAME} PRIVATE ${${PROJECT_NAME}_incPaths} ${CMAKE_CURRENT_BINARY_DIR}) + + set_target_properties(${PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY_DEBUG "../../../${PLUGINS_PATH}" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "../../../${PLUGINS_PATH}" + ) + + install(TARGETS ${PROJECT_NAME} + DESTINATION "${PLUGINS_PATH}" + ) +endif() + +if (desktop AND UNIX AND NOT APPLE) + set_target_properties(${PROJECT_NAME} PROPERTIES + INSTALL_RPATH "$ORIGIN/../../lib" + ) + + # Solve build error using Clang on BSDs + if (NOT LINUX) + target_compile_options(${PROJECT_NAME} PRIVATE -fPIC) + endif() +endif() + +if (desktop AND APPLE) + set_target_properties(${PROJECT_NAME} PROPERTIES + INSTALL_NAME_DIR "@executable_path" + ) +endif() diff --git a/modules/editor/webtools/converter/emscriptenbuilder.cpp b/modules/editor/webtools/converter/emscriptenbuilder.cpp new file mode 100644 index 000000000..69d9d3f31 --- /dev/null +++ b/modules/editor/webtools/converter/emscriptenbuilder.cpp @@ -0,0 +1,228 @@ +#include "emscriptenbuilder.h" + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +namespace { + const char *gSdkPath("${sdkPath}"); + + const char *gEmscriptenPath("Emscripten_Builder/Emscripten_SDK"); + + const char *gLabel("[EmscriptenBuilder]"); + +}; + +EmscriptenBuilder::EmscriptenBuilder() : + m_process(new QProcess(this)), + m_progress(false) { + + EditorSettings *settings = EditorSettings::instance(); + + settings->value(gEmscriptenPath, QVariant::fromValue(QFileInfo("/"))); + + connect(settings, &EditorSettings::updated, this, &EmscriptenBuilder::onApplySettings); + + connect( m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()) ); + connect( m_process, SIGNAL(readyReadStandardError()), this, SLOT(readError()) ); + + connect( m_process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onBuildFinished(int)) ); + + ProjectSettings *mgr = ProjectSettings::instance(); + QString sdk = mgr->sdkPath(); + + m_includePath = QStringList() + << sdk + "/include/engine" + << sdk + "/include/modules" + << sdk + "/include/next" + << sdk + "/include/next/math" + << sdk + "/include/next/core"; + + m_libPath = QStringList() + << sdk + "/emscripten/x86/static"; + + m_libs = QStringList() << "engine" << "next" << "physfs" << "zlib" << "glfm" << + "bullet" << "bullet3" << + "rendergl" << "freetype" << "uikit" << + "media" << "vorbis" << "vorbisfile" << "ogg" << + "angel" << "angelscript"; +} + +bool EmscriptenBuilder::isEmpty() const { + return (ProjectSettings::instance()->currentPlatformName() != "webgl"); +} + +bool EmscriptenBuilder::buildProject() { + if(m_outdated && !m_progress) { + aInfo() << gLabel << "Build started."; + + onApplySettings(); + + ProjectSettings *mgr = ProjectSettings::instance(); + + m_project = mgr->generatedPath() + "/"; + + m_process->setWorkingDirectory(m_project); + + generateProject(); + + m_artifact = mgr->cachePath() + "/" + mgr->currentPlatformName() + "/release"; + + QDir dir; + dir.mkpath(m_artifact); + + mgr->setArtifact(m_artifact); + { + QStringList args; + + for(auto it : m_includePath) { + args.append("-I" + it); + } + + for(auto it : m_libPath) { + args.append("-L" + it); + } + + for(auto it : m_libs) { + args.append("-l" + it); + } + + args.append("-std=c++20"); + args.append("-sMIN_WEBGL_VERSION=2"); + args.append("-sALLOW_MEMORY_GROWTH"); + args.append("-DTHUNDER_MOBILE"); + + args.append("-O3"); + + args.append("application.cpp"); + args.append("-o"); + args.append(m_artifact + "/application.js"); + + args.append("--preload-file"); + args.append("../webgl/assets@/"); + + m_process->start(m_binary, args); + if(!m_process->waitForStarted()) { + aError() << "Failed:" << qPrintable(m_process->errorString()); + return false; + } + m_progress = true; + } + } + return true; +} + +void EmscriptenBuilder::generateProject() { + ProjectSettings *mgr = ProjectSettings::instance(); + + aInfo() << gLabel << "Generating project"; + + m_values[gSdkPath] = mgr->sdkPath(); + const QMetaObject *meta = mgr->metaObject(); + for(int i = 0; i < meta->propertyCount(); i++) { + QMetaProperty property = meta->property(i); + m_values[QString("${%1}").arg(property.name())] = property.read(mgr).toString(); + } + + generateLoader(mgr->templatePath(), mgr->modules()); +} + +QString EmscriptenBuilder::builderVersion() { + m_process->start(m_binary, { "--version" }); + + if(m_process->waitForStarted() && m_process->waitForFinished()) { + return m_process->readAll().simplified(); + } + return QString(); +} + +void EmscriptenBuilder::onBuildFinished(int exitCode) { + ProjectSettings *mgr = ProjectSettings::instance(); + if(exitCode == 0) { + QString targetFile(mgr->artifact() + "/application.html"); + + qPrintable(targetFile); + QFile::remove(targetFile); + QFile::copy(":/application.html", targetFile); + QFile::setPermissions(targetFile, QFileDevice::WriteOwner); + + aInfo() << gLabel << "Build finished"; + + if(mgr->targetPath().isEmpty()) { + emit buildSuccessful(); + } + } + m_outdated = false; + m_progress = false; +} + +void EmscriptenBuilder::readOutput() { + QProcess *p = dynamic_cast( sender() ); + if(p) { + parseLogs(p->readAllStandardOutput()); + } +} + +void EmscriptenBuilder::readError() { + QProcess *p = dynamic_cast( sender() ); + if(p) { + parseLogs(p->readAllStandardError()); + } +} + +void EmscriptenBuilder::onApplySettings() { + QFileInfo info = EditorSettings::instance()->value(gEmscriptenPath).value(); + QString sdk = info.absoluteFilePath(); + + sdk.replace('/', '\\'); + + if(!info.exists()) { + aCritical() << "Can't find the Emscripten SDK by the path:" << qPrintable(sdk); + } + + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert("EMSDK", sdk); + env.insert("EMSDK_PYTHON", sdk + "\\python\\3.9.2-nuget_64bit\\python.exe"); + env.insert("EMSDK_NODE", sdk + "\\node\\16.20.0_64bit\\bin\\node.exe"); + env.insert("JAVA_HOME", sdk + "\\java\\8.152_64bit"); + + m_binary = sdk + "\\upstream\\emscripten\\emcc.bat"; + + QString path = env.value("PATH"); + path += ";" + sdk; + path += ";" + sdk + "\\upstream\\emscripten"; + path += ";" + sdk + "\\node\\16.20.0_64bit\\bin"; + + env.insert("PATH", path); + + m_process->setProcessEnvironment(env); +} + +void EmscriptenBuilder::parseLogs(const QString &log) { + QStringList list = log.split(QRegExp("[\r\n]"), Qt::SkipEmptyParts); + + foreach(QString it, list) { + if(it.contains(" error ") || it.contains(" error:", Qt::CaseInsensitive)) { + aError() << gLabel << qPrintable(it); + } else if(it.contains(" warning ") || it.contains(" warning:", Qt::CaseInsensitive)) { + aWarning() << gLabel << qPrintable(it); + } else { + aInfo() << gLabel << qPrintable(it); + } + } +} + +bool EmscriptenBuilder::isBundle(const QString &platform) const { + if(platform == platforms().front()) { + return true; + } + return false; +} diff --git a/modules/editor/webtools/converter/emscriptenbuilder.h b/modules/editor/webtools/converter/emscriptenbuilder.h new file mode 100644 index 000000000..a6a2d0408 --- /dev/null +++ b/modules/editor/webtools/converter/emscriptenbuilder.h @@ -0,0 +1,58 @@ +#ifndef EMSCRIPTENBUILDER_H +#define EMSCRIPTENBUILDER_H + +#include +#include + +class QProcess; + +class EmscriptenBuilder : public CodeBuilder { + Q_OBJECT +public: + EmscriptenBuilder(); + +protected slots: + void readOutput(); + + void readError(); + + void onApplySettings(); + + void onBuildFinished(int exitCode); + +protected: + bool isNative() const override { return true; } + + bool isEmpty() const override; + + bool buildProject() override; + + QString builderVersion() override; + + QStringList suffixes() const override { return {"cpp", "h"}; } + + QStringList platforms() const override { return {"webgl"}; } + + QString templatePath() const override { return ":/Templates/Native_Behaviour.cpp"; } + + void generateProject(); + + void parseLogs(const QString &log); + + bool isBundle(const QString &platform) const override; + + QString m_artifact; + + QString m_binary; + + QStringList m_includePath; + QStringList m_libPath; + QStringList m_libs; + + QProcess *m_process; + + bool m_progress; + +}; + +#endif // EMSCRIPTENBUILDER_H diff --git a/modules/editor/webtools/res/application.html b/modules/editor/webtools/res/application.html new file mode 100644 index 000000000..cdff15b18 --- /dev/null +++ b/modules/editor/webtools/res/application.html @@ -0,0 +1,86 @@ + + + + + + Thunder Engine + + + +
+ +
+ +
+ +
+ + + + diff --git a/modules/editor/webtools/webtools.cpp b/modules/editor/webtools/webtools.cpp new file mode 100644 index 000000000..da8c846fe --- /dev/null +++ b/modules/editor/webtools/webtools.cpp @@ -0,0 +1,36 @@ +#include "webtools.h" + +#include + +#include "converter/emscriptenbuilder.h" + +static const char *meta = \ +"{" +" \"module\": \"WebTools\"," +" \"version\": \"1.0\"," +" \"description\": \"Web Tools plugin\"," +" \"author\": \"Evgeniy Prikazchikov\"," +" \"objects\": {" +" \"EmscriptenBuilder\": \"converter\"" +" }" +"}"; + +Module *moduleCreate(Engine *engine) { + return new WebTools(engine); +} + +WebTools::WebTools(Engine *engine) : + Module(engine) { +} + +const char *WebTools::metaInfo() const { + return meta; +} + +void *WebTools::getObject(const char *) { + static EmscriptenBuilder *builder = nullptr; + if(builder == nullptr) { + builder = new EmscriptenBuilder; + } + return builder; +} diff --git a/modules/editor/webtools/webtools.h b/modules/editor/webtools/webtools.h new file mode 100644 index 000000000..549f6d805 --- /dev/null +++ b/modules/editor/webtools/webtools.h @@ -0,0 +1,20 @@ +#ifndef WEBTOOLS_H +#define WEBTOOLS_H + +#include + +class WebTools : public Module { +public: + WebTools(Engine *engine); + + const char *metaInfo() const override; + + void *getObject(const char *name) override; + +}; + +extern "C" { + MODULE_EXPORT Module *moduleCreate(Engine *engine); +} + +#endif // WEBTOOLS_H diff --git a/modules/editor/webtools/webtools.qbs b/modules/editor/webtools/webtools.qbs new file mode 100644 index 000000000..ec1e4a965 --- /dev/null +++ b/modules/editor/webtools/webtools.qbs @@ -0,0 +1,60 @@ +import qbs + +Project { + id: webtools + property stringList srcFiles: [ + "*.cpp", + "converter/*.cpp", + "*.h", + "converter/**/*.h", + ] + + property stringList incPaths: [ + "../../../", + "../../../engine/includes", + "../../../engine/includes/resources", + "../../../engine/includes/components", + "../../../engine/includes/editor", + "../../../thirdparty/next/inc", + "../../../thirdparty/next/inc/math", + "../../../thirdparty/next/inc/core", + ] + + DynamicLibrary { + name: "webtools" + condition: webtools.desktop + files: [ + "webtools.qrc", + ].concat(webtools.srcFiles) + Depends { name: "cpp" } + Depends { name: "bundle" } + Depends { name: "next-editor" } + Depends { name: "engine-editor" } + Depends { name: "Qt"; submodules: ["core", "gui"]; } + bundle.isBundle: false + + cpp.defines: ["SHARED_DEFINE"] + cpp.includePaths: webtools.incPaths + cpp.cxxLanguageVersion: webtools.languageVersion + cpp.cxxStandardLibrary: webtools.standardLibrary + cpp.minimumMacosVersion: webtools.osxVersion + + Properties { + condition: qbs.targetOS.contains("linux") + cpp.rpaths: "$ORIGIN/../../lib" + } + + Properties { + condition: qbs.targetOS.contains("darwin") + cpp.sonamePrefix: "@executable_path" + } + + Group { + name: "Install Plugin" + fileTagsFilter: ["dynamiclibrary", "dynamiclibrary_import"] + qbs.install: true + qbs.installDir: webtools.PLUGINS_PATH + qbs.installPrefix: webtools.PREFIX + } + } +} diff --git a/modules/editor/webtools/webtools.qrc b/modules/editor/webtools/webtools.qrc new file mode 100644 index 000000000..278efaf35 --- /dev/null +++ b/modules/editor/webtools/webtools.qrc @@ -0,0 +1,5 @@ + + + res/application.html + + diff --git a/modules/media/CMakeLists.txt b/modules/media/CMakeLists.txt index 5423f33c0..5fde6ae2a 100644 --- a/modules/media/CMakeLists.txt +++ b/modules/media/CMakeLists.txt @@ -40,27 +40,27 @@ if(UNIX AND NOT APPLE) endif() endif() -file(GLOB MOC_HEADERS - "includes/converters/*.h" -) - -QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) - source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${${PROJECT_NAME}_srcFiles}) # Dynamic Library -if (desktop) +if(desktop) + file(GLOB MOC_HEADERS + "includes/converters/*.h" + ) + + QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) + add_library(${PROJECT_NAME}-editor SHARED ${${PROJECT_NAME}_srcFiles} ${MOC_SRCS} "src/converters/audioconverter.cpp" ) - if (WIN32) + if(WIN32) target_link_libraries(${PROJECT_NAME}-editor PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/openal/windows/x64/OpenAL32.lib ) - endif () + endif() target_link_libraries(${PROJECT_NAME}-editor PRIVATE next-editor @@ -112,7 +112,7 @@ if (desktop) DESTINATION "${INC_PATH}/engine" ) - if (WIN32) + if(WIN32) install(FILES "../../thirdparty/openal/windows/bin/OpenAL32.dll" DESTINATION "${BIN_PATH}") endif() endif() @@ -126,14 +126,14 @@ target_link_libraries(${PROJECT_NAME} PRIVATE vorbis ) -if (NOT desktop) +if(NOT desktop) target_compile_definitions(${PROJECT_NAME} PRIVATE THUNDER_MOBILE ) endif() if(UNIX AND NOT APPLE) - target_link_libraries(${PROJECT_NAME}-editor PRIVATE ${OPENAL_LIBRARY}) + target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENAL_LIBRARY}) # Solve build error using Clang on BSDs if(NOT LINUX) @@ -149,5 +149,5 @@ set_target_properties(${PROJECT_NAME} PROPERTIES ) install(TARGETS ${PROJECT_NAME} - DESTINATION "${STATIC_PATH}" + DESTINATION "${STATIC_PATH}" ) diff --git a/modules/physics/bullet/CMakeLists.txt b/modules/physics/bullet/CMakeLists.txt index ed1a0ef29..2ec21c510 100644 --- a/modules/physics/bullet/CMakeLists.txt +++ b/modules/physics/bullet/CMakeLists.txt @@ -39,13 +39,13 @@ set(RESOURCES src/converters/templates.qrc ) -QT5_ADD_RESOURCES(RES_SOURCES ${RESOURCES}) -QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) - source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${${PROJECT_NAME}_srcFiles}) # Dynamic Library -if (desktop) +if(desktop) + QT5_ADD_RESOURCES(RES_SOURCES ${RESOURCES}) + QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) + add_library(${PROJECT_NAME}-editor SHARED ${${PROJECT_NAME}_srcFiles} ${RES_SOURCES} @@ -110,7 +110,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE bullet3 ) -if (NOT desktop) +if(NOT desktop) target_compile_definitions(${PROJECT_NAME} PRIVATE THUNDER_MOBILE ) @@ -127,5 +127,5 @@ set_target_properties(${PROJECT_NAME} PROPERTIES ) install(TARGETS ${PROJECT_NAME} - DESTINATION "${STATIC_PATH}" + DESTINATION "${STATIC_PATH}" ) diff --git a/modules/renders/rendergl/CMakeLists.txt b/modules/renders/rendergl/CMakeLists.txt index bc0ef95db..78c4a9be1 100644 --- a/modules/renders/rendergl/CMakeLists.txt +++ b/modules/renders/rendergl/CMakeLists.txt @@ -31,15 +31,15 @@ if(UNIX AND NOT APPLE AND NOT LINUX) ) endif() -file(GLOB MOC_HEADERS - "*.h" - "includes/editor/*.h" -) +# Dynamic Library +if(desktop) + file(GLOB MOC_HEADERS + "*.h" + "includes/editor/*.h" + ) -QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) + QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) -# Dynamic Library -if (desktop) add_library(${PROJECT_NAME}-editor SHARED ${${PROJECT_NAME}_srcFiles} ${MOC_SRCS} @@ -112,7 +112,7 @@ endif() target_include_directories(${PROJECT_NAME} PRIVATE ${${PROJECT_NAME}_incPaths}) -if (NOT desktop) +if(NOT desktop) target_compile_definitions(${PROJECT_NAME} PRIVATE THUNDER_MOBILE ) @@ -124,5 +124,5 @@ set_target_properties(${PROJECT_NAME} PROPERTIES ) install(TARGETS ${PROJECT_NAME} - DESTINATION "${STATIC_PATH}" + DESTINATION "${STATIC_PATH}" ) diff --git a/modules/uikit/CMakeLists.txt b/modules/uikit/CMakeLists.txt index 03de8477b..be0d4da93 100644 --- a/modules/uikit/CMakeLists.txt +++ b/modules/uikit/CMakeLists.txt @@ -1,16 +1,12 @@ cmake_minimum_required(VERSION 3.10) set(CMAKE_INCLUDE_CURRENT_DIR ON) -set(CMAKE_AUTOUIC ON) project(uikit) file(GLOB ${PROJECT_NAME}_srcFiles "src/*.cpp" "src/components/*.cpp" - "src/converters/*.cpp" - "src/editor/*.cpp" - "src/editor/tools/*.cpp" "src/pipelinetasks/*.cpp" "src/resources/*.cpp" "src/utils/*.cpp" @@ -33,34 +29,6 @@ set(${PROJECT_NAME}_incPaths "../../thirdparty/cssparser/include" ) -# This path is only needed on the BSDs -if(UNIX AND NOT APPLE AND NOT LINUX) - set(${PROJECT_NAME}_incPaths - ${${PROJECT_NAME}_incPaths} - ${Qt5Gui_INCLUDE_DIRS} - ${Qt5Widgets_INCLUDE_DIRS} - "/usr/local/include" - ) -endif() - -file(GLOB ${PROJECT_NAME}_ui - "src/editor/*.ui" -) - -file(GLOB MOC_HEADERS - "includes/converters/*.h" - "includes/editor/*.h" - "includes/editor/tools/*.h" -) - -set( RESOURCES - src/editor/uieditor.qrc -) - -QT5_ADD_RESOURCES(RES_SOURCES ${RESOURCES}) -QT5_WRAP_UI(UI_HEADERS ${${PROJECT_NAME}_ui}) -QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) - add_definitions ( -DCOMPANY_NAME="${COMPANY_NAME}" -DEDITOR_NAME="${EDITOR_NAME}" @@ -69,12 +37,49 @@ add_definitions ( source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${${PROJECT_NAME}_srcFiles}) # Dynamic Library -if (desktop) +if(desktop) + set(CMAKE_AUTOUIC ON) + + file(GLOB ${PROJECT_NAME}_ui + "src/editor/*.ui" + ) + + set(RESOURCES + src/editor/uieditor.qrc + ) + + file(GLOB MOC_HEADERS + "includes/converters/*.h" + "includes/editor/*.h" + "includes/editor/tools/*.h" + ) + + # This path is only needed on the BSDs + if(UNIX AND NOT APPLE AND NOT LINUX) + set(${PROJECT_NAME}_incPaths + ${${PROJECT_NAME}_incPaths} + ${Qt5Gui_INCLUDE_DIRS} + ${Qt5Widgets_INCLUDE_DIRS} + "/usr/local/include" + ) + endif() + + QT5_ADD_RESOURCES(RES_SOURCES ${RESOURCES}) + QT5_WRAP_UI(UI_HEADERS ${${PROJECT_NAME}_ui}) + QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) + + file(GLOB EDITOR_SOURCES + "src/converters/*.cpp" + "src/editor/*.cpp" + "src/editor/tools/*.cpp" + ) + add_library(${PROJECT_NAME}-editor SHARED ${MOC_SRCS} ${UI_HEADERS} ${RES_SOURCES} ${${PROJECT_NAME}_srcFiles} + ${EDITOR_SOURCES} ) target_link_libraries(${PROJECT_NAME}-editor PRIVATE @@ -148,7 +153,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE next engine ) -if (NOT desktop) +if(NOT desktop) target_compile_definitions(${PROJECT_NAME} PRIVATE THUNDER_MOBILE ) @@ -157,6 +162,11 @@ endif() # Solve build error using Clang on BSDs if(UNIX AND NOT APPLE AND NOT LINUX) target_compile_options(${PROJECT_NAME} PRIVATE -fPIC) + + set(${PROJECT_NAME}_incPaths + ${${PROJECT_NAME}_incPaths} + "/usr/local/include" + ) endif() target_include_directories(${PROJECT_NAME} PRIVATE ${${PROJECT_NAME}_incPaths}) @@ -167,5 +177,5 @@ set_target_properties(${PROJECT_NAME} PROPERTIES ) install(TARGETS ${PROJECT_NAME} - DESTINATION "${STATIC_PATH}" + DESTINATION "${STATIC_PATH}" ) diff --git a/modules/uikit/src/components/label.cpp b/modules/uikit/src/components/label.cpp index 59e70ad13..3325e932c 100644 --- a/modules/uikit/src/components/label.cpp +++ b/modules/uikit/src/components/label.cpp @@ -70,6 +70,11 @@ void Label::draw(CommandBuffer &buffer) { if(m_dirty) { m_mesh->setName(actor()->name()); TextRender::composeMesh(m_font, m_mesh, m_size, m_text, m_alignment, m_kerning, m_wrap, m_meshSize); + + if(m_material && m_font) { + m_material->setTexture(gTexture, m_font->page()); + } + m_dirty = false; } @@ -148,10 +153,6 @@ void Label::setFont(Font *font) { m_font = font; if(m_font) { m_font->subscribe(&Label::fontUpdated, this); - - if(m_material) { - m_material->setTexture(gTexture, m_font->page()); - } } m_dirty = true; diff --git a/modules/vms/angel/CMakeLists.txt b/modules/vms/angel/CMakeLists.txt index 80922001f..a26672707 100644 --- a/modules/vms/angel/CMakeLists.txt +++ b/modules/vms/angel/CMakeLists.txt @@ -10,7 +10,12 @@ file(GLOB ${PROJECT_NAME}_srcFiles ) file(GLOB ${PROJECT_NAME}_modules - "../../../thirdparty/angelscript/modules/*/*.cpp" + "../../../thirdparty/angelscript/modules/debugger/*.cpp" + "../../../thirdparty/angelscript/modules/scriptarray/*.cpp" + "../../../thirdparty/angelscript/modules/scriptdictionary/*.cpp" + "../../../thirdparty/angelscript/modules/scriptgrid/*.cpp" + "../../../thirdparty/angelscript/modules/scriptmath/*.cpp" + "../../../thirdparty/angelscript/modules/scriptstdstring/*.cpp" ) set(${PROJECT_NAME}_incPaths @@ -35,21 +40,21 @@ if(UNIX AND NOT APPLE AND NOT LINUX) ) endif() -file(GLOB MOC_HEADERS - "includes/converters/*.h" -) +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${${PROJECT_NAME}_srcFiles}) -set( RESOURCES - src/converters/templates.qrc -) +# Dynamic Library +if(desktop) + file(GLOB MOC_HEADERS + "includes/converters/*.h" + ) -QT5_ADD_RESOURCES(RES_SOURCES ${RESOURCES}) -QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) + set(RESOURCES + src/converters/templates.qrc + ) -source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${${PROJECT_NAME}_srcFiles}) + QT5_ADD_RESOURCES(RES_SOURCES ${RESOURCES}) + QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) -# Dynamic Library -if (desktop) add_library(${PROJECT_NAME}-editor SHARED ${${PROJECT_NAME}_srcFiles} ${${PROJECT_NAME}_modules} @@ -98,7 +103,10 @@ if (desktop) endif() # Static Library -add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_srcFiles}) +add_library(${PROJECT_NAME} STATIC + ${${PROJECT_NAME}_srcFiles} + ${${PROJECT_NAME}_modules} +) target_include_directories(${PROJECT_NAME} PRIVATE ${${PROJECT_NAME}_incPaths}) @@ -113,7 +121,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE angelscript ) -if (NOT desktop) +if(NOT desktop) target_compile_definitions(${PROJECT_NAME} PRIVATE THUNDER_MOBILE ) diff --git a/modules/vms/angel/includes/angelsystem.h b/modules/vms/angel/includes/angelsystem.h index da27685ae..448eef5a2 100644 --- a/modules/vms/angel/includes/angelsystem.h +++ b/modules/vms/angel/includes/angelsystem.h @@ -59,6 +59,8 @@ class AngelSystem : public System { AngelScript *m_script; bool m_inited; + + bool m_generic; }; #endif // ANGELSYSTEM_H diff --git a/modules/vms/angel/includes/bindings/angelbindings.h b/modules/vms/angel/includes/bindings/angelbindings.h index 7853f7c05..1146e7c8c 100644 --- a/modules/vms/angel/includes/bindings/angelbindings.h +++ b/modules/vms/angel/includes/bindings/angelbindings.h @@ -3,14 +3,14 @@ class asIScriptEngine; -void registerCore(asIScriptEngine *engine); +void registerCore(asIScriptEngine *engine, bool generic); -void registerEngine(asIScriptEngine *engine); +void registerEngine(asIScriptEngine *engine, bool generic); -void registerMath(asIScriptEngine *engine); +void registerMath(asIScriptEngine *engine, bool generic); -void registerInput(asIScriptEngine *engine); +void registerInput(asIScriptEngine *engine, bool generic); -void registerTimer(asIScriptEngine *engine); +void registerTimer(asIScriptEngine *engine, bool generic); #endif // ANGELCORE_H diff --git a/modules/vms/angel/src/angelsystem.cpp b/modules/vms/angel/src/angelsystem.cpp index 430c63da5..b77f24a37 100644 --- a/modules/vms/angel/src/angelsystem.cpp +++ b/modules/vms/angel/src/angelsystem.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -74,7 +75,8 @@ AngelSystem::AngelSystem(Engine *engine) : m_scriptModule(nullptr), m_context(nullptr), m_script(nullptr), - m_inited(false) { + m_inited(false), + m_generic(false) { PROFILE_FUNCTION(); AngelBehaviour::registerClassFactory(this); @@ -82,6 +84,8 @@ AngelSystem::AngelSystem(Engine *engine) : AngelScript::registerClassFactory(engine->resourceSystem()); setName("AngelScript"); + + m_generic = strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY"); } AngelSystem::~AngelSystem() { @@ -137,16 +141,13 @@ void AngelSystem::update(World *world) { asIScriptObject *object = component->scriptObject(); if(object) { if(component->isEnabled()) { - Actor *actor = component->actor(); - if(actor) { - Scene *scene = actor->scene(); - if(scene && scene->parent() == world) { - if(!component->isStarted()) { - execute(object, component->scriptStart()); - component->setStarted(true); - } - execute(object, component->scriptUpdate()); + Scene *scene = component->scene(); + if(scene && scene->parent() == world) { + if(!component->isStarted()) { + execute(object, component->scriptStart()); + component->setStarted(true); } + execute(object, component->scriptUpdate()); } } object->Release(); @@ -235,6 +236,9 @@ void AngelSystem::reload() { factoryAdd(info->GetName(), std::string(URI) + info->GetName(), AngelBehaviour::metaClass()); } } + + processEvents(); + for(auto it : m_objectList) { AngelBehaviour *behaviour = static_cast(it); VariantMap data = behaviour->saveUserData(); @@ -300,23 +304,34 @@ void AngelSystem::unload() { } } -void *castTo(void *ptr) { +Object *castTo(Object *ptr) { return ptr; } +void opImplCast(asIScriptGeneric *gen) { + void *ptr = gen->GetAddressOfReturnLocation(); + ptr = gen->GetAddressOfArg(0); +} + +void wrapGeneric(asIScriptGeneric *gen) { + const char *name = gen->GetFunction()->GetName(); +} + void AngelSystem::registerClasses(asIScriptEngine *engine) { PROFILE_FUNCTION(); RegisterStdString(engine); RegisterScriptArray(engine, true); - RegisterScriptGrid(engine); + if(!m_generic) { + RegisterScriptGrid(engine); + } RegisterScriptDictionary(engine); RegisterScriptMath(engine); - registerTimer(engine); - registerMath(engine); - registerInput(engine); - registerCore(engine); + registerTimer(engine, m_generic); + registerMath(engine, m_generic); + registerInput(engine, m_generic); + registerCore(engine, m_generic); for(auto &it : MetaType::types()) { if(it.first > MetaType::USERTYPE) { @@ -325,7 +340,13 @@ void AngelSystem::registerClasses(asIScriptEngine *engine) { if(typeName[strlen(typeName) - 1] != '*') { engine->RegisterObjectType(table.name, 0, asOBJ_REF | asOBJ_NOCOUNT); std::string stream = std::string(table.name) + "@ f()"; - engine->RegisterObjectBehaviour(table.name, asBEHAVE_FACTORY, stream.c_str(), asFUNCTION(table.static_new), asCALL_CDECL); + + engine->RegisterObjectBehaviour(table.name, + asBEHAVE_FACTORY, + stream.c_str(), + m_generic ? asFUNCTION(wrapGeneric) : asFUNCTION(table.static_new), + m_generic ? asCALL_GENERIC : asCALL_CDECL); + //engine->RegisterObjectBehaviour(name, asBEHAVE_ADDREF, "void f()", asMETHOD(CRef,AddRef), asCALL_THISCALL); //engine->RegisterObjectBehaviour(name, asBEHAVE_RELEASE, "void f()", asMETHOD(CRef,Release), asCALL_THISCALL); } @@ -348,17 +369,25 @@ void AngelSystem::registerClasses(asIScriptEngine *engine) { engine->RegisterInterface("IBehaviour"); engine->RegisterObjectMethod("AngelBehaviour", "void setScriptObject(IBehaviour @)", - asMETHOD(AngelBehaviour, setScriptObject), - asCALL_THISCALL); + m_generic ? WRAP_MFN(AngelBehaviour, setScriptObject) : asMETHOD(AngelBehaviour, setScriptObject), + m_generic ? asCALL_GENERIC : asCALL_THISCALL); + engine->RegisterObjectMethod("AngelBehaviour", "IBehaviour @scriptObject()", - asMETHOD(AngelBehaviour, scriptObject), - asCALL_THISCALL); + m_generic ? WRAP_MFN(AngelBehaviour, scriptObject) : asMETHOD(AngelBehaviour, scriptObject), + m_generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Actor", + "Actor &get_parent() property", + m_generic ? WRAP_MFN(Actor, parent) : asMETHOD(Actor, parent), + m_generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Actor", "Actor &get_parent() property", asMETHOD(Actor, parent), asCALL_THISCALL); - engine->RegisterObjectMethod("Actor", "void set_parent(Actor &) property", asMETHOD(Actor, setParent), asCALL_THISCALL); + engine->RegisterObjectMethod("Actor", + "void set_parent(Actor &) property", + m_generic ? WRAP_MFN(Actor, setParent) : asMETHOD(Actor, setParent), + m_generic ? asCALL_GENERIC : asCALL_THISCALL); - registerEngine(engine); + registerEngine(engine, m_generic); } void AngelSystem::bindMetaType(asIScriptEngine *engine, const MetaType::Table &table) { @@ -422,7 +451,9 @@ void AngelSystem::bindMetaType(asIScriptEngine *engine, const MetaType::Table &t asSFuncPtr ptr(2); method.table()->address(ptr.ptr.dummy, sizeof(void *)); - engine->RegisterGlobalFunction(signature.c_str(), ptr, asCALL_CDECL); + engine->RegisterGlobalFunction(signature.c_str(), + m_generic ? asFUNCTION(wrapGeneric) : ptr, + m_generic ? asCALL_GENERIC : asCALL_CDECL); engine->SetDefaultNamespace(""); } else { asSFuncPtr ptr(3); @@ -430,8 +461,8 @@ void AngelSystem::bindMetaType(asIScriptEngine *engine, const MetaType::Table &t engine->RegisterObjectMethod(typeName, signature.c_str(), - ptr, - asCALL_THISCALL); + m_generic ? asFUNCTION(wrapGeneric) : ptr, + m_generic ? asCALL_GENERIC : asCALL_THISCALL); } } } @@ -479,18 +510,18 @@ void AngelSystem::bindMetaType(asIScriptEngine *engine, const MetaType::Table &t asSFuncPtr ptr1(3); // 3 Means Method property.table()->readmem(ptr1.ptr.dummy, sizeof(void *)); - asSFuncPtr ptr2(3); // 3 Means Method - property.table()->writemem(ptr2.ptr.dummy, sizeof(void *)); - engine->RegisterObjectMethod(typeName, get.c_str(), - ptr1, - asCALL_THISCALL); + m_generic ? asFUNCTION(wrapGeneric) : ptr1, + m_generic ? asCALL_GENERIC : asCALL_THISCALL); + + asSFuncPtr ptr2(3); // 3 Means Method + property.table()->writemem(ptr2.ptr.dummy, sizeof(void *)); engine->RegisterObjectMethod(typeName, set.c_str(), - ptr2, - asCALL_THISCALL); + m_generic ? asFUNCTION(wrapGeneric) : ptr2, + m_generic ? asCALL_GENERIC : asCALL_THISCALL); } } } @@ -503,8 +534,15 @@ void AngelSystem::bindMetaObject(asIScriptEngine *engine, const std::string &nam while(super != nullptr) { const char *superName = super->name(); - engine->RegisterObjectMethod(superName, (name + "@ opCast()").c_str(), asFUNCTION(castTo), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod(typeName, (std::string(superName) + "@ opImplCast()").c_str(), asFUNCTION(castTo), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod(superName, + (name + "@ opCast()").c_str(), + m_generic ? WRAP_FN(castTo) : asFUNCTION(castTo), + m_generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod(typeName, + (std::string(superName) + "@ opImplCast()").c_str(), + m_generic ? WRAP_FN(castTo) : asFUNCTION(castTo), + m_generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); super = super->super(); } diff --git a/modules/vms/angel/src/bindings/angelcore.cpp b/modules/vms/angel/src/bindings/angelcore.cpp index 939cba541..1ffc7f4ba 100644 --- a/modules/vms/angel/src/bindings/angelcore.cpp +++ b/modules/vms/angel/src/bindings/angelcore.cpp @@ -1,11 +1,12 @@ #include "bindings/angelbindings.h" #include +#include -#include "engine.h" -#include "log.h" +#include +#include -#include "components/actor.h" +#include void debugFunction(const std::string &in) { aDebug() << in.c_str(); @@ -31,10 +32,16 @@ bool connect(Object *sender, const std::string &signal, Object *receiver, const return Object::connect(sender, signal.c_str(), receiver, slot.c_str()); } -void registerObject(asIScriptEngine *engine) { +void wrap1Generic(asIScriptGeneric *gen) { + +} + +void registerObject(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("Object", 0, asOBJ_REF | asOBJ_NOCOUNT); - engine->RegisterGlobalFunction("bool _connect(Object @, const string &in, Object @, const string &in)", asFUNCTION(connect), asCALL_CDECL); + engine->RegisterGlobalFunction("bool _connect(Object @, const string &in, Object @, const string &in)", + generic ? asFUNCTION(wrap1Generic) : asFUNCTION(connect), + generic ? asCALL_GENERIC : asCALL_CDECL); } Object *objectCreate1(const std::string &type) { @@ -61,30 +68,64 @@ void unloadResource(const std::string &name) { Engine::unloadResource(name); } -void registerEngine(asIScriptEngine *engine) { +void registerEngine(asIScriptEngine *engine, bool generic) { engine->SetDefaultNamespace("Engine"); - engine->RegisterGlobalFunction("Object @objectCreate(const string &in)", asFUNCTION(objectCreate1), asCALL_CDECL); - engine->RegisterGlobalFunction("Object @objectCreate(const string &in, const string &in)", asFUNCTION(objectCreate2), asCALL_CDECL); - engine->RegisterGlobalFunction("Object @objectCreate(const string &in, const string &in, Object &in)", asFUNCTION(objectCreate3), asCALL_CDECL); + engine->RegisterGlobalFunction("Object @objectCreate(const string &in)", + generic ? WRAP_FN(objectCreate1) : asFUNCTION(objectCreate1), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("Object @objectCreate(const string &in, const string &in)", + generic ? WRAP_FN(objectCreate2) : asFUNCTION(objectCreate2), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("Object @objectCreate(const string &in, const string &in, Object &in)", + generic ? WRAP_FN(objectCreate3) : asFUNCTION(objectCreate3), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("Actor @composeActor(const string &in, const string &in, Object &in)", + generic ? WRAP_FN(composeActor) : asFUNCTION(composeActor), + generic ? asCALL_GENERIC : asCALL_CDECL); - engine->RegisterGlobalFunction("Actor @composeActor(const string &in, const string &in, Object &in)", asFUNCTION(composeActor), asCALL_CDECL); + engine->RegisterGlobalFunction("Object @loadResource(const string &in)", + generic ? WRAP_FN(loadResource) : asFUNCTION(loadResource), + generic ? asCALL_GENERIC : asCALL_CDECL); - engine->RegisterGlobalFunction("Object @loadResource(const string &in)", asFUNCTION(loadResource), asCALL_CDECL); - engine->RegisterGlobalFunction("void unloadResource(const string &in)", asFUNCTION(unloadResource), asCALL_CDECL); + engine->RegisterGlobalFunction("void unloadResource(const string &in)", + generic ? WRAP_FN(unloadResource) : asFUNCTION(unloadResource), + generic ? asCALL_GENERIC : asCALL_CDECL); - engine->RegisterGlobalFunction("Scene @loadScene(const string &in, bool)", asFUNCTION(Engine::loadScene), asCALL_CDECL); - engine->RegisterGlobalFunction("void unloadScene(Scene &)", asFUNCTION(Engine::unloadScene), asCALL_CDECL); + engine->RegisterGlobalFunction("Scene @loadScene(const string &in, bool)", + generic ? WRAP_FN(Engine::loadScene) : asFUNCTION(Engine::loadScene), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("void unloadScene(Scene &)", + generic ? WRAP_FN(Engine::unloadScene) : asFUNCTION(Engine::unloadScene), + generic ? asCALL_GENERIC : asCALL_CDECL); engine->SetDefaultNamespace(""); } -void registerCore(asIScriptEngine *engine) { - engine->RegisterGlobalFunction("void debug(const string &in)", asFUNCTION(debugFunction), asCALL_CDECL); - engine->RegisterGlobalFunction("void info(const string &in)", asFUNCTION(infoFunction), asCALL_CDECL); - engine->RegisterGlobalFunction("void warning(const string &in)", asFUNCTION(warningFunction), asCALL_CDECL); - engine->RegisterGlobalFunction("void error(const string &in)", asFUNCTION(errorFunction), asCALL_CDECL); - engine->RegisterGlobalFunction("void critical(const string &in)", asFUNCTION(criticalFunction), asCALL_CDECL); +void registerCore(asIScriptEngine *engine, bool generic) { + engine->RegisterGlobalFunction("void debug(const string &in)", + generic ? WRAP_FN(debugFunction) : asFUNCTION(debugFunction), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("void info(const string &in)", + generic ? WRAP_FN(infoFunction) : asFUNCTION(infoFunction), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("void warning(const string &in)", + generic ? WRAP_FN(warningFunction) : asFUNCTION(warningFunction), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("void error(const string &in)", + generic ? WRAP_FN(errorFunction) : asFUNCTION(errorFunction), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("void critical(const string &in)", + generic ? WRAP_FN(criticalFunction) : asFUNCTION(criticalFunction), + generic ? asCALL_GENERIC : asCALL_CDECL); - registerObject(engine); + registerObject(engine, generic); } diff --git a/modules/vms/angel/src/bindings/angelinput.cpp b/modules/vms/angel/src/bindings/angelinput.cpp index 8f6913439..c0b02580c 100644 --- a/modules/vms/angel/src/bindings/angelinput.cpp +++ b/modules/vms/angel/src/bindings/angelinput.cpp @@ -1,6 +1,7 @@ #include "bindings/angelbindings.h" #include +#include #include @@ -9,7 +10,7 @@ const char *JoystickButton("JoystickButton"); const char *TouchState("TouchState"); const char *KeyCode("KeyCode"); -void registerInput(asIScriptEngine *engine) { +void registerInput(asIScriptEngine *engine, bool generic) { engine->SetDefaultNamespace("Input"); engine->RegisterEnum(KeyCode); @@ -165,26 +166,69 @@ void registerInput(asIScriptEngine *engine) { engine->RegisterEnumValue(KeyCode, "TOUCH_ENDED", Input::TOUCH_ENDED); engine->RegisterEnumValue(KeyCode, "TOUCH_CANCELLED", Input::TOUCH_CANCELLED); - engine->RegisterGlobalFunction("bool isKey(int)", asFUNCTION(Input::isKey), asCALL_CDECL); - engine->RegisterGlobalFunction("bool isKeyDown(int)", asFUNCTION(Input::isKeyDown), asCALL_CDECL); - engine->RegisterGlobalFunction("bool isKeyUp(int)", asFUNCTION(Input::isKeyUp), asCALL_CDECL); + engine->RegisterGlobalFunction("bool isKey(int)", + generic ? WRAP_FN(Input::isKey) : asFUNCTION(Input::isKey), + generic ? asCALL_GENERIC : asCALL_CDECL); - engine->RegisterGlobalFunction("bool isMouseButton(int)", asFUNCTION(Input::isMouseButton), asCALL_CDECL); - engine->RegisterGlobalFunction("bool isMouseButtonDown(int)", asFUNCTION(Input::isMouseButtonDown), asCALL_CDECL); - engine->RegisterGlobalFunction("bool isMouseButtonUp(int)", asFUNCTION(Input::isMouseButtonUp), asCALL_CDECL); + engine->RegisterGlobalFunction("bool isKeyDown(int)", + generic ? WRAP_FN(Input::isKeyDown) : asFUNCTION(Input::isKeyDown), + generic ? asCALL_GENERIC : asCALL_CDECL); - engine->RegisterGlobalFunction("Vector4 mousePosition()", asFUNCTION(Input::mousePosition), asCALL_CDECL); - engine->RegisterGlobalFunction("Vector4 mouseDelta()", asFUNCTION(Input::mouseDelta), asCALL_CDECL); - engine->RegisterGlobalFunction("void mouseLockCursor(bool)", asFUNCTION(Input::mouseLockCursor), asCALL_CDECL); + engine->RegisterGlobalFunction("bool isKeyUp(int)", + generic ? WRAP_FN(Input::isKeyUp) : asFUNCTION(Input::isKeyUp), + generic ? asCALL_GENERIC : asCALL_CDECL); - engine->RegisterGlobalFunction("int joystickCount()", asFUNCTION(Input::joystickCount), asCALL_CDECL); - engine->RegisterGlobalFunction("int joystickButtons(int)", asFUNCTION(Input::joystickButtons), asCALL_CDECL); - engine->RegisterGlobalFunction("Vector4 joystickThumbs(int)", asFUNCTION(Input::joystickThumbs), asCALL_CDECL); - engine->RegisterGlobalFunction("Vector2 joystickTriggers(int)", asFUNCTION(Input::joystickTriggers), asCALL_CDECL); + engine->RegisterGlobalFunction("bool isMouseButton(int)", + generic ? WRAP_FN(Input::isMouseButton) : asFUNCTION(Input::isMouseButton), + generic ? asCALL_GENERIC : asCALL_CDECL); - engine->RegisterGlobalFunction("int touchCount()", asFUNCTION(Input::touchCount), asCALL_CDECL); - engine->RegisterGlobalFunction("int touchState(int)", asFUNCTION(Input::touchState), asCALL_CDECL); - engine->RegisterGlobalFunction("Vector4 touchPosition(int)", asFUNCTION(Input::touchPosition), asCALL_CDECL); + engine->RegisterGlobalFunction("bool isMouseButtonDown(int)", + generic ? WRAP_FN(Input::isMouseButtonDown) : asFUNCTION(Input::isMouseButtonDown), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("bool isMouseButtonUp(int)", + generic ? WRAP_FN(Input::isMouseButtonUp) : asFUNCTION(Input::isMouseButtonUp), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("Vector4 mousePosition()", + generic ? WRAP_FN(Input::mousePosition) : asFUNCTION(Input::mousePosition), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("Vector4 mouseDelta()", + generic ? WRAP_FN(Input::mouseDelta) : asFUNCTION(Input::mouseDelta), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("void mouseLockCursor(bool)", + generic ? WRAP_FN(Input::mouseLockCursor) : asFUNCTION(Input::mouseLockCursor), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("int joystickCount()", + generic ? WRAP_FN(Input::joystickCount) : asFUNCTION(Input::joystickCount), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("int joystickButtons(int)", + generic ? WRAP_FN(Input::joystickButtons) : asFUNCTION(Input::joystickButtons), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("Vector4 joystickThumbs(int)", + generic ? WRAP_FN(Input::joystickThumbs) : asFUNCTION(Input::joystickThumbs), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("Vector2 joystickTriggers(int)", + generic ? WRAP_FN(Input::joystickTriggers) : asFUNCTION(Input::joystickTriggers), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("int touchCount()", + generic ? WRAP_FN(Input::touchCount) : asFUNCTION(Input::touchCount), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("int touchState(int)", + generic ? WRAP_FN(Input::touchState) : asFUNCTION(Input::touchState), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("Vector4 touchPosition(int)", + generic ? WRAP_FN(Input::touchPosition) : asFUNCTION(Input::touchPosition), + generic ? asCALL_GENERIC : asCALL_CDECL); engine->SetDefaultNamespace(""); } diff --git a/modules/vms/angel/src/bindings/angelmath.cpp b/modules/vms/angel/src/bindings/angelmath.cpp index 0647b3de1..df12a8900 100644 --- a/modules/vms/angel/src/bindings/angelmath.cpp +++ b/modules/vms/angel/src/bindings/angelmath.cpp @@ -1,6 +1,7 @@ #include "bindings/angelbindings.h" #include +#include #include @@ -36,47 +37,116 @@ static void vec2SetY(float value, Vector2 *dest) { dest->y = value; } -void registerVector2(asIScriptEngine *engine) { +void registerVector2(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("Vector2", sizeof(Vector2), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("Vector2", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(vec2), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector2", asBEHAVE_CONSTRUCT, "void f(float)", asFUNCTION(new1Float2), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector2", asBEHAVE_CONSTRUCT, "void f(float, float)", asFUNCTION(new2Float2), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Vector2", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(Vector2, ()) : asFUNCTION(vec2), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector2", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteVec2), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Vector2", asBEHAVE_CONSTRUCT, "void f(float)", + generic ? WRAP_CON(Vector2, (float)) : asFUNCTION(new1Float2), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector2", "Vector2 &opAssign(const Vector2 &in)", asMETHODPR(Vector2, operator=, (const Vector2&), Vector2&), asCALL_THISCALL); + engine->RegisterObjectBehaviour("Vector2", asBEHAVE_CONSTRUCT, "void f(float, float)", + generic ? WRAP_CON(Vector2, (float, float)) : asFUNCTION(new2Float2), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector2", "bool opEquals(const Vector2 &in)", asMETHOD(Vector2, operator==), asCALL_THISCALL); + engine->RegisterObjectBehaviour("Vector2", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(Vector2) : asFUNCTION(deleteVec2), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector2", "bool opCmp(const Vector2 &in)", asMETHOD(Vector2, operator>), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector2", "Vector2 &opAssign(const Vector2 &in)", + generic ? WRAP_MFN_PR(Vector2, operator=, (const Vector2&), Vector2&) : asMETHODPR(Vector2, operator=, (const Vector2&), Vector2&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 opMul(float)", asMETHODPR(Vector2, operator*, (areal) const, Vector2), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 opMul(const Vector2 &in)", asMETHODPR(Vector2, operator*, (const Vector2 &) const, Vector2), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector2", "bool opEquals(const Vector2 &in)", + generic ? WRAP_MFN(Vector2, operator==) : asMETHOD(Vector2, operator==), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 opDiv(float)", asMETHOD(Vector2, operator/), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 opAdd(const Vector2 &in)", asMETHOD(Vector2, operator+), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 opNeg()", asMETHODPR(Vector2, operator-, () const, Vector2), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 opSub(const Vector2 &in)", asMETHODPR(Vector2, operator-, (const Vector2 &) const, Vector2), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector2", "bool opCmp(const Vector2 &in)", + generic ? WRAP_MFN(Vector2, operator<) : asMETHOD(Vector2, operator<), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 &opMulAssign(float)", asMETHOD(Vector2, operator*=), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 &opDivAssign(float)", asMETHOD(Vector2, operator/=), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 &opAddAssign(const Vector2 &in)", asMETHOD(Vector2, operator+=), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 &opSubAssign(const Vector2 &in)", asMETHOD(Vector2, operator-=), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector2", "Vector2 opMul(float)", + generic ? WRAP_MFN_PR(Vector2, operator*, (areal) const, Vector2) : asMETHODPR(Vector2, operator*, (areal) const, Vector2), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "float opIndex(int)", asMETHODPR(Vector2, operator[], (int i) const, float), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector2", "Vector2 opMul(const Vector2 &in)", + generic ? WRAP_MFN_PR(Vector2, operator*, (const Vector2 &) const, Vector2) : asMETHODPR(Vector2, operator*, (const Vector2 &) const, Vector2), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "float length()", asMETHOD(Vector2, length), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "float sqrLength()", asMETHOD(Vector2, sqrLength), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "float normalize()", asMETHOD(Vector2, normalize), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "Vector2 &cross(const Vector2 &in)", asMETHOD(Vector2, cross), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "float dot(const Vector2 &in)", asMETHOD(Vector2, dot), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector2", "Vector2 opDiv(float)", + generic ? WRAP_MFN(Vector2, operator/) : asMETHOD(Vector2, operator/), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "float get_x() property", asFUNCTION(vec2GetX), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector2", "void set_x(float) property", asFUNCTION(vec2SetX), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Vector2", "Vector2 opAdd(const Vector2 &in)", + generic ? WRAP_MFN(Vector2, operator+) : asMETHOD(Vector2, operator+), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector2", "float get_y() property", asFUNCTION(vec2GetY), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector2", "void set_y(float) property", asFUNCTION(vec2SetY), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Vector2", "Vector2 opNeg()", + generic ? WRAP_MFN_PR(Vector2, operator-, () const, Vector2) : asMETHODPR(Vector2, operator-, () const, Vector2), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "Vector2 opSub(const Vector2 &in)", + generic ? WRAP_MFN_PR(Vector2, operator-, (const Vector2 &) const, Vector2) : asMETHODPR(Vector2, operator-, (const Vector2 &) const, Vector2), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "Vector2 &opMulAssign(float)", + generic ? WRAP_MFN(Vector2, operator*=) : asMETHOD(Vector2, operator*=), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "Vector2 &opDivAssign(float)", + generic ? WRAP_MFN(Vector2, operator/=) : asMETHOD(Vector2, operator/=), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "Vector2 &opAddAssign(const Vector2 &in)", + generic ? WRAP_MFN(Vector2, operator+=) : asMETHOD(Vector2, operator+=), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "Vector2 &opSubAssign(const Vector2 &in)", + generic ? WRAP_MFN(Vector2, operator-=) : asMETHOD(Vector2, operator-=), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "float opIndex(int)", + generic ? WRAP_MFN_PR(Vector2, operator[], (int i) const, float) : asMETHODPR(Vector2, operator[], (int i) const, float), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "float length()", + generic ? WRAP_MFN(Vector2, length) : asMETHOD(Vector2, length), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "float sqrLength()", + generic ? WRAP_MFN(Vector2, sqrLength) : asMETHOD(Vector2, sqrLength), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "float normalize()", + generic ? WRAP_MFN(Vector2, normalize) : asMETHOD(Vector2, normalize), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "Vector2 &cross(const Vector2 &in)", + generic ? WRAP_MFN(Vector2, cross) : asMETHOD(Vector2, cross), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "float dot(const Vector2 &in)", + generic ? WRAP_MFN(Vector2, dot) : asMETHOD(Vector2, dot), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector2", "float get_x() property", + generic ? WRAP_FN(vec2GetX) : asFUNCTION(vec2GetX), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector2", "void set_x(float) property", + generic ? WRAP_FN(vec2SetX) : asFUNCTION(vec2SetX), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector2", "float get_y() property", + generic ? WRAP_FN(vec2GetY) : asFUNCTION(vec2GetY), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector2", "void set_y(float) property", + generic ? WRAP_FN(vec2SetY) : asFUNCTION(vec2SetY), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); } static void vec3(Vector3 *dest) { @@ -123,53 +193,136 @@ static void vec3SetZ(float value, Vector3 *dest) { dest->z = value; } -void registerVector3(asIScriptEngine *engine) { +void registerVector3(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("Vector3", sizeof(Vector3), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(vec3), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f(float)", asFUNCTION(new1Float3), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f(float, float, float)", asFUNCTION(new3Float3), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f(const Vector2 &in, float)", asFUNCTION(newVec2Float3), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector3", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteVec3), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(Vector3, ()) : asFUNCTION(vec3), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f(float)", + generic ? WRAP_CON(Vector3, (float)) : asFUNCTION(new1Float3), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f(float, float, float)", + generic ? WRAP_CON(Vector3, (float, float, float)) : asFUNCTION(new3Float3), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Vector3", asBEHAVE_CONSTRUCT, "void f(const Vector2 &in, float)", + generic ? WRAP_CON(Vector3, (const Vector2 &, float)) : asFUNCTION(newVec2Float3), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Vector3", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(Vector3) : asFUNCTION(deleteVec3), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector3", "Vector3 &opAssign(const Vector3 &in)", + generic ? WRAP_MFN_PR(Vector3, operator=, (const Vector3&), Vector3&) : asMETHODPR(Vector3, operator=, (const Vector3&), Vector3&), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector3", "bool opEquals(const Vector3 &in)", + generic ? WRAP_MFN(Vector3, operator==) : asMETHOD(Vector3, operator==), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector3", "bool opCmp(const Vector3 &in)", + generic ? WRAP_MFN(Vector3, operator<) : asMETHOD(Vector3, operator<), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector3", "Vector3 opMul(float)", + generic ? WRAP_MFN_PR(Vector3, operator*, (areal) const, Vector3) : asMETHODPR(Vector3, operator*, (areal) const, Vector3), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector3", "Vector3 opMul(const Vector3 &in)", + generic ? WRAP_MFN_PR(Vector3, operator*, (const Vector3 &) const, Vector3) : asMETHODPR(Vector3, operator*, (const Vector3 &) const, Vector3), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector3", "Vector3 opDiv(float)", + generic ? WRAP_MFN(Vector3, operator/) : asMETHOD(Vector3, operator/), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector3", "Vector3 opAdd(const Vector3 &in)", + generic ? WRAP_MFN(Vector3, operator+) : asMETHOD(Vector3, operator+), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector3", "Vector3 opNeg()", + generic ? WRAP_MFN_PR(Vector3, operator-, () const, Vector3) : asMETHODPR(Vector3, operator-, () const, Vector3), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector3", "Vector3 opSub(const Vector3 &in)", + generic ? WRAP_MFN_PR(Vector3, operator-, (const Vector3 &) const, Vector3) : asMETHODPR(Vector3, operator-, (const Vector3 &) const, Vector3), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 &opAssign(const Vector3 &in)", asMETHODPR(Vector3, operator=, (const Vector3&), Vector3&), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector3", "Vector3 &opMulAssign(float)", + generic ? WRAP_MFN(Vector3, operator*=) : asMETHOD(Vector3, operator*=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "bool opEquals(const Vector3 &in)", asMETHOD(Vector3, operator==), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector3", "Vector3 &opDivAssign(float)", + generic ? WRAP_MFN(Vector3, operator/=) : asMETHOD(Vector3, operator/=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "bool opCmp(const Vector3 &in)", asMETHOD(Vector3, operator>), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector3", "Vector3 &opAddAssign(const Vector3 &in)", + generic ? WRAP_MFN(Vector3, operator+=) : asMETHOD(Vector3, operator+=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 opMul(float)", asMETHODPR(Vector3, operator*, (areal) const, Vector3), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 opMul(const Vector3 &in)", asMETHODPR(Vector3, operator*, (const Vector3 &) const, Vector3), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector3", "Vector3 &opSubAssign(const Vector3 &in)", + generic ? WRAP_MFN(Vector3, operator-=) : asMETHOD(Vector3, operator-=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 opDiv(float)", asMETHOD(Vector3, operator/), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 opAdd(const Vector3 &in)", asMETHOD(Vector3, operator+), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 opNeg()", asMETHODPR(Vector3, operator-, () const, Vector3), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 opSub(const Vector3 &in)", asMETHODPR(Vector3, operator-, (const Vector3 &) const, Vector3), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector3", "float opIndex(int)", + generic ? WRAP_MFN_PR(Vector3, operator[], (int i) const, float) : asMETHODPR(Vector3, operator[], (int i) const, float), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 &opMulAssign(float)", asMETHOD(Vector3, operator*=), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 &opDivAssign(float)", asMETHOD(Vector3, operator/=), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 &opAddAssign(const Vector3 &in)", asMETHOD(Vector3, operator+=), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 &opSubAssign(const Vector3 &in)", asMETHOD(Vector3, operator-=), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector3", "float length()", + generic ? WRAP_MFN(Vector3, length) : asMETHOD(Vector3, length), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float opIndex(int)", asMETHODPR(Vector3, operator[], (int i) const, float), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector3", "float sqrLength()", + generic ? WRAP_MFN(Vector3, sqrLength) : asMETHOD(Vector3, sqrLength), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float length()", asMETHOD(Vector3, length), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float sqrLength()", asMETHOD(Vector3, sqrLength), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float normalize()", asMETHOD(Vector3, normalize), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "Vector3 &cross(const Vector3 &in)", asMETHOD(Vector3, cross), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float dot(const Vector3 &in)", asMETHOD(Vector3, dot), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector3", "float normalize()", + generic ? WRAP_MFN(Vector3, normalize) : asMETHOD(Vector3, normalize), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float angle(const Vector3 &in)", asMETHOD(Vector3, angle), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float signedAngle(const Vector3 &in, const Vector3 &in)", asMETHOD(Vector3, signedAngle), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector3", "Vector3 &cross(const Vector3 &in)", + generic ? WRAP_MFN(Vector3, cross) : asMETHOD(Vector3, cross), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float get_x() property", asFUNCTION(vec3GetX), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector3", "void set_x(float) property", asFUNCTION(vec3SetX), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Vector3", "float dot(const Vector3 &in)", + generic ? WRAP_MFN(Vector3, dot) : asMETHOD(Vector3, dot), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float get_y() property", asFUNCTION(vec3GetY), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector3", "void set_y(float) property", asFUNCTION(vec3SetY), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Vector3", "float angle(const Vector3 &in)", + generic ? WRAP_MFN(Vector3, angle) : asMETHOD(Vector3, angle), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector3", "float get_z() property", asFUNCTION(vec3GetZ), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector3", "void set_z(float) property", asFUNCTION(vec3SetZ), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Vector3", "float signedAngle(const Vector3 &in, const Vector3 &in)", + generic ? WRAP_MFN(Vector3, signedAngle) : asMETHOD(Vector3, signedAngle), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector3", "float get_x() property", + generic ? WRAP_FN(vec3GetX) : asFUNCTION(vec3GetX), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector3", "void set_x(float) property", + generic ? WRAP_FN(vec3SetX) : asFUNCTION(vec3SetX), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector3", "float get_y() property", + generic ? WRAP_FN(vec3GetY) : asFUNCTION(vec3GetY), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector3", "void set_y(float) property", + generic ? WRAP_FN(vec3SetY) : asFUNCTION(vec3SetY), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector3", "float get_z() property", + generic ? WRAP_FN(vec3GetZ) : asFUNCTION(vec3GetZ), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector3", "void set_z(float) property", + generic ? WRAP_FN(vec3SetZ) : asFUNCTION(vec3SetZ), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); } static void vec4(Vector4 *dest) { @@ -228,53 +381,136 @@ static void vec4SetW(float value, Vector4 *dest) { dest->w = value; } -void registerVector4(asIScriptEngine *engine) { +void registerVector4(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("Vector4", sizeof(Vector4), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(vec4), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f(float)", asFUNCTION(new1Float4), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f(float, float, float, float)", asFUNCTION(new4Float4), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f(const Vector2 &in, float, float)", asFUNCTION(newVec2Float4), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, float)", asFUNCTION(newVec3Float4), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Vector4", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteVec4), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(Vector4, ()) : asFUNCTION(vec4), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f(float)", + generic ? WRAP_CON(Vector4, (float)) : asFUNCTION(new1Float4), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f(float, float, float, float)", + generic ? WRAP_CON(Vector4, (float, float, float, float)) : asFUNCTION(new4Float4), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f(const Vector2 &in, float, float)", + generic ? WRAP_CON(Vector4, (const Vector2 &, float, float)) : asFUNCTION(newVec2Float4), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Vector4", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, float)", + generic ? WRAP_CON(Vector4, (const Vector3 &, float)) : asFUNCTION(newVec3Float4), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Vector4", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(Vector4) : asFUNCTION(deleteVec4), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector4", "Vector4 &opAssign(const Vector4 &in)", + generic ? WRAP_MFN_PR(Vector4, operator=, (const Vector4&), Vector4&) : asMETHODPR(Vector4, operator=, (const Vector4&), Vector4&), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector4", "bool opEquals(const Vector4 &in)", + generic ? WRAP_MFN(Vector4, operator==) : asMETHOD(Vector4, operator==), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector4", "bool opCmp(const Vector4 &in)", + generic ? WRAP_MFN(Vector4, operator<) : asMETHOD(Vector4, operator<), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 &opAssign(const Vector4 &in)", asMETHODPR(Vector4, operator=, (const Vector4&), Vector4&), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector4", "Vector4 opMul(float)", + generic ? WRAP_MFN_PR(Vector4, operator*, (areal) const, Vector4) : asMETHODPR(Vector4, operator*, (areal) const, Vector4), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "bool opEquals(const Vector4 &in)", asMETHOD(Vector4, operator==), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector4", "Vector4 opMul(const Vector4 &in)", + generic ? WRAP_MFN_PR(Vector4, operator*, (const Vector4 &) const, Vector4) : asMETHODPR(Vector4, operator*, (const Vector4 &) const, Vector4), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "bool opCmp(const Vector4 &in)", asMETHOD(Vector4, operator>), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector4", "Vector4 opDiv(float)", + generic ? WRAP_MFN(Vector4, operator/) : asMETHOD(Vector4, operator/), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 opMul(float)", asMETHODPR(Vector4, operator*, (areal) const, Vector4), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 opMul(const Vector4 &in)", asMETHODPR(Vector4, operator*, (const Vector4 &) const, Vector4), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector4", "Vector4 opAdd(const Vector4 &in)", + generic ? WRAP_MFN(Vector4, operator+) : asMETHOD(Vector4, operator+), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 opDiv(float)", asMETHOD(Vector4, operator/), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 opAdd(const Vector4 &in)", asMETHOD(Vector4, operator+), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 opNeg()", asMETHODPR(Vector4, operator-, () const, Vector4), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 opSub(const Vector4 &in)", asMETHODPR(Vector4, operator-, (const Vector4 &) const, Vector4), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector4", "Vector4 opNeg()", + generic ? WRAP_MFN_PR(Vector4, operator-, () const, Vector4) : asMETHODPR(Vector4, operator-, () const, Vector4), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 &opMulAssign(float)", asMETHOD(Vector4, operator*=), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 &opDivAssign(float)", asMETHOD(Vector4, operator/=), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 &opAddAssign(const Vector4 &in)", asMETHOD(Vector4, operator+=), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "Vector4 &opSubAssign(const Vector4 &in)", asMETHOD(Vector4, operator-=), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector4", "Vector4 opSub(const Vector4 &in)", + generic ? WRAP_MFN_PR(Vector4, operator-, (const Vector4 &) const, Vector4) : asMETHODPR(Vector4, operator-, (const Vector4 &) const, Vector4), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "float opIndex(int)", asMETHODPR(Vector4, operator[], (int i) const, float), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector4", "Vector4 &opMulAssign(float)", + generic ? WRAP_MFN(Vector4, operator*=) : asMETHOD(Vector4, operator*=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "float length()", asMETHOD(Vector4, length), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "float sqrLength()", asMETHOD(Vector4, sqrLength), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "float normalize()", asMETHOD(Vector4, normalize), asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "float dot(const Vector4 &in)", asMETHOD(Vector4, dot), asCALL_THISCALL); + engine->RegisterObjectMethod("Vector4", "Vector4 &opDivAssign(float)", + generic ? WRAP_MFN(Vector4, operator/=) : asMETHOD(Vector4, operator/=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "float get_x() property", asFUNCTION(vec4GetX), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector4", "void set_x(float) property", asFUNCTION(vec4SetX), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Vector4", "Vector4 &opAddAssign(const Vector4 &in)", + generic ? WRAP_MFN(Vector4, operator+=) : asMETHOD(Vector4, operator+=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "float get_y() property", asFUNCTION(vec4GetY), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector4", "void set_y(float) property", asFUNCTION(vec4SetY), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Vector4", "Vector4 &opSubAssign(const Vector4 &in)", + generic ? WRAP_MFN(Vector4, operator-=) : asMETHOD(Vector4, operator-=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "float get_z() property", asFUNCTION(vec4GetZ), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector4", "void set_z(float) property", asFUNCTION(vec4SetZ), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Vector4", "float opIndex(int)", + generic ? WRAP_MFN_PR(Vector4, operator[], (int i) const, float) : asMETHODPR(Vector4, operator[], (int i) const, float), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Vector4", "float get_w() property", asFUNCTION(vec4GetW), asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Vector4", "void set_w(float) property", asFUNCTION(vec4SetW), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Vector4", "float length()", + generic ? WRAP_MFN(Vector4, length) : asMETHOD(Vector4, length), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector4", "float sqrLength()", + generic ? WRAP_MFN(Vector4, sqrLength) : asMETHOD(Vector4, sqrLength), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector4", "float normalize()", + generic ? WRAP_MFN(Vector4, normalize) : asMETHOD(Vector4, normalize), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector4", "float dot(const Vector4 &in)", + generic ? WRAP_MFN(Vector4, dot) : asMETHOD(Vector4, dot), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Vector4", "float get_x() property", + generic ? WRAP_FN(vec4GetX) : asFUNCTION(vec4GetX), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector4", "void set_x(float) property", + generic ? WRAP_FN(vec4SetX) : asFUNCTION(vec4SetX), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector4", "float get_y() property", + generic ? WRAP_FN(vec4GetY) : asFUNCTION(vec4GetY), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector4", "void set_y(float) property", + generic ? WRAP_FN(vec4SetY) : asFUNCTION(vec4SetY), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector4", "float get_z() property", + generic ? WRAP_FN(vec4GetZ) : asFUNCTION(vec4GetZ), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector4", "void set_z(float) property", + generic ? WRAP_FN(vec4SetZ) : asFUNCTION(vec4SetZ), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector4", "float get_w() property", + generic ? WRAP_FN(vec4GetW) : asFUNCTION(vec4GetW), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Vector4", "void set_w(float) property", + generic ? WRAP_FN(vec4SetW) : asFUNCTION(vec4SetW), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); } static void mat3(Matrix3 *dest) { @@ -285,44 +521,104 @@ static void deleteMat3(Matrix3 *dest) { dest->~Matrix3(); } -void registerMatrix3(asIScriptEngine *engine) { +void registerMatrix3(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("Matrix3", sizeof(Matrix3), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("Matrix3", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(mat3), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Matrix3", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteMat3), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Matrix3", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(Matrix3, ()) : asFUNCTION(mat3), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Matrix3", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(Matrix3) : asFUNCTION(deleteMat3), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Matrix3", "Matrix3 &opAssign(const Matrix3 &in)", + generic ? WRAP_MFN_PR(Matrix3, operator=, (const Matrix3&), Matrix3&) : asMETHODPR(Matrix3, operator=, (const Matrix3&), Matrix3&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 &opAssign(const Matrix3 &in)", asMETHODPR(Matrix3, operator=, (const Matrix3&), Matrix3&), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "bool opEquals(const Matrix3 &in)", + generic ? WRAP_MFN(Matrix3, operator==) : asMETHOD(Matrix3, operator==), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "bool opEquals(const Matrix3 &in)", asMETHOD(Matrix3, operator==), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Matrix3 opMul(float)", + generic ? WRAP_MFN_PR(Matrix3, operator*, (areal) const, Matrix3) : asMETHODPR(Matrix3, operator*, (areal) const, Matrix3), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 opMul(float)", asMETHODPR(Matrix3, operator*, (areal) const, Matrix3), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Vector3 opMul(const Vector3 &in)", asMETHODPR(Matrix3, operator*, (const Vector3 &) const, Vector3), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Vector4 opMul(const Vector4 &in)", asMETHODPR(Matrix3, operator*, (const Vector4 &) const, Vector4), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 opMul(const Matrix3 &in)", asMETHODPR(Matrix3, operator*, (const Matrix3 &) const, Matrix3), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Vector3 opMul(const Vector3 &in)", + generic ? WRAP_MFN_PR(Matrix3, operator*, (const Vector3 &) const, Vector3) : asMETHODPR(Matrix3, operator*, (const Vector3 &) const, Vector3), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 opAdd(const Matrix3 &in)", asMETHOD(Matrix3, operator+), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 opSub(const Matrix3 &in)", asMETHOD(Matrix3, operator-), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Vector4 opMul(const Vector4 &in)", + generic ? WRAP_MFN_PR(Matrix3, operator*, (const Vector4 &) const, Vector4) : asMETHODPR(Matrix3, operator*, (const Vector4 &) const, Vector4), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 &opMulAssign(float)", asMETHODPR(Matrix3, operator*=, (areal), Matrix3&), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 &opMulAssign(const Matrix3 &in)", asMETHODPR(Matrix3, operator*=, (const Matrix3 &), Matrix3&), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Matrix3 opMul(const Matrix3 &in)", + generic ? WRAP_MFN_PR(Matrix3, operator*, (const Matrix3 &) const, Matrix3) : asMETHODPR(Matrix3, operator*, (const Matrix3 &) const, Matrix3), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 &opAddAssign(const Matrix3 &in)", asMETHOD(Matrix3, operator+=), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 &opSubAssign(const Matrix3 &in)", asMETHOD(Matrix3, operator-=), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Matrix3 opAdd(const Matrix3 &in)", + generic ? WRAP_MFN(Matrix3, operator+) : asMETHOD(Matrix3, operator+), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "float opIndex(int)", asMETHODPR(Matrix3, operator[], (int i) const, float), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Matrix3 opSub(const Matrix3 &in)", + generic ? WRAP_MFN(Matrix3, operator-) : asMETHOD(Matrix3, operator-), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 transpose()", asMETHOD(Matrix3, transpose), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "float determinant()", asMETHOD(Matrix3, determinant), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "Matrix3 inverse()", asMETHOD(Matrix3, inverse), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Matrix3 &opMulAssign(float)", + generic ? WRAP_MFN_PR(Matrix3, operator*=, (areal), Matrix3&) : asMETHODPR(Matrix3, operator*=, (areal), Matrix3&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "void zero()", asMETHOD(Matrix3, zero), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "void identity()", asMETHOD(Matrix3, identity), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Matrix3 &opMulAssign(const Matrix3 &in)", + generic ? WRAP_MFN_PR(Matrix3, operator*=, (const Matrix3 &), Matrix3&) : asMETHODPR(Matrix3, operator*=, (const Matrix3 &), Matrix3&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "void rotate(const Vector3 &in, float angle)", asMETHODPR(Matrix3, rotate, (const Vector3 &, float), void), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "void rotate(const Vector3 &in)", asMETHODPR(Matrix3, rotate, (const Vector3 &), void), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Matrix3 &opAddAssign(const Matrix3 &in)", + generic ? WRAP_MFN(Matrix3, operator+=) : asMETHOD(Matrix3, operator+=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "void scale(const Vector3 &in)", asMETHOD(Matrix3, scale), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix3", "void orthonormalize()", asMETHOD(Matrix3, orthonormalize), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix3", "Matrix3 &opSubAssign(const Matrix3 &in)", + generic ? WRAP_MFN(Matrix3, operator-=) : asMETHOD(Matrix3, operator-=), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "float opIndex(int)", + generic ? WRAP_MFN_PR(Matrix3, operator[], (int i) const, float) : asMETHODPR(Matrix3, operator[], (int i) const, float), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "Matrix3 transpose()", + generic ? WRAP_MFN(Matrix3, transpose) : asMETHOD(Matrix3, transpose), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "float determinant()", + generic ? WRAP_MFN(Matrix3, determinant) : asMETHOD(Matrix3, determinant), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "Matrix3 inverse()", + generic ? WRAP_MFN(Matrix3, inverse) : asMETHOD(Matrix3, inverse), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "void zero()", + generic ? WRAP_MFN(Matrix3, zero) : asMETHOD(Matrix3, zero), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "void identity()", + generic ? WRAP_MFN(Matrix3, identity) : asMETHOD(Matrix3, identity), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "void rotate(const Vector3 &in, float angle)", + generic ? WRAP_MFN_PR(Matrix3, rotate, (const Vector3 &, float), void) : asMETHODPR(Matrix3, rotate, (const Vector3 &, float), void), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "void rotate(const Vector3 &in)", + generic ? WRAP_MFN_PR(Matrix3, rotate, (const Vector3 &), void) : asMETHODPR(Matrix3, rotate, (const Vector3 &), void), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "void scale(const Vector3 &in)", + generic ? WRAP_MFN(Matrix3, scale) : asMETHOD(Matrix3, scale), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix3", "void orthonormalize()", + generic ? WRAP_MFN(Matrix3, orthonormalize) : asMETHOD(Matrix3, orthonormalize), + generic ? asCALL_GENERIC : asCALL_THISCALL); } static void mat4(Matrix4 *dest) { @@ -333,50 +629,120 @@ static void deleteMat4(Matrix4 *dest) { dest->~Matrix4(); } -void registerMatrix4(asIScriptEngine *engine) { +void registerMatrix4(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("Matrix4", sizeof(Matrix4), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("Matrix4", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(mat4), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Matrix4", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteMat4), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Matrix4", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(Matrix4, ()) : asFUNCTION(mat4), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Matrix4", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(Matrix4) : asFUNCTION(deleteMat4), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Matrix4", "Matrix4 &opAssign(const Matrix4 &in)", + generic ? WRAP_MFN_PR(Matrix4, operator=, (const Matrix4&), Matrix4&) : asMETHODPR(Matrix4, operator=, (const Matrix4&), Matrix4&), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "bool opEquals(const Matrix4 &in)", + generic ? WRAP_MFN(Matrix4, operator==) : asMETHOD(Matrix4, operator==), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "Matrix4 opMul(float)", + generic ? WRAP_MFN_PR(Matrix4, operator*, (areal) const, Matrix4) : asMETHODPR(Matrix4, operator*, (areal) const, Matrix4), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 &opAssign(const Matrix4 &in)", asMETHODPR(Matrix4, operator=, (const Matrix4&), Matrix4&), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Vector3 opMul(const Vector3 &in)", + generic ? WRAP_MFN_PR(Matrix4, operator*, (const Vector3 &) const, Vector3) : asMETHODPR(Matrix4, operator*, (const Vector3 &) const, Vector3), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "bool opEquals(const Matrix4 &in)", asMETHOD(Matrix4, operator==), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Vector4 opMul(const Vector4 &in)", + generic ? WRAP_MFN_PR(Matrix4, operator*, (const Vector4 &) const, Vector4) : asMETHODPR(Matrix4, operator*, (const Vector4 &) const, Vector4), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 opMul(float)", asMETHODPR(Matrix4, operator*, (areal) const, Matrix4), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Vector3 opMul(const Vector3 &in)", asMETHODPR(Matrix4, operator*, (const Vector3 &) const, Vector3), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Vector4 opMul(const Vector4 &in)", asMETHODPR(Matrix4, operator*, (const Vector4 &) const, Vector4), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 opMul(const Matrix4 &in)", asMETHODPR(Matrix4, operator*, (const Matrix4 &) const, Matrix4), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Matrix4 opMul(const Matrix4 &in)", + generic ? WRAP_MFN_PR(Matrix4, operator*, (const Matrix4 &) const, Matrix4) : asMETHODPR(Matrix4, operator*, (const Matrix4 &) const, Matrix4), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 opAdd(const Matrix4 &in)", asMETHOD(Matrix4, operator+), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 opSub(const Matrix4 &in)", asMETHOD(Matrix4, operator-), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Matrix4 opAdd(const Matrix4 &in)", + generic ? WRAP_MFN(Matrix4, operator+) : asMETHOD(Matrix4, operator+), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 &opMulAssign(float)", asMETHODPR(Matrix4, operator*=, (areal), Matrix4&), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 &opMulAssign(const Matrix4 &in)", asMETHODPR(Matrix4, operator*=, (const Matrix4 &), Matrix4&), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Matrix4 opSub(const Matrix4 &in)", + generic ? WRAP_MFN(Matrix4, operator-) : asMETHOD(Matrix4, operator-), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 &opAddAssign(const Matrix4 &in)", asMETHOD(Matrix4, operator+=), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 &opSubAssign(const Matrix4 &in)", asMETHOD(Matrix4, operator-=), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Matrix4 &opMulAssign(float)", + generic ? WRAP_MFN_PR(Matrix4, operator*=, (areal), Matrix4&) : asMETHODPR(Matrix4, operator*=, (areal), Matrix4&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "float opIndex(int)", asMETHODPR(Matrix4, operator[], (int i) const, float), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Matrix4 &opMulAssign(const Matrix4 &in)", + generic ? WRAP_MFN_PR(Matrix4, operator*=, (const Matrix4 &), Matrix4&) : asMETHODPR(Matrix4, operator*=, (const Matrix4 &), Matrix4&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix3 rotation()", asMETHOD(Matrix4, rotation), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 transpose()", asMETHOD(Matrix4, transpose), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "float determinant()", asMETHOD(Matrix4, determinant), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Matrix4 inverse()", asMETHOD(Matrix4, inverse), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Matrix4 &opAddAssign(const Matrix4 &in)", + generic ? WRAP_MFN(Matrix4, operator+=) : asMETHOD(Matrix4, operator+=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "void reflect(const Vector4 &in)", asMETHOD(Matrix4, reflect), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "void direction(const Vector3 &in, const Vector3 &in)", asMETHOD(Matrix4, direction), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Matrix4 &opSubAssign(const Matrix4 &in)", + generic ? WRAP_MFN(Matrix4, operator-=) : asMETHOD(Matrix4, operator-=), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "Vector3 euler()", asMETHOD(Matrix4, euler), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "float opIndex(int)", + generic ? WRAP_MFN_PR(Matrix4, operator[], (int i) const, float) : asMETHODPR(Matrix4, operator[], (int i) const, float), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "void zero()", asMETHOD(Matrix4, zero), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "void identity()", asMETHOD(Matrix4, identity), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Matrix3 rotation()", + generic ? WRAP_MFN(Matrix4, rotation) : asMETHOD(Matrix4, rotation), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "void rotate(const Vector3 &in, float)", asMETHODPR(Matrix4, rotate, (const Vector3 &, float), void), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "void rotate(const Vector3 &in)", asMETHODPR(Matrix4, rotate, (const Vector3 &), void), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "Matrix4 transpose()", + generic ? WRAP_MFN(Matrix4, transpose) : asMETHOD(Matrix4, transpose), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "void scale(const Vector3 &in)", asMETHOD(Matrix4, scale), asCALL_THISCALL); - engine->RegisterObjectMethod("Matrix4", "void translate(const Vector3 &in)", asMETHOD(Matrix4, translate), asCALL_THISCALL); + engine->RegisterObjectMethod("Matrix4", "float determinant()", + generic ? WRAP_MFN(Matrix4, determinant) : asMETHOD(Matrix4, determinant), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "Matrix4 inverse()", + generic ? WRAP_MFN(Matrix4, inverse) : asMETHOD(Matrix4, inverse), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "void reflect(const Vector4 &in)", + generic ? WRAP_MFN(Matrix4, reflect) : asMETHOD(Matrix4, reflect), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "void direction(const Vector3 &in, const Vector3 &in)", + generic ? WRAP_MFN(Matrix4, direction) : asMETHOD(Matrix4, direction), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "Vector3 euler()", + generic ? WRAP_MFN(Matrix4, euler) : asMETHOD(Matrix4, euler), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "void zero()", + generic ? WRAP_MFN(Matrix4, zero) : asMETHOD(Matrix4, zero), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "void identity()", + generic ? WRAP_MFN(Matrix4, identity) : asMETHOD(Matrix4, identity), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "void rotate(const Vector3 &in, float)", + generic ? WRAP_MFN_PR(Matrix4, rotate, (const Vector3 &, float), void) : asMETHODPR(Matrix4, rotate, (const Vector3 &, float), void), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "void rotate(const Vector3 &in)", + generic ? WRAP_MFN_PR(Matrix4, rotate, (const Vector3 &), void) : asMETHODPR(Matrix4, rotate, (const Vector3 &), void), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "void scale(const Vector3 &in)", + generic ? WRAP_MFN(Matrix4, scale) : asMETHOD(Matrix4, scale), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Matrix4", "void translate(const Vector3 &in)", + generic ? WRAP_MFN(Matrix4, translate) : asMETHOD(Matrix4, translate), + generic ? asCALL_GENERIC : asCALL_THISCALL); } static void quat(Quaternion *dest) { @@ -399,29 +765,64 @@ static void quatMat(const Matrix3 &matrix, Quaternion *dest) { new (dest) Quaternion(matrix); } -void registerQuaternion(asIScriptEngine *engine) { +void registerQuaternion(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("Quaternion", sizeof(Quaternion), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(quat), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, float)", asFUNCTION(quatAxis), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in)", asFUNCTION(quatEuler), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_CONSTRUCT, "void f(const Matrix3 &in)", asFUNCTION(quatMat), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(Quaternion, ()) : asFUNCTION(quat), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, float)", + generic ? WRAP_CON(Quaternion, (const Vector3 &, float)) : asFUNCTION(quatAxis), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in)", + generic ? WRAP_CON(Quaternion, (const Vector3 &)) : asFUNCTION(quatEuler), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_CONSTRUCT, "void f(const Matrix3 &in)", + generic ? WRAP_CON(Quaternion, (const Matrix3 &)) : asFUNCTION(quatMat), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteQuat), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Quaternion", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(Quaternion) : asFUNCTION(deleteQuat), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Quaternion", "Quaternion &opAssign(const Quaternion &in)", asMETHODPR(Quaternion, operator=, (const Quaternion&), Quaternion&), asCALL_THISCALL); + engine->RegisterObjectMethod("Quaternion", "Quaternion &opAssign(const Quaternion &in)", + generic ? WRAP_MFN_PR(Quaternion, operator=, (const Quaternion&), Quaternion&) : asMETHODPR(Quaternion, operator=, (const Quaternion&), Quaternion&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Quaternion", "bool opEquals(const Quaternion &in)", asMETHOD(Quaternion, operator==), asCALL_THISCALL); + engine->RegisterObjectMethod("Quaternion", "bool opEquals(const Quaternion &in)", + generic ? WRAP_MFN(Quaternion, operator==) : asMETHOD(Quaternion, operator==), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Quaternion", "Vector3 opMul(const Vector3 &in)", asMETHODPR(Quaternion, operator*, (const Vector3 &) const, Vector3), asCALL_THISCALL); - engine->RegisterObjectMethod("Quaternion", "Quaternion opMul(const Vector4 &in)", asMETHODPR(Quaternion, operator*, (const Quaternion &) const, Quaternion), asCALL_THISCALL); + engine->RegisterObjectMethod("Quaternion", "Vector3 opMul(const Vector3 &in)", + generic ? WRAP_MFN_PR(Quaternion, operator*, (const Vector3 &) const, Vector3) : asMETHODPR(Quaternion, operator*, (const Vector3 &) const, Vector3), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Quaternion", "float opIndex(int)", asMETHODPR(Quaternion, operator[], (int i) const, float), asCALL_THISCALL); + engine->RegisterObjectMethod("Quaternion", "Quaternion opMul(const Vector4 &in)", + generic ? WRAP_MFN_PR(Quaternion, operator*, (const Quaternion &) const, Quaternion) : asMETHODPR(Quaternion, operator*, (const Quaternion &) const, Quaternion), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Quaternion", "Quaternion inverse()", asMETHOD(Quaternion, inverse), asCALL_THISCALL); - engine->RegisterObjectMethod("Quaternion", "void mix(const Quaternion &in, const Quaternion &in, float)", asMETHOD(Quaternion, mix), asCALL_THISCALL); - engine->RegisterObjectMethod("Quaternion", "Matrix3 toMatrix()", asMETHOD(Quaternion, toMatrix), asCALL_THISCALL); - engine->RegisterObjectMethod("Quaternion", "Vector3 euler()", asMETHOD(Quaternion, euler), asCALL_THISCALL); + engine->RegisterObjectMethod("Quaternion", "float opIndex(int)", + generic ? WRAP_MFN_PR(Quaternion, operator[], (int i) const, float) : asMETHODPR(Quaternion, operator[], (int i) const, float), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Quaternion", "Quaternion inverse()", + generic ? WRAP_MFN(Quaternion, inverse) : asMETHOD(Quaternion, inverse), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Quaternion", "void mix(const Quaternion &in, const Quaternion &in, float)", + generic ? WRAP_MFN(Quaternion, mix) : asMETHOD(Quaternion, mix), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Quaternion", "Matrix3 toMatrix()", + generic ? WRAP_MFN(Quaternion, toMatrix) : asMETHOD(Quaternion, toMatrix), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Quaternion", "Vector3 euler()", + generic ? WRAP_MFN(Quaternion, euler) : asMETHOD(Quaternion, euler), + generic ? asCALL_GENERIC : asCALL_THISCALL); } static void aabb(AABBox *dest) { @@ -436,23 +837,46 @@ static void aabbSize(const Vector3 ¢er, const Vector3 &size, AABBox *dest) { new (dest) AABBox(center, size); } -void registerAABBox(asIScriptEngine *engine) { +void registerAABBox(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("AABBox", sizeof(AABBox), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("AABBox", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(aabb), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("AABBox", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in)", asFUNCTION(aabbSize), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("AABBox", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(AABBox, ()) : asFUNCTION(aabb), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("AABBox", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in)", + generic ? WRAP_CON(AABBox, (const Vector3 &, const Vector3 &)) : asFUNCTION(aabbSize), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("AABBox", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(AABBox) : asFUNCTION(deleteAABB), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("AABBox", "AABBox &opAssign(const AABBox &in)", + generic ? WRAP_MFN_PR(AABBox, operator=, (const AABBox&), AABBox&) : asMETHODPR(AABBox, operator=, (const AABBox&), AABBox&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectBehaviour("AABBox", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteAABB), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("AABBox", "AABBox opMul(float)", + generic ? WRAP_MFN_PR(AABBox, operator*, (areal) const, const AABBox) : asMETHODPR(AABBox, operator*, (areal) const, const AABBox), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("AABBox", "AABBox &opAssign(const AABBox &in)", asMETHODPR(AABBox, operator=, (const AABBox&), AABBox&), asCALL_THISCALL); + engine->RegisterObjectMethod("AABBox", "AABBox opMul(const Vector3 &in)", + generic ? WRAP_MFN_PR(AABBox, operator*, (const Vector3 &) const, const AABBox) : asMETHODPR(AABBox, operator*, (const Vector3 &) const, const AABBox), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("AABBox", "AABBox opMul(float)", asMETHODPR(AABBox, operator*, (areal) const, const AABBox), asCALL_THISCALL); - engine->RegisterObjectMethod("AABBox", "AABBox opMul(const Vector3 &in)", asMETHODPR(AABBox, operator*, (const Vector3 &) const, const AABBox), asCALL_THISCALL); - engine->RegisterObjectMethod("AABBox", "AABBox opMul(const Matrix4 &in)", asMETHODPR(AABBox, operator*, (const Matrix4 &) const, const AABBox), asCALL_THISCALL); + engine->RegisterObjectMethod("AABBox", "AABBox opMul(const Matrix4 &in)", + generic ? WRAP_MFN_PR(AABBox, operator*, (const Matrix4 &) const, const AABBox) : asMETHODPR(AABBox, operator*, (const Matrix4 &) const, const AABBox), + generic ? asCALL_GENERIC : asCALL_THISCALL); //engine->RegisterObjectMethod("AABBox", "bool intersect(const Vector3 &in, float)", asMETHOD(AABBox, intersect), asCALL_THISCALL); - engine->RegisterObjectMethod("AABBox", "void box(Vector3 &out, Vector3 &out)", asMETHOD(AABBox, box), asCALL_THISCALL); - engine->RegisterObjectMethod("AABBox", "void setBox(const Vector3 &in, const Vector3 &in)", asMETHODPR(AABBox, setBox, (const Vector3 &, const Vector3 &), void), asCALL_THISCALL); + + engine->RegisterObjectMethod("AABBox", "void box(Vector3 &out, Vector3 &out)", + generic ? WRAP_MFN(AABBox, box) : asMETHOD(AABBox, box), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("AABBox", "void setBox(const Vector3 &in, const Vector3 &in)", + generic ? WRAP_MFN_PR(AABBox, setBox, (const Vector3 &, const Vector3 &), void) : asMETHODPR(AABBox, setBox, (const Vector3 &, const Vector3 &), void), + generic ? asCALL_GENERIC : asCALL_THISCALL); } static void obb(OBBox *dest) { @@ -471,22 +895,44 @@ static void obbSizeRot(const Vector3 ¢er, const Vector3 &size, OBBox *dest) new (dest) OBBox(center, size); } -void registerOBBox(asIScriptEngine *engine) { +void registerOBBox(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("OBBox", sizeof(OBBox), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("OBBox", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(obb), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("OBBox", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in)", asFUNCTION(obbSize), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("OBBox", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in, const Quaternion &in)", asFUNCTION(obbSizeRot), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("OBBox", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(OBBox, ()) : asFUNCTION(obb), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("OBBox", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in)", + generic ? WRAP_CON(OBBox, (const Vector3 &, const Vector3 &)) : asFUNCTION(obbSize), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("OBBox", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in, const Quaternion &in)", + generic ? WRAP_CON(OBBox, (const Vector3 &, const Vector3 &, const Quaternion &)) : asFUNCTION(obbSizeRot), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("OBBox", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteOBB), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("OBBox", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(OBBox) : asFUNCTION(deleteOBB), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("OBBox", "OBBox &opAssign(const OBBox &in)", asMETHODPR(OBBox, operator=, (const OBBox&), OBBox&), asCALL_THISCALL); + engine->RegisterObjectMethod("OBBox", "OBBox &opAssign(const OBBox &in)", + generic ? WRAP_MFN_PR(OBBox, operator=, (const OBBox&), OBBox&) : asMETHODPR(OBBox, operator=, (const OBBox&), OBBox&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("OBBox", "OBBox opMul(float)", asMETHODPR(OBBox, operator*, (areal) const, const OBBox), asCALL_THISCALL); - engine->RegisterObjectMethod("OBBox", "OBBox opMul(const Vector3 &in)", asMETHODPR(OBBox, operator*, (const Vector3 &) const, const OBBox), asCALL_THISCALL); + engine->RegisterObjectMethod("OBBox", "OBBox opMul(float)", + generic ? WRAP_MFN_PR(OBBox, operator*, (areal) const, const OBBox) : asMETHODPR(OBBox, operator*, (areal) const, const OBBox), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("OBBox", "void box(const Vector3 &out, const Vector3 &out)", asMETHOD(OBBox, box), asCALL_THISCALL); - engine->RegisterObjectMethod("OBBox", "void setBox(const Vector3 &in, const Vector3 &in)", asMETHOD(OBBox, setBox), asCALL_THISCALL); + engine->RegisterObjectMethod("OBBox", "OBBox opMul(const Vector3 &in)", + generic ? WRAP_MFN_PR(OBBox, operator*, (const Vector3 &) const, const OBBox) : asMETHODPR(OBBox, operator*, (const Vector3 &) const, const OBBox), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("OBBox", "void box(const Vector3 &out, const Vector3 &out)", + generic ? WRAP_MFN(OBBox, box) : asMETHOD(OBBox, box), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("OBBox", "void setBox(const Vector3 &in, const Vector3 &in)", + generic ? WRAP_MFN(OBBox, setBox) : asMETHOD(OBBox, setBox), + generic ? asCALL_GENERIC : asCALL_THISCALL); } static void plane(Plane *dest) { @@ -501,17 +947,28 @@ static void deletePlane(Plane *dest) { dest->~Plane(); } -void registerPlane(asIScriptEngine *engine) { +void registerPlane(asIScriptEngine *engine, bool generic) { engine->RegisterObjectType("Plane", sizeof(Plane), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(plane), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in, const Vector3 &in)", asFUNCTION(planePoints), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(Plane, ()) : asFUNCTION(plane), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Plane", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in, const Vector3 &in)", + generic ? WRAP_CON(Plane, (Vector3, Vector3, Vector3)) : asFUNCTION(planePoints), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Plane", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deletePlane), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Plane", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(Plane) : asFUNCTION(deletePlane), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); - engine->RegisterObjectMethod("Plane", "Plane &opAssign(const Plane &in)", asMETHODPR(Plane, operator=, (const Plane&), Plane&), asCALL_THISCALL); + engine->RegisterObjectMethod("Plane", "Plane &opAssign(const Plane &in)", + generic ? WRAP_MFN_PR(Plane, operator=, (const Plane&), Plane&) : asMETHODPR(Plane, operator=, (const Plane&), Plane&), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Plane", "float sqrDistance(const Vector3 &in)", asMETHOD(Plane, sqrDistance), asCALL_THISCALL); + engine->RegisterObjectMethod("Plane", "float sqrDistance(const Vector3 &in)", + generic ? WRAP_MFN(Plane, sqrDistance) : asMETHOD(Plane, sqrDistance), + generic ? asCALL_GENERIC : asCALL_THISCALL); } static void hit(Ray *dest) { @@ -530,29 +987,60 @@ static void deleteRay(Ray *dest) { dest->~Ray(); } -void registerRay(asIScriptEngine *engine) { +void registerRay(asIScriptEngine *engine, bool generic) { engine->SetDefaultNamespace("Ray"); + engine->RegisterObjectType("Hit", sizeof(Ray::Hit), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("Hit", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(hit), asCALL_CDECL_OBJLAST); - engine->RegisterObjectBehaviour("Hit", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteHit), asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Hit", asBEHAVE_CONSTRUCT, "void f()", + generic ? WRAP_CON(Ray::Hit, ()) : asFUNCTION(hit), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Hit", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(Ray::Hit) : asFUNCTION(deleteHit), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + engine->SetDefaultNamespace(""); engine->RegisterObjectType("Ray", sizeof(Ray), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); - engine->RegisterObjectBehaviour("Ray", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in)", asFUNCTION(ray), asCALL_CDECL_OBJLAST); + engine->RegisterObjectBehaviour("Ray", asBEHAVE_CONSTRUCT, "void f(const Vector3 &in, const Vector3 &in)", + generic ? WRAP_CON(Ray, (const Vector3 &, const Vector3 &)) : asFUNCTION(ray), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectBehaviour("Ray", asBEHAVE_DESTRUCT, "void f()", + generic ? WRAP_DES(Ray) : asFUNCTION(deleteRay), + generic ? asCALL_GENERIC : asCALL_CDECL_OBJLAST); + + engine->RegisterObjectMethod("Ray", "Ray &opAssign(const Ray &in)", + generic ? WRAP_MFN_PR(Ray, operator=, (const Ray&), Ray&) : asMETHODPR(Ray, operator=, (const Ray&), Ray&), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Ray", "bool intersect(const Vector3 &in, float, Ray::Hit &out)", + generic ? WRAP_MFN_PR(Ray, intersect, (const Vector3&, areal, Ray::Hit *), bool) : asMETHODPR(Ray, intersect, (const Vector3&, areal, Ray::Hit *), bool), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectBehaviour("Ray", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deleteRay), asCALL_CDECL_OBJLAST); + engine->RegisterObjectMethod("Ray", "bool intersect(const Plane &in, Ray::Hit &out, bool)", + generic ? WRAP_MFN_PR(Ray, intersect, (const Plane &, Ray::Hit *, bool), bool) : asMETHODPR(Ray, intersect, (const Plane &, Ray::Hit *, bool), bool), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Ray", "OBBox &opAssign(const OBBox &in)", asMETHODPR(Ray, operator=, (const Ray&), Ray&), asCALL_THISCALL); + engine->RegisterObjectMethod("Ray", "bool intersect(const AABBox &in, Ray::Hit &out)", + generic ? WRAP_MFN_PR(Ray, intersect, (const AABBox&, Ray::Hit *), bool) : asMETHODPR(Ray, intersect, (const AABBox&, Ray::Hit *), bool), + generic ? asCALL_GENERIC : asCALL_THISCALL); - engine->RegisterObjectMethod("Ray", "bool intersect(const Vector3 &in, float, Ray::Hit &out)", asMETHODPR(Ray, intersect, (const Vector3&, areal, Ray::Hit *), bool), asCALL_THISCALL); - engine->RegisterObjectMethod("Ray", "bool intersect(const Plane &in, Ray::Hit &out, bool)", asMETHODPR(Ray, intersect, (const Plane &, Ray::Hit *, bool), bool), asCALL_THISCALL); - engine->RegisterObjectMethod("Ray", "bool intersect(const AABBox &in, Ray::Hit &out)", asMETHODPR(Ray, intersect, (const AABBox&, Ray::Hit *), bool), asCALL_THISCALL); - engine->RegisterObjectMethod("Ray", "bool intersect(const Vector3 &in, const Vector3 &in, const Vector3 &in, Ray::Hit &out, bool)", asMETHODPR(Ray, intersect, (const Vector3 &, const Vector3 &, const Vector3 &, Ray::Hit *, bool), bool), asCALL_THISCALL); + //engine->RegisterObjectMethod("Ray", "bool intersect(const Vector3 &in, const Vector3 &in, const Vector3 &in, Ray::Hit &out, bool)", asMETHODPR(Ray, intersect, (const Vector3 &, const Vector3 &, const Vector3 &, Ray::Hit *, bool), bool), asCALL_THISCALL); - engine->RegisterObjectMethod("Ray", "Ray reflect(const Vector3 &in, const Vector3 &in)", asMETHOD(Ray, reflect), asCALL_THISCALL); - engine->RegisterObjectMethod("Ray", "Ray refract(const Vector3 &in, const Vector3 &in, float)", asMETHOD(Ray, refract), asCALL_THISCALL); - engine->RegisterObjectMethod("Ray", "Ray diffuse(const Vector3 &in, const Vector3 &in, float, float)", asMETHOD(Ray, diffuse), asCALL_THISCALL); + engine->RegisterObjectMethod("Ray", "Ray reflect(const Vector3 &in, const Vector3 &in)", + generic ? WRAP_MFN_PR(Ray, reflect, (const Vector3 &, const Vector3 &), Ray) : asMETHOD(Ray, reflect), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Ray", "Ray refract(const Vector3 &in, const Vector3 &in, float)", + generic ? WRAP_MFN(Ray, refract) : asMETHOD(Ray, refract), + generic ? asCALL_GENERIC : asCALL_THISCALL); + + engine->RegisterObjectMethod("Ray", "Ray diffuse(const Vector3 &in, const Vector3 &in, float, float)", + generic ? WRAP_MFN(Ray, diffuse) : asMETHOD(Ray, diffuse), + generic ? asCALL_GENERIC : asCALL_THISCALL); } int randomInt(int min, int max) { @@ -563,24 +1051,36 @@ float randomFloat(float min, float max) { return RANGE(min, max); } -void registerMath(asIScriptEngine *engine) { - registerVector2(engine); - registerVector3(engine); - registerVector4(engine); +void randomSeed(int32_t seed) { + srand(seed); +} + +void registerMath(asIScriptEngine *engine, bool generic) { + registerVector2(engine, generic); + registerVector3(engine, generic); + registerVector4(engine, generic); + + registerMatrix3(engine, generic); + registerMatrix4(engine, generic); + + registerQuaternion(engine, generic); - registerMatrix3(engine); - registerMatrix4(engine); + registerAABBox(engine, generic); + registerOBBox(engine, generic); - registerQuaternion(engine); + registerPlane(engine, generic); - registerAABBox(engine); - registerOBBox(engine); + registerRay(engine, generic); - registerPlane(engine); + engine->RegisterGlobalFunction("void seed(int)", + generic ? WRAP_FN(randomSeed) : asFUNCTION(randomSeed), + generic ? asCALL_GENERIC : asCALL_CDECL); - registerRay(engine); + engine->RegisterGlobalFunction("int irand(int, int)", + generic ? WRAP_FN(randomInt) : asFUNCTION(randomInt), + generic ? asCALL_GENERIC : asCALL_CDECL); - engine->RegisterGlobalFunction("void seed(int)", asFUNCTION(srand), asCALL_CDECL); - engine->RegisterGlobalFunction("int irand(int, int)", asFUNCTION(randomInt), asCALL_CDECL); - engine->RegisterGlobalFunction("float frand(float, float)", asFUNCTION(randomFloat), asCALL_CDECL); + engine->RegisterGlobalFunction("float frand(float, float)", + generic ? WRAP_FN(randomFloat) : asFUNCTION(randomFloat), + generic ? asCALL_GENERIC : asCALL_CDECL); } diff --git a/modules/vms/angel/src/bindings/angeltimer.cpp b/modules/vms/angel/src/bindings/angeltimer.cpp index bf550d710..fa018071c 100644 --- a/modules/vms/angel/src/bindings/angeltimer.cpp +++ b/modules/vms/angel/src/bindings/angeltimer.cpp @@ -1,15 +1,29 @@ #include "bindings/angelbindings.h" #include +#include #include +#include -void registerTimer(asIScriptEngine *engine) { +void registerTimer(asIScriptEngine *engine, bool generic) { engine->SetDefaultNamespace("Timer"); - engine->RegisterGlobalFunction("float deltaTime()", asFUNCTION(Timer::deltaTime), asCALL_CDECL); - engine->RegisterGlobalFunction("float scale()", asFUNCTION(Timer::scale), asCALL_CDECL); - engine->RegisterGlobalFunction("void setScale(float)", asFUNCTION(Timer::setScale), asCALL_CDECL); + engine->RegisterGlobalFunction("float time()", + generic ? WRAP_FN(Timer::time) : asFUNCTION(Timer::time), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("float deltaTime()", + generic ? WRAP_FN(Timer::deltaTime): asFUNCTION(Timer::deltaTime), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("float scale()", + generic ? WRAP_FN(Timer::scale) : asFUNCTION(Timer::scale), + generic ? asCALL_GENERIC : asCALL_CDECL); + + engine->RegisterGlobalFunction("void setScale(float)", + generic ? WRAP_FN(Timer::setScale) : asFUNCTION(Timer::setScale), + generic ? asCALL_GENERIC : asCALL_CDECL); engine->SetDefaultNamespace(""); } diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index e01062ae0..b45abd799 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -2,20 +2,23 @@ cmake_minimum_required(VERSION 3.10) add_subdirectory(angelscript) add_subdirectory(bullet) -add_subdirectory(assimp) add_subdirectory(next) add_subdirectory(zlib) add_subdirectory(physfs) -add_subdirectory(poly2tri) add_subdirectory(pugixml) -add_subdirectory(glfw) add_subdirectory(glfm) add_subdirectory(glsl) -add_subdirectory(gtest) -add_subdirectory(spirvcross) add_subdirectory(libogg) add_subdirectory(libvorbis) -add_subdirectory(quazip) add_subdirectory(glad) add_subdirectory(freetype) -add_subdirectory(syntaxhighlighting) + +if(desktop) + add_subdirectory(assimp) + add_subdirectory(spirvcross) + add_subdirectory(glfw) + add_subdirectory(gtest) + add_subdirectory(poly2tri) + add_subdirectory(quazip) + add_subdirectory(syntaxhighlighting) +endif() diff --git a/thirdparty/angelscript/CMakeLists.txt b/thirdparty/angelscript/CMakeLists.txt index be0ad3e64..79c942e2a 100644 --- a/thirdparty/angelscript/CMakeLists.txt +++ b/thirdparty/angelscript/CMakeLists.txt @@ -98,6 +98,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES ) install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) diff --git a/thirdparty/angelscript/modules/autowrapper/aswrappedcall.h b/thirdparty/angelscript/modules/autowrapper/aswrappedcall.h new file mode 100644 index 000000000..aa4f6dc2e --- /dev/null +++ b/thirdparty/angelscript/modules/autowrapper/aswrappedcall.h @@ -0,0 +1,766 @@ +#ifndef AS_GEN_WRAPPER_H +#define AS_GEN_WRAPPER_H + +#ifndef ANGELSCRIPT_H +// Avoid having to inform include path if header is already include before +#include +#endif +#include + +namespace gw { + +template class Proxy { + public: + T value; + Proxy(T value) : value(value) {} + static T cast(void * ptr) { + return reinterpret_cast *>(&ptr)->value; + } + private: + Proxy(const Proxy &); + Proxy & operator=(const Proxy &); +}; + +template struct Wrapper {}; +template struct WrapperGlobal {}; +template struct ObjFirst {}; +template struct ObjLast {}; +template struct Constructor {}; + +template +void destroy(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + static_cast(gen->GetObject())->~T(); +} +template <> +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * /*gen*/) { + ((fp)()); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)()); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)()); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)()); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)()); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)()); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)()); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)()); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)()); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)()); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + Proxy::cast(gen->GetObject()))); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + Proxy::cast(gen->GetObject()))); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + Proxy::cast(gen->GetObject()))); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + Proxy::cast(gen->GetObject()))); + } +}; +template +struct Constructor { + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetObject()) T(); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + Proxy::cast(gen->GetObject()), + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + Proxy::cast(gen->GetObject()), + static_cast *>(gen->GetAddressOfArg(0))->value)); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + Proxy::cast(gen->GetObject()))); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + Proxy::cast(gen->GetObject()))); + } +}; +template +struct Constructor { + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetObject()) T( + static_cast *>(gen->GetAddressOfArg(0))->value); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + Proxy::cast(gen->GetObject()), + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + Proxy::cast(gen->GetObject()), + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value)); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + Proxy::cast(gen->GetObject()))); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + Proxy::cast(gen->GetObject()))); + } +}; +template +struct Constructor { + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetObject()) T( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + Proxy::cast(gen->GetObject()), + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + Proxy::cast(gen->GetObject()), + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value)); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + Proxy::cast(gen->GetObject()))); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + Proxy::cast(gen->GetObject()))); + } +}; +template +struct Constructor { + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetObject()) T( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct Wrapper { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct WrapperGlobal { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetAuxiliary())->*fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + Proxy::cast(gen->GetObject()), + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct ObjFirst { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + Proxy::cast(gen->GetObject()), + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value)); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + ((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value, + Proxy::cast(gen->GetObject()))); + } +}; +template +struct ObjLast { + template + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetAddressOfReturnLocation()) Proxy((fp)( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value, + Proxy::cast(gen->GetObject()))); + } +}; +template +struct Constructor { + static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { + new (gen->GetObject()) T( + static_cast *>(gen->GetAddressOfArg(0))->value, + static_cast *>(gen->GetAddressOfArg(1))->value, + static_cast *>(gen->GetAddressOfArg(2))->value, + static_cast *>(gen->GetAddressOfArg(3))->value); + } +}; +template +struct Id { + template AS_NAMESPACE_QUALIFIER asSFuncPtr f(void) { return AS_NAMESPACE_QUALIFIER asFUNCTION(&Wrapper::template f); } + template AS_NAMESPACE_QUALIFIER asSFuncPtr fg(void) { return AS_NAMESPACE_QUALIFIER asFUNCTION(&WrapperGlobal::template f); } + template AS_NAMESPACE_QUALIFIER asSFuncPtr of(void) { return AS_NAMESPACE_QUALIFIER asFUNCTION(&ObjFirst::template f); } + template AS_NAMESPACE_QUALIFIER asSFuncPtr ol(void) { return AS_NAMESPACE_QUALIFIER asFUNCTION(&ObjLast::template f); } +}; + +template +Id id(T /*fn_ptr*/) { return Id(); } + +// On GNUC it is necessary to use the template keyword as disambiguator. +// MSVC seems to accept both with or without the template keyword. +#if defined(__GNUC__) + #define TMPL template +#else + #define TMPL +#endif + +#define WRAP_FN(name) (::gw::id(name).TMPL f< name >()) +#define WRAP_MFN(ClassType, name) (::gw::id(&ClassType::name).TMPL f< &ClassType::name >()) +#define WRAP_MFN_GLOBAL(ClassType, name) (::gw::id(&ClassType::name).TMPL fg< &ClassType::name >()) +#define WRAP_OBJ_FIRST(name) (::gw::id(name).TMPL of< name >()) +#define WRAP_OBJ_LAST(name) (::gw::id(name).TMPL ol< name >()) + +#define WRAP_FN_PR(name, Parameters, ReturnType) asFUNCTION((::gw::Wrapper::TMPL f< name >)) +#if defined(__clang__) + // Clang doesn't like the use of AS_METHOD_AMBIGUITY_CAST in the inner template + #define WRAP_MFN_PR(ClassType, name, Parameters, ReturnType) asFUNCTION((::gw::Wrapper::TMPL f< &ClassType::name >)) + #define WRAP_MFN_GLOBAL_PR(ClassType, name, Parameters, ReturnType) asFUNCTION((::gw::WrapperGlobal::TMPL f< &ClassType::name >)) +#else + #define WRAP_MFN_PR(ClassType, name, Parameters, ReturnType) asFUNCTION((::gw::Wrapper::TMPL f< AS_METHOD_AMBIGUITY_CAST(ReturnType (ClassType::*)Parameters)(&ClassType::name) >)) + #define WRAP_MFN_GLOBAL_PR(ClassType, name, Parameters, ReturnType) asFUNCTION((::gw::WrapperGlobal::TMPL f< AS_METHOD_AMBIGUITY_CAST(ReturnType (ClassType::*)Parameters)(&ClassType::name) >)) +#endif +#define WRAP_OBJ_FIRST_PR(name, Parameters, ReturnType) asFUNCTION((::gw::ObjFirst::TMPL f< name >)) +#define WRAP_OBJ_LAST_PR(name, Parameters, ReturnType) asFUNCTION((::gw::ObjLast::TMPL f< name >)) + +#define WRAP_CON(ClassType, Parameters) asFUNCTION((::gw::Constructor::f)) +#define WRAP_DES(ClassType) asFUNCTION((::gw::destroy)) + +} // end namespace gw + +#endif diff --git a/thirdparty/bullet/CMakeLists.txt b/thirdparty/bullet/CMakeLists.txt index 79e43a841..f0080b64d 100644 --- a/thirdparty/bullet/CMakeLists.txt +++ b/thirdparty/bullet/CMakeLists.txt @@ -71,6 +71,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES # Install install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) diff --git a/thirdparty/freetype/CMakeLists.txt b/thirdparty/freetype/CMakeLists.txt index 88be75428..e6f390256 100644 --- a/thirdparty/freetype/CMakeLists.txt +++ b/thirdparty/freetype/CMakeLists.txt @@ -112,6 +112,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES ) install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) diff --git a/thirdparty/glad/CMakeLists.txt b/thirdparty/glad/CMakeLists.txt index 2e4f8359f..3cd2ceda4 100644 --- a/thirdparty/glad/CMakeLists.txt +++ b/thirdparty/glad/CMakeLists.txt @@ -32,8 +32,8 @@ if(desktop) ) install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) endif() diff --git a/thirdparty/glfm/CMakeLists.txt b/thirdparty/glfm/CMakeLists.txt index e1d46527b..95f24dff2 100644 --- a/thirdparty/glfm/CMakeLists.txt +++ b/thirdparty/glfm/CMakeLists.txt @@ -2,12 +2,12 @@ cmake_minimum_required(VERSION 3.10) project(glfm) -set(srcFiles - "src/glfm_platform.h" +set(${PROJECT_NAME}_srcFiles + "src/glfm_internal.h" "include/glfm.h" ) -set(incPaths "include") +set(${PROJECT_NAME}_incPaths "include") # This path is only needed on the BSDs if(UNIX AND NOT APPLE AND NOT LINUX) @@ -19,41 +19,46 @@ endif() # Static Library if(NOT desktop) - add_library(glfm STATIC ${srcFiles}) - target_compile_definitions(glfm PRIVATE) - target_include_directories(glfm PRIVATE ${incPaths}) - target_compile_features(glfm PRIVATE c_std_11) + add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_srcFiles}) + target_compile_definitions(${PROJECT_NAME} PRIVATE) + target_include_directories(${PROJECT_NAME} PRIVATE ${${PROJECT_NAME}_incPaths}) + target_compile_features(${PROJECT_NAME} PRIVATE c_std_11) # Solve build error using Clang on BSDs if(UNIX AND NOT APPLE AND NOT LINUX) target_compile_options(${PROJECT_NAME} PRIVATE -fPIC) + set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX) endif() # Android-specific configurations if(ANDROID) set(nativePath ${CMAKE_ANDROID_NDK}/sources/android/native_app_glue) list(APPEND srcFiles - "src/glfm_platform_android.c" + "src/glfm_android.c" "${nativePath}/android_native_app_glue.c" "${nativePath}/android_native_app_glue.h" ) - target_include_directories(glfm PRIVATE ${nativePath}) - set_target_properties(glfm PROPERTIES + target_include_directories(${PROJECT_NAME} PRIVATE ${nativePath}) + set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_OPTIONS "-std=c11" ) endif() + if(EMSCRIPTEN) + list(APPEND srcFiles "src/glfm_emscripten.c") + endif() + # iOS and tvOS-specific configurations if(IOS OR TVOS) - list(APPEND srcFiles "src/glfm_platform_ios.m") + list(APPEND srcFiles "src/glfm_apple.m") endif() # Set the source files - target_sources(glfm PRIVATE ${srcFiles}) + target_sources(${PROJECT_NAME} PRIVATE ${srcFiles}) # Install - install(TARGETS glfm - LIBRARY DESTINATION ${SDK_PATH}/${CMAKE_SYSTEM_NAME}/${CMAKE_HOST_SYSTEM_PROCESSOR}/static - ARCHIVE DESTINATION ${SDK_PATH}/${CMAKE_SYSTEM_NAME}/${CMAKE_HOST_SYSTEM_PROCESSOR}/static + install(TARGETS ${PROJECT_NAME} + LIBRARY DESTINATION "${STATIC_PATH}" + ARCHIVE DESTINATION "${STATIC_PATH}" ) endif() diff --git a/thirdparty/glfm/src/glfm_emscripten.c b/thirdparty/glfm/src/glfm_emscripten.c index 937840177..958f015c0 100644 --- a/thirdparty/glfm/src/glfm_emscripten.c +++ b/thirdparty/glfm/src/glfm_emscripten.c @@ -51,6 +51,7 @@ typedef struct { bool isVisible; bool isFocused; + bool isFullscreen; bool refreshRequested; GLFMInterfaceOrientation orientation; @@ -445,11 +446,15 @@ static void glfm__mainLoopFunc(void *userData) { }); if (displayChanged) { platformData->refreshRequested = true; - platformData->width = glfm__getDisplayWidth(display); - platformData->height = glfm__getDisplayHeight(display); - platformData->scale = emscripten_get_device_pixel_ratio(); - if (display->surfaceResizedFunc) { - display->surfaceResizedFunc(display, platformData->width, platformData->height); + int width = glfm__getDisplayWidth(display); + int height = glfm__getDisplayHeight(display); + if (!platformData->isFullscreen && (width != platformData->width || height != platformData->height)) { + platformData->width = width; + platformData->height = height; + platformData->scale = emscripten_get_device_pixel_ratio(); + if (display->surfaceResizedFunc) { + display->surfaceResizedFunc(display, platformData->width, platformData->height); + } } } @@ -874,6 +879,33 @@ static EM_BOOL glfm__touchCallback(int eventType, const EmscriptenTouchEvent *ev return handled; } +static EM_BOOL glfm__fullscreenchangeCallback(int eventType, const EmscriptenFullscreenChangeEvent *e, void *userData) { + GLFMDisplay *display = userData; + GLFMPlatformData *platformData = display->platformData; + + platformData->isFullscreen = e->isFullscreen; + + int width = e->screenWidth; + int height = e->elementHeight; + + if (!platformData->isFullscreen) { + width = platformData->width; + height = platformData->height; + } + + EM_ASM({ + var canvas = Module['canvas']; + canvas.widthNative = $0; + canvas.heightNative = $1; + }, width, height); + + if (display->surfaceResizedFunc) { + display->surfaceResizedFunc(display, width, height); + } + + return 0; +} + // MARK: - main int main(void) { @@ -965,6 +997,9 @@ int main(void) { emscripten_set_blur_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, glfmDisplay, 1, glfm__focusCallback); emscripten_set_beforeunload_callback(glfmDisplay, glfm__beforeUnloadCallback); emscripten_set_deviceorientation_callback(glfmDisplay, 1, glfm__orientationChangeCallback); + + emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, glfmDisplay, 1, glfm__fullscreenchangeCallback); + return 0; } diff --git a/thirdparty/glfw/CMakeLists.txt b/thirdparty/glfw/CMakeLists.txt index 0b7c71400..c9485a789 100644 --- a/thirdparty/glfw/CMakeLists.txt +++ b/thirdparty/glfw/CMakeLists.txt @@ -121,9 +121,9 @@ if(desktop) # Install install(TARGETS ${PROJECT_NAME}-editor - LIBRARY DESTINATION ${LIB_PATH} - ARCHIVE DESTINATION ${LIB_PATH} - RUNTIME DESTINATION ${LIB_PATH} + LIBRARY DESTINATION ${LIB_PATH} + ARCHIVE DESTINATION ${LIB_PATH} + RUNTIME DESTINATION ${LIB_PATH} ) endif() @@ -154,6 +154,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES # Install install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) diff --git a/thirdparty/glsl/CMakeLists.txt b/thirdparty/glsl/CMakeLists.txt index 8b1dfd8cb..6ebb7bae9 100644 --- a/thirdparty/glsl/CMakeLists.txt +++ b/thirdparty/glsl/CMakeLists.txt @@ -57,7 +57,7 @@ if(desktop) # Install install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) endif() diff --git a/thirdparty/libogg/CMakeLists.txt b/thirdparty/libogg/CMakeLists.txt index 3a202c47b..33955eaf8 100644 --- a/thirdparty/libogg/CMakeLists.txt +++ b/thirdparty/libogg/CMakeLists.txt @@ -51,9 +51,9 @@ if(desktop) # Install install(TARGETS ${PROJECT_NAME}-editor - LIBRARY DESTINATION ${LIB_PATH} - ARCHIVE DESTINATION ${LIB_PATH} - RUNTIME DESTINATION ${LIB_PATH} + LIBRARY DESTINATION ${LIB_PATH} + ARCHIVE DESTINATION ${LIB_PATH} + RUNTIME DESTINATION ${LIB_PATH} ) endif() diff --git a/thirdparty/libvorbis/CMakeLists.txt b/thirdparty/libvorbis/CMakeLists.txt index 7634a70b1..773dd62eb 100644 --- a/thirdparty/libvorbis/CMakeLists.txt +++ b/thirdparty/libvorbis/CMakeLists.txt @@ -78,9 +78,9 @@ if(desktop) # Install Vorbis Dynamic Library install(TARGETS ${PROJECT_NAME}-editor - LIBRARY DESTINATION ${LIB_PATH} - ARCHIVE DESTINATION ${LIB_PATH} - RUNTIME DESTINATION ${LIB_PATH} + LIBRARY DESTINATION ${LIB_PATH} + ARCHIVE DESTINATION ${LIB_PATH} + RUNTIME DESTINATION ${LIB_PATH} ) endif() @@ -95,8 +95,8 @@ set_target_properties(${PROJECT_NAME} PROPERTIES # Install Vorbis Library install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) if(desktop) @@ -116,7 +116,7 @@ if(desktop) vorbis-editor ) - if (APPLE) + if(APPLE) set_target_properties(${PROJECT_NAME}file-editor PROPERTIES INSTALL_NAME_DIR "@executable_path" ) @@ -163,6 +163,6 @@ set_target_properties(${PROJECT_NAME}file PROPERTIES # Install VorbisFile Library install(TARGETS ${PROJECT_NAME}file - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) diff --git a/thirdparty/next/CMakeLists.txt b/thirdparty/next/CMakeLists.txt index 5367820c4..02d315403 100644 --- a/thirdparty/next/CMakeLists.txt +++ b/thirdparty/next/CMakeLists.txt @@ -58,15 +58,15 @@ if(desktop) # Install install(TARGETS ${PROJECT_NAME}-editor - LIBRARY DESTINATION ${LIB_PATH} - ARCHIVE DESTINATION ${LIB_PATH} - RUNTIME DESTINATION ${LIB_PATH} + LIBRARY DESTINATION ${LIB_PATH} + ARCHIVE DESTINATION ${LIB_PATH} + RUNTIME DESTINATION ${LIB_PATH} ) # Install includes install(DIRECTORY inc/ - DESTINATION ${INC_PATH}/next - FILES_MATCHING PATTERN "*.h" + DESTINATION ${INC_PATH}/next + FILES_MATCHING PATTERN "*.h" ) endif() @@ -86,6 +86,6 @@ endif() # Install install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) diff --git a/thirdparty/next/inc/math/aabb.h b/thirdparty/next/inc/math/aabb.h index c307298ab..783d8cd4f 100644 --- a/thirdparty/next/inc/math/aabb.h +++ b/thirdparty/next/inc/math/aabb.h @@ -32,6 +32,8 @@ class NEXT_LIBRARY_EXPORT AABBox { AABBox(); AABBox(const Vector3 ¢er, const Vector3 &extent); + AABBox &operator=(const AABBox &value); + bool isValid() const; bool operator==(const AABBox &box) const; diff --git a/thirdparty/next/inc/math/matrix3.h b/thirdparty/next/inc/math/matrix3.h index f4aea430d..0d9e336ed 100644 --- a/thirdparty/next/inc/math/matrix3.h +++ b/thirdparty/next/inc/math/matrix3.h @@ -28,6 +28,8 @@ class NEXT_LIBRARY_EXPORT Matrix3 { public: Matrix3(); + Matrix3 &operator=(const Matrix3 &value); + bool operator==(const Matrix3 &matrix) const; bool operator!=(const Matrix3 &matrix) const; diff --git a/thirdparty/next/inc/math/matrix4.h b/thirdparty/next/inc/math/matrix4.h index b688b4123..c093f3261 100644 --- a/thirdparty/next/inc/math/matrix4.h +++ b/thirdparty/next/inc/math/matrix4.h @@ -32,6 +32,8 @@ class NEXT_LIBRARY_EXPORT Matrix4 { Matrix4(const Matrix3 &matrix); Matrix4(const Vector3 &position, const Quaternion &rotation, const Vector3 &scale); + Matrix4 &operator=(const Matrix4 &matrix); + bool operator==(const Matrix4 &matrix) const; bool operator!=(const Matrix4 &matrix) const; diff --git a/thirdparty/next/inc/math/obb.h b/thirdparty/next/inc/math/obb.h index 27136d562..e52d12666 100644 --- a/thirdparty/next/inc/math/obb.h +++ b/thirdparty/next/inc/math/obb.h @@ -30,6 +30,8 @@ class NEXT_LIBRARY_EXPORT OBBox { OBBox(const Vector3 ¢er, const Vector3 &size); OBBox(const Vector3 ¢er, const Vector3 &size, const Quaternion &rotation); + OBBox &operator=(const OBBox &value); + const OBBox operator*(areal factor) const; const OBBox operator*(const Vector3 &vector) const; diff --git a/thirdparty/next/inc/math/plane.h b/thirdparty/next/inc/math/plane.h index 63a7222b5..b81602b82 100644 --- a/thirdparty/next/inc/math/plane.h +++ b/thirdparty/next/inc/math/plane.h @@ -26,6 +26,8 @@ class NEXT_LIBRARY_EXPORT Plane { Plane(); Plane(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3); + Plane &operator=(const Plane &value); + areal sqrDistance(const Vector3 &point) const; public: diff --git a/thirdparty/next/inc/math/quaternion.h b/thirdparty/next/inc/math/quaternion.h index 43f5f3d75..294723c7f 100644 --- a/thirdparty/next/inc/math/quaternion.h +++ b/thirdparty/next/inc/math/quaternion.h @@ -32,6 +32,8 @@ class NEXT_LIBRARY_EXPORT Quaternion { Quaternion(const Vector3 &euler); Quaternion(const Matrix3 &matrix); + Quaternion &operator=(const Quaternion &value); + bool operator==(const Quaternion &quaternion) const; bool operator!=(const Quaternion &quaternion) const; diff --git a/thirdparty/next/inc/math/ray.h b/thirdparty/next/inc/math/ray.h index 7d87c68d7..7fa9f5918 100644 --- a/thirdparty/next/inc/math/ray.h +++ b/thirdparty/next/inc/math/ray.h @@ -40,6 +40,8 @@ class NEXT_LIBRARY_EXPORT Ray { Ray(); Ray(const Vector3 &position, const Vector3 &direction); + Ray &operator=(const Ray &value); + bool operator==(const Ray &ray) const; bool operator!=(const Ray &ray) const; diff --git a/thirdparty/next/src/math/aabb.cpp b/thirdparty/next/src/math/aabb.cpp index 64bd7da5b..b8ce2377d 100644 --- a/thirdparty/next/src/math/aabb.cpp +++ b/thirdparty/next/src/math/aabb.cpp @@ -49,6 +49,17 @@ AABBox::AABBox(const Vector3 ¢er, const Vector3 &extent) : extent(extent), radius(extent.length()) { } +/*! + Assignment operator. + The \a value will be assigned to this object. +*/ +AABBox &AABBox::operator=(const AABBox &value) { + center = value.center; + extent = value.extent; + radius = value.radius; + + return *this; +} /*! Returns true in case of AABBox is valid; otherwise returns false. */ diff --git a/thirdparty/next/src/math/matrix3.cpp b/thirdparty/next/src/math/matrix3.cpp index 59e0c1512..371db2597 100644 --- a/thirdparty/next/src/math/matrix3.cpp +++ b/thirdparty/next/src/math/matrix3.cpp @@ -35,6 +35,23 @@ Matrix3::Matrix3() { identity(); } +/*! + Assignment operator. + The \a value will be assigned to this object. +*/ +Matrix3 &Matrix3::operator=(const Matrix3 &value) { + mat[0] = value.mat[0]; + mat[1] = value.mat[1]; + mat[2] = value.mat[2]; + mat[3] = value.mat[3]; + mat[4] = value.mat[4]; + mat[5] = value.mat[5]; + mat[6] = value.mat[6]; + mat[7] = value.mat[7]; + mat[8] = value.mat[8]; + + return *this; +} /*! Returns the result of multiplying this matrix and the given 3D \a vector. */ diff --git a/thirdparty/next/src/math/matrix4.cpp b/thirdparty/next/src/math/matrix4.cpp index ab2a80552..c810b48cd 100644 --- a/thirdparty/next/src/math/matrix4.cpp +++ b/thirdparty/next/src/math/matrix4.cpp @@ -55,6 +55,30 @@ Matrix4::Matrix4(const Vector3 &position, const Quaternion &rotation, const Vect m.scale(scale); *this *= m; } +/*! + Assignment operator. + The \a value will be assigned to this object. +*/ +Matrix4 &Matrix4::operator=(const Matrix4 &value) { + mat[0] = value.mat[0]; + mat[1] = value.mat[1]; + mat[2] = value.mat[2]; + mat[3] = value.mat[3]; + mat[4] = value.mat[4]; + mat[5] = value.mat[5]; + mat[6] = value.mat[6]; + mat[7] = value.mat[7]; + mat[8] = value.mat[8]; + mat[9] = value.mat[9]; + mat[10] = value.mat[10]; + mat[11] = value.mat[11]; + mat[12] = value.mat[12]; + mat[13] = value.mat[13]; + mat[14] = value.mat[14]; + mat[15] = value.mat[15]; + + return *this; +} /*! Returns true if this matrix is equal to given \a matrix; otherwise returns false. This operator uses an exact floating-point comparison. diff --git a/thirdparty/next/src/math/obb.cpp b/thirdparty/next/src/math/obb.cpp index 05691886e..7fd431998 100644 --- a/thirdparty/next/src/math/obb.cpp +++ b/thirdparty/next/src/math/obb.cpp @@ -55,6 +55,17 @@ OBBox::OBBox(const Vector3 ¢er, const Vector3 &size, const Quaternion &rotat size(size), rotation(rotation) { } +/*! + Assignment operator. + The \a value will be assigned to this object. +*/ +OBBox &OBBox::operator=(const OBBox &value) { + center = value.center; + size = value.size; + rotation = value.rotation; + + return *this; +} /*! Returns a copy of this vector, multiplied by the given \a factor. */ diff --git a/thirdparty/next/src/math/plane.cpp b/thirdparty/next/src/math/plane.cpp index 460506aa6..b30018e3c 100644 --- a/thirdparty/next/src/math/plane.cpp +++ b/thirdparty/next/src/math/plane.cpp @@ -36,6 +36,17 @@ Plane::Plane() : d(1.0f) { } +/*! + Assignment operator. + The \a value will be assigned to this object. +*/ +Plane &Plane::operator=(const Plane &value) { + d = value.d; + normal = value.normal; + point = value.point; + + return *this; +} /*! Cunstructs a Plane by three points \a v1, \a v2 and \a v3 */ diff --git a/thirdparty/next/src/math/quaternion.cpp b/thirdparty/next/src/math/quaternion.cpp index b09497596..6a74042c4 100644 --- a/thirdparty/next/src/math/quaternion.cpp +++ b/thirdparty/next/src/math/quaternion.cpp @@ -143,6 +143,18 @@ Quaternion::Quaternion(const Matrix3 &matrix) { default: break; } } +/*! + Assignment operator. + The \a value will be assigned to this object. +*/ +Quaternion &Quaternion::operator=(const Quaternion &value) { + x = value.x; + y = value.y; + z = value.z; + w = value.w; + + return *this; +} /*! Returns true if this quaternion is equal to given \a quaternion; otherwise returns false. This operator uses an exact floating-point comparison. diff --git a/thirdparty/next/src/math/ray.cpp b/thirdparty/next/src/math/ray.cpp index a5133fe09..edc3d0259 100644 --- a/thirdparty/next/src/math/ray.cpp +++ b/thirdparty/next/src/math/ray.cpp @@ -44,6 +44,16 @@ Ray::Ray(const Vector3 &position, const Vector3 &direction) : pos(position), dir(direction) { } +/*! + Assignment operator. + The \a value will be assigned to this object. +*/ +Ray &Ray::operator=(const Ray &value) { + pos = value.pos; + dir = value.dir; + + return *this; +} /*! Returns true if this ray is equal to given \a ray; otherwise returns false. This operator uses an exact floating-point comparison. diff --git a/thirdparty/physfs/CMakeLists.txt b/thirdparty/physfs/CMakeLists.txt index d441fb01f..7d4305148 100644 --- a/thirdparty/physfs/CMakeLists.txt +++ b/thirdparty/physfs/CMakeLists.txt @@ -72,9 +72,9 @@ if(desktop) # Install install(TARGETS ${PROJECT_NAME}-editor - LIBRARY DESTINATION ${LIB_PATH} - ARCHIVE DESTINATION ${LIB_PATH} - RUNTIME DESTINATION ${LIB_PATH} + LIBRARY DESTINATION ${LIB_PATH} + ARCHIVE DESTINATION ${LIB_PATH} + RUNTIME DESTINATION ${LIB_PATH} ) endif() @@ -100,6 +100,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES # Install install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) diff --git a/thirdparty/quazip/CMakeLists.txt b/thirdparty/quazip/CMakeLists.txt index 82c0c8f1b..9c80a15f4 100644 --- a/thirdparty/quazip/CMakeLists.txt +++ b/thirdparty/quazip/CMakeLists.txt @@ -14,16 +14,16 @@ file(GLOB MOC_HEADERS QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) set(${PROJECT_NAME}_incPaths - "src" - "../zlib/src" + "src" + "../zlib/src" ) # This path is only needed on the BSDs if(UNIX AND NOT APPLE AND NOT LINUX) - set(${PROJECT_NAME}_incPaths - ${${PROJECT_NAME}_incPaths} - "/usr/local/include" - ) + set(${PROJECT_NAME}_incPaths + ${${PROJECT_NAME}_incPaths} + "/usr/local/include" + ) endif() # Static Library diff --git a/thirdparty/spirvcross/CMakeLists.txt b/thirdparty/spirvcross/CMakeLists.txt index e0ed5149a..bc938b428 100644 --- a/thirdparty/spirvcross/CMakeLists.txt +++ b/thirdparty/spirvcross/CMakeLists.txt @@ -8,15 +8,15 @@ file(GLOB ${PROJECT_NAME}_srcFiles ) set(${PROJECT_NAME}_incPaths - "src" + "src" ) # This path is only needed on the BSDs if(UNIX AND NOT APPLE AND NOT LINUX) - set(${PROJECT_NAME}_incPaths - ${${PROJECT_NAME}_incPaths} - "/usr/local/include" - ) + set(${PROJECT_NAME}_incPaths + ${${PROJECT_NAME}_incPaths} + "/usr/local/include" + ) endif() # Static Library @@ -25,7 +25,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE ${${PROJECT_NAME}_incPaths}) target_compile_definitions(${PROJECT_NAME} PRIVATE) if(MSVC) - target_compile_options(${PROJECT_NAME} PRIVATE /wd4267 /wd4996 $<$:/bigobj>) + target_compile_options(${PROJECT_NAME} PRIVATE /wd4267 /wd4996 $<$:/bigobj>) endif() # Solve build error using Clang on BSDs diff --git a/thirdparty/syntaxhighlighting/CMakeLists.txt b/thirdparty/syntaxhighlighting/CMakeLists.txt index 7a7adfbcd..da277ef0e 100644 --- a/thirdparty/syntaxhighlighting/CMakeLists.txt +++ b/thirdparty/syntaxhighlighting/CMakeLists.txt @@ -16,13 +16,13 @@ set(${PROJECT_NAME}_incPaths # This path is only needed on the BSDs if(UNIX AND NOT APPLE AND NOT LINUX) - set(${PROJECT_NAME}_incPaths - ${${PROJECT_NAME}_incPaths} - "/usr/local/include" - ) + set(${PROJECT_NAME}_incPaths + ${${PROJECT_NAME}_incPaths} + "/usr/local/include" + ) endif() -set( RESOURCES +set(RESOURCES syntax/syntax-data.qrc themes/theme-data.qrc ) @@ -34,7 +34,7 @@ QT5_WRAP_CPP(MOC_SRCS ${MOC_HEADERS}) add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_srcFiles} ${MOC_SRCS} ${RES_SOURCES}) target_include_directories(${PROJECT_NAME} PRIVATE - ${${PROJECT_NAME}_incPaths} + ${${PROJECT_NAME}_incPaths} ${CMAKE_CURRENT_BINARY_DIR} ) target_compile_definitions(${PROJECT_NAME} PRIVATE HAS_SYNTAX_RESOURCE SyntaxHighlighting_VERSION_MAJOR=5 SyntaxHighlighting_VERSION_MINOR=57) diff --git a/thirdparty/zlib/CMakeLists.txt b/thirdparty/zlib/CMakeLists.txt index ea2a56215..3245f0326 100644 --- a/thirdparty/zlib/CMakeLists.txt +++ b/thirdparty/zlib/CMakeLists.txt @@ -36,12 +36,12 @@ set_target_properties(${PROJECT_NAME} PROPERTIES # Install zlib library install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${STATIC_PATH} - ARCHIVE DESTINATION ${STATIC_PATH} + LIBRARY DESTINATION ${STATIC_PATH} + ARCHIVE DESTINATION ${STATIC_PATH} ) # zlib Dynamic Library (Optional) -if (desktop) +if(desktop) add_library(${PROJECT_NAME}-editor SHARED ${${PROJECT_NAME}_srcFiles}) target_include_directories(${PROJECT_NAME}-editor PRIVATE "src") target_compile_definitions(${PROJECT_NAME}-editor PRIVATE ZLIB_DLL ZLIB_LIBRARY) diff --git a/worldeditor/bin/engine/materials/AmbientOcclusion.shader b/worldeditor/bin/engine/materials/AmbientOcclusion.shader index 9fb474df8..9aae6750c 100644 --- a/worldeditor/bin/engine/materials/AmbientOcclusion.shader +++ b/worldeditor/bin/engine/materials/AmbientOcclusion.shader @@ -20,7 +20,7 @@ #include "ShaderLayout.h" #include "Functions.h" -layout(std140, binding = LOCAL) uniform Uniforms { +layout(std140, binding = LOCAL) uniform InstanceData { mat4 model; float radius; float bias; diff --git a/worldeditor/bin/engine/materials/AreaLight.shader b/worldeditor/bin/engine/materials/AreaLight.shader index 10437aba0..7bcb5763e 100644 --- a/worldeditor/bin/engine/materials/AreaLight.shader +++ b/worldeditor/bin/engine/materials/AreaLight.shader @@ -16,6 +16,41 @@ + diff --git a/worldeditor/bin/engine/materials/DirectLight.shader b/worldeditor/bin/engine/materials/DirectLight.shader index a63586a78..ea15579c6 100644 --- a/worldeditor/bin/engine/materials/DirectLight.shader +++ b/worldeditor/bin/engine/materials/DirectLight.shader @@ -48,7 +48,7 @@ void main(void) { #include "Functions.h" #include "BRDF.h" -layout(binding = LOCAL) uniform Uniforms { +layout(binding = LOCAL) uniform InstanceData { mat4 model; mat4 matrix[4]; vec4 tiles[4]; diff --git a/worldeditor/bin/engine/materials/Downsample.shader b/worldeditor/bin/engine/materials/Downsample.shader index 939abd3a3..76cbd5b57 100644 --- a/worldeditor/bin/engine/materials/Downsample.shader +++ b/worldeditor/bin/engine/materials/Downsample.shader @@ -12,7 +12,7 @@ #include "ShaderLayout.h" -layout(binding = LOCAL) uniform Uniform { +layout(binding = LOCAL) uniform InstanceData { mat4 model; float threshold; } uni; diff --git a/worldeditor/bin/engine/materials/PointLight.shader b/worldeditor/bin/engine/materials/PointLight.shader index 830420f45..34d07e68f 100644 --- a/worldeditor/bin/engine/materials/PointLight.shader +++ b/worldeditor/bin/engine/materials/PointLight.shader @@ -14,6 +14,39 @@ + +