From 467453bd0b693b8f57ed8789a0e9abb9c14a7918 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nicolas.pope@utu.fi>
Date: Mon, 20 Jan 2020 13:48:35 +0200
Subject: [PATCH] Resolve #280 windows gui compilation

---
 .gitlab-ci.yml                  |  5 +++--
 .gitmodules                     |  3 +++
 CMakeLists.txt                  | 38 +++++++++++++++++++++++++++------
 applications/gui/CMakeLists.txt |  9 +++++++-
 ext/nanogui                     |  1 +
 5 files changed, 47 insertions(+), 9 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 ext/nanogui

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 35916ad80..4fcf1d06d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,6 +5,7 @@
 # Perhaps relevant in future https://gitlab.com/gitlab-org/gitlab-ce/issues/47063
 
 variables:
+  GIT_SUBMODULE_STRATEGY: recursive
   CMAKE_ARGS_WINDOWS: '-DCMAKE_GENERATOR_PLATFORM=x64 -DNVPIPE_DIR="D:/Build/NvPipe" -DEigen3_DIR="C:/Program Files (x86)/Eigen3/share/eigen3/cmake" -DOpenCV_DIR="D:/Build/opencv-4.1.1" -DCUDA_TOOLKIT_ROOT_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.1"'
 
 stages:
@@ -50,8 +51,8 @@ webserver-deploy:
     - 'call "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Auxiliary/Build/vcvars64.bat"'
     - mkdir build
     - cd build
-    - echo cmake %CMAKE_ARGS% %CMAKE_ARGS_WINDOWS% ..
-    - cmake %CMAKE_ARGS% %CMAKE_ARGS_WINDOWS% ..
+    - echo cmake %CMAKE_ARGS% %CMAKE_ARGS_WINDOWS% -DNANOGUI_DIR="C:/Program Files (x86)/NanoGUI" ..
+    - cmake %CMAKE_ARGS% %CMAKE_ARGS_WINDOWS% -DNANOGUI_DIR="C:/Program Files (x86)/NanoGUI" ..
     - devenv ftl.utu.fi.sln /build Release
     - rmdir /q /s "%DEPLOY_DIR%/%CI_COMMIT_REF_SLUG%"
     - mkdir "%DEPLOY_DIR%/%CI_COMMIT_REF_SLUG%"
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..1c1bd9b62
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "ext/nanogui"]
+	path = ext/nanogui
+	url = https://github.com/wjakob/nanogui.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e2ab0ac60..19f41d1b5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,6 +17,7 @@ option(WITH_FIXSTARS "Use Fixstars libSGM if available" ON)
 option(BUILD_VISION "Enable the vision component" ON)
 option(BUILD_RECONSTRUCT "Enable the reconstruction component" ON)
 option(BUILD_RENDERER "Enable the renderer component" ON)
+option(BUILD_GUI "Enable the GUI" ON)
 option(BUILD_CALIBRATION "Enable the calibration component" OFF)
 
 set(THREADS_PREFER_PTHREAD_FLAG ON)
@@ -92,14 +93,39 @@ else()
 	set(REALSENSE_LIBRARY "")
 endif()
 
+if (BUILD_GUI)
+	#find_library( NANOGUI_LIBRARY NAMES nanogui libnanogui PATHS ${NANOGUI_DIR} PATH_SUFFIXES lib)
+	#if (NANOGUI_LIBRARY)
+	#	set(HAVE_NANOGUI TRUE)
+	#	add_library(nanogui UNKNOWN IMPORTED)
+	#	#set_property(TARGET nanogui PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${NANOGUI_EXTRA_INCS})
+	#	set_property(TARGET nanogui PROPERTY IMPORTED_LOCATION ${NANOGUI_LIBRARY})
+	#	message(STATUS "Found NanoGUI: ${NANOGUI_LIBRARY}")
+
+	#	if(WIN32)
+	#		# Find include
+	#		find_path(NANOGUI_INCLUDE_DIRS
+	#			NAMES nanogui/nanogui.h
+	#			PATHS "C:/Program Files/NanoGUI" "C:/Program Files (x86)/NanoGUI" ${NANOGUI_DIR}
+	#			PATH_SUFFIXES include
+	#		)
+	#		set_property(TARGET nanogui PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${NANOGUI_INCLUDE_DIRS})
+	#	endif()
+	#endif()
 
