diff --git a/CMakeLists.txt b/CMakeLists.txt index 3cd50dc0..109e05f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,11 @@ # Copyright (C) 2023 Isaac Nudelman # AUTOGENERATED COPYRIGHT HEADER END +# ToDo: +# - Explore RESOURCE property: https://cmake.org/cmake/help/latest/prop_tgt/RESOURCE.html +# - Explore PUBLIC_HEADER property: https://cmake.org/cmake/help/latest/prop_tgt/PUBLIC_HEADER.html + + # CMake Setup cmake_minimum_required(VERSION 3.26) list(APPEND CMAKE_MESSAGE_INDENT "[StreamFX] ") @@ -269,13 +274,13 @@ if(_VERSION_PRERELEASE STREQUAL "a") set(FEATURE_STABLE ON) elseif(_VERSION_PRERELEASE STREQUAL "b") set(FEATURE_DEPRECATED ON) - set(FEATURE_EXPERIMENTAL ON) + set(FEATURE_EXPERIMENTAL OFF) set(FEATURE_UNSTABLE ON) set(FEATURE_STABLE ON) elseif(_VERSION_PRERELEASE STREQUAL "c") set(FEATURE_DEPRECATED ON) set(FEATURE_EXPERIMENTAL OFF) - set(FEATURE_UNSTABLE ON) + set(FEATURE_UNSTABLE OFF) set(FEATURE_STABLE ON) else() set(FEATURE_DEPRECATED ON) @@ -288,7 +293,6 @@ endif() set(${PREFIX}VERSION "" CACHE STRING "Specify an override for the automatically detected version. Accepts a mixture of SemVer 2.0 and CMake Version.") # Compile/Link Related -set(${PREFIX}ENABLE_LTO ${D_HAS_IPO} CACHE BOOL "Enable Link Time Optimization for faster and smaller binaries.") set(${PREFIX}ENABLE_FASTMATH ON CACHE BOOL "Enable fast math optimizations, which sacrifice precision and stability.") if(D_PLATFORM_ARCH_X86) set(${PREFIX}TARGET_X86_64_V4 OFF CACHE BOOL "Target x86-64-v4 (x86-64-v3, AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL).") @@ -438,308 +442,6 @@ find_package("Qt6" CONFIG ) -################################################################################ -# Code -################################################################################ -set(PROJECT_DATA ) -set(PROJECT_LIBRARIES ) -set(PROJECT_INCLUDE_DIRS ) -set(PROJECT_TEMPLATES ) -set(PROJECT_PRIVATE_GENERATED ) -set(PROJECT_PRIVATE_SOURCE ) -set(PROJECT_UI ) -set(PROJECT_UI_SOURCE ) -set(PROJECT_DEFINITIONS ) -set(PROJECT_MEDIA ) - -# Data -file(GLOB_RECURSE PROJECT_DATA "data/*") - -# Media -file(GLOB_RECURSE PROJECT_MEDIA "media/*") - -# Templates -file(GLOB_RECURSE PROJECT_TEMPLATES "templates/*") - -# Configure Files -configure_file( - "templates/config.hpp.in" - "generated/config.hpp" -) -LIST(APPEND PROJECT_TEMPLATES "templates/config.hpp.in") -LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/config.hpp") - -configure_file( - "templates/version.hpp.in" - "generated/version.hpp" -) -LIST(APPEND PROJECT_TEMPLATES "templates/version.hpp.in") -LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/version.hpp") - -configure_file( - "templates/module.cpp.in" - "generated/module.cpp" -) -LIST(APPEND PROJECT_TEMPLATES "templates/module.cpp.in") -LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/module.cpp") -# Minimum Dependencies -list(APPEND PROJECT_LIBRARIES OBS::libobs) - -# Dependencies -list(APPEND PROJECT_PRIVATE_SOURCE - "source/util/util-curl.hpp" - "source/util/util-curl.cpp" -) -list(APPEND PROJECT_LIBRARIES CURL::libcurl) - -list(APPEND PROJECT_INCLUDE_DIRS ${JSON_INCLUDE_DIR}) - -if(TRUE) # OpenGL - if(NOT TARGET khronos_glad) - add_library(khronos_glad STATIC - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/gl.c" - ) - target_include_directories(khronos_glad - PRIVATE - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include" - INTERFACE - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include" - PUBLIC - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include" - ) - if(D_PLATFORM_WINDOWS) - target_sources(khronos_glad - PRIVATE - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/wgl.c" - ) - elseif(D_PLATFORM_LINUX) - target_sources(khronos_glad - PRIVATE - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/glx.c" - ) - endif() - - # Requires for shared/static mixing. - set_property(TARGET khronos_glad PROPERTY POSITION_INDEPENDENT_CODE ON) - endif() - - list(APPEND PROJECT_LIBRARIES khronos_glad) -endif() - -list(APPEND PROJECT_LIBRARIES OBS::obs-frontend-api) -list(APPEND PROJECT_UI_SOURCE - "source/obs/browser/obs-browser-panel.hpp" -) - -list(APPEND PROJECT_LIBRARIES Qt6::Core Qt6::Gui Qt6::Widgets) - -################################################################################ -# Features -################################################################################ - -# Core -list(APPEND PROJECT_PRIVATE_SOURCE - "source/warning-disable.hpp" - "source/warning-enable.hpp" - "source/configuration.hpp" - "source/configuration.cpp" - "source/common.hpp" - "source/strings.hpp" - "source/plugin.hpp" - "source/plugin.cpp" - "source/util/utility.hpp" - "source/util/utility.cpp" - "source/util/util-bitmask.hpp" - "source/util/util-event.hpp" - "source/util/util-library.cpp" - "source/util/util-library.hpp" - "source/util/util-logging.cpp" - "source/util/util-logging.hpp" - "source/util/util-platform.hpp" - "source/util/util-platform.cpp" - "source/util/util-threadpool.cpp" - "source/util/util-threadpool.hpp" - "source/gfx/gfx-util.hpp" - "source/gfx/gfx-util.cpp" - "source/gfx/gfx-mipmapper.hpp" - "source/gfx/gfx-mipmapper.cpp" - "source/gfx/gfx-opengl.hpp" - "source/gfx/gfx-opengl.cpp" - "source/gfx/gfx-source-texture.hpp" - "source/gfx/gfx-source-texture.cpp" - "source/obs/gs/gs-helper.hpp" - "source/obs/gs/gs-helper.cpp" - "source/obs/gs/gs-effect.hpp" - "source/obs/gs/gs-effect.cpp" - "source/obs/gs/gs-effect-parameter.hpp" - "source/obs/gs/gs-effect-parameter.cpp" - "source/obs/gs/gs-effect-pass.hpp" - "source/obs/gs/gs-effect-pass.cpp" - "source/obs/gs/gs-effect-technique.hpp" - "source/obs/gs/gs-effect-technique.cpp" - "source/obs/gs/gs-indexbuffer.hpp" - "source/obs/gs/gs-indexbuffer.cpp" - "source/obs/gs/gs-limits.hpp" - "source/obs/gs/gs-rendertarget.hpp" - "source/obs/gs/gs-rendertarget.cpp" - "source/obs/gs/gs-sampler.hpp" - "source/obs/gs/gs-sampler.cpp" - "source/obs/gs/gs-texture.hpp" - "source/obs/gs/gs-texture.cpp" - "source/obs/gs/gs-vertex.hpp" - "source/obs/gs/gs-vertex.cpp" - "source/obs/gs/gs-vertexbuffer.hpp" - "source/obs/gs/gs-vertexbuffer.cpp" - "source/obs/obs-signal-handler.hpp" - "source/obs/obs-signal-handler.cpp" - "source/obs/obs-source-tracker.hpp" - "source/obs/obs-source-tracker.cpp" - "source/obs/obs-tools.hpp" - "source/obs/obs-tools.cpp" - - # obs_encoder_info_t, obs_encoder_t, obs_weak_encoder_t - "source/obs/obs-encoder-factory.hpp" - "source/obs/obs-encoder-factory.cpp" - - # obs_source_info_t, obs_source_t, obs_weak_source_t - "source/obs/obs-source-factory.hpp" - "source/obs/obs-source-factory.cpp" - "source/obs/obs-source.hpp" - "source/obs/obs-source.cpp" - "source/obs/obs-source-active-child.hpp" - "source/obs/obs-source-active-child.cpp" - "source/obs/obs-source-active-reference.hpp" - "source/obs/obs-source-active-reference.cpp" - "source/obs/obs-source-showing-reference.hpp" - "source/obs/obs-source-showing-reference.cpp" - "source/obs/obs-weak-source.hpp" - "source/obs/obs-weak-source.cpp" -) -list(APPEND PROJECT_DATA - "data/effects/color_conversion_rgb_hsl.effect" - "data/effects/color_conversion_rgb_hsv.effect" - "data/effects/color_conversion_rgb_yuv.effect" - "data/effects/mipgen.effect" - "data/effects/pack-unpack.effect" - "data/effects/standard.effect" - "data/effects/shared.effect" - "data/locale/en-US.ini" -) -list(APPEND PROJECT_INCLUDE_DIRS - "${PROJECT_BINARY_DIR}/generated" - "${PROJECT_SOURCE_DIR}/source" -) - -# Profiling -list(APPEND PROJECT_PRIVATE_SOURCE - "source/util/util-profiler.cpp" - "source/util/util-profiler.hpp" -) - -# Updater -list(APPEND PROJECT_PRIVATE_SOURCE - "source/updater.hpp" - "source/updater.cpp" -) - -# Frontend -list(APPEND PROJECT_UI - "ui/streamfx.qrc" - "ui/about.ui" - "ui/about-entry.ui" -) -list(APPEND PROJECT_UI_SOURCE - "source/ui/ui-common.hpp" - "source/ui/ui.hpp" - "source/ui/ui.cpp" - "source/ui/ui-about.hpp" - "source/ui/ui-about.cpp" - "source/ui/ui-about-entry.hpp" - "source/ui/ui-about-entry.cpp" - "source/ui/ui-obs-browser-widget.hpp" - "source/ui/ui-obs-browser-widget.cpp" -) -list(APPEND PROJECT_INCLUDE_DIRS - "source/ui" -) - -list(APPEND PROJECT_UI_SOURCE - "source/ui/ui-updater.hpp" - "source/ui/ui-updater.cpp" -) -list(APPEND PROJECT_UI - "ui/updater.ui" -) - -################################################################################ -# Parts -################################################################################ - -# Windows -if(D_PLATFORM_WINDOWS) - # Disable/Enable a ton of things. - list(APPEND PROJECT_DEFINITIONS - # Microsoft Visual C++ - _CRT_SECURE_NO_WARNINGS - _ENABLE_EXTENDED_ALIGNED_STORAGE - # windows.h - WIN32_LEAN_AND_MEAN - NOGPICAPMASKS - NOVIRTUALKEYCODES - #NOWINMESSAGES - NOWINSTYLES - NOSYSMETRICS - NOMENUS - NOICONS - NOKEYSTATES - NOSYSCOMMANDS - NORASTEROPS - #NOSHOWWINDOW - NOATOM - NOCLIPBOARD - NOCOLOR - #NOCTLMGR - NODRAWTEXT - #NOGDI - NOKERNEL - #NOUSER - #NONLS - NOMB - NOMEMMGR - NOMETAFILE - NOMINMAX - #NOMSG - NOOPENFILE - NOSCROLL - NOSERVICE - NOSOUND - #NOTEXTMETRIC - NOWH - NOWINOFFSETS - NOCOMM - NOKANJI - #NOHELP - NOPROFILER - NODEFERWINDOWPOS - NOMCX - NOIME - NOMDI - NOINOUT - ) -endif() - -# GCC before 9.0, Clang before 9.0 -if((CMAKE_C_COMPILER_ID STREQUAL "GNU") - OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - OR (CMAKE_C_COMPILER_ID STREQUAL "Clang") - OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0) - list(APPEND PROJECT_LIBRARIES - "stdc++fs" - ) - endif() -endif() - ################################################################################ # Helpers ################################################################################ @@ -772,6 +474,7 @@ function(streamfx_add_library TARGET_NAME TARGET_TYPE) # @rpath in installed binaries INSTALL_RPATH "@executable_path/../Frameworks/;@loader_path/../Frameworks/;@loader_path/../Resources/" ) + if(STANDALONE) set_target_properties(${TARGET_NAME} PROPERTIES # @rpath in built binaries @@ -1057,7 +760,7 @@ function(streamfx_add_component COMPONENT_NAME) ) # Always depend on StreamFX::Core - target_link_libraries(${COMPONENT_TARGET} PRIVATE $) + target_link_libraries(${COMPONENT_TARGET} PUBLIC $) # Register the component globally. get_target_property(_DEPENDS StreamFX COMPONENT_DEPENDS) @@ -1118,7 +821,6 @@ function(streamfx_add_component COMPONENT_NAME) ${USERINTERFACE} ${SOURCE_PRIVATE} ${GENERATED_PRIVATE} - PUBLIC ${SOURCE_PUBLIC} ${GENERATED_PUBLIC} ) @@ -1243,12 +945,6 @@ endfunction() ################################################################################ streamfx_add_library(StreamFX MODULE) # We are a module for libOBS. -target_include_directories(StreamFX PRIVATE - "source" - "include" - "${PROJECT_BINARY_DIR}/generated" -) - # Ensure there is at least one file. if(D_PLATFORM_WINDOWS) target_sources(StreamFX @@ -1262,6 +958,7 @@ else() ) endif() +# version.rc (can't be part of a static library) if(D_PLATFORM_WINDOWS) # Windows-exclusive # Version Resource set(PROJECT_PRODUCT_NAME "${PROJECT_FULL_NAME}") @@ -1272,36 +969,17 @@ if(D_PLATFORM_WINDOWS) # Windows-exclusive configure_file( "templates/windows/version.rc.in" - "generated/version.rc" + "version.rc" ) - target_sources(StreamFX - PRIVATE - "templates/windows/version.rc.in" - "${PROJECT_BINARY_DIR}/generated/version.rc" + target_sources(StreamFX PRIVATE + "${PROJECT_BINARY_DIR}/version.rc" ) -elseif(D_PLATFORM_MAC) # MacOS exclusive Changes - set_target_properties(StreamFX PROPERTIES - # No automatic code signing in XCode - XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "" - XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO" - - # @rpath in installed binaries - INSTALL_RPATH "@executable_path/../Frameworks/;@loader_path/../Frameworks/;@loader_path/../Resources/" - ) - - if(STANDALONE) - set_target_properties(StreamFX PROPERTIES - # @rpath in built binaries - BUILD_WITH_INSTALL_RPATH ON - ) - endif() endif() - -# Set file version set_target_properties(StreamFX PROPERTIES + # Version MACHO_COMPATIBILITY_VERSION ${_VERSION_MAJOR}.${_VERSION_MINOR} - MACHO_CURRENT_VERSION ${PROJECT_VERSION} SOVERSION ${_VERSION_MAJOR}.${_VERSION_MINOR} + MACHO_CURRENT_VERSION ${PROJECT_VERSION} VERSION ${PROJECT_VERSION} ) @@ -1311,66 +989,188 @@ set_target_properties(StreamFX PROPERTIES streamfx_add_library(StreamFX_Core STATIC EXCLUDE_FROM_ALL) add_library(StreamFX::Core ALIAS StreamFX_Core) -# Register the library -target_link_libraries(StreamFX_Core - PRIVATE ${PROJECT_LIBRARIES} - PUBLIC OBS::libobs -) -target_include_directories(StreamFX_Core - PRIVATE ${PROJECT_INCLUDE_DIRS} - PUBLIC - "${PROJECT_SOURCE_DIR}/source" - "${PROJECT_BINARY_DIR}/generated" -) -target_compile_definitions(StreamFX_Core - PRIVATE ${PROJECT_DEFINITIONS} -) - -# Combine all variables that matter. -set(PROJECT_FILES - # Always exist - ${PROJECT_DATA} - ${PROJECT_PRIVATE_GENERATED} - ${PROJECT_PRIVATE_SOURCE} - ${PROJECT_TEMPLATES} - # UI-only (empty if not enabled) - ${PROJECT_UI} - ${PROJECT_UI_SOURCE} - # Media - ${PROJECT_MEDIA} -) - -# Set source groups for IDE generators. -source_group(TREE "${PROJECT_SOURCE_DIR}/data" PREFIX "Data" FILES ${PROJECT_DATA}) -source_group(TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Source" FILES ${PROJECT_PRIVATE_SOURCE} ${PROJECT_UI_SOURCE}) -source_group(TREE "${PROJECT_BINARY_DIR}/generated" PREFIX "Source" FILES ${PROJECT_PRIVATE_GENERATED}) -source_group(TREE "${PROJECT_SOURCE_DIR}/templates" PREFIX "Templates" FILES ${PROJECT_TEMPLATES}) -source_group(TREE "${PROJECT_SOURCE_DIR}/ui" PREFIX "User Interface" FILES ${PROJECT_UI}) -source_group(TREE "${PROJECT_SOURCE_DIR}/media" PREFIX "Media" FILES ${PROJECT_MEDIA}) - -# Prevent unwanted files from being built as source. -set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} ${PROJECT_UI} ${PROJECT_MEDIA} PROPERTIES - HEADER_FILE_ONLY ON -) - -# Enable Qt if needed +# Enable Qt set_target_properties(StreamFX_Core PROPERTIES AUTOUIC ON AUTOUIC_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/ui" AUTOMOC ON AUTORCC ON - AUTOGEN_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated" + AUTOGEN_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/qt" ) -# Prevent non-UI files from being Qt'd -set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} ${PROJECT_MEDIA} ${PROJECT_PRIVATE_GENERATED} ${PROJECT_PRIVATE_SOURCE} PROPERTIES +# Default Links +target_link_libraries(StreamFX_Core + PUBLIC + CURL::libcurl + Qt6::Core + Qt6::Gui + Qt6::Widgets + OBS::obs-frontend-api + OBS::libobs +) + +# Default Include Dirs +target_include_directories(StreamFX_Core + PRIVATE + "${PROJECT_SOURCE_DIR}/source/ui" + "${PROJECT_BINARY_DIR}/qt" + PUBLIC + "${PROJECT_SOURCE_DIR}/source" + "${PROJECT_SOURCE_DIR}/include" + "${PROJECT_BINARY_DIR}/generated" + ${JSON_INCLUDE_DIR} +) + +# Templates +file(GLOB_RECURSE PROJECT_TEMPLATES FOLLOW_SYMLINKS CONFIGURE_DEPENDS "templates/*") +source_group(TREE "${PROJECT_SOURCE_DIR}/templates" PREFIX "Templates" FILES ${PROJECT_TEMPLATES}) +set_source_files_properties(${PROJECT_TEMPLATES} PROPERTIES + HEADER_FILE_ONLY ON SKIP_AUTOGEN ON SKIP_AUTOMOC ON SKIP_AUTORCC ON SKIP_AUTOUIC ON ) +target_sources(StreamFX_Core PRIVATE ${PROJECT_TEMPLATES}) -target_sources(StreamFX_Core PRIVATE ${PROJECT_FILES}) +# Generated +#- config.hpp +configure_file( + "templates/config.hpp.in" + "generated/config.hpp" +) +#- version.hpp +configure_file( + "templates/version.hpp.in" + "generated/version.hpp" +) +#- module.cpp +configure_file( + "templates/module.cpp.in" + "generated/module.cpp" +) +#- Add all generated files +file(GLOB_RECURSE PROJECT_PRIVATE_GENERATED FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_BINARY_DIR}/generated/*") +source_group(TREE "${PROJECT_BINARY_DIR}/generated" PREFIX "Private Files/Generated" FILES ${PROJECT_PRIVATE_GENERATED}) +set_source_files_properties(${PROJECT_PRIVATE_GENERATED} PROPERTIES + SKIP_AUTOGEN ON + SKIP_AUTOMOC ON + SKIP_AUTORCC ON + SKIP_AUTOUIC ON +) +target_sources(StreamFX_Core PRIVATE ${PROJECT_PRIVATE_GENERATED}) + +# Source +file(GLOB_RECURSE PROJECT_PRIVATE FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/source/*") +list(REMOVE_ITEM PROJECT_PRIVATE "${PROJECT_SOURCE_DIR}/source/windll.cpp") # Only used by StreamFX, not part of StreamFX::Core +source_group(TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Private Files" FILES ${PROJECT_PRIVATE}) +set_source_files_properties(${PROJECT_PRIVATE} PROPERTIES + SKIP_AUTOGEN ON + SKIP_AUTOMOC ON + SKIP_AUTORCC ON + SKIP_AUTOUIC ON +) +target_sources(StreamFX_Core PRIVATE ${PROJECT_PRIVATE}) + +# User-Interface Source +file(GLOB_RECURSE PROJECT_PRIVATE_UI FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/source/ui/*") +list(APPEND PROJECT_PRIVATE_UI "${PROJECT_SOURCE_DIR}/source/obs/browser/obs-browser-panel.hpp") +set_source_files_properties(${PROJECT_PRIVATE_UI} PROPERTIES + SKIP_AUTOGEN OFF + SKIP_AUTOMOC OFF + SKIP_AUTORCC OFF + SKIP_AUTOUIC OFF +) + +# User-Interface Definitions +file(GLOB_RECURSE PROJECT_UI FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/ui/*") +source_group(TREE "${PROJECT_SOURCE_DIR}/ui" PREFIX "User-Interface Files" FILES ${PROJECT_UI}) +set_source_files_properties(${PROJECT_UI} PROPERTIES + HEADER_FILE_ONLY ON +) +target_sources(StreamFX_Core PRIVATE ${PROJECT_UI}) + +# Windows +if(D_PLATFORM_WINDOWS) + # Disable/Enable a ton of things. + target_compile_definitions(StreamFX_Core PRIVATE + # Microsoft Visual C++ + _CRT_SECURE_NO_WARNINGS + _ENABLE_EXTENDED_ALIGNED_STORAGE + # windows.h + WIN32_LEAN_AND_MEAN + NOGPICAPMASKS + NOVIRTUALKEYCODES + #NOWINMESSAGES + NOWINSTYLES + NOSYSMETRICS + NOMENUS + NOICONS + NOKEYSTATES + NOSYSCOMMANDS + NORASTEROPS + #NOSHOWWINDOW + NOATOM + NOCLIPBOARD + NOCOLOR + #NOCTLMGR + NODRAWTEXT + #NOGDI + NOKERNEL + #NOUSER + #NONLS + NOMB + NOMEMMGR + NOMETAFILE + NOMINMAX + #NOMSG + NOOPENFILE + NOSCROLL + NOSERVICE + NOSOUND + #NOTEXTMETRIC + NOWH + NOWINOFFSETS + NOCOMM + NOKANJI + #NOHELP + NOPROFILER + NODEFERWINDOWPOS + NOMCX + NOIME + NOMDI + NOINOUT + ) +endif() + +# OpenGL via GLAD +if(NOT TARGET StreamFX::GLAD) + add_library(StreamFX_GLAD STATIC + "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/gl.c" + ) + target_include_directories(StreamFX_GLAD + PUBLIC + "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include" + ) + if(D_PLATFORM_WINDOWS) + target_sources(StreamFX_GLAD + PRIVATE + "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/wgl.c" + ) + elseif(D_PLATFORM_LINUX) + target_sources(StreamFX_GLAD + PRIVATE + "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/glx.c" + ) + endif() + + # Requires for shared/static mixing. + set_property(TARGET StreamFX_GLAD PROPERTY POSITION_INDEPENDENT_CODE ON) + + add_library(StreamFX::GLAD ALIAS StreamFX_GLAD) +endif() + +target_link_libraries(StreamFX_Core PUBLIC StreamFX::GLAD) ################################################################################ # Components @@ -1510,22 +1310,54 @@ foreach(_ENTITY ${_RESOLVED}) streamfx_enabled_component(${_ENTITY2} T_CHECK) if(T_CHECK) - target_link_libraries(${RENTITY} - PUBLIC - $ - ) + target_link_libraries(${RENTITY} PUBLIC $) endif() endforeach() endif() - target_link_libraries(StreamFX - PRIVATE - $ - ) + target_link_libraries(StreamFX PUBLIC $) endforeach() target_link_libraries(StreamFX PUBLIC $) +################################################################################ +# Resources +################################################################################ +# This needs to be handled separately, as CMake does not propagate Resources +# between dependencies. This feels like a bug in CMake, but it is better than +# not doing anything at all. Might eventually need to revise this when we start +# generating data files. + +# Data +file(GLOB_RECURSE PROJECT_DATA "data/*") +source_group(TREE "${PROJECT_SOURCE_DIR}/data" PREFIX "Data" FILES ${PROJECT_DATA}) +if(D_PLATFORM_MAC) + foreach(FILE IN LISTS PROJECT_DATA) # Data location + cmake_path(ABSOLUTE_PATH FILE OUTPUT_VARIABLE FILE_PATH) + cmake_path(RELATIVE_PATH FILE_PATH BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/data/") + cmake_path(GET FILE_PATH PARENT_PATH FILE_PATH) + set_source_files_properties("${FILE}" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources/${FILE_PATH}" + ) + endforeach() +endif() + +# Media +file(GLOB_RECURSE PROJECT_MEDIA "media/*") +source_group(TREE "${PROJECT_SOURCE_DIR}/media" PREFIX "Media" FILES ${PROJECT_MEDIA}) +if(D_PLATFORM_MAC) + #- Bundle Icon location + set_source_files_properties("media/icon.png" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" + ) +endif() + +# Add all Resources to StreamFX +set_source_files_properties(${PROJECT_DATA} ${PROJECT_MEDIA} PROPERTIES + HEADER_FILE_ONLY ON +) +target_sources(StreamFX PRIVATE ${PROJECT_DATA} ${PROJECT_MEDIA}) + ################################################################################ # Installation ################################################################################ @@ -1596,21 +1428,6 @@ if(STANDALONE) XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${MACOSX_BUNDLE_GUI_IDENTIFIER}" ) - # Proper location for resources in Bundles - foreach(FILE IN LISTS PROJECT_DATA) - cmake_path(ABSOLUTE_PATH FILE OUTPUT_VARIABLE FILE_PATH) - cmake_path(RELATIVE_PATH FILE_PATH BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/data/") - cmake_path(GET FILE_PATH PARENT_PATH FILE_PATH) - set_source_files_properties("${FILE}" PROPERTIES - MACOSX_PACKAGE_LOCATION "Resources/${FILE_PATH}" - ) - endforeach() - - # Bundle Icon - set_source_files_properties("media/icon.png" PROPERTIES - MACOSX_PACKAGE_LOCATION "Resources" - ) - install( TARGETS StreamFX RUNTIME DESTINATION "." COMPONENT StreamFX diff --git a/source/gfx/gfx-mipmapper.cpp b/source/gfx/gfx-mipmapper.cpp index 9da7c9bc..8664a47e 100644 --- a/source/gfx/gfx-mipmapper.cpp +++ b/source/gfx/gfx-mipmapper.cpp @@ -28,14 +28,14 @@ struct d3d_info { ID3D11Resource* target = nullptr; }; -void d3d_initialize(d3d_info& info, std::shared_ptr source, std::shared_ptr target) +static void d3d_initialize(d3d_info& info, std::shared_ptr source, std::shared_ptr target) { info.target = reinterpret_cast(gs_texture_get_obj(target->get_object())); info.device = reinterpret_cast(gs_get_device_obj()); info.device->GetImmediateContext(&info.context); } -void d3d_copy_subregion(d3d_info& info, std::shared_ptr source, uint32_t mip_level, uint32_t width, uint32_t height) +static void d3d_copy_subregion(d3d_info& info, std::shared_ptr source, uint32_t mip_level, uint32_t width, uint32_t height) { D3D11_BOX box = {0, 0, 0, width, height, 1}; auto source_ref = reinterpret_cast(gs_texture_get_obj(source->get_object())); @@ -49,7 +49,7 @@ struct opengl_info { GLuint fbo = 0; }; -std::string opengl_translate_error(GLenum error) +static std::string opengl_translate_error(GLenum error) { #define TRANSLATE_CASE(X) \ case X: \ @@ -70,7 +70,7 @@ std::string opengl_translate_error(GLenum error) #undef TRANSLATE_CASE } -std::string opengl_translate_framebuffer_status(GLenum error) +static std::string opengl_translate_framebuffer_status(GLenum error) { #define TRANSLATE_CASE(X) \ case X: \ @@ -106,19 +106,19 @@ std::string opengl_translate_framebuffer_status(GLenum error) throw std::runtime_error(sstr.str()); \ } -void opengl_initialize(opengl_info& info, std::shared_ptr source, std::shared_ptr target) +static void opengl_initialize(opengl_info& info, std::shared_ptr source, std::shared_ptr target) { info.target = *reinterpret_cast(gs_texture_get_obj(target->get_object())); glGenFramebuffers(1, &info.fbo); } -void opengl_finalize(opengl_info& info) +static void opengl_finalize(opengl_info& info) { glDeleteFramebuffers(1, &info.fbo); } -void opengl_copy_subregion(opengl_info& info, std::shared_ptr source, uint32_t mip_level, uint32_t width, uint32_t height) +static void opengl_copy_subregion(opengl_info& info, std::shared_ptr source, uint32_t mip_level, uint32_t width, uint32_t height) { GLuint source_ref = *reinterpret_cast(gs_texture_get_obj(source->get_object()));