trlsmax / imgui-vtk

test on how to integrate vtk into glfw + imgui project
MIT License
107 stars 26 forks source link

Blue Screen Render Window #13

Closed rajkundu closed 1 year ago

rajkundu commented 1 year ago

Hello! I'm trying to use imgui-vtk for a project of mine, and I'm currently building on macOS 12.5 Monterey using Apple Clang 14.0.0 (for x86-64). I have VTK v9.1.0 from Homebrew. When I try to build and run the example in this repo, I get a blue screen rendered into the ImGui/VTK Window rather than the expected scene. Any idea why this might be?

image

Here is my CMakeLists.txt. The only change vs. this repo is that I cloned glfw source into ./glfw.

cmake_minimum_required (VERSION 3.6)
project (imgui-vtk)

set (CMAKE_CXX_STANDARD 11)
set (CMAKE_VERBOSE_MAKEFILE 1)
set (APP_VERSION_MAJOR 1)
set (APP_VERSION_MINOR 0)

set (EXECNAME imgui_vtk)

find_package(ParaView
  QUIET
)
if (NOT ParaView_FOUND)
  find_package(VTK COMPONENTS 
    CommonCore
    CommonColor
    CommonDataModel
    FiltersCore
    InteractionStyle
    RenderingCore
    RenderingFreeType
    RenderingGL2PSOpenGL2
    RenderingOpenGL2
    QUIET
  )
  if (NOT VTK_FOUND)
    message("Skipping imgui-vtk: ${VTK_NOT_FOUND_MESSAGE}")
    return ()
  endif()
endif()

message (STATUS "VTK_VERSION: ${VTK_VERSION}")

# glfw
add_subdirectory("./glfw")
link_libraries(glfw)

# opengl
find_package(OpenGL REQUIRED)
include_directories(${OPENGL_INCLUDE_DIRS})

set(HEADER_FILES
    imgui_impl_vtk.h
    imgui_vtk_demo.h
)

set(SOURCE_FILES
    main.cpp
    glad/glad.c
    imgui_impl_vtk.cpp
    imgui/imgui.cpp
    imgui/imgui_demo.cpp
    imgui/imgui_draw.cpp
    imgui/imgui_widgets.cpp
    imgui/imgui_impl_glfw.cpp
    imgui/imgui_impl_opengl3.cpp
)

add_executable (${EXECNAME} ${HEADER_FILES} ${SOURCE_FILES})

target_include_directories (${EXECNAME}
  PUBLIC
    "${${PROJECT_NAME}_SOURCE_DIR}"
    "${${PROJECT_NAME}_SOURCE_DIR}/imgui"
)

target_compile_definitions(${EXECNAME} PRIVATE "IMGUI_IMPL_OPENGL_LOADER_GLAD")

if (UNIX)
  if (APPLE)
      target_link_libraries (
         ${EXECNAME}
              "-framework Cocoa"
              "-framework IOKit"
              "-framework CoreVideo"
              glfw
              OpenGL::GL
              ${VTK_LIBRARIES}
      )
  else ()
      target_link_libraries (
         ${EXECNAME}
              ${CMAKE_THREAD_LIBS_INIT}
              ${X11_LIBRARIES}
              ${CMAKE_DL_LIBS}
              glfw
              OpenGL::GL
              ${VTK_LIBRARIES}
      )
  endif()
else ()
  target_link_libraries (
     ${EXECNAME}
          glfw
          OpenGL::GL
          ${VTK_LIBRARIES}
  )
endif()

if (VTK_VERSION VERSION_LESS "9.0.0")
  include(${VTK_USE_FILE})
else ()
  # vtk_module_autoinit is needed
  vtk_module_autoinit(
    TARGETS ${EXECNAME}
    MODULES ${VTK_LIBRARIES}
    )
  # vtk_module_autoinit is needed
  vtk_module_autoinit(
    TARGETS ${EXECNAME}
    MODULES ${VTK_LIBRARIES}
    )
endif () 

Here is my CMake build output:

[main] Building folder: imgui-vtk 
[build] Starting build
[proc] Executing command: /usr/local/bin/cmake --build /Users/raj/code/imgui-vtk/build --config Debug --target all -j 14 --
[build] /usr/local/Cellar/cmake/3.19.3/bin/cmake -S/Users/raj/code/imgui-vtk -B/Users/raj/code/imgui-vtk/build --check-build-system CMakeFiles/Makefile.cmake 0
[build] /usr/local/Cellar/cmake/3.19.3/bin/cmake -E cmake_progress_start /Users/raj/code/imgui-vtk/build/CMakeFiles /Users/raj/code/imgui-vtk/build//CMakeFiles/progress.marks
[build] /Library/Developer/CommandLineTools/usr/bin/make  -f CMakeFiles/Makefile2 all
[build] /Library/Developer/CommandLineTools/usr/bin/make  -f glfw/src/CMakeFiles/glfw.dir/build.make glfw/src/CMakeFiles/glfw.dir/depend
[build] cd /Users/raj/code/imgui-vtk/build && /usr/local/Cellar/cmake/3.19.3/bin/cmake -E cmake_depends "Unix Makefiles" /Users/raj/code/imgui-vtk /Users/raj/code/imgui-vtk/glfw/src /Users/raj/code/imgui-vtk/build /Users/raj/code/imgui-vtk/build/glfw/src /Users/raj/code/imgui-vtk/build/glfw/src/CMakeFiles/glfw.dir/DependInfo.cmake --color=
[build] /Library/Developer/CommandLineTools/usr/bin/make  -f glfw/src/CMakeFiles/glfw.dir/build.make glfw/src/CMakeFiles/glfw.dir/build
[build] make[2]: Nothing to be done for `glfw/src/CMakeFiles/glfw.dir/build'.
[build] [ 68%] Built target glfw
[build] /Library/Developer/CommandLineTools/usr/bin/make  -f CMakeFiles/imgui_vtk.dir/build.make CMakeFiles/imgui_vtk.dir/depend
[build] cd /Users/raj/code/imgui-vtk/build && /usr/local/Cellar/cmake/3.19.3/bin/cmake -E cmake_depends "Unix Makefiles" /Users/raj/code/imgui-vtk /Users/raj/code/imgui-vtk /Users/raj/code/imgui-vtk/build /Users/raj/code/imgui-vtk/build /Users/raj/code/imgui-vtk/build/CMakeFiles/imgui_vtk.dir/DependInfo.cmake --color=
[build] Scanning dependencies of target imgui_vtk
[build] /Library/Developer/CommandLineTools/usr/bin/make  -f CMakeFiles/imgui_vtk.dir/build.make CMakeFiles/imgui_vtk.dir/build
[build] [ 71%] Building CXX object CMakeFiles/imgui_vtk.dir/imgui_impl_vtk.cpp.o
[build] /usr/bin/clang++ -DIMGUI_IMPL_OPENGL_LOADER_GLAD -Dkiss_fft_scalar=double -DvtkRenderingCore_AUTOINIT_INCLUDE=\"/Users/raj/code/imgui-vtk/build/CMakeFiles/vtkModuleAutoInit_f8458cbfd8eb10644992024bd2afdac3.h\" -DvtkRenderingOpenGL2_AUTOINIT_INCLUDE=\"/Users/raj/code/imgui-vtk/build/CMakeFiles/vtkModuleAutoInit_f8458cbfd8eb10644992024bd2afdac3.h\" -I/Users/raj/code/imgui-vtk -I/Users/raj/code/imgui-vtk/imgui -I/Users/raj/code/imgui-vtk/glfw/include -iframework /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk/System/Library/Frameworks -isystem /usr/local/include/vtk-9.1 -isystem /usr/local/include/vtk-9.1/vtkfreetype/include -isystem /usr/local/include -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk -std=gnu++11 -o CMakeFiles/imgui_vtk.dir/imgui_impl_vtk.cpp.o -c /Users/raj/code/imgui-vtk/imgui_impl_vtk.cpp
[build] /Users/raj/code/imgui-vtk/imgui_impl_vtk.cpp:260:18: warning: cast to 'void *' from smaller integer type 'GLuint' (aka 'unsigned int') [-Wint-to-void-pointer-cast]
[build]     ImGui::Image((void*)g_TexHdl,
[build]                  ^~~~~~~~~~~~~~~
[build] 1 warning generated.
[build] [ 75%] Linking CXX executable imgui_vtk
[build] /usr/local/Cellar/cmake/3.19.3/bin/cmake -E cmake_link_script CMakeFiles/imgui_vtk.dir/link.txt --verbose=1
[build] /usr/bin/clang++ -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/imgui_vtk.dir/main.cpp.o CMakeFiles/imgui_vtk.dir/glad/glad.c.o CMakeFiles/imgui_vtk.dir/imgui_impl_vtk.cpp.o CMakeFiles/imgui_vtk.dir/imgui/imgui.cpp.o CMakeFiles/imgui_vtk.dir/imgui/imgui_demo.cpp.o CMakeFiles/imgui_vtk.dir/imgui/imgui_draw.cpp.o CMakeFiles/imgui_vtk.dir/imgui/imgui_widgets.cpp.o CMakeFiles/imgui_vtk.dir/imgui/imgui_impl_glfw.cpp.o CMakeFiles/imgui_vtk.dir/imgui/imgui_impl_opengl3.cpp.o -o imgui_vtk  glfw/src/libglfw3.a -framework Cocoa -framework IOKit -framework CoreVideo glfw/src/libglfw3.a /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk/System/Library/Frameworks/OpenGL.framework/OpenGL.tbd /usr/local/lib/libvtkInteractionStyle-9.1.9.1.0.dylib /usr/local/lib/libvtkRenderingFreeType-9.1.9.1.0.dylib /usr/local/lib/libvtkRenderingGL2PSOpenGL2-9.1.9.1.0.dylib /usr/local/lib/libvtkRenderingOpenGL2-9.1.9.1.0.dylib -framework IOKit -framework CoreFoundation /usr/local/lib/libvtkfreetype-9.1.9.1.0.dylib /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk/usr/lib/libz.tbd /usr/local/lib/libvtkRenderingUI-9.1.9.1.0.dylib -framework Cocoa /usr/local/lib/libvtkRenderingCore-9.1.9.1.0.dylib /usr/local/lib/libvtkCommonColor-9.1.9.1.0.dylib /usr/local/lib/libvtkFiltersGeneral-9.1.9.1.0.dylib /usr/local/lib/libvtkFiltersCore-9.1.9.1.0.dylib /usr/local/lib/libvtkCommonExecutionModel-9.1.9.1.0.dylib /usr/local/lib/libvtkCommonDataModel-9.1.9.1.0.dylib /usr/local/lib/libvtkCommonTransforms-9.1.9.1.0.dylib /usr/local/lib/libvtkCommonMisc-9.1.9.1.0.dylib /usr/local/lib/libGLEW.dylib /usr/local/lib/libvtkCommonMath-9.1.9.1.0.dylib /usr/local/lib/libvtkCommonCore-9.1.9.1.0.dylib /usr/local/lib/libvtksys-9.1.9.1.0.dylib /usr/local/lib/libvtkkissfft-9.1.9.1.0.dylib 
[build] [100%] Built target imgui_vtk
[build] /usr/local/Cellar/cmake/3.19.3/bin/cmake -E cmake_progress_start /Users/raj/code/imgui-vtk/build/CMakeFiles 0
[build] Build finished with exit code 0
rajkundu commented 1 year ago

Seems that the culprit was some misordered #endif statements in imgui_impl_vtk.cpp on lines 241-255:

#if VTK_MAJOR_VERSION >= 9
#if VTK_BUILD_VERSION >= 2
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_FBOHdl); // required since we set BlitToCurrent = On.
#endif // VTK_BUILD_VERSION >= 2
#else
    glBindFramebuffer(GL_FRAMEBUFFER, g_FBOHdl);
#endif // VTK_MAJOR_VERSION >= 9
    g_RenderWindow->Render();
#if VTK_MAJOR_VERSION >= 9
#if VTK_BUILD_VERSION >= 2
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
#endif // VTK_BUILD_VERSION >= 2
#else
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
#endif // VTK_MAJOR_VERSION >= 9

The #endif statements belong AFTER the #else statements, not before them. It should instead look like this (indentation added for clarity):

#if VTK_MAJOR_VERSION >= 9
  #if VTK_BUILD_VERSION >= 2
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, g_FBOHdl); // required since we set BlitToCurrent = On.
  #else
    glBindFramebuffer(GL_FRAMEBUFFER, g_FBOHdl);
  #endif // VTK_BUILD_VERSION >= 2
#endif // VTK_MAJOR_VERSION >= 9
g_RenderWindow->Render();
#if VTK_MAJOR_VERSION >= 9
  #if VTK_BUILD_VERSION >= 2
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
  #else
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
  #endif // VTK_BUILD_VERSION >= 2
#endif // VTK_MAJOR_VERSION >= 9
rajkundu commented 1 year ago

Just to be clear, this was not a mere syntax change, but I altered the logic of the code.

Could someone quickly double-check this? (Perhaps @MorcilloSanz, if you have any time?) While my changes worked for my computer running VTK 9.1, I am not sure what the original intended logic was for this section of code.

Edit: I just realized that the code is checking VTK_BUILD_VERSION - not VTK_MINOR_VERSION. So it makes even less sense to me than before. I would imagine this is a typo or bug. Unfortunately, I am not too familiar with VTK or the history of its API, or else I would try to fix the issue myself.

rajkundu commented 1 year ago

This issue, among many others, has been fixed in my fork.