-find_library( NANOGUI_LIBRARY NAMES nanogui libnanogui)
-if (NANOGUI_LIBRARY)
 	set(HAVE_NANOGUI TRUE)
-	add_library(nanogui UNKNOWN IMPORTED)
-	#set_property(TARGET nanogui PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${NANOGUI_EXTRA_INCS})
-	set_property(TARGET nanogui PROPERTY IMPORTED_LOCATION ${NANOGUI_LIBRARY})
-    message(STATUS "Found NanoGUI: ${NANOGUI_LIBRARY}")
+
+	# Disable building extras we won't need (pure C++ project)
+	set(NANOGUI_BUILD_SHARED OFF CACHE BOOL " " FORCE)
+	set(NANOGUI_BUILD_EXAMPLE OFF CACHE BOOL " " FORCE)
+	set(NANOGUI_BUILD_PYTHON  OFF CACHE BOOL " " FORCE)
+	set(NANOGUI_INSTALL       OFF CACHE BOOL " " FORCE)
+
+	# Add the configurations from nanogui
+	add_subdirectory(ext/nanogui)
+
+	# For reliability of parallel build, make the NanoGUI targets dependencies
+	set_property(TARGET glfw glfw_objects nanogui PROPERTY FOLDER "dependencies")
 endif()
 
 find_library( NVPIPE_LIBRARY NAMES NvPipe libNvPipe PATHS ${NVPIPE_DIR} PATH_SUFFIXES lib)
diff --git a/applications/gui/CMakeLists.txt b/applications/gui/CMakeLists.txt
index 65d7964d5..cbb25e837 100644
--- a/applications/gui/CMakeLists.txt
+++ b/applications/gui/CMakeLists.txt
@@ -20,10 +20,17 @@ if (HAVE_OPENVR)
 	list(APPEND GUISRC "src/vr.cpp")
 endif()
 
+# Various preprocessor definitions have been generated by NanoGUI
+add_definitions(${NANOGUI_EXTRA_DEFS})
+
+# On top of adding the path to nanogui/include, you may need extras
+include_directories(${NANOGUI_EXTRA_INCS})
+
 add_executable(ftl-gui ${GUISRC})
 
 target_include_directories(ftl-gui PUBLIC
 	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+	$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/ext/nanogui/include>
 	$<INSTALL_INTERFACE:include>
 	PRIVATE src)
 
@@ -32,6 +39,6 @@ target_include_directories(ftl-gui PUBLIC
 #endif()
 
 #target_include_directories(cv-node PUBLIC ${PROJECT_SOURCE_DIR}/include)
-target_link_libraries(ftl-gui ftlcommon ftlctrl ftlrgbd ftlstreams ftlrender Threads::Threads ${OpenCV_LIBS} ${OPENVR_LIBRARIES} glog::glog ftlnet nanogui GL)
+target_link_libraries(ftl-gui ftlcommon ftlctrl ftlrgbd ftlstreams ftlrender Threads::Threads ${OpenCV_LIBS} ${OPENVR_LIBRARIES} glog::glog ftlnet nanogui ${NANOGUI_EXTRA_LIBS})
 
 
diff --git a/ext/nanogui b/ext/nanogui
new file mode 160000
index 000000000..e9ec8a1a9
--- /dev/null
+++ b/ext/nanogui
@@ -0,0 +1 @@
+Subproject commit e9ec8a1a9861cf578d9c6e85a6420080aa715c03
-- 
GitLab