From dfb118dbbaabc052739947633fe31de84f93cbe4 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Sat, 21 Jan 2023 18:45:11 -0600 Subject: [PATCH 01/18] Fix issue with build, closes #1 --- plugins/example_plugin/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/example_plugin/CMakeLists.txt b/plugins/example_plugin/CMakeLists.txt index cecaaa39..f6d366e2 100644 --- a/plugins/example_plugin/CMakeLists.txt +++ b/plugins/example_plugin/CMakeLists.txt @@ -11,7 +11,7 @@ if (BUILD_PLUGIN_EXAMPLE) PanelExample.cpp ) - target_link_libraries(${pluginName} ospray_sg) + target_link_libraries(${pluginName} ospray_sg ospray_ui) # Only link against imgui if needed (ie, pure file importers don't) target_link_libraries(${pluginName} imgui) From bd07bb4d1223bf15647c9a9141fc53215afc59eb Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Sat, 21 Jan 2023 19:08:20 -0600 Subject: [PATCH 02/18] Fix issue with install for debug mode, closes #2 --- app/CMakeLists.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 148d5524..079660a7 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -86,6 +86,17 @@ if(OSPRAY_INSTALL) # message(STATUS "_sharedlib_glob: ${_sharedlib_glob}") file(GLOB _sharedlibs LIST_DIRECTORIES false "${_sharedlib_glob}") # message(STATUS "_sharedlibs: ${_sharedlibs}") + + # get *_debug*.dylib* files from the tbb's lib directory + if (CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG) + get_target_property(TBB_LIBNAME TBB::tbb IMPORTED_LOCATION_DEBUG) + string(REGEX MATCH "^.*/" _tbbLib_glob "${TBB_LIBNAME}") + string(APPEND _tbbLib_glob "*_debug*${CMAKE_SHARED_LIBRARY_SUFFIX}*") + file(GLOB tbb_sharedlibs LIST_DIRECTORIES false "${_tbbLib_glob}") + list(APPEND _sharedlibs ${tbb_sharedlibs}) + unset(_tbbLib_glob) + unset(tbb_sharedlibs) + endif() if(WIN32) install(FILES From afacd9227e847ec4403538eb08847285efae7e85 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Sat, 4 Feb 2023 15:57:49 -0600 Subject: [PATCH 03/18] Fix issue with running ospStudio, closes #3 --- app/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 079660a7..05181c2a 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -80,6 +80,9 @@ install(TARGETS ospStudio if(OSPRAY_INSTALL) get_target_property(OSPRAY_LIBNAME ospray::ospray IMPORTED_LOCATION_RELEASE) + if (CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG) + get_target_property(OSPRAY_LIBNAME ospray::ospray IMPORTED_LOCATION_DEBUG) + endif() string(REGEX MATCH "^.*/" _sharedlib_glob "${OSPRAY_LIBNAME}") string(APPEND _sharedlib_glob "*${CMAKE_SHARED_LIBRARY_SUFFIX}*") From 61c930ad18b049d9b2b78808565e8a87512a0de6 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Sat, 4 Feb 2023 16:09:59 -0600 Subject: [PATCH 04/18] Add starter code for MULTIWINDOWS mode --- app/CMakeLists.txt | 1 + app/MultiWindows.cpp | 2849 ++++++++++++++++++++++++++++++++++++++++++ app/MultiWindows.h | 230 ++++ app/ospStudio.cpp | 6 + app/ospStudio.h | 6 + 5 files changed, 3092 insertions(+) create mode 100644 app/MultiWindows.cpp create mode 100644 app/MultiWindows.h diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 05181c2a..92822547 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -15,6 +15,7 @@ add_executable(ospStudio Batch.cpp TimeSeriesWindow.cpp AnimationManager.cpp + MultiWindows.cpp $<$:Benchmark.cpp> diff --git a/app/MultiWindows.cpp b/app/MultiWindows.cpp new file mode 100644 index 00000000..86c72e1a --- /dev/null +++ b/app/MultiWindows.cpp @@ -0,0 +1,2849 @@ +// copied MainWindow.cpp and used "devel" namespace + +#include "MultiWindows.h" +// imgui +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_opengl2.h" +#include "Proggy.h" +// std +#include +#include +#include +// ospray_sg +#include "sg/camera/Camera.h" +#include "sg/exporter/Exporter.h" +#include "sg/fb/FrameBuffer.h" +#include "sg/generator/Generator.h" +#include "sg/renderer/Renderer.h" +#include "sg/scene/World.h" +#include "sg/scene/lights/LightsManager.h" +#include "sg/visitors/Commit.h" +#include "sg/visitors/PrintNodes.h" +#include "sg/visitors/Search.h" +#include "sg/visitors/SetParamByNode.h" +#include "sg/visitors/CollectTransferFunctions.h" +#include "sg/scene/volume/Volume.h" +#include "sg/Math.h" +// rkcommon +#include "rkcommon/math/rkmath.h" +#include "rkcommon/os/FileName.h" +#include "rkcommon/utility/SaveImage.h" +#include "rkcommon/utility/getEnvVar.h" +#include "rkcommon/utility/DataView.h" + +// json +#include "sg/JSONDefs.h" + +#include +#include +// widgets +#include "widgets/AdvancedMaterialEditor.h" +#include "widgets/FileBrowserWidget.h" +#include "widgets/ListBoxWidget.h" +#include "widgets/SearchWidget.h" +#include "widgets/TransferFunctionWidget.h" +#include "widgets/PieMenu.h" +#include "widgets/Guizmo.h" + +// CLI +#include + +using namespace ospray_studio; +using namespace ospray; + +namespace devel { + +static ImGuiWindowFlags g_imguiWindowFlags = ImGuiWindowFlags_AlwaysAutoResize; + +static bool g_quitNextFrame = false; +static bool g_saveNextFrame = false; +static bool g_animatingPath = false; +static bool g_clearSceneConfirm = false; + +static const std::vector g_scenes = {"tutorial_scene", + "sphere", + "particle_volume", + "random_spheres", + "wavelet", + "wavelet_slices", + "torus_volume", + "unstructured_volume", + "multilevel_hierarchy"}; + +#ifdef USE_MPI +static const std::vector g_renderers = { + "scivis", "pathtracer", "ao", "debug", "mpiRaycast"}; +#else +static const std::vector g_renderers = { + "scivis", "pathtracer", "ao", "debug"}; +#endif + +// list of cameras imported with the scene definition +static CameraMap g_sceneCameras; + +static const std::vector g_debugRendererTypes = {"eyeLight", + "primID", + "geomID", + "instID", + "Ng", + "Ns", + "backfacing_Ng", + "backfacing_Ns", + "dPds", + "dPdt", + "volume"}; + +static const std::vector g_lightTypes = {"ambient", + "cylinder", + "distant", + "hdri", + "sphere", + "spot", + "sunSky", + "quad"}; + +std::vector g_camPath; // interpolated path through cameraStack +int g_camSelectedStackIndex = 0; +int g_camCurrentPathIndex = 0; +float g_camPathSpeed = 5; // defined in hundredths (e.g. 10 = 10 * 0.01 = 0.1) +const int g_camPathPause = 2; // _seconds_ to pause for at end of path +int g_rotationConstraint = -1; + +const double CAM_MOVERATE = + 10.0; // TODO: the constant should be scene dependent or user changeable +double g_camMoveX = 0.0; +double g_camMoveY = 0.0; +double g_camMoveZ = 0.0; +double g_camMoveA = 0.0; +double g_camMoveE = 0.0; +double g_camMoveR = 0.0; + +float lockAspectRatio = 0.0; + +sg::NodePtr g_copiedMat = nullptr; + +std::string quatToString(quaternionf &q) +{ + std::stringstream ss; + ss << q; + return ss.str(); +} + +bool rendererUI_callback(void *, int index, const char **out_text) +{ + *out_text = g_renderers[index].c_str(); + return true; +} + +bool debugTypeUI_callback(void *, int index, const char **out_text) +{ + *out_text = g_debugRendererTypes[index].c_str(); + return true; +} + +bool lightTypeUI_callback(void *, int index, const char **out_text) +{ + *out_text = g_lightTypes[index].c_str(); + return true; +} + +bool cameraUI_callback(void *, int index, const char **out_text) +{ + static std::string outText; + outText = std::to_string(index) + ": " + g_sceneCameras.at_index(index).first; + *out_text = outText.c_str(); + return true; +} + +bool stringVec_callback(void *data, int index, const char **out_text) +{ + *out_text = ((std::string *)data)[index].c_str(); + return true; +} + +std::string vec3fToString(const vec3f &v) +{ + std::stringstream ss; + ss << v; + return ss.str(); +} + +// MultiWindows definitions /////////////////////////////////////////////// + +void error_callback(int error, const char *desc) +{ + std::cerr << "error " << error << ": " << desc << std::endl; +} + +MultiWindows *MultiWindows::activeWindow = nullptr; + +MultiWindows::MultiWindows(StudioCommon &_common) + : StudioContext(_common, StudioMode::GUI), windowSize(_common.defaultSize), scene("") +{ + pluginManager = std::make_shared(); + if (activeWindow != nullptr) { + throw std::runtime_error("Cannot create more than one MultiWindows!"); + } + + // Default saved image baseName (cmdline --image to override) + optImageName = "studio"; + optSPP = 1; // Default SamplesPerPixel in interactive mode is one. + + animationWidget = std::shared_ptr( + new AnimationWidget("Animation Controls", animationManager)); + + activeWindow = this; + + glfwSetErrorCallback(error_callback); + + // initialize GLFW + if (!glfwInit()) { + throw std::runtime_error("Failed to initialize GLFW!"); + } + + glfwWindowHint(GLFW_SRGB_CAPABLE, GLFW_TRUE); + + // get primary monitor's display scaling + GLFWmonitor *primaryMonitor = glfwGetPrimaryMonitor(); + if (primaryMonitor) + glfwGetMonitorContentScale(primaryMonitor, &contentScale.x, &contentScale.y); + + // create GLFW window + glfwWindow = glfwCreateWindow( + windowSize.x, windowSize.y, "OSPRay Studio", nullptr, nullptr); + + if (!glfwWindow) { + glfwTerminate(); + throw std::runtime_error("Failed to create GLFW window!"); + } + + glfwMakeContextCurrent(glfwWindow); + + // Determine whether GL framebuffer has float format + // and set format used by glTexImage2D correctly. + if (glfwGetWindowAttrib(glfwWindow, GLFW_CONTEXT_VERSION_MAJOR) < 3) { + gl_rgb_format = GL_RGB16; + gl_rgba_format = GL_RGBA16; + } else { + gl_rgb_format = GL_RGB32F; + gl_rgba_format = GL_RGBA32F; + } + + glfwSetKeyCallback( + glfwWindow, [](GLFWwindow *, int key, int, int action, int mod) { + auto &io = ImGui::GetIO(); + if (!io.WantCaptureKeyboard) + if (action == GLFW_PRESS) { + switch (key) { + case GLFW_KEY_UP: + if (mod != GLFW_MOD_ALT) + g_camMoveZ = -CAM_MOVERATE; + else + g_camMoveY = -CAM_MOVERATE; + break; + case GLFW_KEY_DOWN: + if (mod != GLFW_MOD_ALT) + g_camMoveZ = CAM_MOVERATE; + else + g_camMoveY = CAM_MOVERATE; + break; + case GLFW_KEY_LEFT: + g_camMoveX = -CAM_MOVERATE; + break; + case GLFW_KEY_RIGHT: + g_camMoveX = CAM_MOVERATE; + break; + case GLFW_KEY_W: + g_camMoveE = CAM_MOVERATE; + break; + case GLFW_KEY_S: + if (mod != GLFW_MOD_CONTROL) + g_camMoveE = -CAM_MOVERATE; + else + g_saveNextFrame = true; + break; + case GLFW_KEY_A: + if (mod != GLFW_MOD_ALT) + g_camMoveA = -CAM_MOVERATE; + else + g_camMoveR = -CAM_MOVERATE; + break; + case GLFW_KEY_D: + if (mod != GLFW_MOD_ALT) + g_camMoveA = CAM_MOVERATE; + else + g_camMoveR = CAM_MOVERATE; + break; + + case GLFW_KEY_X: + g_rotationConstraint = 0; + break; + case GLFW_KEY_Y: + g_rotationConstraint = 1; + break; + case GLFW_KEY_Z: + g_rotationConstraint = 2; + break; + + case GLFW_KEY_I: + activeWindow->centerOnEyePos(); + break; + + case GLFW_KEY_G: + activeWindow->showUi = !(activeWindow->showUi); + break; + case GLFW_KEY_Q: { + auto showMode = + rkcommon::utility::getEnvVar("OSPSTUDIO_SHOW_MODE"); + // Enforce "ctrl-Q" to make it more difficult to exit by mistake. + if (showMode && mod != GLFW_MOD_CONTROL) + std::cout << "Use ctrl-Q to exit\n"; + else + g_quitNextFrame = true; + } break; + case GLFW_KEY_P: + activeWindow->frame->traverse(); + break; + case GLFW_KEY_M: + activeWindow->baseMaterialRegistry->traverse(); + break; + case GLFW_KEY_L: + activeWindow->lightsManager->traverse(); + break; + case GLFW_KEY_B: + PRINT(activeWindow->frame->bounds()); + break; + case GLFW_KEY_V: + activeWindow->frame->child("camera").traverse(); + break; + case GLFW_KEY_SPACE: + if (activeWindow->cameraStack.size() >= 2) { + g_animatingPath = !g_animatingPath; + g_camCurrentPathIndex = 0; + if (g_animatingPath) { + g_camPath = buildPath( + activeWindow->cameraStack, g_camPathSpeed * 0.01); + } + } + activeWindow->animationWidget->togglePlay(); + break; + case GLFW_KEY_EQUAL: + activeWindow->pushLookMark(); + break; + case GLFW_KEY_MINUS: + activeWindow->popLookMark(); + break; + case GLFW_KEY_0: /* fallthrough */ + case GLFW_KEY_1: /* fallthrough */ + case GLFW_KEY_2: /* fallthrough */ + case GLFW_KEY_3: /* fallthrough */ + case GLFW_KEY_4: /* fallthrough */ + case GLFW_KEY_5: /* fallthrough */ + case GLFW_KEY_6: /* fallthrough */ + case GLFW_KEY_7: /* fallthrough */ + case GLFW_KEY_8: /* fallthrough */ + case GLFW_KEY_9: + activeWindow->setCameraSnapshot((key + 9 - GLFW_KEY_0) % 10); + break; + } + } + if (action == GLFW_RELEASE) { + switch (key) { + case GLFW_KEY_X: + case GLFW_KEY_Y: + case GLFW_KEY_Z: + g_rotationConstraint = -1; + break; + case GLFW_KEY_UP: + case GLFW_KEY_DOWN: + g_camMoveZ = 0; + g_camMoveY = 0; + break; + case GLFW_KEY_LEFT: + case GLFW_KEY_RIGHT: + g_camMoveX = 0; + break; + case GLFW_KEY_W: + case GLFW_KEY_S: + g_camMoveE = 0; + break; + case GLFW_KEY_A: + case GLFW_KEY_D: + g_camMoveA = 0; + g_camMoveR = 0; + break; + } + } + }); + + // set GLFW callbacks + glfwSetFramebufferSizeCallback( + glfwWindow, [](GLFWwindow *, int newWidth, int newHeight) { + activeWindow->reshape(vec2i{newWidth, newHeight}); + }); + + glfwSetMouseButtonCallback(glfwWindow, [](GLFWwindow *win, int, int action, int) { + ImGuiIO &io = ImGui::GetIO(); + if (!activeWindow->showUi || !io.WantCaptureMouse) { + double x, y; + glfwGetCursorPos(win, &x, &y); + activeWindow->mouseButton(vec2f{float(x), float(y)}); + + activeWindow->getFrame()->setNavMode(action == GLFW_PRESS); + } + }); + + glfwSetScrollCallback(glfwWindow, [](GLFWwindow *, double x, double y) { + ImGuiIO &io = ImGui::GetIO(); + if (!activeWindow->showUi || !io.WantCaptureMouse) { + activeWindow->mouseWheel(vec2f{float(x), float(y)}); + } + }); + + glfwSetCursorPosCallback(glfwWindow, [](GLFWwindow *, double x, double y) { + ImGuiIO &io = ImGui::GetIO(); + if (!activeWindow->showUi || !io.WantCaptureMouse) { + activeWindow->motion(vec2f{float(x), float(y)}); + } + }); + + ImGui::CreateContext(); + + // Enable context for ImGui experimental viewports + ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; + + ImGui_ImplGlfw_InitForOpenGL(glfwWindow, true); + ImGui_ImplOpenGL2_Init(); + + // Disable active viewports until users enables toggled in view menu + ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_ViewportsEnable; + + // set ImGui font, scaled to display DPI + auto &io = ImGui::GetIO(); + auto scaleFactor = std::max(contentScale.x, contentScale.y); + auto scaledFontSize = fontSize * scaleFactor; + ImVec2 imScale(contentScale.x, contentScale.y); + + ImFont *font = io.Fonts->AddFontFromMemoryCompressedTTF( + ProggyClean_compressed_data, ProggyClean_compressed_size, scaledFontSize); + io.FontGlobalScale = 1.f / scaleFactor; + io.DisplayFramebufferScale = imScale; + + // set initial OpenGL state + glEnable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + + // create OpenGL frame buffer texture + glGenTextures(1, &framebufferTexture); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, framebufferTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + refreshScene(true); + + // trigger window reshape events with current window size + glfwGetFramebufferSize(glfwWindow, &windowSize.x, &windowSize.y); + reshape(windowSize); +} + +MultiWindows::~MultiWindows() +{ + ImGui_ImplOpenGL2_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + glfwTerminate(); + pluginManager->removeAllPlugins(); + g_sceneCameras.clear(); + g_copiedMat = nullptr; + sg::clearAssets(); +} + +void MultiWindows::start() +{ + std::cerr << "MULTIWINDOWS mode\n"; + + // load plugins // + for (auto &p : studioCommon.pluginsToLoad) + pluginManager->loadPlugin(p); + + // create panels // + // doing this outside constructor to ensure shared_from_this() + // can wrap a valid weak_ptr (in constructor, not guaranteed) + + pluginManager->main(shared_from_this(), &pluginPanels); + // std::move(newPluginPanels.begin(), + // newPluginPanels.end(), + // std::back_inserter(pluginPanels)); + + std::ifstream cams("cams.json"); + if (cams) { + JSON j; + cams >> j; + cameraStack = j.get>(); + } + + if (parseCommandLine()) { + refreshRenderer(); + refreshScene(true); + mainLoop(); + } +} + +MultiWindows *MultiWindows::getActiveWindow() +{ + return activeWindow; +} + +std::shared_ptr MultiWindows::getFrame() +{ + return frame; +} + +void MultiWindows::registerDisplayCallback( + std::function callback) +{ + displayCallback = callback; +} + +void MultiWindows::registerKeyCallback(std::function callback) +{ + keyCallback = callback; +} + +void MultiWindows::registerImGuiCallback(std::function callback) +{ + uiCallback = callback; +} + +void MultiWindows::mainLoop() +{ + // continue until the user closes the window + startNewOSPRayFrame(); + + while (!glfwWindowShouldClose(glfwWindow) && !g_quitNextFrame) { + ImGui_ImplOpenGL2_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + bool hasPausedRendering = false; + size_t numTasksExecuted; + do { + numTasksExecuted = 0; + + if (optDoAsyncTasking) { + numTasksExecuted += scheduler->background()->executeAllTasksAsync(); + } else { + numTasksExecuted += scheduler->background()->executeAllTasksSync(); + } + + numTasksExecuted += scheduler->studio()->executeAllTasksSync(); + + auto task = scheduler->ospray()->pop(); + if (task) { + if (!hasPausedRendering) { + hasPausedRendering = true; + + // if a task wants to modify ospray properties, then we need to cancel any + // currently rendering frame to make sure we don't get any segfaults + frame->pauseRendering = true; + frame->cancelFrame(); + frame->waitOnFrame(); + } + + numTasksExecuted += scheduler->ospray()->executeAllTasksSync(task); + } + } while (numTasksExecuted > 0); + + if (hasPausedRendering) { + hasPausedRendering = false; + + // after running ospray tasks, make sure to re-enable rendering and update + // the scene and camera for any newly added or modified objects in the + // scene + frame->pauseRendering = false; + refreshScene(true); + } + + display(); + + glfwPollEvents(); + } + + waitOnOSPRayFrame(); +} + +void MultiWindows::reshape(const vec2i &newWindowSize) +{ + windowSize = newWindowSize; + vec2i fSize = windowSize; + if (lockAspectRatio) { + // Tell OSPRay to render the largest subset of the window that satisies the + // aspect ratio + float aspectCorrection = lockAspectRatio + * static_cast(newWindowSize.y) + / static_cast(newWindowSize.x); + if (aspectCorrection > 1.f) { + fSize.y /= aspectCorrection; + } else { + fSize.x *= aspectCorrection; + } + } + if (frame->child("camera").hasChild("aspect")) + frame->child("camera")["aspect"] = static_cast(fSize.x) / fSize.y; + + frame->child("windowSize") = fSize; + frame->currentAccum = 0; + + // reset OpenGL viewport and orthographic projection + glViewport(0, 0, windowSize.x, windowSize.y); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, windowSize.x, 0.0, windowSize.y, -1.0, 1.0); + + // update camera + arcballCamera->updateWindowSize(windowSize); +} + +void MultiWindows::updateCamera() +{ + frame->currentAccum = 0; + auto camera = frame->child("camera").nodeAs(); + + if (cameraIdx || optCameraRange.lower) { + // switch to index/cameraRange specific scene camera + if (optCameraRange.lower) { + auto &newCamera = g_sceneCameras.at_index(optCameraRange.lower); + g_selectedSceneCamera = newCamera.second; + } else if (cameraIdx) { + auto &newCamera = g_sceneCameras.at_index(cameraIdx); + g_selectedSceneCamera = newCamera.second; + } + frame->remove("camera"); + frame->add(g_selectedSceneCamera); + // update camera pointer + camera = frame->child("camera").nodeAs(); + if (g_selectedSceneCamera->hasChild("aspect")) + lockAspectRatio = g_selectedSceneCamera->child("aspect").valueAs(); + reshape(windowSize); // resets aspect + cameraIdx = 0; // reset global-context cameraIndex + arcballCamera->updateCameraToWorld(affine3f{one}, one); + cameraView = nullptr; // only used for arcball/default + } else if (cameraView && *cameraView != affine3f{one}) { + // use camera settings from scene camera + if (cameraSettingsIdx) { + auto settingsCamera = g_sceneCameras.at_index(cameraSettingsIdx).second; + for (auto &c : settingsCamera->children()) { + if (c.first == "cameraId") { + camera->createChild("cameraSettingsId", "int", c.second->value()); + camera->child("cameraSettingsId").setSGNoUI(); + camera->child("cameraSettingsId").setSGOnly(); + } else if (c.first != "uniqueCameraName") { + if (camera->hasChild(c.first)) + camera->child(c.first) = c.second->value(); + else { + camera->createChild( + c.first, c.second->subType(), c.second->value()); + if (settingsCamera->child(c.first).sgOnly()) + camera->child(c.first).setSGOnly(); + } + } + } + if (settingsCamera->hasChild("aspect")) + lockAspectRatio = settingsCamera->child("aspect").valueAs(); + reshape(windowSize); // resets aspect + } + + auto worldToCamera = rcp(*cameraView); + LinearSpace3f R, S; + ospray::sg::getRSComponent(worldToCamera, R, S); + auto rotation = ospray::sg::getRotationQuaternion(R); + + arcballCamera->updateCameraToWorld(*cameraView, rotation); + cameraView = nullptr; + activeWindow->centerOnEyePos(); + } + + camera->child("position").setValue(arcballCamera->eyePos()); + camera->child("direction").setValue(arcballCamera->lookDir()); + camera->child("up").setValue(arcballCamera->upDir()); + + if (camera->hasChild("focusDistance") + && !camera->child("cameraId").valueAs()) { + float focusDistance = rkcommon::math::length( + camera->child("lookAt").valueAs() - arcballCamera->eyePos()); + if (camera->child("adjustAperture").valueAs()) { + float oldFocusDistance = camera->child("focusDistance").valueAs(); + if (!(isinf(oldFocusDistance) || isinf(focusDistance))) { + float apertureRadius = camera->child("apertureRadius").valueAs(); + camera->child("apertureRadius") + .setValue(apertureRadius * focusDistance / oldFocusDistance); + } + } + camera->child("focusDistance").setValue(focusDistance); + } +} + +void MultiWindows::setCameraState(CameraState &cs) +{ + arcballCamera->setState(cs); +} + +void MultiWindows::centerOnEyePos() +{ + // Recenters camera at the eye position and zooms all the way in, like FPV + // Save current zoom level + preFPVZoom = arcballCamera->getZoomLevel(); + arcballCamera->setCenter(arcballCamera->eyePos()); + arcballCamera->setZoomLevel(0.f); +} + +void MultiWindows::pickCenterOfRotation(float x, float y) +{ + ospray::cpp::PickResult res; + auto &fb = frame->childAs("framebuffer"); + auto &r = frame->childAs("renderer"); + auto &c = frame->childAs("camera"); + auto &w = frame->childAs("world"); + + x = clamp(x / windowSize.x, 0.f, 1.f); + y = 1.f - clamp(y / windowSize.y, 0.f, 1.f); + res = fb.handle().pick(r, c, w, x, y); + if (res.hasHit) { + if (!(glfwGetKey(glfwWindow, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS)) { + // Constraining rotation around the up works pretty well. + arcballCamera->constrainedRotate(vec2f(0.5f,0.5f), vec2f(x,y), 1); + // Restore any preFPV zoom level, then clear it. + arcballCamera->setZoomLevel(preFPVZoom + arcballCamera->getZoomLevel()); + preFPVZoom = 0.f; + arcballCamera->setCenter(vec3f(res.worldPosition)); + } + c["lookAt"] = vec3f(res.worldPosition); + updateCamera(); + } +} + +void MultiWindows::keyboardMotion() +{ + if (!(g_camMoveX || g_camMoveY || g_camMoveZ || g_camMoveE || g_camMoveA + || g_camMoveR)) + return; + + auto sensitivity = maxMoveSpeed; + if (glfwGetKey(glfwWindow, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) + sensitivity *= fineControl; + + // 6 degrees of freedom, four arrow keys? no problem. + double inOut = g_camMoveZ; + double leftRight = g_camMoveX; + double upDown = g_camMoveY; + double roll = g_camMoveR; + double elevation = g_camMoveE; + double azimuth = g_camMoveA; + + if (inOut) { + arcballCamera->dolly(inOut * sensitivity); + } + if (leftRight) { + arcballCamera->pan(vec2f(leftRight, 0) * sensitivity); + } + if (upDown) { + arcballCamera->pan(vec2f(0, upDown) * sensitivity); + } + if (elevation) { + arcballCamera->constrainedRotate( + vec2f(-.5, 0), vec2f(-.5, elevation * .005 * sensitivity), 0); + } + if (azimuth) { + arcballCamera->constrainedRotate( + vec2f(0, -.5), vec2f(azimuth * .005 * sensitivity, -0.5), 1); + } + if (roll) { + arcballCamera->constrainedRotate( + vec2f(-.5, 0), vec2f(-.5, roll * .005 * sensitivity), 2); + } + updateCamera(); +} + +void MultiWindows::changeToDefaultCamera() +{ + auto defaultCamera = g_sceneCameras["default"]; + auto sgSceneCamera = frame->child("camera").nodeAs(); + + for (auto &c : sgSceneCamera->children()) { + if (c.first == "cameraId") { + defaultCamera->createChild("cameraSettingsId", "int", c.second->value()); + defaultCamera->child("cameraSettingsId").setSGNoUI(); + defaultCamera->child("cameraSettingsId").setSGOnly(); + } else if (c.first != "uniqueCameraName") { + if (defaultCamera->hasChild(c.first)) + defaultCamera->child(c.first) = c.second->value(); + else { + defaultCamera->createChild( + c.first, c.second->subType(), c.second->value()); + if (sgSceneCamera->child(c.first).sgOnly()) + defaultCamera->child(c.first).setSGOnly(); + } + } + } + + frame->remove("camera"); + frame->add(defaultCamera); + frame->commit(); + + auto worldToCamera = rcp(sgSceneCamera->cameraToWorld); + LinearSpace3f R, S; + ospray::sg::getRSComponent(worldToCamera, R, S); + auto rotation = ospray::sg::getRotationQuaternion(R); + + arcballCamera->updateCameraToWorld(sgSceneCamera->cameraToWorld, rotation); + activeWindow->centerOnEyePos(); + updateCamera(); // to reflect new default camera properties in GUI +} + +void MultiWindows::motion(const vec2f &position) +{ + if (frame->pauseRendering) + return; + + const vec2f mouse = position * contentScale; + if (previousMouse != vec2f(-1)) { + const bool leftDown = + glfwGetMouseButton(glfwWindow, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS; + const bool rightDown = + glfwGetMouseButton(glfwWindow, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS; + const bool middleDown = + glfwGetMouseButton(glfwWindow, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS; + const vec2f prev = previousMouse; + + bool cameraChanged = leftDown || rightDown || middleDown; + + // if cameraChanged then switch back to default-camera and use current scene + // SG camera state + if (cameraChanged && frame->child("camera").child("uniqueCameraName").valueAs() + != "default") + changeToDefaultCamera(); + + auto sensitivity = maxMoveSpeed; + if (glfwGetKey(glfwWindow, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) + sensitivity *= fineControl; + + auto displaySize = windowSize * contentScale; + + const vec2f mouseFrom(clamp(prev.x * 2.f / displaySize.x - 1.f, -1.f, 1.f), + clamp(prev.y * 2.f / displaySize.y - 1.f, -1.f, 1.f)); + const vec2f mouseTo(clamp(mouse.x * 2.f / displaySize.x - 1.f, -1.f, 1.f), + clamp(mouse.y * 2.f / displaySize.y - 1.f, -1.f, 1.f)); + + if (leftDown) { + arcballCamera->constrainedRotate(mouseFrom, + lerp(sensitivity, mouseFrom, mouseTo), + g_rotationConstraint); + } else if (rightDown) { + if (glfwGetKey(glfwWindow, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) + arcballCamera->dolly((mouseTo - mouseFrom).y * sensitivity); + else + arcballCamera->zoom((mouseTo - mouseFrom).y * sensitivity); + } else if (middleDown) { + arcballCamera->pan((mouseTo - mouseFrom) * sensitivity); + } + + if (cameraChanged) + updateCamera(); + } + + previousMouse = mouse; +} + +void MultiWindows::mouseButton(const vec2f &position) +{ + if (frame->pauseRendering) + return; + + if (glfwGetKey(glfwWindow, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS + && glfwGetMouseButton(glfwWindow, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS) { + // when picking new center of rotation change to default camera first + if (frame->child("camera").child("uniqueCameraName").valueAs() + != "default") + changeToDefaultCamera(); + + vec2f scaledPosition = position * contentScale; + pickCenterOfRotation(scaledPosition.x, scaledPosition.y); + } +} + +void MultiWindows::mouseWheel(const vec2f &scroll) +{ + if (!scroll || frame->pauseRendering) + return; + + // scroll is +/- 1 for horizontal/vertical mouse-wheel motion + + auto sensitivity = maxMoveSpeed; + if (glfwGetKey(glfwWindow, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) + sensitivity *= fineControl; + + if (scroll.y) { + auto &camera = frame->child("camera"); + if (camera.hasChild("fovy")) { + auto fovy = camera["fovy"].valueAs(); + fovy = std::min(180.f, std::max(0.f, fovy + scroll.y * sensitivity)); + camera["fovy"] = fovy; + updateCamera(); + } + } + + // XXX anything interesting to do with horizontal scroll wheel? + // Perhaps cycle through renderer types? Or toggle denoiser or navigation? +} + +void MultiWindows::display() +{ + static auto displayStart = std::chrono::high_resolution_clock::now(); + + if (optAutorotate) { + vec2f from(0.f, 0.f); + vec2f to(autorotateSpeed * 0.001f, 0.f); + arcballCamera->rotate(from, to); + updateCamera(); + } + + // Update animation controller if playing + if (animationWidget->isPlaying()) { + animationWidget->update(); + // use scene camera while playing animation + if (frame->child("camera").child("uniqueCameraName").valueAs() + == "default" && g_selectedSceneCamera) { + frame->remove("camera"); + frame->add(g_selectedSceneCamera); + } + } + + if (g_animatingPath) { + static int framesPaused = 0; + CameraState current = g_camPath[g_camCurrentPathIndex]; + arcballCamera->setState(current); + updateCamera(); + + // pause at the end of the path + if (g_camCurrentPathIndex == (int) g_camPath.size() - 1) { + framesPaused++; + int framesToWait = g_camPathPause * ImGui::GetIO().Framerate; + if (framesPaused > framesToWait) { + framesPaused = 0; + g_camCurrentPathIndex = 0; + } + } else { + g_camCurrentPathIndex++; + } + } + + keyboardMotion(); + + if (displayCallback) + displayCallback(this); + + updateTitleBar(); + + auto &frameBuffer = frame->childAs("framebuffer"); + fbSize = frameBuffer.child("size").valueAs(); + + if (frame->frameIsReady()) { + if (!frame->isCanceled()) { + // display frame rate in window title + auto displayEnd = std::chrono::high_resolution_clock::now(); + auto durationMilliseconds = + std::chrono::duration_cast( + displayEnd - displayStart); + + latestFPS = 1000.f / float(durationMilliseconds.count()); + + // map OSPRay framebuffer, update OpenGL texture with contents, then unmap + waitOnOSPRayFrame(); + + // Only enabled if they exist + optShowAlbedo &= frameBuffer.hasAlbedoChannel(); + optShowDepth &= frameBuffer.hasDepthChannel(); + + auto *mappedFB = (void *)frame->mapFrame(optShowDepth + ? OSP_FB_DEPTH + : (optShowAlbedo ? OSP_FB_ALBEDO : OSP_FB_COLOR)); + + // This needs to query the actual framebuffer format + const GLenum glType = + frameBuffer.isFloatFormat() ? GL_FLOAT : GL_UNSIGNED_BYTE; + + // Only create the copy if it's needed + float *pDepthCopy = nullptr; + if (optShowDepth) { + // Create a local copy and don't modify OSPRay buffer + const auto *mappedDepth = static_cast(mappedFB); + std::vector depthCopy( + mappedDepth, mappedDepth + fbSize.x * fbSize.y); + pDepthCopy = depthCopy.data(); + + // Scale OSPRay's 0 -> inf depth range to OpenGL 0 -> 1, ignoring all + // inf values + float minDepth = rkcommon::math::inf; + float maxDepth = rkcommon::math::neg_inf; + for (auto depth : depthCopy) { + if (isinf(depth)) + continue; + minDepth = std::min(minDepth, depth); + maxDepth = std::max(maxDepth, depth); + } + + const float rcpDepthRange = 1.f / (maxDepth - minDepth); + + // Inverted depth (1.0 -> 0.0) may be more meaningful + if (optShowDepthInvert) + std::transform(depthCopy.begin(), + depthCopy.end(), + depthCopy.begin(), + [&](float depth) { + return (1.f - (depth - minDepth) * rcpDepthRange); + }); + else + std::transform(depthCopy.begin(), + depthCopy.end(), + depthCopy.begin(), + [&](float depth) { return (depth - minDepth) * rcpDepthRange; }); + } + + glBindTexture(GL_TEXTURE_2D, framebufferTexture); + glTexImage2D(GL_TEXTURE_2D, + 0, + optShowAlbedo ? gl_rgb_format : gl_rgba_format, + fbSize.x, + fbSize.y, + 0, + optShowDepth ? GL_LUMINANCE : (optShowAlbedo ? GL_RGB : GL_RGBA), + glType, + optShowDepth ? pDepthCopy : mappedFB); + + frame->unmapFrame(mappedFB); + + // save frame to a file, if requested + if (g_saveNextFrame) { + saveCurrentFrame(); + g_saveNextFrame = false; + } + } + + // Start new frame and reset frame timing interval start + displayStart = std::chrono::high_resolution_clock::now(); + startNewOSPRayFrame(); + } + + // Allow OpenGL to show linear buffers as sRGB. + if (uiDisplays_sRGB && !frameBuffer.isSRGB()) + glEnable(GL_FRAMEBUFFER_SRGB); + + // clear current OpenGL color buffer + glClear(GL_COLOR_BUFFER_BIT); + + // render textured quad with OSPRay frame buffer contents + vec2f border(0.f); + if (lockAspectRatio) { + // when rendered aspect ratio doesn't match window, compute texture + // coordinates to center the display + float aspectCorrection = lockAspectRatio * static_cast(windowSize.y) + / static_cast(windowSize.x); + if (aspectCorrection > 1.f) { + border.y = 1.f - aspectCorrection; + } else { + border.x = 1.f - 1.f / aspectCorrection; + } + } + border *= 0.5f; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + + glBegin(GL_QUADS); + + glTexCoord2f(border.x, border.y); + glVertex2f(0, 0); + + glTexCoord2f(border.x, 1.f - border.y); + glVertex2f(0, windowSize.y); + + glTexCoord2f(1.f - border.x, 1.f - border.y); + glVertex2f(windowSize.x, windowSize.y); + + glTexCoord2f(1.f - border.x, border.y); + glVertex2f(windowSize.x, 0); + + glEnd(); + + glDisable(GL_FRAMEBUFFER_SRGB); + + if (showUi) { + // Notify ImGui of the colorspace for color picker widgets + // (to match the colorspace of the framebuffer) + if (uiDisplays_sRGB || frameBuffer.isSRGB()) + ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_IsSRGB; + + buildUI(); + ImGui::Render(); + ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); + + ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_IsSRGB; + } else { + ImGui::EndFrame(); + } + + // Update and Render additional Platform Windows + if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { + GLFWwindow *backup_current_context = glfwGetCurrentContext(); + ImGui::UpdatePlatformWindows(); + ImGui::RenderPlatformWindowsDefault(); + glfwMakeContextCurrent(backup_current_context); + } + + // swap buffers + glfwSwapBuffers(glfwWindow); +} + +void MultiWindows::startNewOSPRayFrame() +{ + frame->startNewFrame(); +} + +void MultiWindows::waitOnOSPRayFrame() +{ + frame->waitOnFrame(); +} + +void MultiWindows::updateTitleBar() +{ + std::stringstream windowTitle; + windowTitle << "OSPRay Studio: "; + + auto &fb = frame->childAs("framebuffer"); + auto &v = frame->childAs("renderer")["varianceThreshold"]; + auto varianceThreshold = v.valueAs(); + + if (frame->pauseRendering) { + windowTitle << "rendering paused"; + } else if (frame->accumLimitReached()) { + windowTitle << "accumulation limit reached"; + } else if (fb.variance() < varianceThreshold) { + windowTitle << "variance threshold reached"; + } else { + windowTitle << std::setprecision(3) << latestFPS << " fps"; + if (latestFPS < 2.f) { + float progress = frame->frameProgress(); + windowTitle << " | "; + int barWidth = 20; + std::string progBar; + progBar.resize(barWidth + 2); + auto start = progBar.begin() + 1; + auto end = start + progress * barWidth; + std::fill(start, end, '='); + std::fill(end, progBar.end(), '_'); + *end = '>'; + progBar.front() = '['; + progBar.back() = ']'; + windowTitle << progBar; + } + } + + // Set indicator in the title bar for frame modified + windowTitle << (frame->isModified() ? "*" : ""); + + glfwSetWindowTitle(glfwWindow, windowTitle.str().c_str()); +} + +GLFWwindow *MultiWindows::getGLFWWindow() +{ + return glfwWindow; +} + +void MultiWindows::buildUI() +{ + // build main menu and options + buildMainMenu(); + + // build window UIs as needed + buildWindows(); + + if (uiCallback) { + uiCallback(); + } + + for (auto &p : pluginPanels) + if (p->isShown()) + p->buildUI(ImGui::GetCurrentContext()); +} + +void MultiWindows::refreshRenderer() +{ + // Change renderer if current type doesn't match requested + auto currentType = frame->childAs("renderer").child("type") + .valueAs(); + if (currentType != optRendererTypeStr) + frame->createChild("renderer", "renderer_" + optRendererTypeStr); + + auto &r = frame->childAs("renderer"); + r["pixelFilter"] = (int)optPF; + r["backgroundColor"] = optBackGroundColor; + r["pixelSamples"] = optSPP; + r["varianceThreshold"] = optVariance; + if (r.hasChild("maxContribution") && maxContribution < (float)math::inf) + r["maxContribution"] = maxContribution; + + // Re-add the backplate on renderer change + if (backPlateTexture != "") { + auto backplateTex = + sg::createNodeAs("map_backplate", "texture_2d"); + if (backplateTex->load(backPlateTexture, false, false)) + r.add(backplateTex); + else { + backplateTex = nullptr; + backPlateTexture = ""; + } + } else { + // Node removal requires waiting on previous frame completion + frame->cancelFrame(); + frame->waitOnFrame(); + r.remove("map_backplate"); + r.handle().removeParam("map_backplate"); + } +} + +void MultiWindows::saveRendererParams() +{ + auto &r = frame->childAs("renderer"); + + optRendererTypeStr = r["type"].valueAs(); + optPF = (OSPPixelFilterTypes) r["pixelFilter"].valueAs(); + optBackGroundColor = r["backgroundColor"].valueAs(); + optSPP = r["pixelSamples"].valueAs(); + optVariance = r["varianceThreshold"].valueAs(); + if (r.hasChild("maxContribution")) + maxContribution = r["maxContribution"].valueAs(); +} + +void MultiWindows::refreshScene(bool resetCam) +{ + if (frameAccumLimit) + frame->accumLimit = frameAccumLimit; + // Check that the frame contains a world, if not create one + auto world = frame->hasChild("world") ? frame->childNodeAs("world") + : sg::createNode("world", "world"); + if (optSceneConfig == "dynamic") + world->child("dynamicScene").setValue(true); + else if (optSceneConfig == "compact") + world->child("compactMode").setValue(true); + else if (optSceneConfig == "robust") + world->child("robustMode").setValue(true); + + world->createChild( + "materialref", "reference_to_material", defaultMaterialIdx); + + if (!filesToImport.empty()) + importFiles(world); + else if (scene != "") { + auto &gen = world->createChildAs( + scene + "_generator", "generator_" + scene); + gen.setMaterialRegistry(baseMaterialRegistry); + // The generators should reset the camera + resetCam = true; + } + + if (world->isModified()) { + // Cancel any in-progress frame as world->render() will modify live device + // parameters + frame->cancelFrame(); + frame->waitOnFrame(); + world->render(); + } + + frame->add(world); + + if (resetCam && !sgScene) { + const auto &worldBounds = frame->child("world").bounds(); + arcballCamera.reset(new ArcballCamera(worldBounds, windowSize)); + lastCamXfm = arcballCamera->getTransform(); + } + updateCamera(); + auto &fb = frame->childAs("framebuffer"); + fb.resetAccumulation(); +} + +void MultiWindows::addToCommandLine(std::shared_ptr app) { +} + +bool MultiWindows::parseCommandLine() +{ + int ac = studioCommon.argc; + const char **av = studioCommon.argv; + + std::shared_ptr app = std::make_shared("OSPRay Studio MULTIWINDOWS"); + StudioContext::addToCommandLine(app); + MultiWindows::addToCommandLine(app); + try { + app->parse(ac, av); + } catch (const CLI::ParseError &e) { + exit(app->exit(e)); + } + + // XXX: changing windowSize here messes causes some display scaling issues + // because it desyncs window and framebuffer size with any scaling + if (optResolution.x != 0) { + windowSize = optResolution; + glfwSetWindowSize(glfwWindow, optResolution.x, optResolution.y); + reshape(windowSize); + } + rendererTypeStr = optRendererTypeStr; + + return true; +} + +// Importer for all known file types (geometry and models) +void MultiWindows::importFiles(sg::NodePtr world) +{ + std::shared_ptr cameras{nullptr}; + if (!sgFileCameras) { + cameras = std::make_shared(); + // populate cameras map with default camera + auto mainCamera = frame->child("camera").nodeAs(); + cameras->operator[](mainCamera->child("uniqueCameraName").valueAs()) = mainCamera; + } + + for (auto file : filesToImport) { + try { + rkcommon::FileName fileName(file); + + // XXX: handling loading a scene here for now + if (fileName.ext() == "sg") { + sg::importScene(shared_from_this(), fileName); + sgScene = true; + } else { + std::cout << "Importing: " << file << std::endl; + + auto importer = sg::getImporter(world, file); + if (importer) { + if (volumeParams->children().size() > 0) { + auto vp = importer->getVolumeParams(); + for (auto &c : volumeParams->children()) { + vp->remove(c.first); + vp->add(c.second); + } + } + + importer->pointSize = pointSize; + importer->setFb(frame->childAs("framebuffer")); + importer->setMaterialRegistry(baseMaterialRegistry); + if (sgFileCameras) { + importer->importCameras = false; + importer->setCameraList(sgFileCameras); + } else if (cameras) { + importer->importCameras = true; + importer->setCameraList(cameras); + } + importer->setLightsManager(lightsManager); + importer->setArguments(studioCommon.argc, (char**)studioCommon.argv); + importer->setScheduler(scheduler); + importer->setAnimationList(animationManager->getAnimations()); + if (optInstanceConfig == "dynamic") + importer->setInstanceConfiguration( + sg::InstanceConfiguration::DYNAMIC); + else if (optInstanceConfig == "compact") + importer->setInstanceConfiguration( + sg::InstanceConfiguration::COMPACT); + else if (optInstanceConfig == "robust") + importer->setInstanceConfiguration( + sg::InstanceConfiguration::ROBUST); + + importer->importScene(); + } + } + } catch (const std::exception &e) { + std::cerr << "Failed to open file '" << file << "'!\n"; + std::cerr << " " << e.what() << std::endl; + } catch (...) { + std::cerr << "Failed to open file '" << file << "'!\n"; + } + + if (!optDoAsyncTasking) { + for (;;) { + size_t numTasksExecuted = 0; + + numTasksExecuted += scheduler->background()->executeAllTasksSync(); + numTasksExecuted += scheduler->ospray()->executeAllTasksSync(); + numTasksExecuted += scheduler->studio()->executeAllTasksSync(); + + if (numTasksExecuted == 0) { + break; + } + } + } + } + filesToImport.clear(); + + // Initializes time range for newly imported models + animationWidget->init(); + + if (sgFileCameras) + g_sceneCameras = *sgFileCameras; + else if (cameras) + g_sceneCameras = *cameras; +} + +void MultiWindows::saveCurrentFrame() +{ + int filenum = 0; + char filename[64]; + const char *ext = optImageFormat.c_str(); + + // Find an unused filename to ensure we don't overwrite and existing file + do + std::snprintf( + filename, 64, "%s.%04d.%s", optImageName.c_str(), filenum++, ext); + while (std::ifstream(filename).good()); + + int screenshotFlags = optSaveLayersSeparately << 3 | optSaveNormal << 2 + | optSaveDepth << 1 | optSaveAlbedo; + + auto &fb = frame->childAs("framebuffer"); + auto fbFloatFormat = fb["floatFormat"].valueAs(); + if (screenshotFlags > 0 && !fbFloatFormat) + std::cout + << " *** Cannot save additional information without changing FB format to float ***" + << std::endl; + frame->saveFrame(std::string(filename), screenshotFlags); +} + +void MultiWindows::pushLookMark() +{ + cameraStack.push_back(arcballCamera->getState()); + vec3f from = arcballCamera->eyePos(); + vec3f up = arcballCamera->upDir(); + vec3f at = arcballCamera->lookDir() + from; + fprintf(stderr, + "-vp %f %f %f -vu %f %f %f -vi %f %f %f\n", + from.x, + from.y, + from.z, + up.x, + up.y, + up.z, + at.x, + at.y, + at.z); +} + +void MultiWindows::popLookMark() +{ + if (cameraStack.empty()) + return; + CameraState cs = cameraStack.back(); + cameraStack.pop_back(); + + arcballCamera->setState(cs); + updateCamera(); +} + +// Main menu ////////////////////////////////////////////////////////////////// + +void MultiWindows::buildMainMenu() +{ + // build main menu bar and options + ImGui::BeginMainMenuBar(); + buildMainMenuFile(); + buildMainMenuEdit(); + buildMainMenuView(); + buildMainMenuPlugins(); + ImGui::EndMainMenuBar(); +} + +void MultiWindows::buildMainMenuFile() +{ + static bool showImportFileBrowser = false; + + if (ImGui::BeginMenu("File")) { + if (ImGui::MenuItem("Import ...", nullptr)) + + showImportFileBrowser = true; + if (ImGui::BeginMenu("Demo Scene")) { + for (size_t i = 0; i < g_scenes.size(); ++i) { + if (ImGui::MenuItem(g_scenes[i].c_str(), nullptr)) { + scene = g_scenes[i]; + refreshScene(true); + } + } + ImGui::EndMenu(); + } + ImGui::Separator(); + if (ImGui::BeginMenu("Save")) { + if (ImGui::MenuItem("Scene (entire)")) { + std::ofstream dump("studio_scene.sg"); + auto ¤tCamera = frame->child("camera"); + JSON camera = { + {"cameraIdx", currentCamera.child("cameraId").valueAs()}, + {"cameraToWorld", arcballCamera->getTransform()}}; + if (currentCamera.hasChild("cameraSettingsId")) + camera["cameraSettingsIdx"] = + currentCamera.child("cameraSettingsId").valueAs(); + JSON animation; + animation = {{"time", animationManager->getTime()}, + {"shutter", animationManager->getShutter()}}; + JSON j = {{"world", frame->child("world")}, + {"camera", camera}, + {"lightsManager", *lightsManager}, + {"materialRegistry", *baseMaterialRegistry}, + {"animation", animation}}; + dump << j.dump(); + } + + ImGui::Separator(); + if (ImGui::MenuItem("Materials (only)")) { + std::ofstream materials("studio_materials.sg"); + JSON j = {{"materialRegistry", *baseMaterialRegistry}}; + materials << j.dump(); + } + if (ImGui::MenuItem("Lights (only)")) { + std::ofstream lights("studio_lights.sg"); + JSON j = {{"lightsManager", *lightsManager}}; + lights << j.dump(); + } + if (ImGui::MenuItem("Camera (only)")) { + std::ofstream camera("studio_camera.sg"); + JSON j = {{"camera", arcballCamera->getState()}}; + camera << j.dump(); + } + + ImGui::Separator(); + + if (ImGui::MenuItem("Screenshot", "Ctrl+S", nullptr)) + g_saveNextFrame = true; + + static const std::vector screenshotFiletypes = + sg::getExporterTypes(); + + static int screenshotFiletypeChoice = + std::distance(screenshotFiletypes.begin(), + std::find(screenshotFiletypes.begin(), + screenshotFiletypes.end(), + optImageFormat)); + + ImGui::SetNextItemWidth(5.f * ImGui::GetFontSize()); + if (ImGui::Combo("##screenshot_filetype", + (int *)&screenshotFiletypeChoice, + stringVec_callback, + (void *)screenshotFiletypes.data(), + screenshotFiletypes.size())) { + optImageFormat = screenshotFiletypes[screenshotFiletypeChoice]; + } + sg::showTooltip("Image filetype for saving screenshots"); + + if (optImageFormat == "exr") { + // the following options should be available only when FB format is + // float. + auto &fb = frame->childAs("framebuffer"); + auto fbFloatFormat = fb["floatFormat"].valueAs(); + if (ImGui::Checkbox("FB float format ", &fbFloatFormat)) + fb["floatFormat"] = fbFloatFormat; + if (fbFloatFormat) { + ImGui::Checkbox("albedo##saveAlbedo", &optSaveAlbedo); + ImGui::SameLine(); + ImGui::Checkbox("layers as separate files", &optSaveLayersSeparately); + ImGui::Checkbox("depth##saveDepth", &optSaveDepth); + ImGui::Checkbox("normal##saveNormal", &optSaveNormal); + } + } + + ImGui::EndMenu(); + } + + ImGui::Separator(); + // Remove Quit option if in "show mode" to make it more difficult to exit + // by mistake. + auto showMode = + rkcommon::utility::getEnvVar("OSPSTUDIO_SHOW_MODE"); + if (showMode) { + ImGui::TextColored( + ImVec4(.8f, .2f, .2f, 1.f), "ShowMode, use ctrl-Q to exit"); + } else { + if (ImGui::MenuItem("Quit", "Alt+F4")) + g_quitNextFrame = true; + } + + ImGui::EndMenu(); + } + + // Leave the fileBrowser open until files are selected + if (showImportFileBrowser) { + if (fileBrowser(filesToImport, "Select Import File(s) - ", true)) { + showImportFileBrowser = false; + // do not reset camera when loading a scene file + bool resetCam = true; + for (auto &fn : filesToImport) + if (rkcommon::FileName(fn).ext() == "sg") + resetCam = false; + refreshScene(resetCam); + } + } +} + +void MultiWindows::buildMainMenuEdit() +{ + if (ImGui::BeginMenu("Edit")) { + // Scene stuff ///////////////////////////////////////////////////// + + if (ImGui::MenuItem("Lights...", "", nullptr)) + showLightEditor = true; + if (ImGui::MenuItem("Transforms...", "", nullptr)) + showTransformEditor = true; + if (ImGui::MenuItem("Materials...", "", nullptr)) + showMaterialEditor = true; + if (ImGui::MenuItem("Transfer Functions...", "", nullptr)) + showTransferFunctionEditor = true; + if (ImGui::MenuItem("Isosurfaces...", "", nullptr)) + showIsosurfaceEditor = true; + ImGui::Separator(); + + if (ImGui::MenuItem("Clear scene")) + g_clearSceneConfirm = true; + + ImGui::EndMenu(); + } + + if (g_clearSceneConfirm) { + g_clearSceneConfirm = false; + ImGui::OpenPopup("Clear scene"); + } + + if (ImGui::BeginPopupModal("Clear scene")) { + ImGui::Text("Are you sure you want to clear the scene?"); + ImGui::Text("This will delete all objects, materials and lights."); + + if (ImGui::Button("No!")) + ImGui::CloseCurrentPopup(); + ImGui::SameLine(ImGui::GetWindowWidth()-(8*ImGui::GetFontSize())); + + if (ImGui::Button("Yes, clear it")) { + // Cancel any in-progress frame + frame->cancelFrame(); + frame->waitOnFrame(); + frame->remove("world"); + lightsManager->clear(); + animationManager->getAnimations().clear(); + animationManager->setTimeRange(range1f(rkcommon::math::empty)); + animationWidget->update(); + + // TODO: lights caching to avoid complete re-importing after clearing + sg::clearAssets(); + + // Recreate MaterialRegistry, clearing old registry and all materials + // Then, add the new one to the frame and set the renderer type + baseMaterialRegistry = sg::createNodeAs( + "baseMaterialRegistry", "materialRegistry"); + frame->add(baseMaterialRegistry); + baseMaterialRegistry->updateRendererType(); + + scene = ""; + refreshScene(true); + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } +} + +void MultiWindows::buildMainMenuView() +{ + static bool showFileBrowser = false; + static bool guizmoOn = false; + if (ImGui::BeginMenu("View")) { + // Camera stuff //////////////////////////////////////////////////// + + if (ImGui::MenuItem("Camera...", "", nullptr)) + showCameraEditor = true; + if (ImGui::MenuItem("Center camera", "", nullptr)) { + arcballCamera.reset( + new ArcballCamera(frame->child("world").bounds(), windowSize)); + updateCamera(); + } + + static bool lockUpDir = false; + if (ImGui::Checkbox("Lock UpDir", &lockUpDir)) + arcballCamera->setLockUpDir(lockUpDir); + + if (lockUpDir) { + ImGui::SameLine(); + static int dir = 1; + static int _dir = -1; + ImGui::RadioButton("X##setUpDir", &dir, 0); + ImGui::SameLine(); + ImGui::RadioButton("Y##setUpDir", &dir, 1); + ImGui::SameLine(); + ImGui::RadioButton("Z##setUpDir", &dir, 2); + if (dir != _dir) { + arcballCamera->setUpDir(vec3f(dir == 0, dir == 1, dir == 2)); + _dir = dir; + } + } + + ImGui::Text("Camera Movement Speed:"); + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + ImGui::SliderFloat("Speed##camMov", &maxMoveSpeed, 0.1f, 5.0f); + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + ImGui::SliderFloat("FineControl##camMov", &fineControl, 0.1f, 1.0f, "%0.2fx"); + sg::showTooltip("hold for more sensitive camera movement."); + + ImGui::Separator(); + + if (ImGui::MenuItem("Animation Controls...", "", nullptr)) + animationWidget->setShowUI(); + + if (ImGui::MenuItem("Keyframes...", "", nullptr)) + showKeyframes = true; + if (ImGui::MenuItem("Snapshots...", "", nullptr)) + showSnapshots = true; + + ImGui::Checkbox("Auto rotate", &optAutorotate); + if (optAutorotate) { + ImGui::SameLine(); + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + ImGui::SliderInt(" speed", &autorotateSpeed, 1, 100); + } + ImGui::Separator(); + + // Renderer stuff ////////////////////////////////////////////////// + + if (ImGui::MenuItem("Renderer...")) + showRendererEditor = true; + + auto &renderer = frame->childAs("renderer"); + + ImGui::Checkbox("Rendering stats", &showRenderingStats); + ImGui::Checkbox("Pause rendering", &frame->pauseRendering); + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + ImGui::DragInt( + "Limit accumulation", &frame->accumLimit, 1, 0, INT_MAX, "%d frames"); + + // Although varianceThreshold and backgroundColor are found in the + // renderer UI, also add them here to make them easier to find. + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + GenerateWidget(renderer["varianceThreshold"]); + GenerateWidget(renderer["backgroundColor"]); + + if (ImGui::MenuItem("Set background texture...")) + showFileBrowser = true; + if (!backPlateTexture.str().empty()) { + ImGui::TextColored(ImVec4(.5f, .5f, .5f, 1.f), + "current: %s", + backPlateTexture.base().c_str()); + if (ImGui::MenuItem("Clear background texture")) { + backPlateTexture = ""; + refreshRenderer(); + } + } + + // Framebuffer and window stuff //////////////////////////////////// + ImGui::Separator(); + if (ImGui::MenuItem("Framebuffer...")) + showFrameBufferEditor = true; + if (ImGui::BeginMenu("Quick window size")) { + const std::vector options = {{480, 270}, + {960, 540}, + {1280, 720}, + {1920, 1080}, + {2560, 1440}, + {3840, 2160}}; + for (auto &sizeChoice : options) { + char label[64]; + snprintf(label, + sizeof(label), + "%s%d x %d", + windowSize == sizeChoice ? "*" : " ", + sizeChoice.x, + sizeChoice.y); + if (ImGui::MenuItem(label)) { + glfwSetWindowSize(glfwWindow, sizeChoice.x, sizeChoice.y); + reshape(sizeChoice); + } + } + ImGui::EndMenu(); + } + ImGui::Checkbox("Display as sRGB", &uiDisplays_sRGB); + sg::showTooltip("Display linear framebuffers as sRGB,\n" + "maintains consistent display across all formats."); + // Allows the user to cancel long frame renders, such as too-many spp or + // very large resolution. Don't wait on the frame-cancel completion as + // this locks up the UI. Note: Next frame-start following frame + // cancellation isn't immediate. + if (ImGui::MenuItem("Cancel frame")) + frame->cancelFrame(); + + ImGui::Separator(); + + // UI options ////////////////////////////////////////////////////// + ImGui::Text("ui options"); + + ImGui::Checkbox("Show tooltips", &g_ShowTooltips); + if (g_ShowTooltips) { + ImGui::SameLine(); + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + ImGui::DragInt("delay", &g_TooltipDelay, 50, 0, 1000, "%d ms"); + } + +#if 1 // XXX example new features that need to be integrated + ImGui::Separator(); + + ImGuiIO& io = ImGui::GetIO(); + ImGui::CheckboxFlags( + "DockingEnable", &io.ConfigFlags, ImGuiConfigFlags_DockingEnable); + sg::showTooltip("[experimental] Menu docking"); + ImGui::CheckboxFlags( + "ViewportsEnable", &io.ConfigFlags, ImGuiConfigFlags_ViewportsEnable); + sg::showTooltip("[experimental] Mind blowing multi-viewports support"); + + ImGui::Checkbox("Guizmo", &guizmoOn); + + ImGui::Text("...right-click to open pie menu..."); + pieMenu(); +#endif + + ImGui::EndMenu(); + } + +#if 1 // Guizmo shows outsize menu window + if (guizmoOn) { + ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration + | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings + | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav + | ImGuiWindowFlags_NoMove; + ImGui::SetNextWindowBgAlpha(0.75f); + + // Bottom right corner + ImVec2 window_pos(ImGui::GetIO().DisplaySize.x, + ImGui::GetIO().DisplaySize.y); + ImVec2 window_pos_pivot(1.f, 1.f); + ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); + + if (ImGui::Begin("###guizmo", &guizmoOn, flags)) { + guizmo(); + ImGui::End(); + } + } +#endif + + // Leave the fileBrowser open until file is selected + if (showFileBrowser) { + FileList fileList = {}; + if (fileBrowser(fileList, "Select Background Texture")) { + showFileBrowser = false; + + if (!fileList.empty()) { + backPlateTexture = fileList[0]; + refreshRenderer(); + } + } + } +} + +void MultiWindows::buildMainMenuPlugins() +{ + if (!pluginPanels.empty() && ImGui::BeginMenu("Plugins")) { + for (auto &p : pluginPanels) + if (ImGui::MenuItem(p->name().c_str())) + p->setShown(true); + + ImGui::EndMenu(); + } +} + +// Option windows ///////////////////////////////////////////////////////////// + +void MultiWindows::buildWindows() +{ + if (showRendererEditor) + buildWindowRendererEditor(); + if (showFrameBufferEditor) + buildWindowFrameBufferEditor(); + if (showKeyframes) + buildWindowKeyframes(); + if (showSnapshots) + buildWindowSnapshots(); + if (showCameraEditor) + buildWindowCameraEditor(); + if (showLightEditor) + buildWindowLightEditor(); + if (showMaterialEditor) + buildWindowMaterialEditor(); + if (showTransferFunctionEditor) + buildWindowTransferFunctionEditor(); + if (showIsosurfaceEditor) + buildWindowIsosurfaceEditor(); + if (showTransformEditor) + buildWindowTransformEditor(); + if (showRenderingStats) + buildWindowRenderingStats(); + + // Add the animation widget's UI + animationWidget->addUI(); +} + +void MultiWindows::buildWindowRendererEditor() +{ + if (!ImGui::Begin( + "Renderer editor", &showRendererEditor, g_imguiWindowFlags)) { + ImGui::End(); + return; + } + + int whichRenderer = + find(g_renderers.begin(), g_renderers.end(), rendererTypeStr) + - g_renderers.begin(); + + static int whichDebuggerType = 0; + ImGui::PushItemWidth(10.f * ImGui::GetFontSize()); + if (ImGui::Combo("renderer##whichRenderer", + &whichRenderer, + rendererUI_callback, + nullptr, + g_renderers.size())) { + rendererTypeStr = g_renderers[whichRenderer]; + + if (rendererType == OSPRayRendererType::DEBUGGER) + whichDebuggerType = 0; // reset UI if switching away + // from debug renderer + + if (rendererTypeStr == "scivis") + rendererType = OSPRayRendererType::SCIVIS; + else if (rendererTypeStr == "pathtracer") + rendererType = OSPRayRendererType::PATHTRACER; + else if (rendererTypeStr == "ao") + rendererType = OSPRayRendererType::AO; + else if (rendererTypeStr == "debug") + rendererType = OSPRayRendererType::DEBUGGER; +#ifdef USE_MPI + if (rendererTypeStr == "mpiRaycast") + rendererType = OSPRayRendererType::MPIRAYCAST; +#endif + else + rendererType = OSPRayRendererType::OTHER; + + // Change the renderer type, if the new renderer is different. + auto &renderer = frame->childAs("renderer"); + auto newType = "renderer_" + rendererTypeStr; + + if (renderer["type"].valueAs() != newType) { + // Save properties of current renderer then create new renderer + saveRendererParams(); + optRendererTypeStr = rendererTypeStr; + refreshRenderer(); + } + } + + auto &renderer = frame->childAs("renderer"); + + if (rendererType == OSPRayRendererType::DEBUGGER) { + if (ImGui::Combo("debug type##whichDebugType", + &whichDebuggerType, + debugTypeUI_callback, + nullptr, + g_debugRendererTypes.size())) { + renderer["method"] = g_debugRendererTypes[whichDebuggerType]; + } + } + + if (GenerateWidget(renderer)) + saveRendererParams(); + + ImGui::End(); +} + +void MultiWindows::buildWindowFrameBufferEditor() +{ + if (!ImGui::Begin( + "Framebuffer editor", &showFrameBufferEditor, g_imguiWindowFlags)) { + ImGui::End(); + return; + } + + auto &fb = frame->childAs("framebuffer"); + GenerateWidget(fb, sg::TreeState::ALLOPEN); + + ImGui::Separator(); + + static int whichBuffer = 0; + ImGui::Text("Display Buffer"); + ImGui::RadioButton("color##displayColor", &whichBuffer, 0); + + if (!fb.hasAlbedoChannel() && !fb.hasDepthChannel()) { + ImGui::TextColored( + ImVec4(.5f, .5f, .5f, 1.f), "Enable float format for more buffers"); + } + + if (fb.hasAlbedoChannel()) { + ImGui::SameLine(); + ImGui::RadioButton("albedo##displayAlbedo", &whichBuffer, 1); + } + if (fb.hasDepthChannel()) { + ImGui::SameLine(); + ImGui::RadioButton("depth##displayDepth", &whichBuffer, 2); + ImGui::SameLine(); + ImGui::RadioButton("invert depth##displayDepthInv", &whichBuffer, 3); + } + + switch (whichBuffer) { + case 0: + optShowColor = true; + optShowAlbedo = optShowDepth = optShowDepthInvert = false; + break; + case 1: + optShowAlbedo = true; + optShowColor = optShowDepth = optShowDepthInvert = false; + break; + case 2: + optShowDepth = true; + optShowColor = optShowAlbedo = optShowDepthInvert = false; + break; + case 3: + optShowDepth = true; + optShowDepthInvert = true; + optShowColor = optShowAlbedo = false; + break; + } + + ImGui::Separator(); + + ImGui::Text("Post-processing"); + if (fb.isFloatFormat()) { + ImGui::Checkbox("Tonemap", &frame->toneMapFB); + ImGui::SameLine(); + ImGui::Checkbox("Tonemap nav", &frame->toneMapNavFB); + + if (studioCommon.denoiserAvailable) { + if (ImGui::Checkbox("Denoise", &optDenoiser)) + frame->denoiseFB = optDenoiser; + ImGui::SameLine(); + ImGui::Checkbox("Denoise nav", &frame->denoiseNavFB); + } + if (frame->denoiseFB || frame->denoiseNavFB) { + ImGui::Checkbox("Denoise only PathTracer", &frame->denoiseOnlyPathTracer); + ImGui::Checkbox("Denoise on final frame", &frame->denoiseFBFinalFrame); + ImGui::SameLine(); + // Add accum here for convenience with final-frame denoising + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + ImGui::DragInt( + "Limit accumulation", &frame->accumLimit, 1, 0, INT_MAX, "%d frames"); + } + } else { + ImGui::TextColored( + ImVec4(.5f, .5f, .5f, 1.f), "Enable float format for post-processing"); + } + + ImGui::Separator(); + + ImGui::Text("Scaling"); + { + static const float scaleValues[9] = { + 0.25f, 0.5f, 0.75f, 1.f, 1.25f, 1.5f, 2.f, 4.f, 8.f}; + + auto size = frame->child("windowSize").valueAs(); + char _label[56]; + auto createLabel = [&_label, size](std::string uniqueId, float v) { + const vec2i _sz = v * size; + snprintf(_label, + sizeof(_label), + "%1.2fx (%d,%d)##%s", + v, + _sz.x, + _sz.y, + uniqueId.c_str()); + return _label; + }; + + auto selectNewScale = [&](std::string id, const float _scale) { + auto scale = _scale; + auto custom = true; + for (auto v : scaleValues) { + if (ImGui::Selectable(createLabel(id, v), v == scale)) + scale = v; + custom &= (v != scale); + } + + ImGui::Separator(); + char cLabel[64]; + snprintf(cLabel, sizeof(cLabel), "custom %s", createLabel(id, scale)); + if (ImGui::BeginMenu(cLabel)) { + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + ImGui::InputFloat("x##fb_scaling", &scale); + ImGui::EndMenu(); + } + + return scale; + }; + + auto scale = frame->child("scale").valueAs(); + ImGui::SetNextItemWidth(12 * ImGui::GetFontSize()); + if (ImGui::BeginCombo("Scale resolution", createLabel("still", scale))) { + auto newScale = selectNewScale("still", scale); + if (scale != newScale) + frame->child("scale") = newScale; + ImGui::EndCombo(); + } + + scale = frame->child("scaleNav").valueAs(); + ImGui::SetNextItemWidth(12 * ImGui::GetFontSize()); + if (ImGui::BeginCombo("Scale Nav resolution", createLabel("nav", scale))) { + auto newScale = selectNewScale("nav", scale); + if (scale != newScale) + frame->child("scaleNav") = newScale; + ImGui::EndCombo(); + } + } + + ImGui::Separator(); + + ImGui::Text("Aspect Ratio"); + const float origAspect = lockAspectRatio; + if (lockAspectRatio != 0.f) { + ImGui::SameLine(); + ImGui::Text("locked at %f", lockAspectRatio); + if (ImGui::Button("Unlock")) { + lockAspectRatio = 0.f; + } + } else { + if (ImGui::Button("Lock")) { + lockAspectRatio = + static_cast(windowSize.x) / static_cast(windowSize.y); + } + sg::showTooltip("Lock to current aspect ratio"); + } + + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + ImGui::InputFloat("Set", &lockAspectRatio); + sg::showTooltip("Lock to custom aspect ratio"); + lockAspectRatio = std::max(lockAspectRatio, 0.f); + + if (origAspect != lockAspectRatio) + reshape(windowSize); + + ImGui::End(); +} + +void MultiWindows::buildWindowKeyframes() +{ + if (!ImGui::Begin("Keyframe editor", &showKeyframes, g_imguiWindowFlags)) { + ImGui::End(); + return; + } + + ImGui::SetNextItemWidth(25 * ImGui::GetFontSize()); + + if (ImGui::Button("add")) { // add current camera state after the selected one + if (cameraStack.empty()) { + cameraStack.push_back(arcballCamera->getState()); + g_camSelectedStackIndex = 0; + } else { + cameraStack.insert(cameraStack.begin() + g_camSelectedStackIndex + 1, + arcballCamera->getState()); + g_camSelectedStackIndex++; + } + } + + sg::showTooltip("insert a new keyframe after the selected keyframe, based\n" + "on the current camera state"); + + ImGui::SameLine(); + if (ImGui::Button("remove")) { // remove the selected camera state + cameraStack.erase(cameraStack.begin() + g_camSelectedStackIndex); + g_camSelectedStackIndex = std::max(0, g_camSelectedStackIndex - 1); + } + sg::showTooltip("remove the currently selected keyframe"); + + if (cameraStack.size() >= 2) { + ImGui::SameLine(); + if (ImGui::Button(g_animatingPath ? "stop" : "play")) { + g_animatingPath = !g_animatingPath; + g_camCurrentPathIndex = 0; + if (g_animatingPath) + g_camPath = buildPath(cameraStack, g_camPathSpeed * 0.01); + } + ImGui::SameLine(); + ImGui::SetNextItemWidth(10 * ImGui::GetFontSize()); + ImGui::SliderFloat("speed##path", &g_camPathSpeed, 0.f, 10.0); + sg::showTooltip("Animation speed for computed path.\n" + "Slow speeds may cause jitter for small objects"); + + static bool showCameraPath = false; + if (ImGui::Checkbox("show camera path", &showCameraPath)) { + if (!showCameraPath) { + frame->child("world").remove("cameraPath_xfm"); + refreshScene(false); + } else { + auto pathXfm = sg::createNode("cameraPath_xfm", "transform"); + + const auto &worldBounds = frame->child("world").bounds(); + float pathRad = 0.0075f * reduce_min(worldBounds.size()); + std::vector cameraPath = + buildPath(cameraStack, g_camPathSpeed * 0.01f); + std::vector pathVertices; // position and radius + for (const auto &state : cameraPath) + pathVertices.emplace_back(state.position(), pathRad); + pathVertices.emplace_back(cameraStack.back().position(), pathRad); + + std::vector indexes(pathVertices.size()); + std::iota(indexes.begin(), indexes.end(), 0); + + std::vector colors(pathVertices.size()); + std::fill(colors.begin(), colors.end(), vec4f(0.8f, 0.4f, 0.4f, 1.f)); + + const std::vector mID = { + static_cast(baseMaterialRegistry->baseMaterialOffSet())}; + auto mat = sg::createNode("pathGlass", "thinGlass"); + baseMaterialRegistry->add(mat); + + auto path = sg::createNode("cameraPath", "geometry_curves"); + path->createChildData("vertex.position_radius", pathVertices); + path->createChildData("vertex.color", colors); + path->createChildData("index", indexes); + path->createChild("type", "uchar", (unsigned char)OSP_ROUND); + path->createChild("basis", "uchar", (unsigned char)OSP_CATMULL_ROM); + path->createChildData("material", mID); + path->child("material").setSGOnly(); + + + std::vector capVertexes; + std::vector capColors; + for (int i = 0; i < cameraStack.size(); i++) { + capVertexes.push_back(cameraStack[i].position()); + if (i == 0) + capColors.push_back(vec4f(.047f, .482f, .863f, 1.f)); + else + capColors.push_back(vec4f(vec3f(0.8f), 1.f)); + } + + auto caps = sg::createNode("cameraPathCaps", "geometry_spheres"); + caps->createChildData("sphere.position", capVertexes); + caps->createChildData("color", capColors); + caps->child("color").setSGOnly(); + caps->child("radius") = pathRad * 1.5f; + caps->createChildData("material", mID); + caps->child("material").setSGOnly(); + + pathXfm->add(path); + pathXfm->add(caps); + + frame->child("world").add(pathXfm); + } + } + } + + if (ImGui::ListBoxHeader("##")) { + for (int i = 0; i < cameraStack.size(); i++) { + if (ImGui::Selectable( + (std::to_string(i) + ": " + to_string(cameraStack[i])).c_str(), + (g_camSelectedStackIndex == (int) i))) { + g_camSelectedStackIndex = i; + arcballCamera->setState(cameraStack[i]); + updateCamera(); + } + } + ImGui::ListBoxFooter(); + } + + ImGui::End(); +} + +void MultiWindows::setCameraSnapshot(size_t snapshot) +{ + if (snapshot < cameraStack.size()) { + const CameraState &cs = cameraStack.at(snapshot); + arcballCamera->setState(cs); + updateCamera(); + } +} + +void MultiWindows::buildWindowSnapshots() +{ + if (!ImGui::Begin("Camera snap shots", &showSnapshots, g_imguiWindowFlags)) { + ImGui::End(); + return; + } + ImGui::Text("+ key to add new snapshots"); + for (size_t s = 0; s < cameraStack.size(); s++) { + if (ImGui::Button(std::to_string(s).c_str())) { + setCameraSnapshot(s); + } + } + if (cameraStack.size()) { + if (ImGui::Button("save to cams.json")) { + std::ofstream cams("cams.json"); + if (cams) { + JSON j = cameraStack; + cams << j; + } + } + } + ImGui::End(); +} + +void MultiWindows::buildWindowLightEditor() +{ + if (!ImGui::Begin("Light editor", &showLightEditor, g_imguiWindowFlags)) { + ImGui::End(); + return; + } + + auto &lights = lightsManager->children(); + static int whichLight = -1; + + // Validate that selected light is still a valid light. Clear scene will + // change the lights list, elsewhere. + if (whichLight >= lights.size()) + whichLight = -1; + + ImGui::Text("lights"); + if (ImGui::ListBoxHeader("", 3)) { + int i = 0; + for (auto &light : lights) { + if (ImGui::Selectable(light.first.c_str(), (whichLight == i))) { + whichLight = i; + } + i++; + } + ImGui::ListBoxFooter(); + + if (whichLight != -1) { + ImGui::Text("edit"); + GenerateWidget(lightsManager->child(lights.at_index(whichLight).first)); + } + } + + if (lights.size() > 1) { + if (ImGui::Button("remove")) { + if (whichLight != -1) { + // Node removal requires waiting on previous frame completion + frame->cancelFrame(); + frame->waitOnFrame(); + lightsManager->removeLight(lights.at_index(whichLight).first); + whichLight = std::max(0, whichLight - 1); + } + } + } + + ImGui::Separator(); + + ImGui::Text("new light"); + + static std::string lightType = ""; + if (ImGui::Combo("type##whichLightType", + &whichLightType, + lightTypeUI_callback, + nullptr, + g_lightTypes.size())) { + if (whichLightType > -1 && whichLightType < (int) g_lightTypes.size()) + lightType = g_lightTypes[whichLightType]; + } + + static bool lightNameWarning = false; + static bool lightTexWarning = false; + + static char lightName[64] = ""; + if (ImGui::InputText("name", lightName, sizeof(lightName))) + lightNameWarning = !(*lightName) || lightsManager->lightExists(lightName); + + // HDRI lights need a texture + static bool showHDRIFileBrowser = false; + static rkcommon::FileName texFileName(""); + if (lightType == "hdri") { + // This field won't be typed into. + ImGui::InputTextWithHint( + "texture", "select...", (char *)texFileName.base().c_str(), 0); + if (ImGui::IsItemClicked()) + showHDRIFileBrowser = true; + } else + lightTexWarning = false; + + // Leave the fileBrowser open until file is selected + if (showHDRIFileBrowser) { + FileList fileList = {}; + if (fileBrowser(fileList, "Select HDRI Texture")) { + showHDRIFileBrowser = false; + + lightTexWarning = fileList.empty(); + if (!fileList.empty()) { + texFileName = fileList[0]; + } + } + } + + if ((!lightNameWarning && !lightTexWarning)) { + if (ImGui::Button("add")) { + if (lightsManager->addLight(lightName, lightType)) { + if (lightType == "hdri") { + auto &hdri = lightsManager->child(lightName); + hdri["filename"] = texFileName.str(); + } + // Select newly added light + whichLight = lights.size() - 1; + } else { + lightNameWarning = true; + } + } + if (lightsManager->hasDefaultLight()) { + auto &rmDefaultLight = lightsManager->rmDefaultLight; + ImGui::SameLine(); + ImGui::Checkbox("remove default", &rmDefaultLight); + } + } + + if (lightNameWarning) + ImGui::TextColored( + ImVec4(1.f, 0.f, 0.f, 1.f), "Light must have unique non-empty name"); + if (lightTexWarning) + ImGui::TextColored(ImVec4(1.f, 0.f, 0.f, 1.f), "No texture provided"); + + ImGui::End(); +} + +void MultiWindows::buildWindowCameraEditor() +{ + if (!ImGui::Begin("Camera editor", &showCameraEditor)) { + ImGui::End(); + return; + } + + whichCamera = frame->child("camera").child("cameraId").valueAs(); + + // Only present selector UI if more than one camera + if (!g_sceneCameras.empty() + && ImGui::Combo("sceneCameras##whichCamera", + &whichCamera, + cameraUI_callback, + nullptr, + g_sceneCameras.size())) { + if (whichCamera > -1 && whichCamera < (int)g_sceneCameras.size()) { + auto &newCamera = g_sceneCameras.at_index(whichCamera); + g_selectedSceneCamera = newCamera.second; + auto hasParents = g_selectedSceneCamera->parents().size(); + frame->remove("camera"); + frame->add(g_selectedSceneCamera); + + if (g_selectedSceneCamera->hasChild("aspect")) + lockAspectRatio = + g_selectedSceneCamera->child("aspect").valueAs(); + reshape(windowSize); // resets aspect + if (!hasParents) + updateCamera(); + } + } + + // Change camera type + ImGui::Text("Type:"); + static const std::vector cameraTypes = { + "perspective", "orthographic", "panoramic"}; + auto currentType = frame->childAs("camera").subType(); + for (auto &type : cameraTypes) { + auto newType = "camera_" + type; + ImGui::SameLine(); + if (ImGui::RadioButton(type.c_str(), currentType == newType)) { + // Create new camera of new type + frame->createChildAs("camera", newType); + reshape(windowSize); // resets aspect + updateCamera(); // resets position, direction, etc + break; + } + } + + // UI Widget + GenerateWidget(frame->childAs("camera")); + + ImGui::End(); +} + +void MultiWindows::buildWindowMaterialEditor() +{ + if (!ImGui::Begin("Material editor", &showMaterialEditor)) { + ImGui::End(); + return; + } + + static std::vector types{sg::NodeType::MATERIAL}; + static SearchWidget searchWidget(types, types, sg::TreeState::ALLCLOSED); + static AdvancedMaterialEditor advMaterialEditor; + + searchWidget.addSearchBarUI(*baseMaterialRegistry); + searchWidget.addSearchResultsUI(*baseMaterialRegistry); + auto selected = searchWidget.getSelected(); + if (selected) { + GenerateWidget(*selected); + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(245, 200, 66, 255)); + if (ImGui::TreeNodeEx( + "Advanced options##materials", ImGuiTreeNodeFlags_None)) { + ImGui::PopStyleColor(); + advMaterialEditor.buildUI(baseMaterialRegistry, selected); + ImGui::TreePop(); + } else { + ImGui::PopStyleColor(); + } + } + + if (baseMaterialRegistry->isModified()) { + frame->cancelFrame(); + frame->waitOnFrame(); + } + + ImGui::End(); +} + +void MultiWindows::buildWindowTransferFunctionEditor() +{ + if (!ImGui::Begin("Transfer Function editor", &showTransferFunctionEditor)) { + ImGui::End(); + return; + } + + // Gather all transfer functions in the scene + sg::CollectTransferFunctions visitor; + frame->traverse(visitor); + auto &transferFunctions = visitor.transferFunctions; + + if (transferFunctions.empty()) { + ImGui::Text("== empty == "); + + } else { + ImGui::Text("TransferFunctions"); + static int whichTFn = -1; + static std::string selected = ""; + + // Called by TransferFunctionWidget to update selected TFn + auto transferFunctionUpdatedCallback = + [&](const range1f &valueRange, + const std::vector &colorsAndOpacities) { + if (whichTFn != -1) { + auto &tfn = + *(transferFunctions[selected]->nodeAs()); + auto &colors = tfn.colors; + auto &opacities = tfn.opacities; + + colors.resize(colorsAndOpacities.size()); + opacities.resize(colorsAndOpacities.size()); + + // Separate out colors + std::transform(colorsAndOpacities.begin(), + colorsAndOpacities.end(), + colors.begin(), + [](vec4f c4) { return vec3f(c4[0], c4[1], c4[2]); }); + + // Separate out opacities + std::transform(colorsAndOpacities.begin(), + colorsAndOpacities.end(), + opacities.begin(), + [](vec4f c4) { return c4[3]; }); + + tfn.createChildData("color", colors); + tfn.createChildData("opacity", opacities); + tfn["valueRange"] = valueRange.toVec2(); + } + }; + + static TransferFunctionWidget transferFunctionWidget( + transferFunctionUpdatedCallback, + range1f(0.f, 1.f), + "TransferFunctionEditor"); + + if (ImGui::ListBoxHeader("", transferFunctions.size())) { + int i = 0; + for (auto t : transferFunctions) { + if (ImGui::Selectable(t.first.c_str(), (whichTFn == i))) { + whichTFn = i; + selected = t.first; + + auto &tfn = *(t.second->nodeAs()); + const auto numSamples = tfn.colors.size(); + + if (numSamples > 1) { + auto vRange = tfn["valueRange"].valueAs(); + + // Create a c4 from c3 + opacity + std::vector c4; + + if (tfn.opacities.size() != numSamples) + tfn.opacities.resize(numSamples, tfn.opacities.back()); + + for (int n = 0; n < numSamples; n++) { + c4.emplace_back(vec4f(tfn.colors.at(n), tfn.opacities.at(n))); + } + + transferFunctionWidget.setValueRange(range1f(vRange[0], vRange[1])); + transferFunctionWidget.setColorsAndOpacities(c4); + } + } + i++; + } + ImGui::ListBoxFooter(); + + ImGui::Separator(); + if (whichTFn != -1) { + transferFunctionWidget.updateUI(); + } + } + } + + ImGui::End(); +} + +void MultiWindows::buildWindowIsosurfaceEditor() +{ + if (!ImGui::Begin("Isosurface editor", &showIsosurfaceEditor)) { + ImGui::End(); + return; + } + + // Specialized node vector list box + using vNodePtr = std::vector; + auto ListBox = [](const char *label, int *selected, vNodePtr &nodes) { + auto getter = [](void *vec, int index, const char **name) { + auto nodes = static_cast(vec); + if (0 > index || index >= (int) nodes->size()) + return false; + // Need longer lifetime than this lambda? + static std::string copy = ""; + copy = nodes->at(index)->name(); + *name = copy.data(); + return true; + }; + + if (nodes.empty()) + return false; + return ImGui::ListBox( + label, selected, getter, static_cast(&nodes), nodes.size()); + }; + + // Gather all volumes in the scene + vNodePtr volumes = {}; + for (auto &node : frame->child("world").children()) + if (node.second->type() == sg::NodeType::GENERATOR + || node.second->type() == sg::NodeType::IMPORTER + || node.second->type() == sg::NodeType::VOLUME) { + auto volume = + findFirstNodeOfType(node.second, sg::NodeType::VOLUME); + if (volume) + volumes.push_back(volume); + } + + ImGui::Text("Volumes"); + ImGui::Text("(select to create an isosurface)"); + if (volumes.empty()) { + ImGui::Text("== empty == "); + + } else { + static int currentVolume = 0; + if (ListBox("##Volumes", ¤tVolume, volumes)) { + auto selected = volumes.at(currentVolume); + + auto &world = frame->childAs("world"); + + auto count = 1; + auto surfName = selected->name() + "_surf"; + while (world.hasChild(surfName + std::to_string(count) + "_xfm")) + count++; + surfName += std::to_string(count); + + auto isoXfm = + sg::createNode(surfName + "_xfm", "transform", affine3f{one}); + + auto valueRange = selected->child("valueRange").valueAs(); + + auto isoGeom = sg::createNode(surfName, "geometry_isosurfaces"); + isoGeom->createChild("valueRange", "range1f", valueRange); + isoGeom->child("valueRange").setSGOnly(); + isoGeom->createChild("isovalue", "float", valueRange.center()); + isoGeom->child("isovalue").setMinMax(valueRange.lower, valueRange.upper); + + uint32_t materialID = baseMaterialRegistry->baseMaterialOffSet(); + const std::vector mID = {materialID}; + auto mat = sg::createNode(surfName, "obj"); + + // Give it some editable parameters + mat->createChild("kd", "rgb", "diffuse color", vec3f(0.8f)); + mat->createChild("ks", "rgb", "specular color", vec3f(0.f)); + mat->createChild("ns", "float", "shininess [2-10e4]", 10.f); + mat->createChild("d", "float", "opacity [0-1]", 1.f); + mat->createChild("tf", "rgb", "transparency filter color", vec3f(0.f)); + mat->child("ns").setMinMax(2.f,10000.f); + mat->child("d").setMinMax(0.f,1.f); + + baseMaterialRegistry->add(mat); + isoGeom->createChildData("material", mID); + isoGeom->child("material").setSGOnly(); + + auto &handle = isoGeom->valueAs(); + handle.setParam("volume", selected->valueAs()); + + isoXfm->add(isoGeom); + + world.add(isoXfm); + } + } + + // Gather all isosurfaces in the scene + vNodePtr surfaces = {}; + for (auto &node : frame->child("world").children()) + if (node.second->type() == sg::NodeType::GENERATOR + || node.second->type() == sg::NodeType::IMPORTER + || node.second->type() == sg::NodeType::TRANSFORM) { + auto surface = + findFirstNodeOfType(node.second, sg::NodeType::GEOMETRY); + if (surface && (surface->subType() == "geometry_isosurfaces")) + surfaces.push_back(surface); + } + + ImGui::Separator(); + ImGui::Text("Isosurfaces"); + if (surfaces.empty()) { + ImGui::Text("== empty == "); + } else { + for (auto &surface : surfaces) { + GenerateWidget(*surface); + if (surface->isModified()) + break; + } + } + + ImGui::End(); +} + +void MultiWindows::buildWindowTransformEditor() +{ + if (!ImGui::Begin("Transform Editor", &showTransformEditor)) { + ImGui::End(); + return; + } + + typedef sg::NodeType NT; + + auto toggleSearch = [&](sg::SearchResults &results, bool visible) { + for (auto result : results) { + auto resultNode = result.lock(); + if (resultNode->hasChild("visible")) + resultNode->child("visible").setValue(visible); + } + }; + auto showSearch = [&](sg::SearchResults &r) { toggleSearch(r, true); }; + auto hideSearch = [&](sg::SearchResults &r) { toggleSearch(r, false); }; + + auto &warudo = frame->child("world"); + auto toggleDisplay = [&](bool visible) { + warudo.traverse(NT::GEOMETRY, "visible", visible); + warudo.traverse(NT::VOLUME, "visible", visible); + }; + auto showDisplay = [&]() { toggleDisplay(true); }; + auto hideDisplay = [&]() { toggleDisplay(false); }; + + static std::vector searchTypes{ + NT::IMPORTER, NT::TRANSFORM, NT::GENERATOR, NT::GEOMETRY, NT::VOLUME}; + static std::vector displayTypes{ + NT::IMPORTER, NT::TRANSFORM, NT::GENERATOR}; + static SearchWidget searchWidget(searchTypes, displayTypes); + + searchWidget.addSearchBarUI(warudo); + searchWidget.addCustomAction("show all", showSearch, showDisplay); + searchWidget.addCustomAction("hide all", hideSearch, hideDisplay, true); + searchWidget.addSearchResultsUI(warudo); + + auto selected = searchWidget.getSelected(); + if (selected) { + auto toggleSelected = [&](bool visible) { + selected->traverse(NT::GEOMETRY, "visible", visible); + selected->traverse(NT::VOLUME, "visible", visible); + }; + + ImGui::Text("Selected "); + ImGui::SameLine(); + if (ImGui::Button("show")) + toggleSelected(true); + ImGui::SameLine(); + if (ImGui::Button("hide")) + toggleSelected(false); + + GenerateWidget(*selected); + } + + ImGui::End(); +} + +void MultiWindows::buildWindowRenderingStats() +{ + ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration + | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings + | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav + | ImGuiWindowFlags_NoMove; + ImGui::SetNextWindowBgAlpha(0.75f); + + // Bottom left corner + static const float FROM_EDGE = 10.f; + ImVec2 window_pos(FROM_EDGE, ImGui::GetIO().DisplaySize.y - FROM_EDGE); + ImVec2 window_pos_pivot(0.f, 1.f); + ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); + + if (!ImGui::Begin("Rendering stats", &showRenderingStats, flags)) { + ImGui::End(); + return; + } + + auto &fb = frame->childAs("framebuffer"); + auto variance = fb.variance(); + auto &v = frame->childAs("renderer")["varianceThreshold"]; + auto varianceThreshold = v.valueAs(); + + std::string mode = frame->child("navMode").valueAs() ? "Nav" : ""; + float scale = frame->child("scale" + mode).valueAs(); + + ImGui::Text("renderer: %s", rendererTypeStr.c_str()); + ImGui::Text("frame size: (%d,%d)", windowSize.x, windowSize.y); + ImGui::SameLine(); + ImGui::Text("x%1.2f", scale); + ImGui::Text("framerate: %-4.1f fps", latestFPS); + ImGui::Text("ui framerate: %-4.1f fps", ImGui::GetIO().Framerate); + + if (varianceThreshold == 0) { + ImGui::Text("variance : %-5.2f ", variance); + } else { + ImGui::Text("variance :"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(8 * ImGui::GetFontSize()); + float progress = varianceThreshold / variance; + char message[64]; + snprintf( + message, sizeof(message), "%.2f/%.2f", variance, varianceThreshold); + ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), message); + } + + if (frame->accumLimit == 0) { + ImGui::Text("accumulation: %d", frame->currentAccum); + } else { + ImGui::Text("accumulation:"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(8 * ImGui::GetFontSize()); + float progress = float(frame->currentAccum) / frame->accumLimit; + char message[64]; + snprintf(message, + sizeof(message), + "%d/%d", + frame->currentAccum, + frame->accumLimit); + ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), message); + auto remaining = frame->accumLimit - frame->currentAccum; + if (remaining > 0) { + auto secondsPerFrame = 1.f / (latestFPS + 1e-6); + ImGui::SameLine(); + ImGui::Text( + "ETA: %4.2f s", int(remaining * secondsPerFrame * 100.f) / 100.f); + } + } + + ImGui::End(); +} + +} // namespace devel \ No newline at end of file diff --git a/app/MultiWindows.h b/app/MultiWindows.h new file mode 100644 index 00000000..66fa59c5 --- /dev/null +++ b/app/MultiWindows.h @@ -0,0 +1,230 @@ +// copied MainWindow.h and use "devel" namespace + +#pragma once + +#include "ospStudio.h" + +#include "ArcballCamera.h" +// glfw +#include +// ospray sg +#include "sg/Frame.h" +#include "sg/renderer/MaterialRegistry.h" +// std +#include + +#include +#include "widgets/AnimationWidget.h" +#include "widgets/GenerateImGuiWidgets.h" +#include "PluginManager.h" +#include "sg/importer/Importer.h" + +using namespace rkcommon::math; +using namespace ospray; +using rkcommon::make_unique; + +namespace devel { + +// on Windows often only GL 1.1 headers are present +// and Mac may be missing the float defines +#ifndef GL_CLAMP_TO_BORDER +#define GL_CLAMP_TO_BORDER 0x812D +#endif +#ifndef GL_FRAMEBUFFER_SRGB +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#endif +#ifndef GL_RGBA32F +#define GL_RGBA32F 0x8814 +#endif +#ifndef GL_RGB32F +#define GL_RGB32F 0x8815 +#endif + +enum class OSPRayRendererType +{ + SCIVIS, + PATHTRACER, + AO, + DEBUGGER, +#ifdef USE_MPI + MPIRAYCAST, +#endif + OTHER +}; + +class MultiWindows : public StudioContext +{ + public: + + MultiWindows(StudioCommon &studioCommon); + + ~MultiWindows(); + + static MultiWindows *getActiveWindow(); + + GLFWwindow* getGLFWWindow(); + + void registerDisplayCallback(std::function callback); + + void registerKeyCallback( + std::function); + + void registerImGuiCallback(std::function callback); + + void mainLoop(); + + void addToCommandLine(std::shared_ptr app) override; + bool parseCommandLine() override; + + void start() override; + + void importFiles(sg::NodePtr world) override; + + std::shared_ptr getFrame(); + + bool timeseriesMode = false; + + std::stringstream windowTitle; + + void updateTitleBar(); + + void refreshRenderer(); + void saveRendererParams(); + + void changeToDefaultCamera(); + void updateCamera() override; + void setCameraState(CameraState &cs) override; + void refreshScene(bool resetCamera) override; + int whichLightType{-1}; + int whichCamera{0}; + std::string lightTypeStr{"ambient"}; + std::string scene; + std::string rendererTypeStr; + + protected: + void buildPanel(); + void reshape(const vec2i &newWindowSize); + void motion(const vec2f &position); + void keyboardMotion(); + void mouseButton(const vec2f &position); + void mouseWheel(const vec2f &scroll); + void display(); + void startNewOSPRayFrame(); + void waitOnOSPRayFrame(); + void buildUI(); + void addLight(); + void removeLight(); + void addPTMaterials(); + + void saveCurrentFrame(); + void centerOnEyePos(); + void pickCenterOfRotation(float x, float y); + void pushLookMark(); + void popLookMark(); + + // menu and window UI + void buildMainMenu(); + void buildMainMenuFile(); + void buildMainMenuEdit(); + void buildMainMenuView(); + void buildMainMenuPlugins(); + + void buildWindows(); + void buildWindowRendererEditor(); + void buildWindowFrameBufferEditor(); + void buildWindowKeyframes(); + void buildWindowSnapshots(); + void buildWindowLightEditor(); + void buildWindowCameraEditor(); + void buildWindowMaterialEditor(); + void buildWindowTransferFunctionEditor(); + void buildWindowIsosurfaceEditor(); + void buildWindowTransformEditor(); + void buildWindowRenderingStats(); + + void setCameraSnapshot(size_t snapshot); + + std::vector cameraStack; + sg::NodePtr g_selectedSceneCamera; + + // Plugins // + std::vector> pluginPanels; + + // imgui window visibility toggles + bool showRendererEditor{false}; + bool showFrameBufferEditor{false}; + bool showKeyframes{false}; + bool showSnapshots{false}; + bool showLightEditor{false}; + bool showCameraEditor{false}; + bool showMaterialEditor{false}; + bool showTransferFunctionEditor{false}; + bool showIsosurfaceEditor{false}; + bool showTransformEditor{false}; + bool showRenderingStats{false}; + + // Option to always show a gamma corrected display to user. Native sRGB + // buffer is untouched, linear buffers are displayed as sRGB. + bool uiDisplays_sRGB{true}; + + static MultiWindows *activeWindow; + + int fontSize{13}; // pixels + vec2f contentScale{1.0f}; + vec2i windowSize; + vec2i fbSize; + vec2f previousMouse{-1.f}; + + OSPRayRendererType rendererType{OSPRayRendererType::SCIVIS}; + + rkcommon::FileName backPlateTexture = ""; + + // GLFW window instance + GLFWwindow *glfwWindow = nullptr; + + // OpenGL framebuffer texture + GLuint framebufferTexture = 0; + + // optional registered display callback, called before every display() + std::function displayCallback; + + // toggles display of ImGui UI, if an ImGui callback is provided + bool showUi = true; + + // optional registered ImGui callback, called during every frame to build UI + std::function uiCallback; + + // optional registered key callback, called when keys are pressed + std::function + keyCallback; + + // FPS measurement of last frame + float latestFPS{0.f}; + + // auto rotation speed, 1=0.1% window width mouse movement, 100=10% + int autorotateSpeed{1}; + + // Camera motion controls + float maxMoveSpeed{1.f}; + float fineControl{0.2f}; + float preFPVZoom{0.f}; + affine3f lastCamXfm{one}; + + // format used by glTexImage2D, as determined at context creation time + GLenum gl_rgb_format; + GLenum gl_rgba_format; + + std::shared_ptr animationWidget{nullptr}; + + // CLI + bool optShowColor{true}; + bool optShowAlbedo{false}; + bool optShowDepth{false}; + bool optShowDepthInvert{false}; + bool optAutorotate{false}; + bool optAnimate{false}; +}; + +} // namespace devel \ No newline at end of file diff --git a/app/ospStudio.cpp b/app/ospStudio.cpp index f0d7dd79..15b3ce8e 100644 --- a/app/ospStudio.cpp +++ b/app/ospStudio.cpp @@ -6,6 +6,7 @@ #include "MainWindow.h" #include "Batch.h" #include "TimeSeriesWindow.h" +#include "MultiWindows.h" #include "sg/Mpi.h" // CLI @@ -380,6 +381,11 @@ int main(int argc, const char *argv[]) case StudioMode::BENCHMARK: context = std::make_shared(studioCommon); break; +#endif +#ifdef USE_MPI + case StudioMode::MULTIWINDOWS: + context = std::make_shared(studioCommon); + break; #endif default: std::cerr << "unknown mode! How did I get here?!\n"; diff --git a/app/ospStudio.h b/app/ospStudio.h index f9c6449e..d6445070 100644 --- a/app/ospStudio.h +++ b/app/ospStudio.h @@ -42,6 +42,9 @@ enum class StudioMode #ifdef USE_BENCHMARK BENCHMARK, #endif +#ifdef USE_MPI + MULTIWINDOWS, +#endif }; const static std::map StudioModeMap = { @@ -52,6 +55,9 @@ const static std::map StudioModeMap = { #ifdef USE_BENCHMARK {"benchmark", StudioMode::BENCHMARK}, #endif +#ifdef USE_MPI + {"multiwindows", StudioMode::MULTIWINDOWS}, +#endif }; const static std::map standardResolutionSizeMap = { From 88793692ebf1fcf9bb0c4468d2902330e2656867 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Sun, 5 Feb 2023 01:51:14 -0600 Subject: [PATCH 05/18] Sync multiple windows --- app/MultiWindows.cpp | 440 ++++++++++++++++++++++++++----------------- app/MultiWindows.h | 17 ++ 2 files changed, 289 insertions(+), 168 deletions(-) diff --git a/app/MultiWindows.cpp b/app/MultiWindows.cpp index 86c72e1a..a0df65f1 100644 --- a/app/MultiWindows.cpp +++ b/app/MultiWindows.cpp @@ -25,6 +25,7 @@ #include "sg/visitors/CollectTransferFunctions.h" #include "sg/scene/volume/Volume.h" #include "sg/Math.h" +#include "sg/Mpi.h" // rkcommon #include "rkcommon/math/rkmath.h" #include "rkcommon/os/FileName.h" @@ -176,11 +177,15 @@ void error_callback(int error, const char *desc) std::cerr << "error " << error << ": " << desc << std::endl; } +SharedState::SharedState() : quit(false), camChanged(false) { } + MultiWindows *MultiWindows::activeWindow = nullptr; MultiWindows::MultiWindows(StudioCommon &_common) : StudioContext(_common, StudioMode::GUI), windowSize(_common.defaultSize), scene("") { + parseCommandLine(); + pluginManager = std::make_shared(); if (activeWindow != nullptr) { throw std::runtime_error("Cannot create more than one MultiWindows!"); @@ -202,6 +207,13 @@ MultiWindows::MultiWindows(StudioCommon &_common) throw std::runtime_error("Failed to initialize GLFW!"); } + // set the window size and show/hide the frame + windowSize.x = configDisplay[sg::sgMpiRank()]["screenWidth"]; + windowSize.y = configDisplay[sg::sgMpiRank()]["screenHeight"]; + optResolution.x = windowSize.x; + optResolution.y = windowSize.y; + glfwWindowHint(GLFW_DECORATED, sg::sgMpiRank() == 0 ? GLFW_TRUE : GLFW_FALSE); + glfwWindowHint(GLFW_SRGB_CAPABLE, GLFW_TRUE); // get primary monitor's display scaling @@ -230,183 +242,201 @@ MultiWindows::MultiWindows(StudioCommon &_common) gl_rgba_format = GL_RGBA32F; } - glfwSetKeyCallback( - glfwWindow, [](GLFWwindow *, int key, int, int action, int mod) { - auto &io = ImGui::GetIO(); - if (!io.WantCaptureKeyboard) - if (action == GLFW_PRESS) { + // set the window position + int numOfMonitors; + GLFWmonitor** monitors = glfwGetMonitors(&numOfMonitors); + int displayIndex = configDisplay[sg::sgMpiRank()]["display"]; + if (numOfMonitors <= displayIndex) { + throw std::runtime_error("The display index should be less than numOfMonitors: " + std::to_string(numOfMonitors)); + } + int xVirtual, yVirtual; + glfwGetMonitorPos(monitors[displayIndex], &xVirtual, &yVirtual); + int x = (int) configDisplay[sg::sgMpiRank()]["screenX"] + xVirtual; + int y = (int) configDisplay[sg::sgMpiRank()]["screenY"] + yVirtual; + glfwSetWindowPos(glfwWindow, x, y); + + // further configure GLFW window based on rank + if (sg::sgMpiRank() == 0) { + glfwSetWindowAspectRatio(glfwWindow, windowSize.x, windowSize.y); + + glfwSetKeyCallback( + glfwWindow, [](GLFWwindow *, int key, int, int action, int mod) { + auto &io = ImGui::GetIO(); + if (!io.WantCaptureKeyboard) + if (action == GLFW_PRESS) { + switch (key) { + case GLFW_KEY_UP: + if (mod != GLFW_MOD_ALT) + g_camMoveZ = -CAM_MOVERATE; + else + g_camMoveY = -CAM_MOVERATE; + break; + case GLFW_KEY_DOWN: + if (mod != GLFW_MOD_ALT) + g_camMoveZ = CAM_MOVERATE; + else + g_camMoveY = CAM_MOVERATE; + break; + case GLFW_KEY_LEFT: + g_camMoveX = -CAM_MOVERATE; + break; + case GLFW_KEY_RIGHT: + g_camMoveX = CAM_MOVERATE; + break; + case GLFW_KEY_W: + g_camMoveE = CAM_MOVERATE; + break; + case GLFW_KEY_S: + if (mod != GLFW_MOD_CONTROL) + g_camMoveE = -CAM_MOVERATE; + else + g_saveNextFrame = true; + break; + case GLFW_KEY_A: + if (mod != GLFW_MOD_ALT) + g_camMoveA = -CAM_MOVERATE; + else + g_camMoveR = -CAM_MOVERATE; + break; + case GLFW_KEY_D: + if (mod != GLFW_MOD_ALT) + g_camMoveA = CAM_MOVERATE; + else + g_camMoveR = CAM_MOVERATE; + break; + + case GLFW_KEY_X: + g_rotationConstraint = 0; + break; + case GLFW_KEY_Y: + g_rotationConstraint = 1; + break; + case GLFW_KEY_Z: + g_rotationConstraint = 2; + break; + + case GLFW_KEY_I: + activeWindow->centerOnEyePos(); + break; + + case GLFW_KEY_G: + activeWindow->showUi = !(activeWindow->showUi); + break; + case GLFW_KEY_Q: { + auto showMode = + rkcommon::utility::getEnvVar("OSPSTUDIO_SHOW_MODE"); + // Enforce "ctrl-Q" to make it more difficult to exit by mistake. + if (showMode && mod != GLFW_MOD_CONTROL) + std::cout << "Use ctrl-Q to exit\n"; + else + g_quitNextFrame = true; + } break; + case GLFW_KEY_P: + activeWindow->frame->traverse(); + break; + case GLFW_KEY_M: + activeWindow->baseMaterialRegistry->traverse(); + break; + case GLFW_KEY_L: + activeWindow->lightsManager->traverse(); + break; + case GLFW_KEY_B: + PRINT(activeWindow->frame->bounds()); + break; + case GLFW_KEY_V: + activeWindow->frame->child("camera").traverse(); + break; + case GLFW_KEY_SPACE: + if (activeWindow->cameraStack.size() >= 2) { + g_animatingPath = !g_animatingPath; + g_camCurrentPathIndex = 0; + if (g_animatingPath) { + g_camPath = buildPath( + activeWindow->cameraStack, g_camPathSpeed * 0.01); + } + } + activeWindow->animationWidget->togglePlay(); + break; + case GLFW_KEY_EQUAL: + activeWindow->pushLookMark(); + break; + case GLFW_KEY_MINUS: + activeWindow->popLookMark(); + break; + case GLFW_KEY_0: /* fallthrough */ + case GLFW_KEY_1: /* fallthrough */ + case GLFW_KEY_2: /* fallthrough */ + case GLFW_KEY_3: /* fallthrough */ + case GLFW_KEY_4: /* fallthrough */ + case GLFW_KEY_5: /* fallthrough */ + case GLFW_KEY_6: /* fallthrough */ + case GLFW_KEY_7: /* fallthrough */ + case GLFW_KEY_8: /* fallthrough */ + case GLFW_KEY_9: + activeWindow->setCameraSnapshot((key + 9 - GLFW_KEY_0) % 10); + break; + } + } + if (action == GLFW_RELEASE) { switch (key) { - case GLFW_KEY_UP: - if (mod != GLFW_MOD_ALT) - g_camMoveZ = -CAM_MOVERATE; - else - g_camMoveY = -CAM_MOVERATE; + case GLFW_KEY_X: + case GLFW_KEY_Y: + case GLFW_KEY_Z: + g_rotationConstraint = -1; break; + case GLFW_KEY_UP: case GLFW_KEY_DOWN: - if (mod != GLFW_MOD_ALT) - g_camMoveZ = CAM_MOVERATE; - else - g_camMoveY = CAM_MOVERATE; + g_camMoveZ = 0; + g_camMoveY = 0; break; case GLFW_KEY_LEFT: - g_camMoveX = -CAM_MOVERATE; - break; case GLFW_KEY_RIGHT: - g_camMoveX = CAM_MOVERATE; + g_camMoveX = 0; break; case GLFW_KEY_W: - g_camMoveE = CAM_MOVERATE; - break; case GLFW_KEY_S: - if (mod != GLFW_MOD_CONTROL) - g_camMoveE = -CAM_MOVERATE; - else - g_saveNextFrame = true; + g_camMoveE = 0; break; case GLFW_KEY_A: - if (mod != GLFW_MOD_ALT) - g_camMoveA = -CAM_MOVERATE; - else - g_camMoveR = -CAM_MOVERATE; - break; case GLFW_KEY_D: - if (mod != GLFW_MOD_ALT) - g_camMoveA = CAM_MOVERATE; - else - g_camMoveR = CAM_MOVERATE; - break; - - case GLFW_KEY_X: - g_rotationConstraint = 0; - break; - case GLFW_KEY_Y: - g_rotationConstraint = 1; - break; - case GLFW_KEY_Z: - g_rotationConstraint = 2; - break; - - case GLFW_KEY_I: - activeWindow->centerOnEyePos(); - break; - - case GLFW_KEY_G: - activeWindow->showUi = !(activeWindow->showUi); - break; - case GLFW_KEY_Q: { - auto showMode = - rkcommon::utility::getEnvVar("OSPSTUDIO_SHOW_MODE"); - // Enforce "ctrl-Q" to make it more difficult to exit by mistake. - if (showMode && mod != GLFW_MOD_CONTROL) - std::cout << "Use ctrl-Q to exit\n"; - else - g_quitNextFrame = true; - } break; - case GLFW_KEY_P: - activeWindow->frame->traverse(); - break; - case GLFW_KEY_M: - activeWindow->baseMaterialRegistry->traverse(); - break; - case GLFW_KEY_L: - activeWindow->lightsManager->traverse(); - break; - case GLFW_KEY_B: - PRINT(activeWindow->frame->bounds()); - break; - case GLFW_KEY_V: - activeWindow->frame->child("camera").traverse(); - break; - case GLFW_KEY_SPACE: - if (activeWindow->cameraStack.size() >= 2) { - g_animatingPath = !g_animatingPath; - g_camCurrentPathIndex = 0; - if (g_animatingPath) { - g_camPath = buildPath( - activeWindow->cameraStack, g_camPathSpeed * 0.01); - } - } - activeWindow->animationWidget->togglePlay(); - break; - case GLFW_KEY_EQUAL: - activeWindow->pushLookMark(); - break; - case GLFW_KEY_MINUS: - activeWindow->popLookMark(); - break; - case GLFW_KEY_0: /* fallthrough */ - case GLFW_KEY_1: /* fallthrough */ - case GLFW_KEY_2: /* fallthrough */ - case GLFW_KEY_3: /* fallthrough */ - case GLFW_KEY_4: /* fallthrough */ - case GLFW_KEY_5: /* fallthrough */ - case GLFW_KEY_6: /* fallthrough */ - case GLFW_KEY_7: /* fallthrough */ - case GLFW_KEY_8: /* fallthrough */ - case GLFW_KEY_9: - activeWindow->setCameraSnapshot((key + 9 - GLFW_KEY_0) % 10); + g_camMoveA = 0; + g_camMoveR = 0; break; } } - if (action == GLFW_RELEASE) { - switch (key) { - case GLFW_KEY_X: - case GLFW_KEY_Y: - case GLFW_KEY_Z: - g_rotationConstraint = -1; - break; - case GLFW_KEY_UP: - case GLFW_KEY_DOWN: - g_camMoveZ = 0; - g_camMoveY = 0; - break; - case GLFW_KEY_LEFT: - case GLFW_KEY_RIGHT: - g_camMoveX = 0; - break; - case GLFW_KEY_W: - case GLFW_KEY_S: - g_camMoveE = 0; - break; - case GLFW_KEY_A: - case GLFW_KEY_D: - g_camMoveA = 0; - g_camMoveR = 0; - break; - } - } - }); - - // set GLFW callbacks - glfwSetFramebufferSizeCallback( - glfwWindow, [](GLFWwindow *, int newWidth, int newHeight) { - activeWindow->reshape(vec2i{newWidth, newHeight}); - }); - - glfwSetMouseButtonCallback(glfwWindow, [](GLFWwindow *win, int, int action, int) { - ImGuiIO &io = ImGui::GetIO(); - if (!activeWindow->showUi || !io.WantCaptureMouse) { - double x, y; - glfwGetCursorPos(win, &x, &y); - activeWindow->mouseButton(vec2f{float(x), float(y)}); - - activeWindow->getFrame()->setNavMode(action == GLFW_PRESS); - } - }); + }); + + // set GLFW callbacks + glfwSetFramebufferSizeCallback( + glfwWindow, [](GLFWwindow *, int newWidth, int newHeight) { + activeWindow->reshape(vec2i{newWidth, newHeight}); + }); + + glfwSetMouseButtonCallback(glfwWindow, [](GLFWwindow *win, int, int action, int) { + ImGuiIO &io = ImGui::GetIO(); + if (!activeWindow->showUi || !io.WantCaptureMouse) { + double x, y; + glfwGetCursorPos(win, &x, &y); + activeWindow->mouseButton(vec2f{float(x), float(y)}); + + activeWindow->getFrame()->setNavMode(action == GLFW_PRESS); + } + }); - glfwSetScrollCallback(glfwWindow, [](GLFWwindow *, double x, double y) { - ImGuiIO &io = ImGui::GetIO(); - if (!activeWindow->showUi || !io.WantCaptureMouse) { - activeWindow->mouseWheel(vec2f{float(x), float(y)}); - } - }); + glfwSetScrollCallback(glfwWindow, [](GLFWwindow *, double x, double y) { + ImGuiIO &io = ImGui::GetIO(); + if (!activeWindow->showUi || !io.WantCaptureMouse) { + activeWindow->mouseWheel(vec2f{float(x), float(y)}); + } + }); - glfwSetCursorPosCallback(glfwWindow, [](GLFWwindow *, double x, double y) { - ImGuiIO &io = ImGui::GetIO(); - if (!activeWindow->showUi || !io.WantCaptureMouse) { - activeWindow->motion(vec2f{float(x), float(y)}); - } - }); + glfwSetCursorPosCallback(glfwWindow, [](GLFWwindow *, double x, double y) { + ImGuiIO &io = ImGui::GetIO(); + if (!activeWindow->showUi || !io.WantCaptureMouse) { + activeWindow->motion(vec2f{float(x), float(y)}); + } + }); + } ImGui::CreateContext(); @@ -443,6 +473,14 @@ MultiWindows::MultiWindows(StudioCommon &_common) refreshScene(true); + // set the initial state + sharedState.camChanged = true; + auto camera = frame->child("camera").nodeAs(); + sharedState.eyePos = camera->child("position").valueAs(); + sharedState.lookDir = camera->child("direction").valueAs(); + sharedState.upDir = camera->child("up").valueAs(); + showUi = sg::sgMpiRank() == 0; + // trigger window reshape events with current window size glfwGetFramebufferSize(glfwWindow, &windowSize.x, &windowSize.y); reshape(windowSize); @@ -523,7 +561,24 @@ void MultiWindows::mainLoop() // continue until the user closes the window startNewOSPRayFrame(); - while (!glfwWindowShouldClose(glfwWindow) && !g_quitNextFrame) { + while (true) { + MPI_Bcast(&sharedState, sizeof(sharedState), MPI_BYTE, 0, MPI_COMM_WORLD); + + { // process changes in the shared state + if (sharedState.quit) { + break; + } + + if (sharedState.camChanged) { + auto camera = frame->child("camera").nodeAs(); + camera->child("position").setValue(sharedState.eyePos); + camera->child("direction").setValue(sharedState.lookDir); + camera->child("up").setValue(sharedState.upDir); + + sharedState.camChanged = false; + } + } + ImGui_ImplOpenGL2_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); @@ -569,7 +624,21 @@ void MultiWindows::mainLoop() display(); + // poll and process events glfwPollEvents(); + if (sg::sgMpiRank() == 0) { + sharedState.quit = glfwWindowShouldClose(glfwWindow) || g_quitNextFrame; + + // check if the camera has been updated + auto camera = frame->child("camera").nodeAs(); + if (camera->isModified()) { + sharedState.camChanged = true; + sharedState.eyePos = camera->child("position").valueAs(); + sharedState.lookDir = camera->child("direction").valueAs(); + sharedState.upDir = camera->child("up").valueAs(); + } + } + MPI_Barrier(MPI_COMM_WORLD); } waitOnOSPRayFrame(); @@ -1103,6 +1172,9 @@ void MultiWindows::display() glfwMakeContextCurrent(backup_current_context); } + // wait for other ranks to reach this point before swapping the buffer + MPI_Barrier(MPI_COMM_WORLD); + // swap buffers glfwSwapBuffers(glfwWindow); } @@ -1275,6 +1347,43 @@ void MultiWindows::refreshScene(bool resetCam) } void MultiWindows::addToCommandLine(std::shared_ptr app) { + app->add_option( + "--displayConfig", + [&](const std::vector val) { + try { + std::ifstream configFile(val[0]); + if (!configFile) { + std::cerr << "The display config file does not exist." << std::endl; + return false; + } + configFile >> configDisplay; + } catch (nlohmann::json::exception &e) { + std::cerr << "Failed to parse the display config file: " << e.what() << std::endl; + return false; + } + if (configDisplay.empty()) { + std::cerr << "The display config file is empty." << std::endl; + return false; + } + return true; + }, + "Sets the display configuration file path" + ); + + app->add_option( + "--scene", + [&](const std::vector val) { + for (size_t i = 0; i < g_scenes.size(); ++i) { + if (val[0] == g_scenes[i]) { + scene = g_scenes[i]; + return true; + } + } + std::cerr << "The scene name does not exist." << std::endl; + return false; + }, + "Sets the opening scene name" + ); } bool MultiWindows::parseCommandLine() @@ -1284,6 +1393,8 @@ bool MultiWindows::parseCommandLine() std::shared_ptr app = std::make_shared("OSPRay Studio MULTIWINDOWS"); StudioContext::addToCommandLine(app); + // remove --resolution option as it is set by a config file + app->remove_option(app->get_option("--resolution")); MultiWindows::addToCommandLine(app); try { app->parse(ac, av); @@ -1291,13 +1402,6 @@ bool MultiWindows::parseCommandLine() exit(app->exit(e)); } - // XXX: changing windowSize here messes causes some display scaling issues - // because it desyncs window and framebuffer size with any scaling - if (optResolution.x != 0) { - windowSize = optResolution; - glfwSetWindowSize(glfwWindow, optResolution.x, optResolution.y); - reshape(windowSize); - } rendererTypeStr = optRendererTypeStr; return true; diff --git a/app/MultiWindows.h b/app/MultiWindows.h index 66fa59c5..0bbfee70 100644 --- a/app/MultiWindows.h +++ b/app/MultiWindows.h @@ -52,6 +52,18 @@ enum class OSPRayRendererType OTHER }; +struct SharedState +{ + bool quit; + + bool camChanged; + vec3f eyePos; + vec3f lookDir; + vec3f upDir; + + SharedState(); +}; + class MultiWindows : public StudioContext { public: @@ -225,6 +237,11 @@ class MultiWindows : public StudioContext bool optShowDepthInvert{false}; bool optAutorotate{false}; bool optAnimate{false}; + + // configuration for displays + nlohmann::ordered_json configDisplay; + // the state to be sent out over MPI to the other rendering processes + SharedState sharedState; }; } // namespace devel \ No newline at end of file From 6630188cd53418f0c3fde71439e9087392d61244 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Wed, 8 Feb 2023 21:12:34 -0600 Subject: [PATCH 06/18] Integrate off-axis projection --- app/MultiWindows.cpp | 71 ++++++++++++++++++++++++++++----------- app/MultiWindows.h | 8 +++-- sg/camera/Perspective.cpp | 9 +++++ 3 files changed, 66 insertions(+), 22 deletions(-) diff --git a/app/MultiWindows.cpp b/app/MultiWindows.cpp index a0df65f1..fb0731cb 100644 --- a/app/MultiWindows.cpp +++ b/app/MultiWindows.cpp @@ -255,6 +255,50 @@ MultiWindows::MultiWindows(StudioCommon &_common) int y = (int) configDisplay[sg::sgMpiRank()]["screenY"] + yVirtual; glfwSetWindowPos(glfwWindow, x, y); + // update three corners of the image plane + { + topLeftLocal = configDisplay[sg::sgMpiRank()]["topLeft"].get(); + botLeftLocal = configDisplay[sg::sgMpiRank()]["botLeft"].get(); + botRightLocal = configDisplay[sg::sgMpiRank()]["botRight"].get(); + vec3f eyePos = configDisplay[sg::sgMpiRank()]["eye"].get(); + vec4f mullion { + configDisplay[sg::sgMpiRank()]["mullionLeft"], + configDisplay[sg::sgMpiRank()]["mullionRight"], + configDisplay[sg::sgMpiRank()]["mullionTop"], + configDisplay[sg::sgMpiRank()]["mullionBottom"]}; + + // use mullion values to update the three corners + vec3f tl = topLeftLocal, bl = botLeftLocal, br = botRightLocal; + + float mullionLeft = mullion[0]; + botLeftLocal += normalize(br - bl) * mullionLeft; + topLeftLocal += normalize(br - bl) * mullionLeft; + + float mullionRight = mullion[1]; + botRightLocal += normalize(bl - br) * mullionRight; + + float mullionTop = mullion[2]; + topLeftLocal += normalize(bl - tl) * mullionTop; + + float mullionBottom = mullion[3]; + botLeftLocal += normalize(tl - bl) * mullionBottom; + botRightLocal += normalize(tl - bl) * mullionBottom; + + // update the camera + auto camera = frame->child("camera").nodeAs(); + + camera->child("offAxisMode").setValue(true); + camera->child("position").setValue(eyePos); + camera->child("topLeft").setValue(topLeftLocal); + camera->child("botLeft").setValue(botLeftLocal); + camera->child("botRight").setValue(botRightLocal); + + camera->child("aspect").setValue(length(botRightLocal - botLeftLocal) / length(topLeftLocal - botLeftLocal)); + float angle = acos(dot(topLeftLocal, botLeftLocal) / (length(topLeftLocal) * length(botLeftLocal))) * 180.f / M_PI; + camera->child("fovy").setValue(angle); + camera->child("direction").setValue(vec3f{0,0,-1}); + } + // further configure GLFW window based on rank if (sg::sgMpiRank() == 0) { glfwSetWindowAspectRatio(glfwWindow, windowSize.x, windowSize.y); @@ -476,9 +520,7 @@ MultiWindows::MultiWindows(StudioCommon &_common) // set the initial state sharedState.camChanged = true; auto camera = frame->child("camera").nodeAs(); - sharedState.eyePos = camera->child("position").valueAs(); - sharedState.lookDir = camera->child("direction").valueAs(); - sharedState.upDir = camera->child("up").valueAs(); + sharedState.transform = camera->child("transform").valueAs(); showUi = sg::sgMpiRank() == 0; // trigger window reshape events with current window size @@ -571,9 +613,10 @@ void MultiWindows::mainLoop() if (sharedState.camChanged) { auto camera = frame->child("camera").nodeAs(); - camera->child("position").setValue(sharedState.eyePos); - camera->child("direction").setValue(sharedState.lookDir); - camera->child("up").setValue(sharedState.upDir); + camera->child("transform").setValue(sharedState.transform); + camera->child("topLeft").setValue(xfmPoint(sharedState.transform, topLeftLocal)); + camera->child("botLeft").setValue(xfmPoint(sharedState.transform, botLeftLocal)); + camera->child("botRight").setValue(xfmPoint(sharedState.transform, botRightLocal)); sharedState.camChanged = false; } @@ -628,15 +671,6 @@ void MultiWindows::mainLoop() glfwPollEvents(); if (sg::sgMpiRank() == 0) { sharedState.quit = glfwWindowShouldClose(glfwWindow) || g_quitNextFrame; - - // check if the camera has been updated - auto camera = frame->child("camera").nodeAs(); - if (camera->isModified()) { - sharedState.camChanged = true; - sharedState.eyePos = camera->child("position").valueAs(); - sharedState.lookDir = camera->child("direction").valueAs(); - sharedState.upDir = camera->child("up").valueAs(); - } } MPI_Barrier(MPI_COMM_WORLD); } @@ -736,10 +770,6 @@ void MultiWindows::updateCamera() activeWindow->centerOnEyePos(); } - camera->child("position").setValue(arcballCamera->eyePos()); - camera->child("direction").setValue(arcballCamera->lookDir()); - camera->child("up").setValue(arcballCamera->upDir()); - if (camera->hasChild("focusDistance") && !camera->child("cameraId").valueAs()) { float focusDistance = rkcommon::math::length( @@ -754,6 +784,9 @@ void MultiWindows::updateCamera() } camera->child("focusDistance").setValue(focusDistance); } + + sharedState.camChanged = true; + sharedState.transform = arcballCamera->getTransform(); } void MultiWindows::setCameraState(CameraState &cs) diff --git a/app/MultiWindows.h b/app/MultiWindows.h index 0bbfee70..4e9727bc 100644 --- a/app/MultiWindows.h +++ b/app/MultiWindows.h @@ -57,9 +57,7 @@ struct SharedState bool quit; bool camChanged; - vec3f eyePos; - vec3f lookDir; - vec3f upDir; + affine3f transform; SharedState(); }; @@ -242,6 +240,10 @@ class MultiWindows : public StudioContext nlohmann::ordered_json configDisplay; // the state to be sent out over MPI to the other rendering processes SharedState sharedState; + // three corners of a display + vec3f topLeftLocal; + vec3f botLeftLocal; + vec3f botRightLocal; }; } // namespace devel \ No newline at end of file diff --git a/sg/camera/Perspective.cpp b/sg/camera/Perspective.cpp index ec96032d..6c4ff164 100644 --- a/sg/camera/Perspective.cpp +++ b/sg/camera/Perspective.cpp @@ -49,6 +49,15 @@ Perspective::Perspective() : Camera("perspective") child("interpupillaryDistance").setMinMax(0.f, 0.1f); child("aspect").setReadOnly(); + + createChild("offAxisMode", + "bool", + "toggle off-axis projection mode", + false); + createChild("transform", "affine3f", affine3f(one)); + createChild("topLeft", "vec3f", vec3f{-10.0f, 10.0f, -20.0f}); + createChild("botLeft", "vec3f", vec3f{-10.0f, -10.0f, -20.0f}); + createChild("botRight", "vec3f", vec3f{10.0f, -10.0f, -20.0f}); } OSP_REGISTER_SG_NODE_NAME(Perspective, camera_perspective); From 70532794d516655f2f16675e69564faa10d8f7db Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Sun, 19 Feb 2023 04:44:13 -0600 Subject: [PATCH 07/18] Add Gesture Plugin --- .gitignore | 1 + app/ArcballCamera.cpp | 5 + app/ArcballCamera.h | 1 + app/MultiWindows.cpp | 5 +- plugins/gesture_plugin/CMakeLists.txt | 33 +++ plugins/gesture_plugin/PanelGesture.cpp | 100 +++++++ plugins/gesture_plugin/PanelGesture.h | 25 ++ .../gesture_plugin/external/CMakeLists.txt | 1 + .../external/async-sockets/CMakeLists.txt | 3 + .../external/async-sockets/basesocket.hpp | 146 ++++++++++ .../external/async-sockets/tcpserver.hpp | 175 ++++++++++++ .../external/async-sockets/tcpsocket.hpp | 258 ++++++++++++++++++ plugins/gesture_plugin/plugin_gesture.cpp | 52 ++++ plugins/gesture_plugin/tracker/TrackingData.h | 122 +++++++++ .../tracker/TrackingManager.cpp | 214 +++++++++++++++ .../gesture_plugin/tracker/TrackingManager.h | 55 ++++ .../tracker/tracking_settings.json | 10 + 17 files changed, 1203 insertions(+), 3 deletions(-) create mode 100644 plugins/gesture_plugin/CMakeLists.txt create mode 100644 plugins/gesture_plugin/PanelGesture.cpp create mode 100644 plugins/gesture_plugin/PanelGesture.h create mode 100644 plugins/gesture_plugin/external/CMakeLists.txt create mode 100644 plugins/gesture_plugin/external/async-sockets/CMakeLists.txt create mode 100644 plugins/gesture_plugin/external/async-sockets/basesocket.hpp create mode 100644 plugins/gesture_plugin/external/async-sockets/tcpserver.hpp create mode 100644 plugins/gesture_plugin/external/async-sockets/tcpsocket.hpp create mode 100644 plugins/gesture_plugin/plugin_gesture.cpp create mode 100644 plugins/gesture_plugin/tracker/TrackingData.h create mode 100644 plugins/gesture_plugin/tracker/TrackingManager.cpp create mode 100644 plugins/gesture_plugin/tracker/TrackingManager.h create mode 100644 plugins/gesture_plugin/tracker/tracking_settings.json diff --git a/.gitignore b/.gitignore index 142a5560..6f7e0183 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ !/plugins /plugins/* !/plugins/example_plugin +!/plugins/gesture_plugin doc/*.html diff --git a/app/ArcballCamera.cpp b/app/ArcballCamera.cpp index 750f9496..df6e07ed 100644 --- a/app/ArcballCamera.cpp +++ b/app/ArcballCamera.cpp @@ -83,6 +83,11 @@ void ArcballCamera::pan(const vec2f &delta) updateCamera(); } +void ArcballCamera::move(const rkcommon::math::vec3f &dir) { + translation = AffineSpace3f::translate(-dir) * translation; + updateCamera(); +} + vec3f ArcballCamera::eyePos() const { return cameraToWorld.p; diff --git a/app/ArcballCamera.h b/app/ArcballCamera.h index e4a8305a..386a8922 100644 --- a/app/ArcballCamera.h +++ b/app/ArcballCamera.h @@ -113,6 +113,7 @@ class ArcballCamera void zoom(float amount); void dolly(float amount); void pan(const vec2f &delta); + void move(const vec3f &dir); vec3f eyePos() const; vec3f center() const; diff --git a/app/MultiWindows.cpp b/app/MultiWindows.cpp index fb0731cb..0a359e3a 100644 --- a/app/MultiWindows.cpp +++ b/app/MultiWindows.cpp @@ -670,6 +670,8 @@ void MultiWindows::mainLoop() // poll and process events glfwPollEvents(); if (sg::sgMpiRank() == 0) { + sharedState.camChanged = true; + sharedState.transform = arcballCamera->getTransform(); sharedState.quit = glfwWindowShouldClose(glfwWindow) || g_quitNextFrame; } MPI_Barrier(MPI_COMM_WORLD); @@ -784,9 +786,6 @@ void MultiWindows::updateCamera() } camera->child("focusDistance").setValue(focusDistance); } - - sharedState.camChanged = true; - sharedState.transform = arcballCamera->getTransform(); } void MultiWindows::setCameraState(CameraState &cs) diff --git a/plugins/gesture_plugin/CMakeLists.txt b/plugins/gesture_plugin/CMakeLists.txt new file mode 100644 index 00000000..9e9da39f --- /dev/null +++ b/plugins/gesture_plugin/CMakeLists.txt @@ -0,0 +1,33 @@ +option(BUILD_PLUGIN_GESTURE "Gesture plugin" OFF) + +if (BUILD_PLUGIN_GESTURE) + set(pluginName "ospray_studio_plugin_gesture") + + add_library(${pluginName} SHARED + plugin_gesture.cpp + PanelGesture.cpp + tracker/TrackingManager.cpp + ) + + target_link_libraries(${pluginName} ospray_sg ospray_ui) + + # Only link against imgui if needed (ie, pure file importers don't) + target_link_libraries(${pluginName} imgui) + + # Add external libraries for this plugin + add_subdirectory(external) + target_link_libraries(${pluginName} network) + + target_include_directories(${pluginName} + PRIVATE ${CMAKE_SOURCE_DIR} + ) + + install(TARGETS ${pluginName} + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT lib + # on Windows put the dlls into bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT lib + ) + +endif() diff --git a/plugins/gesture_plugin/PanelGesture.cpp b/plugins/gesture_plugin/PanelGesture.cpp new file mode 100644 index 00000000..cdd74326 --- /dev/null +++ b/plugins/gesture_plugin/PanelGesture.cpp @@ -0,0 +1,100 @@ +#include + +#include "PanelGesture.h" + +#include "app/widgets/GenerateImGuiWidgets.h" + +#include "sg/JSONDefs.h" +#include "sg/Math.h" +#include "sg/JSONDefs.h" + +#include "imgui.h" + +namespace ospray { +namespace gesture_plugin { + +PanelGesture::PanelGesture(std::shared_ptr _context, std::string _panelName, std::string _configFilePath) + : Panel(_panelName.c_str(), _context) + , panelName(_panelName) + , configFilePath(_configFilePath) +{ + trackingManager.reset(new TrackingManager(configFilePath)); +} + +void PanelGesture::buildUI(void *ImGuiCtx) +{ + // Need to set ImGuiContext in *this* address space + ImGui::SetCurrentContext((ImGuiContext *)ImGuiCtx); + ImGui::OpenPopup(panelName.c_str()); + + if (!ImGui::BeginPopupModal(panelName.c_str(), nullptr, ImGuiWindowFlags_None)) return; + + if (trackingManager->isRunning()) { + ImGui::Text("%s", "Currently connected to the server..."); + + if (ImGui::Button("Disconnect")) { + trackingManager->close(); + } + else { + // poll state... update the camera + TrackingState state = trackingManager->pollState(); + if (state.mode == INTERACTION_FLYING) { + context->arcballCamera->move(state.leaningDir); + } + } + } + else { + ImGui::Text("%s", "Currently NOT connected to the server..."); + std::string str = "- Connect to " + trackingManager->ipAddress + ":" + std::to_string(trackingManager->portNumber); + ImGui::Text("%s", str.c_str()); + + if (ImGui::Button("Connect")) { + trackingManager->start(); + } + } + ImGui::Separator(); + + // Close button + if (ImGui::Button("Close")) { + setShown(false); + ImGui::CloseCurrentPopup(); + } + ImGui::Separator(); + + if (ImGui::CollapsingHeader("Configuration", ImGuiTreeNodeFlags_DefaultOpen)) { + ImGui::Text("%s", "Offset(s)"); + ImGui::DragFloat3("Scale", trackingManager->scaleOffset, 0.001, -100, 100, "%.3f"); + ImGui::DragFloat3("Translate", trackingManager->translationOffset, 0, -100, 100, "%.1f"); + + ImGui::Text("%s", "Gestures(s)"); + ImGui::DragInt("Confidence Level Threshold", &trackingManager->confidenceLevelThreshold, K4ABT_JOINT_CONFIDENCE_LOW, K4ABT_JOINT_CONFIDENCE_NONE, K4ABT_JOINT_CONFIDENCE_LEVELS_COUNT); + ImGui::DragFloat("Leaning Angle Threshold", &trackingManager->leaningAngleThreshold, 1, 0, 180); + ImGui::DragFloat3("Leaning Dir Scale", trackingManager->leaningDirScaleFactor, 0, -100, 100, "%.1f"); + + ImGui::Separator(); + if (ImGui::Button("Save")) { + trackingManager->saveConfig(this->configFilePath); + } + // ImGui::SameLine(); + // if (ImGui::Button("Load")) { + // // TODO + // // loadConfig(); + // } + } + ImGui::Separator(); + + // Display statuses in a scrolling region + if (ImGui::CollapsingHeader("Status", ImGuiTreeNodeFlags_DefaultOpen)) { + ImGui::BeginChild("Scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_AlwaysAutoResize); + for (std::string status : trackingManager->statuses) { + ImGui::Text("%s", status.c_str()); + } + ImGui::EndChild(); + } + ImGui::Separator(); + + ImGui::EndPopup(); +} + +} // namespace gesture_plugin +} // namespace ospray diff --git a/plugins/gesture_plugin/PanelGesture.h b/plugins/gesture_plugin/PanelGesture.h new file mode 100644 index 00000000..e38f540c --- /dev/null +++ b/plugins/gesture_plugin/PanelGesture.h @@ -0,0 +1,25 @@ +#pragma once + +#include "app/widgets/Panel.h" +#include "app/ospStudio.h" + +#include "tracker/TrackingManager.h" + +namespace ospray { +namespace gesture_plugin { + +struct PanelGesture : public Panel +{ + PanelGesture(std::shared_ptr _context, std::string _panelName, std::string _configFilePath); + + void buildUI(void *ImGuiCtx) override; + +private: + std::string panelName; + std::string configFilePath; + + std::unique_ptr trackingManager; +}; + +} // namespace gesture_plugin +} // namespace ospray diff --git a/plugins/gesture_plugin/external/CMakeLists.txt b/plugins/gesture_plugin/external/CMakeLists.txt new file mode 100644 index 00000000..fc999e8a --- /dev/null +++ b/plugins/gesture_plugin/external/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(async-sockets) \ No newline at end of file diff --git a/plugins/gesture_plugin/external/async-sockets/CMakeLists.txt b/plugins/gesture_plugin/external/async-sockets/CMakeLists.txt new file mode 100644 index 00000000..8d9267dd --- /dev/null +++ b/plugins/gesture_plugin/external/async-sockets/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(network INTERFACE) +target_include_directories(network + INTERFACE $) \ No newline at end of file diff --git a/plugins/gesture_plugin/external/async-sockets/basesocket.hpp b/plugins/gesture_plugin/external/async-sockets/basesocket.hpp new file mode 100644 index 00000000..47312430 --- /dev/null +++ b/plugins/gesture_plugin/external/async-sockets/basesocket.hpp @@ -0,0 +1,146 @@ +// The Linux and Mac implementations are from https://github.com/eminfedar/async-sockets-cpp +// Updated it to suport Windows. +#pragma once + +#if defined(__linux__) || defined(__APPLE__) + +#include +#include +#include +#include +#include + +#include +#include +#include + +#define FDR_UNUSED(expr){ (void)(expr); } +#define FDR_ON_ERROR std::function onError = [](int errorCode, std::string errorMessage){FDR_UNUSED(errorCode); FDR_UNUSED(errorMessage)} + +class BaseSocket +{ +// Definitions +public: + enum SocketType + { + TCP = SOCK_STREAM, + UDP = SOCK_DGRAM + }; + const uint16_t BUFFER_SIZE = 0xFFFF; + sockaddr_in address; + bool isClosed = false; + +protected: + int sock = 0; + static std::string ipToString(sockaddr_in addr) + { + char ip[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN); + + return std::string(ip); + } + + BaseSocket(FDR_ON_ERROR, SocketType sockType = TCP, int socketId = -1) + { + if (socketId < 0) + { + if ((this->sock = socket(AF_INET, sockType, 0)) < 0) + { + onError(errno, "Socket creating error."); + } + } + else + { + this->sock = socketId; + } + } + +// Methods +public: + virtual void Close() { + if(isClosed) return; + + isClosed = true; + close(this->sock); + } + + std::string remoteAddress() {return ipToString(this->address);} + int remotePort() {return ntohs(this->address.sin_port);} + int fileDescriptor() const { return this->sock; } +}; + +#elif _WIN32 + +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include + +#include +#include +#include + +// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib +#pragma comment (lib, "Ws2_32.lib") +#pragma comment (lib, "Mswsock.lib") +#pragma comment (lib, "AdvApi32.lib") + +#define DEFAULT_BUFLEN 512 +#define FDR_UNUSED(expr){ (void)(expr); } +#define FDR_ON_ERROR std::function onError = [](int errorCode, std::string errorMessage){FDR_UNUSED(errorCode); FDR_UNUSED(errorMessage)} + +class BaseSocket +{ +// Definitions +public: + sockaddr_in address; + bool isClosed = false; + +protected: + SOCKET sock = INVALID_SOCKET; + + static std::string ipToString(sockaddr_in addr) { + char ip[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN); + + return std::string(ip); + } + + BaseSocket(FDR_ON_ERROR, int socketId = -1) { + // Initialize Winsock + WSADATA wsaData; + int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (iResult != 0) { + onError(errno, "WSAStartup failed with error: " + std::to_string(iResult)); + return; + } + + if (socketId < 0) { + // Create a SOCKET to connect to server or to listen for client connections + this->sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (this->sock == INVALID_SOCKET) { + onError(errno, "socket failed with error: " + std::to_string(WSAGetLastError())); + WSACleanup(); + return; + } + } else { + this->sock = (SOCKET) socketId; + } + } + +// Methods +public: + virtual void Close() { + if (isClosed) return; + + isClosed = true; + closesocket(this->sock); + WSACleanup(); + } + + std::string remoteAddress() { return ipToString(this->address); } + int remotePort() { return ntohs(this->address.sin_port); } +}; + +#endif \ No newline at end of file diff --git a/plugins/gesture_plugin/external/async-sockets/tcpserver.hpp b/plugins/gesture_plugin/external/async-sockets/tcpserver.hpp new file mode 100644 index 00000000..8e9096ec --- /dev/null +++ b/plugins/gesture_plugin/external/async-sockets/tcpserver.hpp @@ -0,0 +1,175 @@ +// The Linux and Mac implementations are from https://github.com/eminfedar/async-sockets-cpp +// Updated it to suport Windows. +#pragma once + +#if defined(__linux__) || defined(__APPLE__) + +#include "tcpsocket.hpp" +#include + +class TCPServer : public BaseSocket +{ +public: + // Event Listeners: + std::function onNewConnection = [](TCPSocket* sock){FDR_UNUSED(sock)}; + + explicit TCPServer(FDR_ON_ERROR): BaseSocket(onError, SocketType::TCP) + { + int opt = 1; + setsockopt(this->sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(int)); + setsockopt(this->sock,SOL_SOCKET,SO_REUSEPORT,&opt,sizeof(int)); + } + + // Binding the server. + void Bind(const char *address, uint16_t port, FDR_ON_ERROR) + { + if (inet_pton(AF_INET, address, &this->address.sin_addr) <= 0) + { + onError(errno, "Invalid address. Address type not supported."); + return; + } + + this->address.sin_family = AF_INET; + this->address.sin_port = htons(port); + + if (bind(this->sock, (const sockaddr *)&this->address, sizeof(this->address)) < 0) + { + onError(errno, "Cannot bind the socket."); + return; + } + } + void Bind(int port, FDR_ON_ERROR) { this->Bind("0.0.0.0", port, onError); } + + // Start listening the server. + void Listen(FDR_ON_ERROR) + { + if (listen(this->sock, 20) < 0) + { + onError(errno, "Error: Server can't listen the socket."); + return; + } + + std::thread t(Accept, this, onError); + t.detach(); + } + + // Overriding Close to add shutdown(): + void Close() + { + shutdown(this->sock, SHUT_RDWR); + + BaseSocket::Close(); + } + +private: + static void Accept(TCPServer *server, FDR_ON_ERROR) + { + sockaddr_in newSocketInfo; + socklen_t newSocketInfoLength = sizeof(newSocketInfo); + + int newSock; + while (!server->isClosed) + { + while ((newSock = accept(server->sock, (sockaddr *)&newSocketInfo, &newSocketInfoLength)) < 0) + { + if (errno == EBADF || errno == EINVAL) return; + + onError(errno, "Error while accepting a new connection."); + return; + } + + if (!server->isClosed && newSock >= 0) + { + TCPSocket *newSocket = new TCPSocket(onError, newSock); + newSocket->deleteAfterClosed = true; + newSocket->setAddressStruct(newSocketInfo); + + server->onNewConnection(newSocket); + newSocket->Listen(); + } + } + } +}; + +#elif _WIN32 + +#include "tcpsocket.hpp" + +#include +#include + +class TCPServer : public BaseSocket +{ +public: + // Event Listeners: + std::function onNewConnection = [](TCPSocket* sock){FDR_UNUSED(sock)}; + + explicit TCPServer(FDR_ON_ERROR): BaseSocket(onError) { + BOOL bOptVal = TRUE; + setsockopt(this->sock, SOL_SOCKET, SO_REUSEADDR, (char *) &bOptVal, sizeof(BOOL)); + } + + // Binding the server. + void Bind(const char *address, uint16_t port, FDR_ON_ERROR) { + if (inet_pton(AF_INET, address, &this->address.sin_addr) <= 0) { + onError(errno, "Invalid address. Address type not supported."); + return; + } + + this->address.sin_family = AF_INET; + this->address.sin_port = htons(port); + + if (bind(this->sock, (const sockaddr *)&this->address, sizeof(this->address)) == SOCKET_ERROR) { + onError(errno, "Cannot bind the socket."); + //// + return; + } + } + void Bind(int port, FDR_ON_ERROR) { this->Bind("0.0.0.0", port, onError); } + + // Start listening the server. + void Listen(FDR_ON_ERROR) { + if (listen(this->sock, 20) == SOCKET_ERROR) { + onError(errno, "Error: Server can't listen the socket."); + return; + } + + std::thread t(Accept, this, onError); + t.detach(); + } + + // Overriding Close to add shutdown(): + void Close() { + shutdown(this->sock, SD_BOTH); + + BaseSocket::Close(); + } + +private: + static void Accept(TCPServer *server, FDR_ON_ERROR) { + sockaddr_in newSocketInfo; + socklen_t newSocketInfoLength = sizeof(newSocketInfo); + + SOCKET newSock = 0; + while (!server->isClosed) { + newSock = accept(server->sock, (sockaddr *)&newSocketInfo, &newSocketInfoLength); + if (newSock == INVALID_SOCKET) { + if (errno == EBADF || errno == EINVAL) return; + + onError(errno, "Error while accepting a new connection." + std::to_string(WSAGetLastError())); + return; + } + + if (!server->isClosed && newSock >= 0) { + TCPSocket *newSocket = new TCPSocket(onError, newSock); + newSocket->deleteAfterClosed = true; + newSocket->setAddressStruct(newSocketInfo); + + server->onNewConnection(newSocket); + newSocket->Listen(); + } + } + } +}; + +#endif \ No newline at end of file diff --git a/plugins/gesture_plugin/external/async-sockets/tcpsocket.hpp b/plugins/gesture_plugin/external/async-sockets/tcpsocket.hpp new file mode 100644 index 00000000..ea12f9e8 --- /dev/null +++ b/plugins/gesture_plugin/external/async-sockets/tcpsocket.hpp @@ -0,0 +1,258 @@ +// The Linux and Mac implementations are from https://github.com/eminfedar/async-sockets-cpp +// Updated it to suport Windows. +#pragma once + +#if defined(__linux__) || defined(__APPLE__) + +#include "basesocket.hpp" +#include +#include +#include +// copied from https://github.com/eminfedar/async-sockets-cpp + +#include + +class TCPSocket : public BaseSocket +{ +public: + // Event Listeners: + std::function onMessageReceived; + std::function onRawMessageReceived; + std::function onSocketClosed; + + explicit TCPSocket(FDR_ON_ERROR, int socketId = -1) : BaseSocket(onError, TCP, socketId){} + + // Send TCP Packages + int Send(const char *bytes, size_t byteslength) + { + if (this->isClosed) + return -1; + + int sent = 0; + if ((sent = send(this->sock, bytes, byteslength, 0)) < 0) + { + perror("send"); + } + return sent; + } + int Send(std::string message) { return this->Send(message.c_str(), message.length()); } + + void Connect(std::string host, uint16_t port, std::function onConnected = [](){}, FDR_ON_ERROR) + { + struct addrinfo hints, *res, *it; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + + // Get address info from DNS + int status; + if ((status = getaddrinfo(host.c_str(), NULL, &hints, &res)) != 0) { + onError(errno, "Invalid address." + std::string(gai_strerror(status))); + return; + } + + for(it = res; it != NULL; it = it->ai_next) + { + if (it->ai_family == AF_INET) { // IPv4 + memcpy((void*)(&this->address), (void*)it->ai_addr, sizeof(sockaddr_in)); + break; // for now, just get first ip (ipv4). + } + } + + freeaddrinfo(res); + + this->Connect((uint32_t)this->address.sin_addr.s_addr, port, onConnected, onError); + } + void Connect(uint32_t ipv4, uint16_t port, std::function onConnected = [](){}, FDR_ON_ERROR) + { + this->address.sin_family = AF_INET; + this->address.sin_port = htons(port); + this->address.sin_addr.s_addr = ipv4; + + this->setTimeout(5); + + // Try to connect. + if (connect(this->sock, (const sockaddr *)&this->address, sizeof(sockaddr_in)) < 0) + { + onError(errno, "Connection failed to the host."); + this->setTimeout(0); + return; + } + + this->setTimeout(0); + + // Connected to the server, fire the event. + onConnected(); + + // Start listening from server: + this->Listen(); + } + + void Listen() + { + std::thread t(TCPSocket::Receive, this); + t.detach(); + } + + void setAddressStruct(sockaddr_in addr) {this->address = addr;} + sockaddr_in getAddressStruct() const {return this->address;} + + bool deleteAfterClosed = false; + +private: + static void Receive(TCPSocket *socket) + { + char tempBuffer[socket->BUFFER_SIZE]; + int messageLength; + + while ((messageLength = recv(socket->sock, tempBuffer, socket->BUFFER_SIZE, 0)) > 0) + { + tempBuffer[messageLength] = '\0'; + if(socket->onMessageReceived) + socket->onMessageReceived(std::string(tempBuffer, messageLength)); + + if(socket->onRawMessageReceived) + socket->onRawMessageReceived(tempBuffer, messageLength); + } + + socket->Close(); + if(socket->onSocketClosed) + socket->onSocketClosed(errno); + + if (socket->deleteAfterClosed && socket != nullptr) + delete socket; + } + + void setTimeout(int seconds) + { + struct timeval tv; + tv.tv_sec = seconds; + tv.tv_usec = 0; + + setsockopt(this->sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); + setsockopt(this->sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); + } +}; + +#elif _WIN32 + +#include "basesocket.hpp" + +#include +#include +#include + +class TCPSocket : public BaseSocket +{ +public: + // Event Listeners: + std::function onMessageReceived; + std::function onRawMessageReceived; + std::function onSocketClosed; + + explicit TCPSocket(FDR_ON_ERROR, int socketId = -1) : BaseSocket(onError, socketId){} + + // Send TCP Packages + int Send(const char *bytes, size_t byteslength) { + if (this->isClosed) + return -1; + + int sent = send(this->sock, bytes, byteslength, 0); + if (sent == SOCKET_ERROR) { + perror("send failed..."); + } + return sent; + } + int Send(std::string message) { return this->Send(message.c_str(), message.length()); } + + void Connect(std::string host, uint16_t port, std::function onConnected = [](){}, FDR_ON_ERROR) { + struct addrinfo hints, *res, *it; + ZeroMemory( &hints, sizeof(hints) ); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + // Get address info from DNS + int status; + if ((status = getaddrinfo(host.c_str(), NULL, &hints, &res)) != 0) { + onError(errno, "Invalid address." + std::string(gai_strerror(status))); + return; + } + + for(it = res; it != NULL; it = it->ai_next) { + if (it->ai_family == AF_INET) { // IPv4 + memcpy((void*)(&this->address), (void*)it->ai_addr, sizeof(sockaddr_in)); + break; // for now, just get first ip (ipv4). + } + } + + freeaddrinfo(res); + + this->Connect((uint32_t)this->address.sin_addr.s_addr, port, onConnected, onError); + } + void Connect(uint32_t ipv4, uint16_t port, std::function onConnected = [](){}, FDR_ON_ERROR) { + this->address.sin_family = AF_INET; + this->address.sin_port = htons(port); + this->address.sin_addr.s_addr = ipv4; + + this->setTimeout(5); + + // Try to connect. + if (connect(this->sock, (const sockaddr *)&this->address, sizeof(sockaddr_in)) == SOCKET_ERROR) { + onError(errno, "Connection failed to the host."); + this->setTimeout(0); + return; + } + + this->setTimeout(0); + + // Connected to the server, fire the event. + onConnected(); + + // Start listening from server: + this->Listen(); + } + + void Listen() { + std::thread t(TCPSocket::Receive, this); + t.detach(); + } + + void setAddressStruct(sockaddr_in addr) { this->address = addr; } + sockaddr_in getAddressStruct() const { return this->address; } + + bool deleteAfterClosed = false; + +private: + static void Receive(TCPSocket *socket) { + char tempBuffer[DEFAULT_BUFLEN]; + int messageLength = 0; + + while ((messageLength = recv(socket->sock, tempBuffer, DEFAULT_BUFLEN, 0)) > 0) { + tempBuffer[messageLength] = '\0'; + if(socket->onMessageReceived) + socket->onMessageReceived(std::string(tempBuffer, messageLength)); + + if(socket->onRawMessageReceived) + socket->onRawMessageReceived(tempBuffer, messageLength); + } + + socket->Close(); + if(socket->onSocketClosed) + socket->onSocketClosed(errno); + + if (socket->deleteAfterClosed && socket != nullptr) + delete socket; + } + + void setTimeout(int seconds) { + struct timeval tv; + tv.tv_sec = seconds; + tv.tv_usec = 0; + + setsockopt(this->sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); + setsockopt(this->sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); + } +}; + +#endif \ No newline at end of file diff --git a/plugins/gesture_plugin/plugin_gesture.cpp b/plugins/gesture_plugin/plugin_gesture.cpp new file mode 100644 index 00000000..85656802 --- /dev/null +++ b/plugins/gesture_plugin/plugin_gesture.cpp @@ -0,0 +1,52 @@ +#include + +#include "PanelGesture.h" + +#include "app/ospStudio.h" +#include "app/Plugin.h" + +namespace ospray { +namespace gesture_plugin { + +struct PluginGesture : public Plugin +{ + PluginGesture() : Plugin("Gesture") {} + + void mainMethod(std::shared_ptr ctx) override + { + if (ctx->mode == StudioMode::GUI) { + auto &studioCommon = ctx->studioCommon; + int ac = studioCommon.plugin_argc; + const char **av = studioCommon.plugin_argv; + + std::string optPanelName = "Gesture Panel"; + std::string configFilePath = "config/tracking_settings.json"; + + for (int i=0; i + +namespace ospray { +namespace gesture_plugin { + +TrackingManager::TrackingManager(std::string configFilePath) { + tcpSocket = nullptr; + updated = false; + + JSON config = nullptr; + try { + std::ifstream configFile(configFilePath); + if (configFile) + configFile >> config; + else + std::cerr << "The gesture config file does not exist." << std::endl; + } catch (nlohmann::json::exception &e) { + std::cerr << "Failed to parse the gesture config file: " << e.what() << std::endl; + } + + if (config == nullptr) + return; + + if (config != nullptr && config.contains("ipAddress")) + ipAddress = config["ipAddress"]; + if (config != nullptr && config.contains("portNumber")) + portNumber = config["portNumber"]; + if (config != nullptr && config.contains("scaleOffset")) + scaleOffset = config["scaleOffset"].get(); + // if (config != nullptr && config.contains("rotationOffset")) + // rotationOffset = config["rotationOffset"].get(); + if (config != nullptr && config.contains("translationOffset")) + translationOffset = config["translationOffset"].get(); + if (config != nullptr && config.contains("confidenceLevelThreshold")) + confidenceLevelThreshold = config["confidenceLevelThreshold"].get(); + if (config != nullptr && config.contains("leaningAngleThreshold")) + leaningAngleThreshold = config["leaningAngleThreshold"]; + if (config != nullptr && config.contains("leaningDirScaleFactor")) + leaningDirScaleFactor = config["leaningDirScaleFactor"].get(); +} + +TrackingManager::~TrackingManager() { + this->close(); +} + +void TrackingManager::saveConfig(std::string configFilePath) { + std::ofstream config(configFilePath); + + JSON j; + j["ipAddress"] = ipAddress; + j["portNumber"] = portNumber; + j["scaleOffset"] = scaleOffset; + // j["rotationOffset"] = rotationOffset; + j["translationOffset"] = translationOffset; + j["confidenceLevelThreshold"] = confidenceLevelThreshold; + j["leaningAngleThreshold"] = leaningAngleThreshold; + j["leaningDirScaleFactor"] = leaningDirScaleFactor; + + config << std::setw(4) << j << std::endl; + addStatus("Saved the configuration to " + configFilePath); +} + +void TrackingManager::start() { + if (tcpSocket != nullptr) { + std::cout << "Connection has already been set." << std::endl; + return; + } + + // Initialize socket. + tcpSocket = new TCPSocket([&](int errorCode, std::string errorMessage){ + addStatus("Socket creation error: " + std::to_string(errorCode) + " : " + errorMessage); + }); + + // Start receiving from the host. + tcpSocket->onMessageReceived = [&](std::string message) { + std::lock_guard guard(mtx); + + // std::cout << "Message from the Server: " << message << std::endl << std::flush; + updateState(message); + updated = true; + }; + + // On socket closed: + tcpSocket->onSocketClosed = [&](int errorCode){ + addStatus("Connection closed: " + std::to_string(errorCode)); + delete tcpSocket; + tcpSocket = nullptr; + updateState("{}"); + updated = true; + }; + + // Connect to the host. + tcpSocket->Connect(ipAddress, portNumber, [&] { + addStatus("Connected to the server successfully."); + }, + [&](int errorCode, std::string errorMessage){ // Connection failed + addStatus(std::to_string(errorCode) + " : " + errorMessage); + delete tcpSocket; + tcpSocket = nullptr; + }); +} + +void TrackingManager::close() { + if (tcpSocket == nullptr) + return; + + tcpSocket->Close(); +} + +bool TrackingManager::isRunning() { + return tcpSocket != nullptr && !tcpSocket->isClosed; +} + +bool TrackingManager::isUpdated() { + return updated; +} + +TrackingState TrackingManager::pollState() { + std::lock_guard guard(mtx); + + updated = false; + return state; +} + +void TrackingManager::updateState(std::string message) { + // set the default state + for (int i = 0; i < K4ABT_JOINT_COUNT; i++) { + state.positions[i] = vec3f(0.f); + state.confidences[i] = K4ABT_JOINT_CONFIDENCE_NONE; + } + state.mode = INTERACTION_NONE; + state.leaningAngle = 0.0f; + state.leaningDir = vec3f(0.0f); + + // parse the message (which is supposed to be in a JSON format) + nlohmann::ordered_json j; + try { + j = nlohmann::ordered_json::parse(message); + } catch (nlohmann::json::exception& e) { + std::cout << "Parse exception: " << e.what() << std::endl; + j = nullptr; + } + + // check if the tracking data is reliable. + if (j == nullptr || j.size() != K4ABT_JOINT_COUNT) { + return; + } + + // update positions and confidence levels + for (int i = 0; i < K4ABT_JOINT_COUNT; i++) { + if (j[i].contains("pos")) { + state.positions[i] = j[i]["pos"].get() * scaleOffset + translationOffset; + } + if (j[i].contains("conf")) { + state.confidences[i] = j[i]["conf"]; + } + } + + // check if the tracking data is reliable for further detections. + if (state.confidences[K4ABT_JOINT_SPINE_NAVEL] < confidenceLevelThreshold || + state.confidences[K4ABT_JOINT_WRIST_LEFT] < confidenceLevelThreshold || + state.confidences[K4ABT_JOINT_WRIST_RIGHT] < confidenceLevelThreshold || + state.confidences[K4ABT_JOINT_NECK] < confidenceLevelThreshold) { + return; + } + + // compute additional states (angle and direction) + vec3f spine = state.positions[K4ABT_JOINT_NECK] - state.positions[K4ABT_JOINT_SPINE_NAVEL]; + vec3f normal (0.0f, 1.0f, 0.0f); + state.leaningAngle = acos(dot(spine, normal) / (length(spine) * length(normal))) / M_PI * 180.f; + state.leaningDir = spine - dot(spine, normal) / length(normal) * normal; + state.leaningDir *= leaningDirScaleFactor; + + // compute additional states (mode) + bool leftHandUp = state.positions[K4ABT_JOINT_SPINE_NAVEL].y < state.positions[K4ABT_JOINT_WRIST_LEFT].y; + bool rightHandUp = state.positions[K4ABT_JOINT_SPINE_NAVEL].y < state.positions[K4ABT_JOINT_WRIST_RIGHT].y; + state.mode = (leftHandUp && rightHandUp && state.leaningAngle > leaningAngleThreshold) ? INTERACTION_FLYING : INTERACTION_IDLE; +} + +void TrackingManager::addStatus(std::string status) { + // write time before status + time_t now = time(0); + tm *ltm = localtime(&now); + status.insert(0, "(" + std::to_string(ltm->tm_hour) + ":" + std::to_string(ltm->tm_min) + ":" + std::to_string(ltm->tm_sec) + ") "); + + statuses.push_back(status); +} + +// show "important" tracking information in a readable format +std::string TrackingManager::getResultsInReadableForm() { + std::string result; + + result += "headPos.x: " + std::to_string(state.positions[K4ABT_JOINT_HEAD].x) + "\n"; + result += "headPos.y: " + std::to_string(state.positions[K4ABT_JOINT_HEAD].y) + "\n"; + result += "headPos.z: " + std::to_string(state.positions[K4ABT_JOINT_HEAD].z) + "\n"; + + if (state.mode == INTERACTION_NONE) result += "mode: NONE\n"; + else if (state.mode == INTERACTION_IDLE) result += "mode: IDLE\n"; + else if (state.mode == INTERACTION_FLYING) result += "mode: FLYING\n"; + + result += "leaningAngle: " + std::to_string(state.leaningAngle) + " °\n"; + + result += "leaningDir.x: " + std::to_string(state.leaningDir.x) + "\n"; + result += "leaningDir.y: " + std::to_string(state.leaningDir.y) + " (proj. to x-z plane)\n"; + result += "leaningDir.z: " + std::to_string(state.leaningDir.z); + + return result; +} + +} // namespace gesture_plugin +} // namespace ospray \ No newline at end of file diff --git a/plugins/gesture_plugin/tracker/TrackingManager.h b/plugins/gesture_plugin/tracker/TrackingManager.h new file mode 100644 index 00000000..02bb2eae --- /dev/null +++ b/plugins/gesture_plugin/tracker/TrackingManager.h @@ -0,0 +1,55 @@ +#pragma once + +#include "TrackingData.h" +#include "tcpsocket.hpp" + +#include +#include +#include + +namespace ospray { +namespace gesture_plugin { + +using namespace rkcommon::math; + +class TrackingManager +{ +public: + TrackingManager(std::string configFilePath); + ~TrackingManager(); + + void saveConfig(std::string configFilePath); + + void start(); + void close(); + bool isRunning(); + bool isUpdated(); + + TrackingState pollState(); + std::string getResultsInReadableForm(); + + std::string ipAddress { "localhost" }; + uint portNumber { 8888 }; + // Kinect - right-hand, y-down, z-forward, in milli-meters + // OSPRay - right-hand, y-up, z-forward, in meters + vec3f scaleOffset { -0.001f, -0.001f, +0.001f}; + // vec3f rotationOffset { 0.0f, 0.0f, 0.0f}; + vec3f translationOffset { 0.0f, 0.0f, 0.0f}; + int confidenceLevelThreshold { K4ABT_JOINT_CONFIDENCE_LOW }; + float leaningAngleThreshold { 8.0f }; // in degrees + vec3f leaningDirScaleFactor { 1.0f, 1.0f, 1.0f }; + + std::list statuses; +private: + void updateState(std::string message); + void addStatus(std::string status); + + TCPSocket *tcpSocket; + TrackingState state; + bool updated; + + std::mutex mtx; +}; + +} // namespace gesture_plugin +} // namespace ospray \ No newline at end of file diff --git a/plugins/gesture_plugin/tracker/tracking_settings.json b/plugins/gesture_plugin/tracker/tracking_settings.json new file mode 100644 index 00000000..dbb08094 --- /dev/null +++ b/plugins/gesture_plugin/tracker/tracking_settings.json @@ -0,0 +1,10 @@ +{ + "ipAddress": "129.114.10.237", + "portNumber": 8888, + + "scaleOffset": [0.001, -0.001, -0.001], + "translationOffset": [0.0, -0.1, 1.19], + "confidenceLevelThreshold": 1, + "leaningAngleThreshold": 1.0, + "leaningDirScaleFactor": [1.0, 1.0, 1.0] +} \ No newline at end of file From 1d09ec07504b841836d5f1b6a1df9613ad433189 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Sun, 19 Feb 2023 06:19:07 -0600 Subject: [PATCH 08/18] Be able to run an event when Panel is not shown --- app/MultiWindows.cpp | 7 +++++++ app/widgets/Panel.h | 3 +++ plugins/gesture_plugin/PanelGesture.cpp | 19 ++++++++++++------- plugins/gesture_plugin/PanelGesture.h | 2 ++ 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/app/MultiWindows.cpp b/app/MultiWindows.cpp index 0a359e3a..721ad520 100644 --- a/app/MultiWindows.cpp +++ b/app/MultiWindows.cpp @@ -446,6 +446,10 @@ MultiWindows::MultiWindows(StudioCommon &_common) g_camMoveA = 0; g_camMoveR = 0; break; + case GLFW_KEY_C: + for (auto &p : activeWindow->pluginPanels) + p->process("start"); + break; } } }); @@ -670,6 +674,9 @@ void MultiWindows::mainLoop() // poll and process events glfwPollEvents(); if (sg::sgMpiRank() == 0) { + for (auto &p : pluginPanels) + p->process("update"); + sharedState.camChanged = true; sharedState.transform = arcballCamera->getTransform(); sharedState.quit = glfwWindowShouldClose(glfwWindow) || g_quitNextFrame; diff --git a/app/widgets/Panel.h b/app/widgets/Panel.h index bbc730e0..71d30982 100644 --- a/app/widgets/Panel.h +++ b/app/widgets/Panel.h @@ -28,6 +28,9 @@ struct PANEL_INTERFACE Panel virtual void buildUI(void* ImGuiCtx) = 0; + // Process 'key' even though the UI is not shown, e.g, check "update" to run something in every frame in mainLoop() + virtual void process(std::string key) {}; + // Controls to show/hide the panel in the app // void setShown(bool shouldBeShown); diff --git a/plugins/gesture_plugin/PanelGesture.cpp b/plugins/gesture_plugin/PanelGesture.cpp index cdd74326..da18eeee 100644 --- a/plugins/gesture_plugin/PanelGesture.cpp +++ b/plugins/gesture_plugin/PanelGesture.cpp @@ -35,13 +35,6 @@ void PanelGesture::buildUI(void *ImGuiCtx) if (ImGui::Button("Disconnect")) { trackingManager->close(); } - else { - // poll state... update the camera - TrackingState state = trackingManager->pollState(); - if (state.mode == INTERACTION_FLYING) { - context->arcballCamera->move(state.leaningDir); - } - } } else { ImGui::Text("%s", "Currently NOT connected to the server..."); @@ -96,5 +89,17 @@ void PanelGesture::buildUI(void *ImGuiCtx) ImGui::EndPopup(); } +void PanelGesture::process(std::string key) { + if (key == "update") { + TrackingState state = trackingManager->pollState(); + if (state.mode == INTERACTION_FLYING) { + context->arcballCamera->move(state.leaningDir); + } + } + else if (key == "start") { + trackingManager->start(); + } +} + } // namespace gesture_plugin } // namespace ospray diff --git a/plugins/gesture_plugin/PanelGesture.h b/plugins/gesture_plugin/PanelGesture.h index e38f540c..bf2d5bff 100644 --- a/plugins/gesture_plugin/PanelGesture.h +++ b/plugins/gesture_plugin/PanelGesture.h @@ -14,6 +14,8 @@ struct PanelGesture : public Panel void buildUI(void *ImGuiCtx) override; + void process(std::string key) override; + private: std::string panelName; std::string configFilePath; From c04b561308c08bf46a72a66b9a5f78cb125e90d4 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Sun, 19 Feb 2023 16:53:53 -0600 Subject: [PATCH 09/18] Fix issue with windows rendering at different rates --- app/MultiWindows.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/MultiWindows.cpp b/app/MultiWindows.cpp index 721ad520..d42fbcc6 100644 --- a/app/MultiWindows.cpp +++ b/app/MultiWindows.cpp @@ -1059,6 +1059,8 @@ void MultiWindows::display() auto &frameBuffer = frame->childAs("framebuffer"); fbSize = frameBuffer.child("size").valueAs(); + waitOnOSPRayFrame(); + if (frame->frameIsReady()) { if (!frame->isCanceled()) { // display frame rate in window title From 42e84a38ea898bc5b22d3fcae641cbb19d56c1c4 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Thu, 4 May 2023 12:53:43 -0500 Subject: [PATCH 10/18] Update README --- GesturePlugin-System.png | Bin 0 -> 268627 bytes GesturePlugin-UI.png | Bin 0 -> 391954 bytes README.md | 279 +++++++++++---------- example-config/display_settings.json | 56 +++++ example-config/rattler.json | 344 ++++++++++++++++++++++++++ example-config/rattler_planar.json | 344 ++++++++++++++++++++++++++ example-config/tracking_settings.json | 10 + example-config/two_displays.json | 56 +++++ 8 files changed, 959 insertions(+), 130 deletions(-) create mode 100644 GesturePlugin-System.png create mode 100644 GesturePlugin-UI.png create mode 100644 example-config/display_settings.json create mode 100644 example-config/rattler.json create mode 100644 example-config/rattler_planar.json create mode 100644 example-config/tracking_settings.json create mode 100644 example-config/two_displays.json diff --git a/GesturePlugin-System.png b/GesturePlugin-System.png new file mode 100644 index 0000000000000000000000000000000000000000..e95b44efe265a70a23edea0e7188dbb52e61a760 GIT binary patch literal 268627 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

{&=V|9g!?BT z0C#5sT#;?w8tpw3YY9B(FFsi(LVvfb#|XckU!mXeJv!Ll1j}S`aWD}Ljp3V75=@~5 z!BoF%a{mZOJ^P$`=M*`)_CUUQkxAVNBr$-leH;kiuM!r&t(v4+u!PA(5RZlacOYD_ zyKxUV@w2otUt@%s{#j;!_4ZP*bYbl*h!lb7iU@M^HM^1xh|ej{Eaqlu zR1j!;B+W>LN8j_aYzhC1p}&;#P;GpDe|NnlRshLsSUSF8dbq!v1>yngZ~hnlQ>~Er z`hnrJ`SLcP>v0gRz+C@(GqC!K_}_*TUmYGbu*rwGdVk3?xrvX=czq`QUG4l(`YQ4tqkt6?RXYTbhufeS^*^!p2~CDZ+Dj08nAVa2h{tVtbi`|c z5K>}4L@m6J+>U+t@L}E)tEma;D$FY7@9ITqmI=az2S`bQ3J>6v4!*3K@D0w%u~O!> zZn3#MW-RW$@Ff>kp#{7zd2Yx{Jpa!)^4~Mz#l;oiBFff8s;Z8FC3O$bMG1|n<6Q%$ zIfTT-^I%@I#EUpiwV{67>YTjvs1}5yz}j6BY2h>84v^4|(1R0@L`(hO#yw{gTmwMR zajw_E(QS}~l(h3H8O`}KXU-G{*CKD${kGJFNqkqmy(oP+ofHV!1BVO^zN*vYzYqDQ z&NhX!1*#_8m=HYdQj@|5N=-sZe8sN(KDuw_xTl77P+MGr&3ujpT7>SY1o9BU3{HtvC50w`hKZ$^NiAp30zkzOOgCnRhME{&RlNV^U2uJqpocTiFJ z{pMQ!4}xaSyO|p7Ir;?+*bk9hn!qcUo!3YRVWigiZ?^5PhB;u0vcJ$eLKOj7bbWij z`E?845Ai?tuLYkGcRiG>>KDgh{WDz*$2eBNk@^dEg}MX;1XHV?zQwD5rS!kgcNQ#B zLapUH*{81Kwa1XeJUXbmQQX@9o4yML`AJhwNbTRX&$W6FYmxj^M869Y0;cdulM+jX zFMk*PTp&BMBbc7d^4pRv0TQAj8WVMXm(*isAO)*I>-=xtD|w9YwLHicTPyA2{#{b< zU6CH|dh_zp@9Jb=5kDu0Y6hNWcBjkGM25Vi;bYnYKAO6Zzpv+f38Hv(dx7gAkwQ84 z`t2NO5vh;zc$bOEZ(}Y62;g6{rCRIncIRREL-p~lr0oNc*`xY&bFN1dEI=f3{#HLubvu^{vG^7^s2 zzh9CUjFA(`>dzOE{oCCCy8mIH@w008k1xMn@=Od+Ii*iLfA`kaGYS>~aYD8>zyqhs zhtIt!0?Ato?>V}m36^^Q13Yj79nc(ReRuQM9sK(R_(Sv`0cyslnSOhX&ZSyQ;tQOG zS~R?d55)A|$r4RBh1dO05P0q6jQ|WtIl_YIjw&BW#d`-_dN)G<7nsBZB;dt369WSZ z%y)L#Hmw(bYUUSL!$4k5qNvN|_wn!i2=V-1m*2MPO1Bq#FqO)Cf_Sccp)9iIOB=U# z^7DMll}j$mR`@|J<$kcYPoknHc!uK7S*P%nVBq@nU8EQv@?%n$Iibcw>89HU6-TER zhpW_%7^Ko%Xwpvgnd=lM>}nT!I*mk1#S=v2$A6f0+rhvF%Vr-QN;*MlatXOziWgeK zd1@4gp^75+@5Dq_y}OEcr8KK$KyHe?i172x|@Gz*ZRhkFCQebKR<6ivrvv{rA? zUPdR3=F|&RcSpvq7uxmk4fc8)U}Sr1|F*3;RmAWK#pM3js6m(U6?7(Ul(;ID0qq+;_|qaOoU?2DiTO3sWX1 zPBQg^vl_y-JKd$*qxTLmTv-w9w8uSJ1AzluY;M0kdgawurYJihb^7#uHCi*@tIaF7 zR+y@w*{@IViZhIQzHO0!+_aUl%i6f}B{58(LJ9}ld=5D}M{-QMg z#3c8)X>L?ZkZV_#g!)8R>tkKZx6O_piF{9OozH{J}Bf`pip- zmNz(xB5#L>C${X;KgQ-B7#J)W<723ezX2t@8s~b;L`^KpYk}-)(n_AQk!J4Z>zR#=)OiWuuwLWgv8KAsjb$4E#f@ZAoEXK6~+yvq{8 z*-Xav%Mq+(+^ypuyoStnHpEF@WWLChN*>VKD1t3ug$u15l#ynNY0%F~_ymhgbv~m< zU$+2F@(->2>8ItwZw6JAlHK5YN0`gL;?+UNxUnnG+((>E!P!5y5}Tg5LC9$wyG19m z3lplE7VD}?jucPpq1^k{452K<8Xu*2$qlg11SV~8>sQ2&GKxrVzKq>&bR6%pVP}Dv zY`!U0bd>N+`O4gOX@z$E*ko)s{sM6!2KK$@-xc3O|7@0HRsT8*0FZVF%Qfc#S^OQZ zOpN{6e0lZrZ;6b0nw|2=qx}=BzgD^j5|GP}4snSyU>$e9x$yNG0fNRIo=%+Q-jQ6x zCwHB71zTU5XPch1xKas$mFb#z^#>IR3DpxpFjl5GQk$az9n15t@(vBy9H%(%D%X=v zYus%jN`xGSu8ABeyFBaBYI&LMU9=nPO!TP8Yfx!!W8Y^Fi(WTj>m1he7Yx8e`qXNu zVD^c?0gxRUOs6w9v|P?$Iq?WoI_~TZ@4YbLCH6mnar;b{q2?J4FH{U+uOX^x>^S3?<@ORzHuW`+gk0lf7LXy>Jy?RY+ zm>Fm^n2jkvP{RZpr*-k4n!}QO&S2Oj&3tfZ*pdLbWvQ0*Wuj(lZaG5dMz^uYl=?IJ zEUWQPTyy$;S2Acd$2E0eeIwm+W4VWVMUKyxyO#(duqrOjgs+6jCm>{FBSy3Z=M|j} zQvbBhscr#0F{(D(aUGCTVE@jIb5q9xFoY%>IiHNj*MSWL&tg4)>@tylc?KwYkkjtE zCp+HtP9Z%il4|EvRla83GCJFD>FmZ{h3B!*?YAwYBja+5Dt zv(IPFc6ga1VcYHARz=TtMDyJGJuY+SVxZJ~iFoJM-957EJ~6g0lM*0Si|*Gn5gZaA zwqur+#|5sRoByHbQqKhVt1)-a=QMI0E+yO?P(Frr zyxXIb*i!~m>Op%~IGaB|yp3!{Zd)&YbQHAyNF29wK%GeTBB6NW+cO`WZS!d~wl}C_ zd((qcmT$4MKjd^KZYua?9NQ-0{f-}}rr@UH8_h#C?YNMWk+)m?0dxxkQg)daHB;B2F$SxtruC<;DJ}Awv6fs9p+R#R#2;Bx~cQ z3YvJM>3LN7cmzGU*5UOWp$AiE+%k0TUfyj1mSUr42;ObG(>LfbiYw1`=YfSN((yYc zC1t*mOh)+inv(lMr;k5+`OVALW_zMdIryT8?6^SwiTO-5ptt74EjGRf_F3$~x%bL( zld8bLfo!?U1l-y`EPI#&zF#E5qdn;fwX@B}qdJRFK5O_?{E7DYi!0bP1@ZvQ_@r@` zUxz!?mwW$27)Q#W{{|9*4eP^Q-+56h1nRAnlXef40nMGdW+(UEf51Y7Z!UoNDKGnr zhq&5VE)_fDJBw07UxSut!`?+2#TFQ%!Rbr+7}miCxHc1_kAyYM zO&O;JZh>p?(ztV^y2o@crb*_gOJ=(=q`Y7o!lr+=NO>aXDt3!FI`r;PFP|+oU_D$8 zxAARn2+^@0#iq?~Abo3<)7FUyQkU*tQ1_D&Kug(lp7bA8uqTz z%YHwq@3S*kzx$A(1%6%W@H_1wnOD~ zCE87(g45&e(8DzC+f6dTei>Qbp9dES6(nUutZP52c&B;KTp;IVj?EUPGO!*@5;$uv z5vyI$DA?wiqAr0{se$&q-!$t+IjLQhT1d41G`MsJ4XvWFS^8qb-!6O(+(DDek+`(9 zlSU2y^3j}`#8-~Ns#hZgERniByT5%ufm#}h_cuL|uX3JlfmV4JX-@p7D=hkn0V{YL z-TkNbGsVw7JCl-4VB z*BK{FhiBg0QmU462$ zgS?it7P&=u;Hf&M1_wTOq_k}%48{5SX*wm#m(qpz+@}o&htm?uF{8}YwjYTg=mg2+ zDxa;n@d-0Am!;RTUFKRdc6~g?AL89y!VMb^DCYJ41E6B0qr7~d_4@U9Ba@UkwrpFY z6UAKjUtgc)eJcxgrrbN6pFVQG>8Ty=$1wKZu+{HK#BM66V4mY!GpmbRug~L4aN5no zyc%wcO;vU3w*(%&>h-4lp;>1$=bq@3i)I-|qrM=J=xQ3-c2sw5J6qwZ?2b=ego+9- zxXaALGRO)OA;Zqy+qJmc_0(Rxdc-@}Ah%jhUj*(@TJ(%Nre!Ho%EdF#Z>(6ikvFxE zTx2YLNNH-7-<`A}@Accp5u3^GCG9NrOT&j7eho zH}z-+kqkX-CwC;`Yy<^J0xX^+%g$mTk!(qG~zI zcJHil?Oq~WEJ{?t#wB`*it!0-;uZCk=hjLZinG!!s|T?`65MKGHkGBf$exYNZqo(T z)Xu^Z)4%0hWX@{NCUYD0S*))%(ncj#8%W9sts7Q_oOO|}#DMvwxFX<&7t_SXV59G0 zlT=Bdrbs+K2ZNh#LKr~E_fy*{gQznn+`DV&D@otLk*o?K$sT9K$$6Xhnm{M>qf@6JajX2EJEEi z8l$PAcyiBP2G%gCFS=|}aAA>T&wW=ov2sCLzpR&KnoCE9oXPX<(R{bereiB@N2ryp zZlQz1O>Jz6!sz=O$yBQYXHu!zifwGRO;@X(CN&d3JpMw)v-t@YywMS&c_OXu72%XN zCRTjYg3_lO!vkISKCTV-a@w&yr7`(IYJRBNV{T(hpRV6B3=+E@A7Z?ALg9GS0m$6V zGbeVNKP+9k%D|;Cx508YwBk{b_0;3?ibgwRjhnGirq}USo-Z~>3y0HmN9~+&VR(Qr zqeM=af}@DqJ&O@n54hyk=T~#R>B;#%F69#k6ru%6#-VU|aG|LtPx1a$L`jwqBg~IS zZ*c7eO*bxck2|ab9=5taCS|=wOt~?Q+JzQ))wCPE=oZaB&6FK1QNOG{(r~qBwK*h< zipzEW%jGV`Z&8bLx=xg)G5911wb!|tb~pqS@6k|WjPCc-a8|~^ zs(5!yEUA*t^!H@?lJPZl~fP_|GZxJDLpPaI|Hn<2sV)*ve& zp(RSZWNpkB*>b)WI}5$_d`o#Q<9aAOU9&wcTzaI(ZyO&O5 zy>U}g?N4hh6KZ4Fr>Q+iJ#Jp}1R zrsO)?2J8z8zWECK#;^S%cZql)*)NQ%-qDG~J*B;g-cNH3+}6N|q|b+H>YAdZDkF|z z$uea6-q8tV>q;~_P97NsPVP7`EGKCviYDR66tWh4B=8CN%l9==VU z6E!P(1_|SvvAwN|J_**hs8mIuoif+*I;_8|RzW<7nxGH^*CG`NW`Rv8XDOfl3ER)& zMdFjm^KKF#yP8mm4S$>6H3r7hO4ftg`X(6qd8{PQ!ocd%bFNZ0p|6%gxBQj;6}1i2 zzP#hvTA^SvuUWKiGvHT@$}N#MEbXmD3VDAT*4?-_BvSZ+bhO^%PE5f|xi$nkcRFS4 z{K@PtkO0wMjLybNO$y!rkd!T>6VZ_K&^kN|E(D+XBML+7_UT0-?G9@FCk&4E^ z?UJcgtukGtD$|Lf6g|%<)0g}H7|~l4x_VfRP^{KTR6ns1G>XhH zK!rQ5$M`@as{NFTNG~r3ohO8(FflN3JOeiA)7>=HA9&;(K5+E4RKvD~23V*_-ub}8 zA}z-zQiRJ#*S@h_juRo>t!mvGhd0`J(6`w)_DzepMzkW1B<8g!wcaLDI~?8WIS4Ap zo`2b=_`JBfPu3ifnE9%m=0R8H;43Msj+Jj+<&D%kpWnXPTP|lQ)#tP z(5ELb>+CFk6+Y>9a)7HIOjTw6z(*lJq5x;I0hxMUhLU&2yQun#XfCgKEk5i1;USmS z0LM5eb6a=04--N#*7Z%r-g$jj4(O>n3x`%XyMi}!!X=TVCw&xY4inO;wZ*O44_!=9i41_C*W0Zq}M7 zLj3e9N)EHAq;k94*=UlVkV&>!J|)$KzWW%Tc-KTP27Sl}9q&qcdrF41%#}-G0joal zwyXUx12uDKlwzNio;*a-H_`9a%zdo*z0rvaQ-(dy6wP%Zb00f2MVtSSZWu zV+e!PEZKHyX}6wN-xKh+p5J2@+HQR8J(WUEH&pyqAWQBw z7CNbb(4EeiG+GTY<$lAXfIJ+`N^_a9n$9(YXjT&Ir9^Jg;Zl1y=8_uJjazxzGz{=xdT2?jQwT zEA|WM^a~m{`)F4|Z;xmQqVv-$GRy+EttaQ0i#CujvBii}o17l8mYZ!KOSDBx;FYg! zMbTCC{#^l@Te!J=YI1vYfXlY%k%f!yLgpPuA#DrC?JEe4?crPr+RA`?%ar@KSpMSn z!ymDsD1LE+Ba?8L7?P%htI>*BW86HLAX6{5Cb~ct*>iA}srP1EeC8-TEwat3e2uf` z)7r}LOo?{p{;NUH58{Xl`P)m(+2mvH>RY#Nz{D$duVz<`4xZ1f+AkXIbR_fUbd2O$ zFgxu#s9AlKJ}N~2Ek`IY5nO*a+cnLE$a-qV9At)HLcFiM>d8%op8`b0FL-|}+wb9} zytD*(o&G_^b=A(^J`l`(948^tLsIBfm$clLluTi+BEMA_M{%f`0`2ZtFZhUDTf48d zIJz$AV?}=Z(=jwF@C-?_#c69|27E3OI2_a0UVNdx_n_a58%xN>#;=#nI=f}lE6$gN z8>byy9zLIEWPX=~{BS~dGxO`Gri<=D)H^|*id&H*DtlHN88q4{3ZHn$c+UFXdeykq z(RBdn*~(ji?)V)O?cS>D+1qH=;6Jew((bER4-M(Mv&{LL*4B0|$;|*tA-+>#0$H3W-|L7XidUveIa6E>#@G z$rVn)OSj(js-%1^@|in$&zI@oWSsqlCvbD*Erqw;iZ7zWZC#r_+3l5&JQ<1cV#ghL zS4uTB1e)C%KG|FoeYqQ=biSHF_jew2$r*TzOi(H{Pg_(hUum8e%?BR)RR@ zNT@r6iB??3w%mq~E~&b`DXrV}@H0E;7`!p7Kdn3-A8}_d-|ET$-qC<#eS7=|botY< zKkly#yiIEJra{Git50k^c9a7@)?{2rtdIM^Zpj~o*0`;h;wB zk+P3rJ<~4d*H_t!$Sg@3+tv7<$P2pHWifnr=U<<;X$i`An9v$P-7X-8_YZ zekJuC#3k)pmuB@WA%l@sG^Qx@V0z7+Dpcl3;IRMAR9h-{Y!g`kril)P#7EULm)~@l zeK);@TzJzPBL0tZ8BsfHez0XtBl%@ofU)#EKV6+05q%SdPch#lz49xqGDHv0-sXY4 z_Iw%oBeH6X({VSZ@LOP?oBT|ZW^AL>ikHQ~UG36kbNi|@eypPuS(0m+(aQS>nY)Y0 zI^_20Vh1zxm6Ty*8g(*K*os4s+cnRbHOIRm?nE&i=^0mzDH0_I_0k5MORgHLNlwps zW;@x;(>@b)TioV@BXgF`RufZum!eVt=HaOl>y>0GZ*28E+aIQSN}ZETpc+!U(VjiC zHr$4P3v->*X-L^E#ukyTPl?Es%Gc6SHe%5AbcwWh(>O)GskaS<8R-rJM-OB}j_K1| z|9`B#Wl&vPur+#u1`jSlLy+JEcL)~TCAfQVcXtgC+}+*X-Q6uXfsJqcElzU2`_-#= z|GghcYHg^>p0m40caI)x&i+%YIU1*{xSb&fzcSSC+H=ZhUrXk>8g=5=lNrr3sd^dZ zjSm9S?lbKqc(_dcn0B@KC#8d$^>OP6IgRR|(h2zDBj)2DKlkQQkXXS;d&&;kF8Tl&lwIl|-@EIe(t3 zYNz4SrnLg`I00WleE+(~{I+DuTq0ZY_qtY%N|Z_j&O`+;Z-DiVSA2B?B|=uth}RiL zG|a0vuL@AS5dC#uTkWoW&mi!zEme#P3>jKd14 zo0dvt)_TTM9-$rPO0}`O99We4u*j4v&DtaoVvN~vj+uoT&F#I`M)XX{)s@HXv0ubM zPeJ+RLH@(W%UmfH`q9ph*{(+ynoHY}G}jXB6O{L3_BR0h zx?q;uuy8N^TkAQ*6llQ4e!XzD0Mn03m*}Hc3ZPj~B}x{w?q zLqrneFR3d0n%Yo5ZnXJ_Dj>7JH}d;ZRX!+)b^xDu-vrJ&z{mbVebjjTh3Eo zv3oMw*KbVejusDB^mY z-UWSykyG|-P$v~oj9^Cd7bR1dnhpH)qR>w%ybI96?-b?zem<7A-`+{@6F8`x?L;$4 z%pIPR-`npOfuxittIlzr9>)}he;Xg2Fr$O7a#b!HSWWLQ$&f@Izi#iGvVm|5;bkV~ zE*P<Qk~3AC4ycVz~;1Qe+&)o2sxfr^_hJ*09SkS?*6-3hW(cQkomOC6-SJBFHvj zu9NEot++QI&d#T^#LVo~DQI~;56v)t8t3?!Uwwb6R`y@Ahnt$eRX;j4Zg&)6JU1vW z5>xL`IsRglB{%bPHGvd#xE{_U32b*VrQDyR0e#{~0B^);w=Qo?Qooqo z{is=9s)nk+4T$|9Xnl=^&)Y%iqgo>c~pg6iNFz)>Y~1sXEtmbH?%j+^kzH*V4h7 zey&AYQ{V`YIUQPg3-2FNmeYXY0BrDBk`lqyp`K;w$-SLM2edz4n{i;A=1d|}`i-}Fyhf^dioj*;tyWhF=@ z?m_e>rm9lWjyKVCDs~>X1NL*bOhQ6xaPF?Yp{A4DNJlDjw?>jQ(OWWPT{gGaV8p>Z z%NZwAgUiN(48E$y1k3NBdSp#F8F$yu2VQ4qv->jlL~|?`=I!<%{W+?+Z`5sUi4e92 zO{Q)vMhf-{@0;8wkwEW}`!1NiJjUMY?S~>o8FLz<1PY2YANgy&%BZ3Zk*Xxp* z%&T_%ticgGkag8S!2!$ns+_6{dF1UuiYRlkctjH0tOH zzK@QAp3s27)(rFxEQxV_p_N}UUi$@+aYptSxykXUGz`$;6tC+0c)Azlchwq6UvoYx z8JlBFp`=--^GMxB=N(_mlWn|5y&*Iu0~G-?bBBprpjN$ejzi5pUCjZZ71(NCh-SuXwh1qh@~7^N|wyu4a4ivg6n$NSYN7M zoF|cBdKVfGT>0*IL)38qMd2Z#?eVLs{huX^Nw(zKhS2gb<<0DT2f6}LzEylwFd|K1 z`(^#nb+b(dq-e>wNe@SaxlKy*_~P-^O6;>^Tbpf~Yuv~$1;3Wg0-m}D*X!b?ucY%& zJG0-Bh>GFU3e39}^M_CEhNU)VU{hd=qygg=a~atG8Ba#MvdzhmGXMK{QUt{v21>Ky zBuViS8=Tp_?jW#8c-igvly#?SM~q0LjRX1O`3O3W*x3C(6}-BqdIM@B}ZE~8QQWr*fRYi#;&~H$pfaSc0g4i>se$dc?&*^U`A)?T4G$i`8}mnY z9b-A$w0v{@roS#l!&#go8gM@Ge+-M;x@#e)OM$NNUsH-}+|c}XSAjdHU~#B~2<_Hk@9%;=e968$I^ z!N4;~Ou3cF+ns3O^2UzVdpb@WIpM(Jd+;sMY?kVM@b~%TmCk~;%kw%xrMB^r)lppyZ4#AJ-zt+y>YW6m7mD->N_nbXJhd zA#h4~hhrM6#d0=5i=+ANdfW2tzSh&-J_!Mz7st44Dv)x}6Sdpgm&&&yG$l!_Y&7p5 z6y|8p{eONFm?@EnRtsM(E?Nr}M(E3r?=!h`4mi;fU)~SJV z{NSNoT;Ek|F$J07bdbh!Jlkd=NxCl5`Z>1K_>~(smSSYIABzblK({XAPeZ-`?#Z?b z7yeS!baM(!za0h5K)^|!Ga2wJe_6()*X`M}$x;cSkB$TG?^dxBhV@L&k`sh6KWRv@ zXZ?6lL%7@eKt`+0q}l)@%&USppC5yAbV^vW+qO+&-X5&1?`V246Of~M8LXl2z92~d zT)IEJFq0@XkVXYjZk6BkU{vU-yg_f;54;8hpzuL_zw72Tk$u-tyK7vY0maz2YoFrX zi+X|08IFJcKj~3Z(N?8953 z?|k*01){jN8@Z2N54E?>xg!@Ycn6nC8wWAl?KvNW%9fH3#JxNpT8sG}%b#1Fuj%*$ zAElUGcI{a@K9zf*e*n2?tzdg(JBfJa;)Z$6Od;?(eaLoV`$^jm0Iu-Wup0>mN?)eN$1RS-;z{bh93Pna^o_@y zb$&3zy}+>o{7Xd*q=jyXFw%+!wnzTw|8p{&><6%(2$)p4kg&+?W#y_>uSadz5Z36? z0WP*0`r|JmycSKrcp>CgqCSBR<@zD&Sj_eks9qGX=bTT?(`?JPU<-v}Z?AU3>8Rd~ zP^OU>mljnIv(EHt7L-S39>Pthp|t1HIb2X*sG`WZ*w)S+XUJnT#M#fqDH!Xjyd5x>RNp!FzlraFC-s16p?fL_- ztB`MmQyrk=QeM0iF+VD?$}gVbS;BNROwlS)7lrhCq}DsS^lo*1%u%|}^tj^BZlF$h zxzo4~b(oGCXWm^mMmsW&PVQ*?#*|KfsGtiPnscp^Lx|9Dn8eec-Po3s-P545S73~% zl#_2*b!|CqJtkaJ&&#&_6fOLQ#OpXB@V4;Q*Kd40pVXa-IHB3APMwr+bnnEx+ScX_ zw%F!jM$L{DY-S@P;sAEe;I+)4SUwF0;YNJ45d1-S8%GFktyc0VR$c&oRcPK&^{QnZ zcTwgbMVomhQ5aJOxS~DTyy{3au%sbu`02kWlWPh@rs+MX;1Ju25PZdy<{B7!Z@nYW zqxHFm<-OMOOO@HibFQ)wye*a&nCW}+vNA5|0%5D*Q?b(Aq!Mb5E{s7@)&v{<`0WW6w_WTtU=Q6y)%!#*ZLaI}wn`#3Oi{ScDFV8~!LZKnTbt&e}647Z+u@@cHce+yW{6l}n zEx0*GM*&0yC{f(4ObEK@uI@T5*lsn)PFr5zg|@X=&oyl=a67pdfxL z_(s2mOY47FPZTo}lzJyeFv2=z+#=1D!jn{TI1>>zd%Ab9P*G0%nirpA(<`P_bG&%B zQ@uu#xALp8-uXKAf_A3b3GA$KHc~kG1Ak!vunqSv0-V_yhZEXet)} zdD)6M=2f1IX3<&_K?wAGOY$2p9KsIOLefHN3J%xig|LBi3eMzHW{k28JQpFJiL)Xu z5II4EKS)6?y0^}AP5ZcI+*=V9;sP$_CcUGkuEn;5IVo?m5alxRvqpy>T}5^S@76RiMNG@s3r6!d5udk?-U{6!jDyEQW3PU@}} zpStm!Zuax6ye_8wYwBTsWOB!|pwbBH0(E2=c1%W1d4>C;+AS}KQbFrCRTss^F3Pf} zQ{3H4yWdpzHg6|2(~J&YPSPCs71Z$uI-F`leHTODIO=A72*p|SJ%6{ew6?gmwx+4N zSVl>;xW?Ne%RqUEbB0{sqEq?iy~R!g-@0Y0+xVHgrxS0z#|@WLeZ5~bi|os4YFOZy z(RP5z92V=xbX`+PUI$Evi8|6Ph0nsZWlB(A!L!Boa+N~fZ{NN75FG&*4NBq|qS#VE zN)-buLMk5pc>SCoD%d;uZ8WHeyz=l=`P)`(nHp#zA)Y*~YS-nRN}cx2#2XCyyuM%lE5$(|oN_P%x}5d75A0O41&Rik6i;0?OOHt_{UjMg+!fj9@JX!?_YEN7SdUm@0*>YGgjZVlmnRupw7-YHhTA!Erhw>zqMMe#SA{yGJI(}4(>sMQ%qX>B{ z1_vqy?N~ONu;4&4XSlpKHk#G(`apBJ`O>{dcZ1`8KzrLGRH?-KK7ucZ3E@52i%;3; z?(j)JRH}$m3my9vW4QVF0cPOC)`04I`#(;Swt|@51v;iqT~WDdOGIK4w7<3L*+iB% zdL9WT8aZZuoc_2nRi6QjU37?>4gPmcfCqd;CEjAPJB32yo$E~Umto=0qYHUmF7Ttm zkbmGZ%pg)uE#t9yp#{Nd1kevRCFdL>A8kG}&`m*8Se^MQkUZIo#yoZtm)h3*JQP)Q zD_F$8ZQyaX%~Y?ZLftmkx3Ou3RHJPgJ96$0(nTtDb4C}8dq(q%x@~dGGRok2yT$p2 zM!js{a>g%4eZC`()cpc+M1MWrEzyL&%{z(mBBM(eHt$Wj~{Nk4@U*)vgf)r->-lDPAXd zlHRSGRV)*R2+eh=#qM6ScjY|VDC+3n4yrW`1lH^L!QppR*k#nW0VuBEZ@>? zXd|f?9ko?+lil7q*W|#O-EL5L@>EL9)Fs=Y6yz`Fis8qfD6yUrFaN%Rw7S|UVNgk1Ly#scb%OGj*>mNsI{sK6X=8yqvn&=~}V_&o@8g(E8niWa^dgyb9A{Z(UxoXXVUCxdjyAE|9H}1J@4*7!OBYS!QhU1=e60*MCWG% zTcOi#SB2O%AQ}AN?~tb6{d8a+%uDx1eXS;QO%kk?5;$$^DNFrUoaNP>Zd-8XDv{>7 zqcxT_QOL>fgF}P&JU1n}3x4qktt3kWOOcv**C+aCX+p%WE|X+O0XP}V_(%8RH&hN{ ze}BX;1>lY%`l7v43hNfSg>c}S2VTx?`F^SavC9UTKr0S_YaE9PnU|Q9S6y>dMYo-)xfs(VUbmUiZQLurzVP@hEz6LKFoMD7Q z0w%iNx{i+>lVl4hX=f;LwtJb27e~HNm9@3^sgsFRZrl*bGpxOfp*%{nqC8Vn42@S< z8@Gt(OpVwbLSS*djPTwqIN&Qozcs!G1jSEg2|D_brWL)%r6bB4O>3|q&aJDC?R?LC zkji9%ML$*7ATC`*P_|8`mz4d=y|3GE3|o!xAT52lME?oq>fF5_z?$Q71y+D)`WI4} zQ-J+RP9qAHM)mo6a;yo-;~2V8bGZ8*VIo0vvRudP?2L5r_KO4X2Q6a+XIXCsod}VV z{>4M>YM;kMe}zb^BfC$aif@m4!4~G`G|^iPdiox6UA2{)0ph!>RllfZkuxA;U_)n9 zZTh^6Df7i_}B z^k};^qyk=Y*gkDd9@Un@|Q~nsVQslKM?r} zK&8Tu!29~w{Gkp&$v^SUA73E^Sac>i1mFm87R@bEIiR6P^qu{XNC&s=tA@9his=HM z!ns@#E>|!l7lJM|L{~*z{blO$w)&+DIe!H=4ntqbm2^RPiaXv&3Ku#|UEIT!FbP zbste$|MvJavURdGo|iB}{YO2+=$Yy_FfvIYRXhZ841LFa9Kp{|Z(H_cdTSlDz(Zxv z-NW&L%8Aa~tb28X^p-Tn)Vx>ZtM3~Inqm2xh_K+34|l1;Ji{FI&WX8x?F}_C1PIDK zx2rN#@?oXAB5e(P6r;sOXC`!lr@&?rFynipoCkvQ-|7DK)B4*1>3LI}{pLq^@ykq} zF>?Oy0;Bz)Y|_78K>PvtAlTnEc2N;lmK}XBG~BY>`whulBIn z+aqUJ&E1NKHje~S{S6WNY5`D9b?B|^`q7PaAhJ;T{4KQ3=*<|!``fveu!eM#Pe;Zzk@;v&SY4a2o^?mVnCwV5S5#;e+Hi-

#-Fj(H8_jd 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 z�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 AwEzGB literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 66c77de1..b542ae6d 100644 --- a/README.md +++ b/README.md @@ -1,168 +1,187 @@ -# OSPRay Studio +# Immersive OSPRay Studio +> This project is part of a larger project called [Immersive OSPray](https://github.com/jungwhonam-tacc/Whitepaper). -This is release v0.11.1 of Intel® OSPRay Studio. It is released under the -Apache 2.0 license. +We extend [OSPRay v2.10.0](https://github.com/ospray/ospray/releases/tag/v2.11.0) to display a single, coherent 3D virtual environment on tiled display walls and use gesture-based interaction techniques to navigate the environment. We provide another mode of running the application with the ability to open multiple windows and coordinate these windows (see [MULTIWINDOWS Mode](#multiwindows-mode)). We provide gestured-based interaction techniques by integrating a separate server application sending tracking user data to a plugin to the rendering application (see [Gesture Plugin](#multiwindows-mode)). -Visit [**OSPRay Studio**](http://www.ospray.org/ospray_studio) -(http://www.ospray.org/ospray_studio) for more information. - -See [what's -new](https://github.com/ospray/ospray_studio/blob/master/CHANGELOG.md) -in this release. - -## Overview - -Intel OSPRay Studio is an open source and interactive visualization and -ray tracing application that leverages [Intel OSPRay](https://www.ospray.org) -as its core rendering engine. It can be used to load complex scenes requiring -high fidelity rendering or very large scenes requiring supercomputing resources. - -The main control structure is a *scene graph* which allows users to -create an abstract scene in a *directed acyclical graph* manner. Scenes -can either be imported or created using scene graph nodes and structure -support. The scenes can then be rendered either with OSPRay's pathtracer -or scivis renderer. - -More information can be found in the [**high-level feature -description**](https://github.com/ospray/ospray_studio/blob/master/FEATURES.md). - -Building OSPRay Studio -======================== - -CMake Superbuild ----------------- +# Build and Run +## CMake configuration and build +``` +git clone https://github.com/jungwhonam-tacc/ospray_studio.git +cd ospray_studio -### Required dependencies for superbuild +# switch to the devel branch +git switch devel -- [CMake](https://www.cmake.org) (v3.15+) and any C++14 compiler +# create "build/release" +mkdir build +cd build +mkdir release -For convenience, OSPRay Studio provides a CMake Superbuild script which will -pull down its dependencies i.e. GLFW, OSPRay, rkcommon and TBB. It builds OSPRay -Studio without OpemImageIO and OpenEXR support. `stb_image` is used for all -image operations by default instead. +cmake -S .. \ +-B release \ +-DCMAKE_BUILD_TYPE=Release \ +-DUSE_PYSG=OFF \ +-DUSE_MPI=ON \ +-DBUILD_PLUGINS=ON \ +-DBUILD_PLUGIN_GESTURE=ON \ +-Dospray_DIR="/Users/jnam/Documents/Test/ospray/build/release/install/ospray/lib/cmake/ospray-2.10.0" -To use the superbuild run with: +cmake --build release -- -j 5 -``` sh -mkdir build -cd build -cmake .. -cmake --build . +cmake --install release ``` +OSPRay Studio needs to be built with ```-DUSE_MPI=ON```, ```-DBUILD_PLUGINS=ON```, and ```-BUILD_PLUGIN_GESTURE=ON``` in CMake. Also, we need to use [OSPRay we have customized](https://github.com/jungwhonam-tacc/ospray). After building the OSPRay, set ```ospray_DIR``` so CMake can locate OSPRay, e.g., ```/Users/jnam/Documents/GitHub/ospray/build/install/ospray/lib/cmake/ospray-2.10.0```. -For other full set of options, run: - -``` sh -ccmake .. +## Run the application +``` +mpirun -n 3 \ +./ospStudio \ +multiwindows \ +--mpi \ +--displayConfig config/display_settings.json \ +--scene multilevel_hierarchy \ +--plugin gesture \ +--plugin:gesture:config config/tracking_settings.json ``` -or +```multiwindows```: This option activates our custom mode. -``` sh -cmake-gui .. -``` +```--mpi```: This option enables the OSPRay Studio's built-in MPI support, which is a required dependency of our custom mode. -Standard CMake build --------------------- +````--displayConfig config/display_settings.json````: The JSON configuration file contains information about off-axis projection cameras and windows. Information in the file is used to position and scale windows. See [Display Configuration JSON File](https://github.com/jungwhonam-tacc/ConfigurationGenerator#1-display-configuration-json-file) for details on the JSON file. -For standard cmake process turn off cmake option `OSPRAY_INSTALL` and provide -following required dependencies with their respective cmake options as will be -listed in OS-specific building process below. +```--scene multilevel_hierarchy```: This option starts the application with the scene opened (optional). -### Required dependencies +```--plugin gesture```: This option starts the application with the gesture plugin. -- [CMake](https://www.cmake.org) (v3.15+) and any C++14 compiler -- Intel [OSPRay](https://www.github.com/ospray/ospray) (v2.10.0) and its - dependencies - OSPRay Studio builds on top of OSPRay. Instructions on - building OSPRay are provided - [here](http://www.ospray.org/downloads.html#building-and-finding-ospray). - OSPRay and OSPRay Studio have the following common dependencies which Studio - can hence leverage from an OSPRay build. - - Intel oneAPI Rendering Toolkit common library - [rkcommon](https://www.github.com/ospray/rkcommon) (v1.10.0) - - Intel [Threading Building Blocks](https://www.threadingbuildingblocks.org/) -- OpenGL and [GLFW](https://www.glfw.org) (v3.3.4) - for the windowing environment +```--plugin:gesture:config config/tracking_settings.json```: The JSON configuration file contains information about the gesture tracking server and user tracking data. Gesture Plugin uses this file. See [Implementation details](#implementation-details) for details on the JSON file. +> See [example-config](/example-config/) for example JSON files. -### Optional Dependencies +# MULTIWINDOWS Mode +OSPRay Studio provides different modes of running the application. We added another mode called ```MULTIWINDOWS```; the mode is similar to the default ```GUI``` mode with these additional features: 1) Position and scale windows based on MPI ranks and 2) Synchronize MPI processes. -- Intel [Open Image Denoise](https://openimagedenoise.github.io) - (v1.4.3 or - newer) for denoising frames. To use with OSPRay Studio, OSPRay must be built - with `-DBUILD_OIDN=ON` in CMake. -- [OpenVDB](https://www.openvdb.org/) to support loading VDB formatted volume files. -- [OpenImageIO](http://openimageio.org/) and [OpenEXR](https://www.openexr.com/) - (pre-3.x versions) to support images in a variety of file formats. Set `OPENIMAGEIO_ROOT` - and `OPENEXR_ROOT` to the respective install directories to use these libraries. - (tested with OpenImageIO v2.3.16 and OpenEXR v2.5.8) -- [Python] (3.9.7) (https://python.org) for python bindings +> See ```app/MultiWindows.cpp```. To implement the mode, we copied and modified ```app/MainWindow.cpp```. -### Building on Linux and macOS +### 1. Position and scale windows based on MPI ranks +This new OSPRay Studio mode takes a command line option, ```--displayConfig```, which points to a JSON configuration file that specifies windows and off-axis cameras. At the start of the application, the JSON file is loaded, and values get stored in a JSON object ```nlohmann::ordered_json configDisplay```. Positioning and scaling GLFW windows are done in a constructor. -- Follow OSPRay's build instructions to install it, which will also - fulfill most other required dependencies. Set the following - environment variables to easily locate OSPRay and - rkcommon during CMake. +> See [Display Configuration JSON File](https://github.com/jungwhonam-tacc/ConfigurationGenerator#1-display-configuration-json-file) for details on the JSON file. - +> See ```void MultiWindows::addToCommandLine(std::shared_ptr app)``` for implementation. - ``` bash - export ospray_DIR = ${OSPRAY_INSTALL_LOCATION} - export rkcommon_DIR = ${RKCOMMON_INSTALL_LOCATION} - export TBB_DIR = ${TBB_INSTALL_LOCATION} - ``` +### 2. Synchronize MPI processes +We take additional steps to run these multiple processes in a synchronized fashion. After processing user inputs, the master process updates values in a sharing object. +> Currently we only synchronize a camera location and a closing status across processes. +``` +while (true) { + + ... + + // poll and process events + glfwPollEvents(); + if (sg::sgMpiRank() == 0) { + // poll and process events from the server + for (auto &p : pluginPanels) + p->process("update"); + + // update the shared state + sharedState.camChanged = true; + sharedState.transform = arcballCamera->getTransform(); + sharedState.quit = glfwWindowShouldClose(glfwWindow) || g_quitNextFrame; + } + MPI_Barrier(MPI_COMM_WORLD); +} +``` - Alternatively, [CMAKE_PREFIX_PATH](https://cmake.org/cmake/help/latest/variable/CMAKE_PREFIX_PATH.html) - can be set to find the OSPRay install and other dependencies. +Then, at the beginning of the next frame, the object is broadcast to other processes, and each process updates its objects and application states based on the shared values. -- Clone OSPRay Studio +``` +while (true) { + MPI_Bcast(&sharedState, sizeof(sharedState), MPI_BYTE, 0, MPI_COMM_WORLD); + + { // process changes in the shared state + if (sharedState.quit) { + break; + } + + if (sharedState.camChanged) { + auto camera = frame->child("camera").nodeAs(); + camera->child("transform").setValue(sharedState.transform); + camera->child("topLeft").setValue(xfmPoint(sharedState.transform, topLeftLocal)); + camera->child("botLeft").setValue(xfmPoint(sharedState.transform, botLeftLocal)); + camera->child("botRight").setValue(xfmPoint(sharedState.transform, botRightLocal)); + + sharedState.camChanged = false; + } + } + + ... +} +``` - ``` bash - git clone https://github.com/ospray/ospray_studio/ - ``` +Also, to ensure windows display rendering results simultaneously, processes wait for others to complete the rendering processes before swapping buffers. This is done by calling ```waitOnOSPRayFrame()``` and ```MPI_Barrier(...)``` before ```glfwSwapBuffers(...)```. -- Create build directory and change directory to it (we recommend - keeping a separate build directory) - ``` bash - cd ospray_studio - mkdir build - cd build - ``` -- Then run the typical CMake routine +# Gesture Plugin +

- ``` bash - cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang ... # or use ccmake - make -j `nproc` # or cmake --build . - ``` +The plugin handles the connection with [Gesture Tracking Server](https://github.com/jungwhonam-tacc/GestureTrackingServer), computes gestures from received data, and keeps track of the latest state. When the plugin receives a message from the server, it derives additional information from the body tracking data. The underlying scene is not updated immediately; OSPRay Studio initiates updating the scene from the latest tracking data. When the application is in the phase of processing user inputs, e.g., key-pressed events, it calls a poll event method from the plugin to get the latest tracking result and uses the result to update corresponding 3D objects, e.g., changing camera locations. -- To run OSPRay Studio, make sure `LD_LIBRARY_PATH` (on Linux) or - `DYLD_LIBRARY_PATH` (on macOS) contains all dependencies. For - example, +> See codes under ```plugins/gesture_plugin/tracker```. - ``` bash - export LD_LIBRARY_PATH=${OSPRAY_INSTALL}/lib64:...:$LD_LIBRARY_PATH - # then run! - ./ospStudio - ``` +## GUI +The plugin panel can be opended by clicking ```Plugins/Gesture Panel``` in the menu. As shown in the left figure, the top pane shows information about the server and has a button for starting and closing the connection. ``Configuration`` pane provides options to modify body tracking data received from the server. ``Save`` button saves the current values to a JSON file (the application reads the values at the start). ``Status`` pane shows important updates, e.g., indicating whether a server is connected. -### Building on Windows +## Implementation details + +At the start, the information about the socket, e.g., IP address and port number, is read from a JSON configuration file. The file also contains information about how to process the user tracking data. -Use CMake (cmake-gui) to configure and generate a Microsoft Visual -Studio solution file for OSPRay Studio. +``` +{ + "ipAddress": "127.0.0.1", + "portNumber": 8888, + + "scaleOffset": [0.001, -0.001, -0.001], + "translationOffset": [0.0, -0.1, 1.19], + "confidenceLevelThreshold": 1, + "leaningAngleThreshold": 1.0, + "leaningDirScaleFactor": [1.0, 1.0, 1.0] +} +``` +- the first two key/value pairs are information about the gesture tracking server. +- ```multiplyBy``` is multiplied to position values of joints. This process is needed as Kinect and OSPRay are in two different coordinate systems. +- ```positionOffset``` are used to offset the sensor's center. The offset is applied to calibrate the sensor and displays. +- ```leaningAngleThreshold``` is a threshhold for activating the flying mode. When a user's body is leaning more than the angle, the flying mode is activated. -- Specify the source folder and the build directory in CMake -- Specify `ospray_DIR`, `rkcommon_DIR` CMake - variables for the respective install locations -- Click 'Configure' and select the appropriate generator (we recommend - using at least Visual Studio 15 2017) -- Select x64 as an optional parameter for the generator (32-bit builds - are not supported) -- Click 'Generate' to create `ospray_studio.sln`. Open this in Visual - Studio and compile + +`async-sockets` receives body tracking data from the server. The implementation is based on [async-sockets](https://github.com/eminfedar/async-sockets-cpp) (using the version from the last commit on 2/21/2022). -You can optionally use the CMake command line: + +```TrackingManager``` manages a socket connection and keeps track of the latest data from the server. In addition to providing methods for starting and closing the connection, the class keeps track of the latest data received from the server. The data can be accessed by calling ```pollState()```. When the method is called, the object that stores the latest information becomes empty, indicating the data has been used. In the plugin, the method is called in ```process(std::string key)```. -``` pwsh -cmake --build . --config Release --target install ``` +void PanelGesture::process(std::string key) { + if (key == "update") { + TrackingState state = trackingManager->pollState(); + if (state.mode == INTERACTION_FLYING) { + context->arcballCamera->move(state.leaningDir); + } + } + else if (key == "start") { + trackingManager->start(); + } +} +``` + +The manager class also figures out current gestures. When a message is received from the server, ```updateState(std::string message)``` is called to process the message. We compute a leaning direction and the current gesture mode in our current implementation. \ No newline at end of file diff --git a/example-config/display_settings.json b/example-config/display_settings.json new file mode 100644 index 00000000..dfc6d73c --- /dev/null +++ b/example-config/display_settings.json @@ -0,0 +1,56 @@ +[ +{ + "hostName": "localhost", + + "topLeft": [-0.178950, 0.122950, -1.000000], + "botLeft": [-0.178950, -0.122950, -1.000000], + "botRight": [0.178950, -0.122950, -1.000000], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.006320, + "mullionRight": 0.006320, + "mullionTop": 0.015056, + "mullionBottom": 0.015056, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 1024, + "screenHeight": 640 +}, +{ + "hostName": "localhost", + + "topLeft": [-0.178950, 0.122950, -1.000000], + "botLeft": [-0.178950, -0.122950, -1.000000], + "botRight": [0.000000, -0.122950, -1.000000], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.006320, + "mullionRight": 0.000000, + "mullionTop": 0.015056, + "mullionBottom": 0.015056, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 896, + "screenHeight": 1120 +}, +{ + "hostName": "localhost", + + "topLeft": [0.000000, 0.122950, -1.000000], + "botLeft": [0.000000, -0.122950, -1.000000], + "botRight": [0.178950, -0.122950, -1.000000], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.000000, + "mullionRight": 0.006320, + "mullionTop": 0.015056, + "mullionBottom": 0.015056, + + "display": 0, + "screenX": 896, + "screenY": 0, + "screenWidth": 896, + "screenHeight": 1120 +} +] \ No newline at end of file diff --git a/example-config/rattler.json b/example-config/rattler.json new file mode 100644 index 00000000..e29fe4f6 --- /dev/null +++ b/example-config/rattler.json @@ -0,0 +1,344 @@ +[ +{ + "hostName": "localhost", + + "topLeft": [-1.887851, 1.078200, 0.613400], + "botLeft": [-1.887851, -1.078200, 0.613400], + "botRight": [1.887851, -1.078200, 0.613400], + "eye": [0.000000, 0.000000, 2.501251], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 1024, + "screenHeight": 577 +}, +{ + "hostName": "r07", + + "topLeft": [-1.887851, 1.078200, 0.613400], + "botLeft": [-1.887851, 0.359400, 0.613400], + "botRight": [-1.887851, 0.359400, -0.613400], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r08", + + "topLeft": [-1.887851, 0.359400, 0.613400], + "botLeft": [-1.887851, -0.359400, 0.613400], + "botRight": [-1.887851, -0.359400, -0.613400], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r09", + + "topLeft": [-1.887851, -0.359400, 0.613400], + "botLeft": [-1.887851, -1.078200, 0.613400], + "botRight": [-1.887851, -1.078200, -0.613400], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r04", + + "topLeft": [-1.887851, 1.078200, -0.613400], + "botLeft": [-1.887851, 0.359400, -0.613400], + "botRight": [-1.166756, 0.359400, -1.605902], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r05", + + "topLeft": [-1.887851, 0.359400, -0.613400], + "botLeft": [-1.887851, -0.359400, -0.613400], + "botRight": [-1.166756, -0.359400, -1.605902], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r06", + + "topLeft": [-1.887851, -0.359400, -0.613400], + "botLeft": [-1.887851, -1.078200, -0.613400], + "botRight": [-1.166756, -1.078200, -1.605902], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r10", + + "topLeft": [-1.166756, 1.078200, -1.605902], + "botLeft": [-1.166756, 0.359400, -1.605902], + "botRight": [0.000000, 0.359400, -1.985004], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r11", + + "topLeft": [-1.166756, 0.359400, -1.605902], + "botLeft": [-1.166756, -0.359400, -1.605902], + "botRight": [0.000000, -0.359400, -1.985004], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r12", + + "topLeft": [-1.166756, -0.359400, -1.605902], + "botLeft": [-1.166756, -1.078200, -1.605902], + "botRight": [0.000000, -1.078200, -1.985004], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r13", + + "topLeft": [0.000000, 1.078200, -1.985004], + "botLeft": [0.000000, 0.359400, -1.985004], + "botRight": [1.166756, 0.359400, -1.605902], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r14", + + "topLeft": [0.000000, 0.359400, -1.985004], + "botLeft": [0.000000, -0.359400, -1.985004], + "botRight": [1.166756, -0.359400, -1.605902], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r15", + + "topLeft": [0.000000, -0.359400, -1.985004], + "botLeft": [0.000000, -1.078200, -1.985004], + "botRight": [1.166756, -1.078200, -1.605902], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r16", + + "topLeft": [1.166756, 1.078200, -1.605902], + "botLeft": [1.166756, 0.359400, -1.605902], + "botRight": [1.887851, 0.359400, -0.613400], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r17", + + "topLeft": [1.166756, 0.359400, -1.605902], + "botLeft": [1.166756, -0.359400, -1.605902], + "botRight": [1.887851, -0.359400, -0.613400], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r18", + + "topLeft": [1.166756, -0.359400, -1.605902], + "botLeft": [1.166756, -1.078200, -1.605902], + "botRight": [1.887851, -1.078200, -0.613400], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r01", + + "topLeft": [1.887851, 1.078200, -0.613400], + "botLeft": [1.887851, 0.359400, -0.613400], + "botRight": [1.887851, 0.359400, 0.613400], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r02", + + "topLeft": [1.887851, 0.359400, -0.613400], + "botLeft": [1.887851, -0.359400, -0.613400], + "botRight": [1.887851, -0.359400, 0.613400], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r03", + + "topLeft": [1.887851, -0.359400, -0.613400], + "botLeft": [1.887851, -1.078200, -0.613400], + "botRight": [1.887851, -1.078200, 0.613400], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +} +] \ No newline at end of file diff --git a/example-config/rattler_planar.json b/example-config/rattler_planar.json new file mode 100644 index 00000000..860d96d5 --- /dev/null +++ b/example-config/rattler_planar.json @@ -0,0 +1,344 @@ +[ +{ + "hostName": "localhost", + + "topLeft": [-3.680400, 1.078200, -1.887851], + "botLeft": [-3.680400, -1.078200, -1.887851], + "botRight": [3.680400, -1.078200, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 1024, + "screenHeight": 295 +}, +{ + "hostName": "r07", + + "topLeft": [-3.680400, 1.078200, -1.887851], + "botLeft": [-3.680400, 0.359400, -1.887851], + "botRight": [-2.453600, 0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r08", + + "topLeft": [-3.680400, 0.359400, -1.887851], + "botLeft": [-3.680400, -0.359400, -1.887851], + "botRight": [-2.453600, -0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r09", + + "topLeft": [-3.680400, -0.359400, -1.887851], + "botLeft": [-3.680400, -1.078200, -1.887851], + "botRight": [-2.453600, -1.078200, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r04", + + "topLeft": [-2.453600, 1.078200, -1.887851], + "botLeft": [-2.453600, 0.359400, -1.887851], + "botRight": [-1.226800, 0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r05", + + "topLeft": [-2.453600, 0.359400, -1.887851], + "botLeft": [-2.453600, -0.359400, -1.887851], + "botRight": [-1.226800, -0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r06", + + "topLeft": [-2.453600, -0.359400, -1.887851], + "botLeft": [-2.453600, -1.078200, -1.887851], + "botRight": [-1.226800, -1.078200, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r10", + + "topLeft": [-1.226800, 1.078200, -1.887851], + "botLeft": [-1.226800, 0.359400, -1.887851], + "botRight": [0.000000, 0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r11", + + "topLeft": [-1.226800, 0.359400, -1.887851], + "botLeft": [-1.226800, -0.359400, -1.887851], + "botRight": [0.000000, -0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r12", + + "topLeft": [-1.226800, -0.359400, -1.887851], + "botLeft": [-1.226800, -1.078200, -1.887851], + "botRight": [0.000000, -1.078200, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r13", + + "topLeft": [0.000000, 1.078200, -1.887851], + "botLeft": [0.000000, 0.359400, -1.887851], + "botRight": [1.226800, 0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r14", + + "topLeft": [0.000000, 0.359400, -1.887851], + "botLeft": [0.000000, -0.359400, -1.887851], + "botRight": [1.226800, -0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r15", + + "topLeft": [0.000000, -0.359400, -1.887851], + "botLeft": [0.000000, -1.078200, -1.887851], + "botRight": [1.226800, -1.078200, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r16", + + "topLeft": [1.226800, 1.078200, -1.887851], + "botLeft": [1.226800, 0.359400, -1.887851], + "botRight": [2.453600, 0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r17", + + "topLeft": [1.226800, 0.359400, -1.887851], + "botLeft": [1.226800, -0.359400, -1.887851], + "botRight": [2.453600, -0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r18", + + "topLeft": [1.226800, -0.359400, -1.887851], + "botLeft": [1.226800, -1.078200, -1.887851], + "botRight": [2.453600, -1.078200, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r01", + + "topLeft": [2.453600, 1.078200, -1.887851], + "botLeft": [2.453600, 0.359400, -1.887851], + "botRight": [3.680400, 0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r02", + + "topLeft": [2.453600, 0.359400, -1.887851], + "botLeft": [2.453600, -0.359400, -1.887851], + "botRight": [3.680400, -0.359400, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +}, +{ + "hostName": "r03", + + "topLeft": [2.453600, -0.359400, -1.887851], + "botLeft": [2.453600, -1.078200, -1.887851], + "botRight": [3.680400, -1.078200, -1.887851], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.011326, + "mullionRight": 0.011326, + "mullionTop": 0.020733, + "mullionBottom": 0.020733, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 3840, + "screenHeight": 2160 +} +] \ No newline at end of file diff --git a/example-config/tracking_settings.json b/example-config/tracking_settings.json new file mode 100644 index 00000000..debcdd99 --- /dev/null +++ b/example-config/tracking_settings.json @@ -0,0 +1,10 @@ +{ + "ipAddress": "127.0.0.1", + "portNumber": 8888, + + "scaleOffset": [0.001, -0.001, -0.001], + "translationOffset": [0.0, -0.1, 1.19], + "confidenceLevelThreshold": 1, + "leaningAngleThreshold": 1.0, + "leaningDirScaleFactor": [1.0, 1.0, 1.0] +} \ No newline at end of file diff --git a/example-config/two_displays.json b/example-config/two_displays.json new file mode 100644 index 00000000..28d80946 --- /dev/null +++ b/example-config/two_displays.json @@ -0,0 +1,56 @@ +[ +{ + "hostName": "localhost", + + "topLeft": [-0.357900, 0.320370, -1.000000], + "botLeft": [-0.357900, -0.320370, -1.000000], + "botRight": [0.379660, -0.320370, -1.000000], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.006320, + "mullionRight": 0.021536, + "mullionTop": 0.021180, + "mullionBottom": 0.021180, + + "display": 1, + "screenX": 0, + "screenY": 0, + "screenWidth": 840, + "screenHeight": 708 +}, +{ + "hostName": "localhost", + + "topLeft": [-0.357900, 0.122950, -1.000000], + "botLeft": [-0.357900, -0.122950, -1.000000], + "botRight": [0.000000, -0.122950, -1.000000], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.006320, + "mullionRight": 0.006320, + "mullionTop": 0.015056, + "mullionBottom": 0.015056, + + "display": 0, + "screenX": 0, + "screenY": 0, + "screenWidth": 1792, + "screenHeight": 1120 +}, +{ + "hostName": "localhost", + + "topLeft": [0.000000, 0.320370, -1.000000], + "botLeft": [0.000000, -0.320370, -1.000000], + "botRight": [0.379660, -0.320370, -1.000000], + "eye": [0.000000, 0.000000, 0.000000], + "mullionLeft": 0.021536, + "mullionRight": 0.021536, + "mullionTop": 0.021180, + "mullionBottom": 0.021180, + + "display": 1, + "screenX": 0, + "screenY": 0, + "screenWidth": 1440, + "screenHeight": 2560 +} +] \ No newline at end of file From e1b5344901bdd936738a41ccb1dcf7df48b42e60 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Thu, 4 May 2023 17:15:55 -0500 Subject: [PATCH 11/18] Fix links in README --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b542ae6d..c18bb549 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Immersive OSPRay Studio > This project is part of a larger project called [Immersive OSPray](https://github.com/jungwhonam-tacc/Whitepaper). -We extend [OSPRay v2.10.0](https://github.com/ospray/ospray/releases/tag/v2.11.0) to display a single, coherent 3D virtual environment on tiled display walls and use gesture-based interaction techniques to navigate the environment. We provide another mode of running the application with the ability to open multiple windows and coordinate these windows (see [MULTIWINDOWS Mode](#multiwindows-mode)). We provide gestured-based interaction techniques by integrating a separate server application sending tracking user data to a plugin to the rendering application (see [Gesture Plugin](#multiwindows-mode)). +We extend [OSPRay v2.10.0](https://github.com/ospray/ospray/releases/tag/v2.11.0) to display a single, coherent 3D virtual environment on tiled display walls and use gesture-based interaction techniques to navigate the environment. We provide another mode of running the application with the ability to open multiple windows and coordinate these windows (see [MULTIWINDOWS Mode](#multiwindows-mode)). We provide gestured-based interaction techniques by integrating a separate server application sending tracking user data to a plugin to the rendering application (see [Gesture Plugin](#gesture-plugin)). # Build and Run ## CMake configuration and build @@ -9,10 +9,8 @@ We extend [OSPRay v2.10.0](https://github.com/ospray/ospray/releases/tag/v2.11.0 git clone https://github.com/jungwhonam-tacc/ospray_studio.git cd ospray_studio -# switch to the devel branch -git switch devel +git checkout v0.12.0-alpha.x -# create "build/release" mkdir build cd build mkdir release From 11c6c58f3b1b35a0cb4a1f2eb69a378eb2b0d90b Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Fri, 5 May 2023 09:50:23 -0500 Subject: [PATCH 12/18] Update links in README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c18bb549..13c2bc51 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ cmake --build release -- -j 5 cmake --install release ``` -OSPRay Studio needs to be built with ```-DUSE_MPI=ON```, ```-DBUILD_PLUGINS=ON```, and ```-BUILD_PLUGIN_GESTURE=ON``` in CMake. Also, we need to use [OSPRay we have customized](https://github.com/jungwhonam-tacc/ospray). After building the OSPRay, set ```ospray_DIR``` so CMake can locate OSPRay, e.g., ```/Users/jnam/Documents/GitHub/ospray/build/install/ospray/lib/cmake/ospray-2.10.0```. +OSPRay Studio needs to be built with ```-DUSE_MPI=ON```, ```-DBUILD_PLUGINS=ON```, and ```-BUILD_PLUGIN_GESTURE=ON``` in CMake. Also, we need to use [OSPRay we have customized](https://github.com/jungwhonam-tacc/ospray/tree/v2.11.0-alpha.x). After building the OSPRay, set ```ospray_DIR``` so CMake can locate OSPRay, e.g., ```/Users/jnam/Documents/GitHub/ospray/build/install/ospray/lib/cmake/ospray-2.10.0```. ## Run the application ``` @@ -46,7 +46,7 @@ multiwindows \ ```--mpi```: This option enables the OSPRay Studio's built-in MPI support, which is a required dependency of our custom mode. -````--displayConfig config/display_settings.json````: The JSON configuration file contains information about off-axis projection cameras and windows. Information in the file is used to position and scale windows. See [Display Configuration JSON File](https://github.com/jungwhonam-tacc/ConfigurationGenerator#1-display-configuration-json-file) for details on the JSON file. +````--displayConfig config/display_settings.json````: The JSON configuration file contains information about off-axis projection cameras and windows. Information in the file is used to position and scale windows. See [Display Configuration JSON File](https://github.com/jungwhonam-tacc/ConfigurationGenerator#display-configuration-json-file) for details on the JSON file. ```--scene multilevel_hierarchy```: This option starts the application with the scene opened (optional). @@ -64,7 +64,7 @@ OSPRay Studio provides different modes of running the application. We added anot ### 1. Position and scale windows based on MPI ranks This new OSPRay Studio mode takes a command line option, ```--displayConfig```, which points to a JSON configuration file that specifies windows and off-axis cameras. At the start of the application, the JSON file is loaded, and values get stored in a JSON object ```nlohmann::ordered_json configDisplay```. Positioning and scaling GLFW windows are done in a constructor. -> See [Display Configuration JSON File](https://github.com/jungwhonam-tacc/ConfigurationGenerator#1-display-configuration-json-file) for details on the JSON file. +> See [Display Configuration JSON File](https://github.com/jungwhonam-tacc/ConfigurationGenerator#display-configuration-json-file) for details on the JSON file. > See ```void MultiWindows::addToCommandLine(std::shared_ptr app)``` for implementation. From 2fbb299803073f104c0efd5398323aff9e9d77d7 Mon Sep 17 00:00:00 2001 From: JungWho Nam <67192233+JungWhoNam@users.noreply.github.com> Date: Thu, 15 Jun 2023 15:29:11 -0500 Subject: [PATCH 13/18] Update urls in README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 13c2bc51..4d70b64d 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # Immersive OSPRay Studio -> This project is part of a larger project called [Immersive OSPray](https://github.com/jungwhonam-tacc/Whitepaper). +> This project is part of a larger project called [Immersive OSPray](https://github.com/jungwhonam/ImmersiveOSPRay). We extend [OSPRay v2.10.0](https://github.com/ospray/ospray/releases/tag/v2.11.0) to display a single, coherent 3D virtual environment on tiled display walls and use gesture-based interaction techniques to navigate the environment. We provide another mode of running the application with the ability to open multiple windows and coordinate these windows (see [MULTIWINDOWS Mode](#multiwindows-mode)). We provide gestured-based interaction techniques by integrating a separate server application sending tracking user data to a plugin to the rendering application (see [Gesture Plugin](#gesture-plugin)). # Build and Run ## CMake configuration and build ``` -git clone https://github.com/jungwhonam-tacc/ospray_studio.git +git clone https://github.com/jungwhonam/ospray_studio.git cd ospray_studio git checkout v0.12.0-alpha.x @@ -28,7 +28,7 @@ cmake --build release -- -j 5 cmake --install release ``` -OSPRay Studio needs to be built with ```-DUSE_MPI=ON```, ```-DBUILD_PLUGINS=ON```, and ```-BUILD_PLUGIN_GESTURE=ON``` in CMake. Also, we need to use [OSPRay we have customized](https://github.com/jungwhonam-tacc/ospray/tree/v2.11.0-alpha.x). After building the OSPRay, set ```ospray_DIR``` so CMake can locate OSPRay, e.g., ```/Users/jnam/Documents/GitHub/ospray/build/install/ospray/lib/cmake/ospray-2.10.0```. +OSPRay Studio needs to be built with ```-DUSE_MPI=ON```, ```-DBUILD_PLUGINS=ON```, and ```-BUILD_PLUGIN_GESTURE=ON``` in CMake. Also, we need to use [OSPRay we have customized](https://github.com/jungwhonam/ospray/tree/v2.11.0-alpha.x). After building the OSPRay, set ```ospray_DIR``` so CMake can locate OSPRay, e.g., ```/Users/jnam/Documents/GitHub/ospray/build/install/ospray/lib/cmake/ospray-2.10.0```. ## Run the application ``` @@ -46,7 +46,7 @@ multiwindows \ ```--mpi```: This option enables the OSPRay Studio's built-in MPI support, which is a required dependency of our custom mode. -````--displayConfig config/display_settings.json````: The JSON configuration file contains information about off-axis projection cameras and windows. Information in the file is used to position and scale windows. See [Display Configuration JSON File](https://github.com/jungwhonam-tacc/ConfigurationGenerator#display-configuration-json-file) for details on the JSON file. +````--displayConfig config/display_settings.json````: The JSON configuration file contains information about off-axis projection cameras and windows. Information in the file is used to position and scale windows. See [Display Configuration JSON File](https://github.com/jungwhonam/ConfigurationGenerator#display-configuration-json-file) for details on the JSON file. ```--scene multilevel_hierarchy```: This option starts the application with the scene opened (optional). @@ -64,7 +64,7 @@ OSPRay Studio provides different modes of running the application. We added anot ### 1. Position and scale windows based on MPI ranks This new OSPRay Studio mode takes a command line option, ```--displayConfig```, which points to a JSON configuration file that specifies windows and off-axis cameras. At the start of the application, the JSON file is loaded, and values get stored in a JSON object ```nlohmann::ordered_json configDisplay```. Positioning and scaling GLFW windows are done in a constructor. -> See [Display Configuration JSON File](https://github.com/jungwhonam-tacc/ConfigurationGenerator#display-configuration-json-file) for details on the JSON file. +> See [Display Configuration JSON File](https://github.com/jungwhonam/ConfigurationGenerator#display-configuration-json-file) for details on the JSON file. > See ```void MultiWindows::addToCommandLine(std::shared_ptr app)``` for implementation. @@ -134,7 +134,7 @@ Also, to ensure windows display rendering results simultaneously, processes wait -The plugin handles the connection with [Gesture Tracking Server](https://github.com/jungwhonam-tacc/GestureTrackingServer), computes gestures from received data, and keeps track of the latest state. When the plugin receives a message from the server, it derives additional information from the body tracking data. The underlying scene is not updated immediately; OSPRay Studio initiates updating the scene from the latest tracking data. When the application is in the phase of processing user inputs, e.g., key-pressed events, it calls a poll event method from the plugin to get the latest tracking result and uses the result to update corresponding 3D objects, e.g., changing camera locations. +The plugin handles the connection with [Gesture Tracking Server](https://github.com/jungwhonam/GestureTrackingServer), computes gestures from received data, and keeps track of the latest state. When the plugin receives a message from the server, it derives additional information from the body tracking data. The underlying scene is not updated immediately; OSPRay Studio initiates updating the scene from the latest tracking data. When the application is in the phase of processing user inputs, e.g., key-pressed events, it calls a poll event method from the plugin to get the latest tracking result and uses the result to update corresponding 3D objects, e.g., changing camera locations. > See codes under ```plugins/gesture_plugin/tracker```. @@ -182,4 +182,4 @@ void PanelGesture::process(std::string key) { } ``` -The manager class also figures out current gestures. When a message is received from the server, ```updateState(std::string message)``` is called to process the message. We compute a leaning direction and the current gesture mode in our current implementation. \ No newline at end of file +The manager class also figures out current gestures. When a message is received from the server, ```updateState(std::string message)``` is called to process the message. We compute a leaning direction and the current gesture mode in our current implementation. From ec83d7616459b33a3daa7731a8cffdd0044dd73f Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Thu, 1 Jun 2023 16:23:29 -0500 Subject: [PATCH 14/18] Adds an initial implementation of a storyboard --- .gitignore | 1 + plugins/storyboard_plugin/CMakeLists.txt | 33 +++ plugins/storyboard_plugin/PanelStoryboard.cpp | 213 +++++++++++++++ plugins/storyboard_plugin/PanelStoryboard.h | 27 ++ .../storyboard_plugin/external/CMakeLists.txt | 1 + .../external/async-sockets/CMakeLists.txt | 3 + .../external/async-sockets/basesocket.hpp | 146 ++++++++++ .../external/async-sockets/tcpserver.hpp | 175 ++++++++++++ .../external/async-sockets/tcpsocket.hpp | 258 ++++++++++++++++++ .../storyboard_plugin/plugin_storyboard.cpp | 52 ++++ .../request/RequestManager.cpp | 117 ++++++++ .../request/RequestManager.h | 46 ++++ .../storyboard_settings.json | 7 + 13 files changed, 1079 insertions(+) create mode 100644 plugins/storyboard_plugin/CMakeLists.txt create mode 100644 plugins/storyboard_plugin/PanelStoryboard.cpp create mode 100644 plugins/storyboard_plugin/PanelStoryboard.h create mode 100644 plugins/storyboard_plugin/external/CMakeLists.txt create mode 100644 plugins/storyboard_plugin/external/async-sockets/CMakeLists.txt create mode 100644 plugins/storyboard_plugin/external/async-sockets/basesocket.hpp create mode 100644 plugins/storyboard_plugin/external/async-sockets/tcpserver.hpp create mode 100644 plugins/storyboard_plugin/external/async-sockets/tcpsocket.hpp create mode 100644 plugins/storyboard_plugin/plugin_storyboard.cpp create mode 100644 plugins/storyboard_plugin/request/RequestManager.cpp create mode 100644 plugins/storyboard_plugin/request/RequestManager.h create mode 100644 plugins/storyboard_plugin/storyboard_settings.json diff --git a/.gitignore b/.gitignore index 6f7e0183..8cefb6b3 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ /plugins/* !/plugins/example_plugin !/plugins/gesture_plugin +!/plugins/storyboard_plugin doc/*.html diff --git a/plugins/storyboard_plugin/CMakeLists.txt b/plugins/storyboard_plugin/CMakeLists.txt new file mode 100644 index 00000000..75e1f580 --- /dev/null +++ b/plugins/storyboard_plugin/CMakeLists.txt @@ -0,0 +1,33 @@ +option(BUILD_PLUGIN_STORYBOARD "Storyboard plugin" OFF) + +if (BUILD_PLUGIN_STORYBOARD) + set(pluginName "ospray_studio_plugin_storyboard") + + add_library(${pluginName} SHARED + plugin_storyboard.cpp + PanelStoryboard.cpp + request/RequestManager.cpp + ) + + target_link_libraries(${pluginName} ospray_sg ospray_ui) + + # Only link against imgui if needed (ie, pure file importers don't) + target_link_libraries(${pluginName} imgui) + + # Add external libraries for this plugin + # add_subdirectory(external) + target_link_libraries(${pluginName} network) + + target_include_directories(${pluginName} + PRIVATE ${CMAKE_SOURCE_DIR} + ) + + install(TARGETS ${pluginName} + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT lib + # on Windows put the dlls into bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT lib + ) + +endif() diff --git a/plugins/storyboard_plugin/PanelStoryboard.cpp b/plugins/storyboard_plugin/PanelStoryboard.cpp new file mode 100644 index 00000000..5a3a95eb --- /dev/null +++ b/plugins/storyboard_plugin/PanelStoryboard.cpp @@ -0,0 +1,213 @@ +#include + +#include "PanelStoryboard.h" + +#include "app/widgets/GenerateImGuiWidgets.h" + +#include "rkcommon/math/vec.h" + +#include "sg/JSONDefs.h" +#include "sg/Math.h" +#include "sg/JSONDefs.h" + +#include "imgui.h" + +namespace ospray { +namespace storyboard_plugin { + +PanelStoryboard::PanelStoryboard(std::shared_ptr _context, std::string _panelName, std::string _configFilePath) + : Panel(_panelName.c_str(), _context) + , panelName(_panelName) + , configFilePath(_configFilePath) +{ + requestManager.reset(new RequestManager("localhost", 8888)); + + requestManager->start(); +} + +void PanelStoryboard::buildUI(void *ImGuiCtx) +{ + // Need to set ImGuiContext in *this* address space + ImGui::SetCurrentContext((ImGuiContext *)ImGuiCtx); + ImGui::OpenPopup(panelName.c_str()); + + if (!ImGui::BeginPopupModal(panelName.c_str(), nullptr, ImGuiWindowFlags_None)) return; + + if (requestManager->isRunning()) { + ImGui::Text("%s", "Currently connected to the storyboard server..."); + + if (ImGui::Button("Disconnect")) { + requestManager->close(); + } + } + else { + ImGui::Text("%s", "Currently NOT connected to the storyboard server..."); + std::string str = "- Connect to " + requestManager->ipAddress + ":" + std::to_string(requestManager->portNumber); + ImGui::Text("%s", str.c_str()); + + if (ImGui::Button("Connect")) { + requestManager->start(); + } + } + ImGui::Separator(); + + // Close button + if (ImGui::Button("Close")) { + setShown(false); + ImGui::CloseCurrentPopup(); + } + ImGui::Separator(); + + // if (ImGui::CollapsingHeader("Configuration", ImGuiTreeNodeFlags_DefaultOpen)) { + // ImGui::Text("%s", "Offset(s)"); + // ImGui::DragFloat3("Scale", storyboardManager->scaleOffset, 0.001, -100, 100, "%.3f"); + // ImGui::DragFloat3("Translate", storyboardManager->translationOffset, 0, -100, 100, "%.1f"); + + // ImGui::Separator(); + // if (ImGui::Button("Save")) { + // storyboardManager->saveConfig(this->configFilePath); + // } + // } + ImGui::Separator(); + + // Display statuses in a scrolling region + if (ImGui::CollapsingHeader("Status", ImGuiTreeNodeFlags_DefaultOpen)) { + ImGui::BeginChild("Scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_AlwaysAutoResize); + for (std::string status : requestManager->statuses) { + ImGui::Text("%s", status.c_str()); + } + ImGui::EndChild(); + } + ImGui::Separator(); + + ImGui::EndPopup(); +} + +void PanelStoryboard::process(std::string key) { + if (key == "update") { + std::queue requests; + requestManager->pollRequests(requests); + + std::cout << "Requests... " << requests.size() << std::flush << std::endl; + + while (!requests.empty()) { + nlohmann::ordered_json req = requests.front(); + + if (req.contains("type") && req["type"] == "request" && + req.contains("action") && req["action"] == "capture.view") { + + nlohmann::ordered_json j = + { + {"type", "response"}, + {"action", "capture.view"}, + {"snapshotIdx", req["snapshotIdx"].get()}, + {"camera", context->arcballCamera->getState()} + }; + requestManager->send(j.dump()); + } + else if (req.contains("type") && req["type"] == "request" && + req.contains("action") && req["action"] == "capture.image") { + + // 1) capture the image + vec2i size{16, 16}; + std::vector values + { + 48,50,50,50,231,48,170,127,50,50,50,50,249,64,188,127,3,3,3,3,246,48,2,5,3,3,3,3,244,48,3,6,50,50,50,50,247,64,170,127,50,242,2,168,231,48,255,255,3,3,3,255,230,64,0,15,0,255,0,170,233,64,159,255,91,3,3,3,202,106,15,48,3,3,3,255,202,104,15,48,170,148,144,64,186,91,175,104,64,0,0,255,202,88,15,32,0,0,0,255,230,64,1,44,0,255,0,170,219,65,255,255,0,0,0,255,232,64,1,28,0,255,0,170,187,64,255,255 + }; + + // auto binary = nlohmann::ordered_json::binary_t( + // { + // 0x30, 0x32, 0x32, 0x32, 0xe7, 0x30, 0xaa, 0x7f, 0x32, 0x32, 0x32, 0x32, 0xf9, 0x40, 0xbc, 0x7f, + // 0x03, 0x03, 0x03, 0x03, 0xf6, 0x30, 0x02, 0x05, 0x03, 0x03, 0x03, 0x03, 0xf4, 0x30, 0x03, 0x06, + // 0x32, 0x32, 0x32, 0x32, 0xf7, 0x40, 0xaa, 0x7f, 0x32, 0xf2, 0x02, 0xa8, 0xe7, 0x30, 0xff, 0xff, + // 0x03, 0x03, 0x03, 0xff, 0xe6, 0x40, 0x00, 0x0f, 0x00, 0xff, 0x00, 0xaa, 0xe9, 0x40, 0x9f, 0xff, + // 0x5b, 0x03, 0x03, 0x03, 0xca, 0x6a, 0x0f, 0x30, 0x03, 0x03, 0x03, 0xff, 0xca, 0x68, 0x0f, 0x30, + // 0xaa, 0x94, 0x90, 0x40, 0xba, 0x5b, 0xaf, 0x68, 0x40, 0x00, 0x00, 0xff, 0xca, 0x58, 0x0f, 0x20, + // 0x00, 0x00, 0x00, 0xff, 0xe6, 0x40, 0x01, 0x2c, 0x00, 0xff, 0x00, 0xaa, 0xdb, 0x41, 0xff, 0xff, + // 0x00, 0x00, 0x00, 0xff, 0xe8, 0x40, 0x01, 0x1c, 0x00, 0xff, 0x00, 0xaa, 0xbb, 0x40, 0xff, 0xff, + // }); + + // auto binary = nlohmann::ordered_json::binary_t( + // { + // 48,50,50,50,231,48,170,127,50,50,50,50,249,64,188,127,3,3,3,3,246,48,2,5,3,3,3,3,244,48,3,6,50,50,50,50,247,64,170,127,50,242,2,168,231,48,255,255,3,3,3,255,230,64,0,15,0,255,0,170,233,64,159,255,91,3,3,3,202,106,15,48,3,3,3,255,202,104,15,48,170,148,144,64,186,91,175,104,64,0,0,255,202,88,15,32,0,0,0,255,230,64,1,44,0,255,0,170,219,65,255,255,0,0,0,255,232,64,1,28,0,255,0,170,187,64,255,255 + // }); + + // 2) send the setup information + nlohmann::ordered_json jSetUp = + { + {"type", "response"}, + {"action", "capture.image.setup"}, + {"snapshotIdx", req["snapshotIdx"].get()}, + {"width", size.x}, + {"height", size.y} + }; + requestManager->send(jSetUp.dump()); + + // 3) send the image data in chunks + int start = 0; + int chunckLen = 16 * 1; + while (start < size.x * size.y) { + int len = (start + chunckLen) > (size.x * size.y) ? (size.y * size.y - start) : chunckLen; + std::vector chunk = std::vector(values.begin() + start, values.begin() + start + len); + auto binary = nlohmann::ordered_json::binary_t(chunk); + + nlohmann::ordered_json jChunk = + { + {"type", "response"}, + {"action", "capture.image.data"}, + {"snapshotIdx", req["snapshotIdx"].get()}, + {"start", start }, + {"length", len }, + {"data", binary } + }; + requestManager->send(jChunk.dump()); + + start += len; + } + + // 4) send the done message + nlohmann::ordered_json jDone = + { + {"type", "response"}, + {"action", "capture.image.done"}, + {"snapshotIdx", req["snapshotIdx"].get()} + }; + requestManager->send(jDone.dump()); + } + else if (req.contains("type") && req["type"] == "request" && + req.contains("action") && req["action"] == "update.view") { + // int snapshotIdx = req["snapshotIdx"].get(); + + if (req.contains("camera")) { + CameraState state; + from_json(req["camera"], state); + context->arcballCamera->setState(state); + } + } + else if (req.contains("type") && req["type"] == "request" && + req.contains("action") && req["action"] == "update.transition") { + // int snapshotIdx = req["snapshotIdx"].get(); + + if (req.contains("amount") && req.contains("from") && req.contains("to")) { + CameraState from; + from_json(req["from"], from); + + CameraState to; + from_json(req["to"], to); + + CameraState curr = from.slerp(to, req["amount"]); + context->arcballCamera->setState(curr); + } + } + + requests.pop(); + } + } + else if (key == "start") { + requestManager->start(); + } + +} + +} // namespace storyboard_plugin +} // namespace ospray diff --git a/plugins/storyboard_plugin/PanelStoryboard.h b/plugins/storyboard_plugin/PanelStoryboard.h new file mode 100644 index 00000000..e3e78905 --- /dev/null +++ b/plugins/storyboard_plugin/PanelStoryboard.h @@ -0,0 +1,27 @@ +#pragma once + +#include "app/widgets/Panel.h" +#include "app/ospStudio.h" + +#include "request/RequestManager.h" + +namespace ospray { +namespace storyboard_plugin { + +struct PanelStoryboard : public Panel +{ + PanelStoryboard(std::shared_ptr _context, std::string _panelName, std::string _configFilePath); + + void buildUI(void *ImGuiCtx) override; + + void process(std::string key) override; + +private: + std::string panelName; + std::string configFilePath; + + std::unique_ptr requestManager; +}; + +} // namespace storyboard_plugin +} // namespace ospray diff --git a/plugins/storyboard_plugin/external/CMakeLists.txt b/plugins/storyboard_plugin/external/CMakeLists.txt new file mode 100644 index 00000000..fc999e8a --- /dev/null +++ b/plugins/storyboard_plugin/external/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(async-sockets) \ No newline at end of file diff --git a/plugins/storyboard_plugin/external/async-sockets/CMakeLists.txt b/plugins/storyboard_plugin/external/async-sockets/CMakeLists.txt new file mode 100644 index 00000000..8d9267dd --- /dev/null +++ b/plugins/storyboard_plugin/external/async-sockets/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(network INTERFACE) +target_include_directories(network + INTERFACE $) \ No newline at end of file diff --git a/plugins/storyboard_plugin/external/async-sockets/basesocket.hpp b/plugins/storyboard_plugin/external/async-sockets/basesocket.hpp new file mode 100644 index 00000000..47312430 --- /dev/null +++ b/plugins/storyboard_plugin/external/async-sockets/basesocket.hpp @@ -0,0 +1,146 @@ +// The Linux and Mac implementations are from https://github.com/eminfedar/async-sockets-cpp +// Updated it to suport Windows. +#pragma once + +#if defined(__linux__) || defined(__APPLE__) + +#include +#include +#include +#include +#include + +#include +#include +#include + +#define FDR_UNUSED(expr){ (void)(expr); } +#define FDR_ON_ERROR std::function onError = [](int errorCode, std::string errorMessage){FDR_UNUSED(errorCode); FDR_UNUSED(errorMessage)} + +class BaseSocket +{ +// Definitions +public: + enum SocketType + { + TCP = SOCK_STREAM, + UDP = SOCK_DGRAM + }; + const uint16_t BUFFER_SIZE = 0xFFFF; + sockaddr_in address; + bool isClosed = false; + +protected: + int sock = 0; + static std::string ipToString(sockaddr_in addr) + { + char ip[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN); + + return std::string(ip); + } + + BaseSocket(FDR_ON_ERROR, SocketType sockType = TCP, int socketId = -1) + { + if (socketId < 0) + { + if ((this->sock = socket(AF_INET, sockType, 0)) < 0) + { + onError(errno, "Socket creating error."); + } + } + else + { + this->sock = socketId; + } + } + +// Methods +public: + virtual void Close() { + if(isClosed) return; + + isClosed = true; + close(this->sock); + } + + std::string remoteAddress() {return ipToString(this->address);} + int remotePort() {return ntohs(this->address.sin_port);} + int fileDescriptor() const { return this->sock; } +}; + +#elif _WIN32 + +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include + +#include +#include +#include + +// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib +#pragma comment (lib, "Ws2_32.lib") +#pragma comment (lib, "Mswsock.lib") +#pragma comment (lib, "AdvApi32.lib") + +#define DEFAULT_BUFLEN 512 +#define FDR_UNUSED(expr){ (void)(expr); } +#define FDR_ON_ERROR std::function onError = [](int errorCode, std::string errorMessage){FDR_UNUSED(errorCode); FDR_UNUSED(errorMessage)} + +class BaseSocket +{ +// Definitions +public: + sockaddr_in address; + bool isClosed = false; + +protected: + SOCKET sock = INVALID_SOCKET; + + static std::string ipToString(sockaddr_in addr) { + char ip[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN); + + return std::string(ip); + } + + BaseSocket(FDR_ON_ERROR, int socketId = -1) { + // Initialize Winsock + WSADATA wsaData; + int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (iResult != 0) { + onError(errno, "WSAStartup failed with error: " + std::to_string(iResult)); + return; + } + + if (socketId < 0) { + // Create a SOCKET to connect to server or to listen for client connections + this->sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (this->sock == INVALID_SOCKET) { + onError(errno, "socket failed with error: " + std::to_string(WSAGetLastError())); + WSACleanup(); + return; + } + } else { + this->sock = (SOCKET) socketId; + } + } + +// Methods +public: + virtual void Close() { + if (isClosed) return; + + isClosed = true; + closesocket(this->sock); + WSACleanup(); + } + + std::string remoteAddress() { return ipToString(this->address); } + int remotePort() { return ntohs(this->address.sin_port); } +}; + +#endif \ No newline at end of file diff --git a/plugins/storyboard_plugin/external/async-sockets/tcpserver.hpp b/plugins/storyboard_plugin/external/async-sockets/tcpserver.hpp new file mode 100644 index 00000000..8e9096ec --- /dev/null +++ b/plugins/storyboard_plugin/external/async-sockets/tcpserver.hpp @@ -0,0 +1,175 @@ +// The Linux and Mac implementations are from https://github.com/eminfedar/async-sockets-cpp +// Updated it to suport Windows. +#pragma once + +#if defined(__linux__) || defined(__APPLE__) + +#include "tcpsocket.hpp" +#include + +class TCPServer : public BaseSocket +{ +public: + // Event Listeners: + std::function onNewConnection = [](TCPSocket* sock){FDR_UNUSED(sock)}; + + explicit TCPServer(FDR_ON_ERROR): BaseSocket(onError, SocketType::TCP) + { + int opt = 1; + setsockopt(this->sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(int)); + setsockopt(this->sock,SOL_SOCKET,SO_REUSEPORT,&opt,sizeof(int)); + } + + // Binding the server. + void Bind(const char *address, uint16_t port, FDR_ON_ERROR) + { + if (inet_pton(AF_INET, address, &this->address.sin_addr) <= 0) + { + onError(errno, "Invalid address. Address type not supported."); + return; + } + + this->address.sin_family = AF_INET; + this->address.sin_port = htons(port); + + if (bind(this->sock, (const sockaddr *)&this->address, sizeof(this->address)) < 0) + { + onError(errno, "Cannot bind the socket."); + return; + } + } + void Bind(int port, FDR_ON_ERROR) { this->Bind("0.0.0.0", port, onError); } + + // Start listening the server. + void Listen(FDR_ON_ERROR) + { + if (listen(this->sock, 20) < 0) + { + onError(errno, "Error: Server can't listen the socket."); + return; + } + + std::thread t(Accept, this, onError); + t.detach(); + } + + // Overriding Close to add shutdown(): + void Close() + { + shutdown(this->sock, SHUT_RDWR); + + BaseSocket::Close(); + } + +private: + static void Accept(TCPServer *server, FDR_ON_ERROR) + { + sockaddr_in newSocketInfo; + socklen_t newSocketInfoLength = sizeof(newSocketInfo); + + int newSock; + while (!server->isClosed) + { + while ((newSock = accept(server->sock, (sockaddr *)&newSocketInfo, &newSocketInfoLength)) < 0) + { + if (errno == EBADF || errno == EINVAL) return; + + onError(errno, "Error while accepting a new connection."); + return; + } + + if (!server->isClosed && newSock >= 0) + { + TCPSocket *newSocket = new TCPSocket(onError, newSock); + newSocket->deleteAfterClosed = true; + newSocket->setAddressStruct(newSocketInfo); + + server->onNewConnection(newSocket); + newSocket->Listen(); + } + } + } +}; + +#elif _WIN32 + +#include "tcpsocket.hpp" + +#include +#include + +class TCPServer : public BaseSocket +{ +public: + // Event Listeners: + std::function onNewConnection = [](TCPSocket* sock){FDR_UNUSED(sock)}; + + explicit TCPServer(FDR_ON_ERROR): BaseSocket(onError) { + BOOL bOptVal = TRUE; + setsockopt(this->sock, SOL_SOCKET, SO_REUSEADDR, (char *) &bOptVal, sizeof(BOOL)); + } + + // Binding the server. + void Bind(const char *address, uint16_t port, FDR_ON_ERROR) { + if (inet_pton(AF_INET, address, &this->address.sin_addr) <= 0) { + onError(errno, "Invalid address. Address type not supported."); + return; + } + + this->address.sin_family = AF_INET; + this->address.sin_port = htons(port); + + if (bind(this->sock, (const sockaddr *)&this->address, sizeof(this->address)) == SOCKET_ERROR) { + onError(errno, "Cannot bind the socket."); + //// + return; + } + } + void Bind(int port, FDR_ON_ERROR) { this->Bind("0.0.0.0", port, onError); } + + // Start listening the server. + void Listen(FDR_ON_ERROR) { + if (listen(this->sock, 20) == SOCKET_ERROR) { + onError(errno, "Error: Server can't listen the socket."); + return; + } + + std::thread t(Accept, this, onError); + t.detach(); + } + + // Overriding Close to add shutdown(): + void Close() { + shutdown(this->sock, SD_BOTH); + + BaseSocket::Close(); + } + +private: + static void Accept(TCPServer *server, FDR_ON_ERROR) { + sockaddr_in newSocketInfo; + socklen_t newSocketInfoLength = sizeof(newSocketInfo); + + SOCKET newSock = 0; + while (!server->isClosed) { + newSock = accept(server->sock, (sockaddr *)&newSocketInfo, &newSocketInfoLength); + if (newSock == INVALID_SOCKET) { + if (errno == EBADF || errno == EINVAL) return; + + onError(errno, "Error while accepting a new connection." + std::to_string(WSAGetLastError())); + return; + } + + if (!server->isClosed && newSock >= 0) { + TCPSocket *newSocket = new TCPSocket(onError, newSock); + newSocket->deleteAfterClosed = true; + newSocket->setAddressStruct(newSocketInfo); + + server->onNewConnection(newSocket); + newSocket->Listen(); + } + } + } +}; + +#endif \ No newline at end of file diff --git a/plugins/storyboard_plugin/external/async-sockets/tcpsocket.hpp b/plugins/storyboard_plugin/external/async-sockets/tcpsocket.hpp new file mode 100644 index 00000000..ea12f9e8 --- /dev/null +++ b/plugins/storyboard_plugin/external/async-sockets/tcpsocket.hpp @@ -0,0 +1,258 @@ +// The Linux and Mac implementations are from https://github.com/eminfedar/async-sockets-cpp +// Updated it to suport Windows. +#pragma once + +#if defined(__linux__) || defined(__APPLE__) + +#include "basesocket.hpp" +#include +#include +#include +// copied from https://github.com/eminfedar/async-sockets-cpp + +#include + +class TCPSocket : public BaseSocket +{ +public: + // Event Listeners: + std::function onMessageReceived; + std::function onRawMessageReceived; + std::function onSocketClosed; + + explicit TCPSocket(FDR_ON_ERROR, int socketId = -1) : BaseSocket(onError, TCP, socketId){} + + // Send TCP Packages + int Send(const char *bytes, size_t byteslength) + { + if (this->isClosed) + return -1; + + int sent = 0; + if ((sent = send(this->sock, bytes, byteslength, 0)) < 0) + { + perror("send"); + } + return sent; + } + int Send(std::string message) { return this->Send(message.c_str(), message.length()); } + + void Connect(std::string host, uint16_t port, std::function onConnected = [](){}, FDR_ON_ERROR) + { + struct addrinfo hints, *res, *it; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + + // Get address info from DNS + int status; + if ((status = getaddrinfo(host.c_str(), NULL, &hints, &res)) != 0) { + onError(errno, "Invalid address." + std::string(gai_strerror(status))); + return; + } + + for(it = res; it != NULL; it = it->ai_next) + { + if (it->ai_family == AF_INET) { // IPv4 + memcpy((void*)(&this->address), (void*)it->ai_addr, sizeof(sockaddr_in)); + break; // for now, just get first ip (ipv4). + } + } + + freeaddrinfo(res); + + this->Connect((uint32_t)this->address.sin_addr.s_addr, port, onConnected, onError); + } + void Connect(uint32_t ipv4, uint16_t port, std::function onConnected = [](){}, FDR_ON_ERROR) + { + this->address.sin_family = AF_INET; + this->address.sin_port = htons(port); + this->address.sin_addr.s_addr = ipv4; + + this->setTimeout(5); + + // Try to connect. + if (connect(this->sock, (const sockaddr *)&this->address, sizeof(sockaddr_in)) < 0) + { + onError(errno, "Connection failed to the host."); + this->setTimeout(0); + return; + } + + this->setTimeout(0); + + // Connected to the server, fire the event. + onConnected(); + + // Start listening from server: + this->Listen(); + } + + void Listen() + { + std::thread t(TCPSocket::Receive, this); + t.detach(); + } + + void setAddressStruct(sockaddr_in addr) {this->address = addr;} + sockaddr_in getAddressStruct() const {return this->address;} + + bool deleteAfterClosed = false; + +private: + static void Receive(TCPSocket *socket) + { + char tempBuffer[socket->BUFFER_SIZE]; + int messageLength; + + while ((messageLength = recv(socket->sock, tempBuffer, socket->BUFFER_SIZE, 0)) > 0) + { + tempBuffer[messageLength] = '\0'; + if(socket->onMessageReceived) + socket->onMessageReceived(std::string(tempBuffer, messageLength)); + + if(socket->onRawMessageReceived) + socket->onRawMessageReceived(tempBuffer, messageLength); + } + + socket->Close(); + if(socket->onSocketClosed) + socket->onSocketClosed(errno); + + if (socket->deleteAfterClosed && socket != nullptr) + delete socket; + } + + void setTimeout(int seconds) + { + struct timeval tv; + tv.tv_sec = seconds; + tv.tv_usec = 0; + + setsockopt(this->sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); + setsockopt(this->sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); + } +}; + +#elif _WIN32 + +#include "basesocket.hpp" + +#include +#include +#include + +class TCPSocket : public BaseSocket +{ +public: + // Event Listeners: + std::function onMessageReceived; + std::function onRawMessageReceived; + std::function onSocketClosed; + + explicit TCPSocket(FDR_ON_ERROR, int socketId = -1) : BaseSocket(onError, socketId){} + + // Send TCP Packages + int Send(const char *bytes, size_t byteslength) { + if (this->isClosed) + return -1; + + int sent = send(this->sock, bytes, byteslength, 0); + if (sent == SOCKET_ERROR) { + perror("send failed..."); + } + return sent; + } + int Send(std::string message) { return this->Send(message.c_str(), message.length()); } + + void Connect(std::string host, uint16_t port, std::function onConnected = [](){}, FDR_ON_ERROR) { + struct addrinfo hints, *res, *it; + ZeroMemory( &hints, sizeof(hints) ); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + // Get address info from DNS + int status; + if ((status = getaddrinfo(host.c_str(), NULL, &hints, &res)) != 0) { + onError(errno, "Invalid address." + std::string(gai_strerror(status))); + return; + } + + for(it = res; it != NULL; it = it->ai_next) { + if (it->ai_family == AF_INET) { // IPv4 + memcpy((void*)(&this->address), (void*)it->ai_addr, sizeof(sockaddr_in)); + break; // for now, just get first ip (ipv4). + } + } + + freeaddrinfo(res); + + this->Connect((uint32_t)this->address.sin_addr.s_addr, port, onConnected, onError); + } + void Connect(uint32_t ipv4, uint16_t port, std::function onConnected = [](){}, FDR_ON_ERROR) { + this->address.sin_family = AF_INET; + this->address.sin_port = htons(port); + this->address.sin_addr.s_addr = ipv4; + + this->setTimeout(5); + + // Try to connect. + if (connect(this->sock, (const sockaddr *)&this->address, sizeof(sockaddr_in)) == SOCKET_ERROR) { + onError(errno, "Connection failed to the host."); + this->setTimeout(0); + return; + } + + this->setTimeout(0); + + // Connected to the server, fire the event. + onConnected(); + + // Start listening from server: + this->Listen(); + } + + void Listen() { + std::thread t(TCPSocket::Receive, this); + t.detach(); + } + + void setAddressStruct(sockaddr_in addr) { this->address = addr; } + sockaddr_in getAddressStruct() const { return this->address; } + + bool deleteAfterClosed = false; + +private: + static void Receive(TCPSocket *socket) { + char tempBuffer[DEFAULT_BUFLEN]; + int messageLength = 0; + + while ((messageLength = recv(socket->sock, tempBuffer, DEFAULT_BUFLEN, 0)) > 0) { + tempBuffer[messageLength] = '\0'; + if(socket->onMessageReceived) + socket->onMessageReceived(std::string(tempBuffer, messageLength)); + + if(socket->onRawMessageReceived) + socket->onRawMessageReceived(tempBuffer, messageLength); + } + + socket->Close(); + if(socket->onSocketClosed) + socket->onSocketClosed(errno); + + if (socket->deleteAfterClosed && socket != nullptr) + delete socket; + } + + void setTimeout(int seconds) { + struct timeval tv; + tv.tv_sec = seconds; + tv.tv_usec = 0; + + setsockopt(this->sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); + setsockopt(this->sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); + } +}; + +#endif \ No newline at end of file diff --git a/plugins/storyboard_plugin/plugin_storyboard.cpp b/plugins/storyboard_plugin/plugin_storyboard.cpp new file mode 100644 index 00000000..29454d81 --- /dev/null +++ b/plugins/storyboard_plugin/plugin_storyboard.cpp @@ -0,0 +1,52 @@ +#include + +#include "PanelStoryboard.h" + +#include "app/ospStudio.h" +#include "app/Plugin.h" + +namespace ospray { +namespace storyboard_plugin { + +struct PluginStoryboard : public Plugin +{ + PluginStoryboard() : Plugin("Storyboard") {} + + void mainMethod(std::shared_ptr ctx) override + { + if (ctx->mode == StudioMode::GUI) { + auto &studioCommon = ctx->studioCommon; + int ac = studioCommon.plugin_argc; + const char **av = studioCommon.plugin_argv; + + std::string optPanelName = "Storyboard Panel"; + std::string configFilePath = "config/storyboard_settings.json"; + + for (int i=0; i + +namespace ospray { +namespace storyboard_plugin { + +RequestManager::RequestManager(std::string ipAddress, uint portNumber) { + tcpSocket = nullptr; + this->ipAddress = ipAddress; + this->portNumber = portNumber; +} + +RequestManager::~RequestManager() { + this->close(); +} + +void RequestManager::start() { + if (tcpSocket != nullptr) { + std::cout << "Connection has already been set." << std::endl; + return; + } + + // Initialize socket. + tcpSocket = new TCPSocket([&](int errorCode, std::string errorMessage){ + addStatus("Socket creation error: " + std::to_string(errorCode) + " : " + errorMessage); + }); + + // Start receiving from the host. + tcpSocket->onMessageReceived = [&](std::string message) { + std::lock_guard guard(mtx); + + // parse the message (which is supposed to be in a JSON format) + nlohmann::ordered_json j; + try { + j = nlohmann::ordered_json::parse(message); + } catch (nlohmann::json::exception& e) { + std::cout << "Parse exception: " << e.what() << std::endl; + j = nullptr; + } + + // add it to the pending actions + if (j != nullptr) { + pendingRequests.push(j); + } + }; + + // On socket closed: + tcpSocket->onSocketClosed = [&](int errorCode){ + std::lock_guard guard(mtx); + while (!pendingRequests.empty()) pendingRequests.pop(); + + addStatus("Connection closed: " + std::to_string(errorCode)); + delete tcpSocket; + tcpSocket = nullptr; + }; + + // Connect to the host. + tcpSocket->Connect(ipAddress, portNumber, [&] { + addStatus("Connected to the server successfully."); + }, + [&](int errorCode, std::string errorMessage){ // Connection failed + addStatus(std::to_string(errorCode) + " : " + errorMessage); + delete tcpSocket; + tcpSocket = nullptr; + }); +} + +void RequestManager::close() { + if (tcpSocket == nullptr) return; + + tcpSocket->Close(); +} + +bool RequestManager::isRunning() { + return tcpSocket != nullptr && !tcpSocket->isClosed; +} + +bool RequestManager::isUpdated() { + std::lock_guard guard(mtx); + + return pendingRequests.size() > 0; +} + +void RequestManager::pollRequests(std::queue& requests) { + std::lock_guard guard(mtx); + + while (!pendingRequests.empty()) { + requests.push(pendingRequests.front()); + pendingRequests.pop(); + } +} + +void RequestManager::send(std::string message) { + if (tcpSocket == nullptr) return; + + tcpSocket->Send(message); +} + +void RequestManager::addStatus(std::string status) { + // write time before status + time_t now = time(0); + tm *ltm = localtime(&now); + status.insert(0, "(" + std::to_string(ltm->tm_hour) + ":" + std::to_string(ltm->tm_min) + ":" + std::to_string(ltm->tm_sec) + ") "); + + statuses.push_back(status); +} + +// show "important" storyboard information in a readable format +std::string RequestManager::getResultsInReadableForm() { + std::lock_guard guard(mtx); + + return std::to_string(pendingRequests.size()) + " pending action(s)"; +} + +} // namespace storyboard_plugin +} // namespace ospray \ No newline at end of file diff --git a/plugins/storyboard_plugin/request/RequestManager.h b/plugins/storyboard_plugin/request/RequestManager.h new file mode 100644 index 00000000..e01c7acc --- /dev/null +++ b/plugins/storyboard_plugin/request/RequestManager.h @@ -0,0 +1,46 @@ +#pragma once + +#include "tcpsocket.hpp" +#include "sg/JSONDefs.h" + +#include +#include +#include + +namespace ospray { +namespace storyboard_plugin { + +using namespace rkcommon::math; + +class RequestManager +{ +public: + RequestManager(std::string ipAddress, uint portNumber); + ~RequestManager(); + + void start(); + void close(); + bool isRunning(); + bool isUpdated(); + + void pollRequests(std::queue& requests); + + void send(std::string message); + + std::string getResultsInReadableForm(); + + std::string ipAddress { "localhost" }; + uint portNumber { 8889 }; + + std::list statuses; +private: + void addStatus(std::string status); + + TCPSocket *tcpSocket; + + std::queue pendingRequests; + std::mutex mtx; +}; + +} // namespace storyboard_plugin +} // namespace ospray \ No newline at end of file diff --git a/plugins/storyboard_plugin/storyboard_settings.json b/plugins/storyboard_plugin/storyboard_settings.json new file mode 100644 index 00000000..ca32d4e5 --- /dev/null +++ b/plugins/storyboard_plugin/storyboard_settings.json @@ -0,0 +1,7 @@ +{ + "ipAddress": "127.0.0.1", + "portNumber": 8888, + + "scaleOffset": [0.001, -0.001, -0.001], + "translationOffset": [0.0, -0.1, 1.19] +} \ No newline at end of file From 53c158c07ff679e73ec4f8978151a9a264991211 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Thu, 15 Jun 2023 13:59:53 -0500 Subject: [PATCH 15/18] Send capture images --- plugins/storyboard_plugin/CMakeLists.txt | 5 +- plugins/storyboard_plugin/PanelStoryboard.cpp | 86 ++++++++++--------- .../request/RequestManager.cpp | 2 + .../request/RequestManager.h | 3 + .../request/ScreenShotContainer.cpp | 51 +++++++++++ .../request/ScreenShotContainer.h | 29 +++++++ 6 files changed, 132 insertions(+), 44 deletions(-) create mode 100644 plugins/storyboard_plugin/request/ScreenShotContainer.cpp create mode 100644 plugins/storyboard_plugin/request/ScreenShotContainer.h diff --git a/plugins/storyboard_plugin/CMakeLists.txt b/plugins/storyboard_plugin/CMakeLists.txt index 75e1f580..deae80b4 100644 --- a/plugins/storyboard_plugin/CMakeLists.txt +++ b/plugins/storyboard_plugin/CMakeLists.txt @@ -7,12 +7,11 @@ if (BUILD_PLUGIN_STORYBOARD) plugin_storyboard.cpp PanelStoryboard.cpp request/RequestManager.cpp + request/ScreenShotContainer.cpp ) target_link_libraries(${pluginName} ospray_sg ospray_ui) - - # Only link against imgui if needed (ie, pure file importers don't) - target_link_libraries(${pluginName} imgui) + target_link_libraries(${pluginName} imgui stb_image) # Add external libraries for this plugin # add_subdirectory(external) diff --git a/plugins/storyboard_plugin/PanelStoryboard.cpp b/plugins/storyboard_plugin/PanelStoryboard.cpp index 5a3a95eb..d18fdb35 100644 --- a/plugins/storyboard_plugin/PanelStoryboard.cpp +++ b/plugins/storyboard_plugin/PanelStoryboard.cpp @@ -9,12 +9,23 @@ #include "sg/JSONDefs.h" #include "sg/Math.h" #include "sg/JSONDefs.h" +#include "sg/fb/FrameBuffer.h" #include "imgui.h" +#include "stb_image_write.h" namespace ospray { namespace storyboard_plugin { +static void WriteToMemory_stbi(void *context, void *data, int size) { + std::vector *buffer = + reinterpret_cast *>(context); + + unsigned char *pData = reinterpret_cast(data); + + buffer->insert(buffer->end(), pData, pData + size); +} + PanelStoryboard::PanelStoryboard(std::shared_ptr _context, std::string _panelName, std::string _configFilePath) : Panel(_panelName.c_str(), _context) , panelName(_panelName) @@ -23,6 +34,9 @@ PanelStoryboard::PanelStoryboard(std::shared_ptr _context, std::s requestManager.reset(new RequestManager("localhost", 8888)); requestManager->start(); + + context->frame->child("scale") = 0.5f; + context->frame->child("scaleNav") = 0.25f; } void PanelStoryboard::buildUI(void *ImGuiCtx) @@ -109,28 +123,16 @@ void PanelStoryboard::process(std::string key) { req.contains("action") && req["action"] == "capture.image") { // 1) capture the image - vec2i size{16, 16}; - std::vector values - { - 48,50,50,50,231,48,170,127,50,50,50,50,249,64,188,127,3,3,3,3,246,48,2,5,3,3,3,3,244,48,3,6,50,50,50,50,247,64,170,127,50,242,2,168,231,48,255,255,3,3,3,255,230,64,0,15,0,255,0,170,233,64,159,255,91,3,3,3,202,106,15,48,3,3,3,255,202,104,15,48,170,148,144,64,186,91,175,104,64,0,0,255,202,88,15,32,0,0,0,255,230,64,1,44,0,255,0,170,219,65,255,255,0,0,0,255,232,64,1,28,0,255,0,170,187,64,255,255 - }; + auto &fb = context->frame->childAs("framebuffer"); + auto img = fb.map(OSP_FB_COLOR); + auto size = fb.child("size").valueAs(); // 2048 x 1280 + auto fmt = fb.child("colorFormat").valueAs(); // sRGB - // auto binary = nlohmann::ordered_json::binary_t( - // { - // 0x30, 0x32, 0x32, 0x32, 0xe7, 0x30, 0xaa, 0x7f, 0x32, 0x32, 0x32, 0x32, 0xf9, 0x40, 0xbc, 0x7f, - // 0x03, 0x03, 0x03, 0x03, 0xf6, 0x30, 0x02, 0x05, 0x03, 0x03, 0x03, 0x03, 0xf4, 0x30, 0x03, 0x06, - // 0x32, 0x32, 0x32, 0x32, 0xf7, 0x40, 0xaa, 0x7f, 0x32, 0xf2, 0x02, 0xa8, 0xe7, 0x30, 0xff, 0xff, - // 0x03, 0x03, 0x03, 0xff, 0xe6, 0x40, 0x00, 0x0f, 0x00, 0xff, 0x00, 0xaa, 0xe9, 0x40, 0x9f, 0xff, - // 0x5b, 0x03, 0x03, 0x03, 0xca, 0x6a, 0x0f, 0x30, 0x03, 0x03, 0x03, 0xff, 0xca, 0x68, 0x0f, 0x30, - // 0xaa, 0x94, 0x90, 0x40, 0xba, 0x5b, 0xaf, 0x68, 0x40, 0x00, 0x00, 0xff, 0xca, 0x58, 0x0f, 0x20, - // 0x00, 0x00, 0x00, 0xff, 0xe6, 0x40, 0x01, 0x2c, 0x00, 0xff, 0x00, 0xaa, 0xdb, 0x41, 0xff, 0xff, - // 0x00, 0x00, 0x00, 0xff, 0xe8, 0x40, 0x01, 0x1c, 0x00, 0xff, 0x00, 0xaa, 0xbb, 0x40, 0xff, 0xff, - // }); - - // auto binary = nlohmann::ordered_json::binary_t( - // { - // 48,50,50,50,231,48,170,127,50,50,50,50,249,64,188,127,3,3,3,3,246,48,2,5,3,3,3,3,244,48,3,6,50,50,50,50,247,64,170,127,50,242,2,168,231,48,255,255,3,3,3,255,230,64,0,15,0,255,0,170,233,64,159,255,91,3,3,3,202,106,15,48,3,3,3,255,202,104,15,48,170,148,144,64,186,91,175,104,64,0,0,255,202,88,15,32,0,0,0,255,230,64,1,44,0,255,0,170,219,65,255,255,0,0,0,255,232,64,1,28,0,255,0,170,187,64,255,255 - // }); + std::vector values; + stbi_flip_vertically_on_write(1); + stbi_write_png_to_func(WriteToMemory_stbi, &values, size.x, size.y, 4, img, 4 * size.x); + requestManager->screenshotContainer->clear(); + requestManager->screenshotContainer->setImage(size.x, size.y, values); // 2) send the setup information nlohmann::ordered_json jSetUp = @@ -139,40 +141,42 @@ void PanelStoryboard::process(std::string key) { {"action", "capture.image.setup"}, {"snapshotIdx", req["snapshotIdx"].get()}, {"width", size.x}, - {"height", size.y} + {"height", size.y}, + {"length", values.size()} }; requestManager->send(jSetUp.dump()); + } + else if (req.contains("type") && req["type"] == "ack" && + req.contains("action") && (req["action"] == "capture.image.setup" || req["action"] == "capture.image.data")) { + + if (!requestManager->screenshotContainer->isNextChunkAvailable()) { + // clear the memory + requestManager->screenshotContainer->clear(); + // send the message to indicate the sending the image part is done + nlohmann::ordered_json jChunk = + { + {"type", "response"}, + {"action", "capture.image.done"}, + {"snapshotIdx", req["snapshotIdx"].get()} + }; + requestManager->send(jChunk.dump()); + } + else { // send the first message + int len = 512; + int start = requestManager->screenshotContainer->getStartIndex(); + std::vector chunk = requestManager->screenshotContainer->getNextChunk(len); - // 3) send the image data in chunks - int start = 0; - int chunckLen = 16 * 1; - while (start < size.x * size.y) { - int len = (start + chunckLen) > (size.x * size.y) ? (size.y * size.y - start) : chunckLen; - std::vector chunk = std::vector(values.begin() + start, values.begin() + start + len); auto binary = nlohmann::ordered_json::binary_t(chunk); - nlohmann::ordered_json jChunk = { {"type", "response"}, {"action", "capture.image.data"}, {"snapshotIdx", req["snapshotIdx"].get()}, {"start", start }, - {"length", len }, {"data", binary } }; requestManager->send(jChunk.dump()); - - start += len; } - - // 4) send the done message - nlohmann::ordered_json jDone = - { - {"type", "response"}, - {"action", "capture.image.done"}, - {"snapshotIdx", req["snapshotIdx"].get()} - }; - requestManager->send(jDone.dump()); } else if (req.contains("type") && req["type"] == "request" && req.contains("action") && req["action"] == "update.view") { diff --git a/plugins/storyboard_plugin/request/RequestManager.cpp b/plugins/storyboard_plugin/request/RequestManager.cpp index 6bba7dec..4d0f5305 100644 --- a/plugins/storyboard_plugin/request/RequestManager.cpp +++ b/plugins/storyboard_plugin/request/RequestManager.cpp @@ -9,6 +9,8 @@ RequestManager::RequestManager(std::string ipAddress, uint portNumber) { tcpSocket = nullptr; this->ipAddress = ipAddress; this->portNumber = portNumber; + + screenshotContainer.reset(new ScreenShotContainer()); } RequestManager::~RequestManager() { diff --git a/plugins/storyboard_plugin/request/RequestManager.h b/plugins/storyboard_plugin/request/RequestManager.h index e01c7acc..7d2407fb 100644 --- a/plugins/storyboard_plugin/request/RequestManager.h +++ b/plugins/storyboard_plugin/request/RequestManager.h @@ -1,6 +1,7 @@ #pragma once #include "tcpsocket.hpp" +#include "ScreenShotContainer.h" #include "sg/JSONDefs.h" #include @@ -32,6 +33,8 @@ class RequestManager std::string ipAddress { "localhost" }; uint portNumber { 8889 }; + std::unique_ptr screenshotContainer; + std::list statuses; private: void addStatus(std::string status); diff --git a/plugins/storyboard_plugin/request/ScreenShotContainer.cpp b/plugins/storyboard_plugin/request/ScreenShotContainer.cpp new file mode 100644 index 00000000..755e5242 --- /dev/null +++ b/plugins/storyboard_plugin/request/ScreenShotContainer.cpp @@ -0,0 +1,51 @@ +#include "ScreenShotContainer.h" + +#include + +namespace ospray { +namespace storyboard_plugin { + +ScreenShotContainer::ScreenShotContainer() { } + +ScreenShotContainer::~ScreenShotContainer() { } + +void ScreenShotContainer::setImage(int w, int h, std::vector values) { + imgValues.insert(imgValues.end(), values.begin(), values.end()); + width = w; + height = h; + currStartIndex = 0; +} + +void ScreenShotContainer::clear() { + imgValues.clear(); + width = 0; + height = 0; + currStartIndex = 0; +} + +bool ScreenShotContainer::isNextChunkAvailable() { + return currStartIndex < imgValues.size(); +} + +std::vector ScreenShotContainer::getNextChunk(int len) { + int chunkLen = (currStartIndex + len) > imgValues.size() ? (imgValues.size() - currStartIndex) : len; + + // Starting and Ending iterators + auto start = imgValues.begin() + currStartIndex; + auto end = imgValues.begin() + currStartIndex + chunkLen; + + // To store the sliced vector + std::vector result(chunkLen); + copy(start, end, result.begin()); + currStartIndex += chunkLen; + + // Return the final sliced vector + return result; +} + +int ScreenShotContainer::getStartIndex() { + return currStartIndex; +} + +} // namespace storyboard_plugin +} // namespace ospray \ No newline at end of file diff --git a/plugins/storyboard_plugin/request/ScreenShotContainer.h b/plugins/storyboard_plugin/request/ScreenShotContainer.h new file mode 100644 index 00000000..f15c31b5 --- /dev/null +++ b/plugins/storyboard_plugin/request/ScreenShotContainer.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +namespace ospray { +namespace storyboard_plugin { + +class ScreenShotContainer +{ +public: + ScreenShotContainer(); + ~ScreenShotContainer(); + + void setImage(int w, int h, std::vector values); + void clear(); + + bool isNextChunkAvailable(); + std::vector getNextChunk(int len); + int getStartIndex(); + +private: + std::vector imgValues; + int width; + int height; + int currStartIndex; +}; + +} // namespace storyboard_plugin +} // namespace ospray \ No newline at end of file From 86d27bdeef7697967f05f145cad2ad80a0ec0a38 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Mon, 18 Sep 2023 12:11:56 -0500 Subject: [PATCH 16/18] Uses a config file --- plugins/storyboard_plugin/PanelStoryboard.cpp | 2 +- .../request/RequestManager.cpp | 25 ++++++++++++++++--- .../request/RequestManager.h | 2 +- .../request/storyboard_settings.json | 4 +++ .../storyboard_settings.json | 7 ------ 5 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 plugins/storyboard_plugin/request/storyboard_settings.json delete mode 100644 plugins/storyboard_plugin/storyboard_settings.json diff --git a/plugins/storyboard_plugin/PanelStoryboard.cpp b/plugins/storyboard_plugin/PanelStoryboard.cpp index d18fdb35..0bf517f6 100644 --- a/plugins/storyboard_plugin/PanelStoryboard.cpp +++ b/plugins/storyboard_plugin/PanelStoryboard.cpp @@ -31,7 +31,7 @@ PanelStoryboard::PanelStoryboard(std::shared_ptr _context, std::s , panelName(_panelName) , configFilePath(_configFilePath) { - requestManager.reset(new RequestManager("localhost", 8888)); + requestManager.reset(new RequestManager(configFilePath)); requestManager->start(); diff --git a/plugins/storyboard_plugin/request/RequestManager.cpp b/plugins/storyboard_plugin/request/RequestManager.cpp index 4d0f5305..d8496837 100644 --- a/plugins/storyboard_plugin/request/RequestManager.cpp +++ b/plugins/storyboard_plugin/request/RequestManager.cpp @@ -1,16 +1,33 @@ #include "RequestManager.h" +#include "sg/JSONDefs.h" #include namespace ospray { namespace storyboard_plugin { -RequestManager::RequestManager(std::string ipAddress, uint portNumber) { +RequestManager::RequestManager(std::string configFilePath) { tcpSocket = nullptr; - this->ipAddress = ipAddress; - this->portNumber = portNumber; - screenshotContainer.reset(new ScreenShotContainer()); + + JSON config = nullptr; + try { + std::ifstream configFile(configFilePath); + if (configFile) + configFile >> config; + else + std::cerr << "The storyboard config file does not exist." << std::endl; + } catch (nlohmann::json::exception &e) { + std::cerr << "Failed to parse the storyboard config file: " << e.what() << std::endl; + } + + if (config == nullptr) + return; + + if (config != nullptr && config.contains("ipAddress")) + ipAddress = config["ipAddress"]; + if (config != nullptr && config.contains("portNumber")) + portNumber = config["portNumber"]; } RequestManager::~RequestManager() { diff --git a/plugins/storyboard_plugin/request/RequestManager.h b/plugins/storyboard_plugin/request/RequestManager.h index 7d2407fb..4a0ea3b0 100644 --- a/plugins/storyboard_plugin/request/RequestManager.h +++ b/plugins/storyboard_plugin/request/RequestManager.h @@ -16,7 +16,7 @@ using namespace rkcommon::math; class RequestManager { public: - RequestManager(std::string ipAddress, uint portNumber); + RequestManager(std::string configFilePath); ~RequestManager(); void start(); diff --git a/plugins/storyboard_plugin/request/storyboard_settings.json b/plugins/storyboard_plugin/request/storyboard_settings.json new file mode 100644 index 00000000..95dbaa00 --- /dev/null +++ b/plugins/storyboard_plugin/request/storyboard_settings.json @@ -0,0 +1,4 @@ +{ + "ipAddress": "127.0.0.1", + "portNumber": 8888 +} \ No newline at end of file diff --git a/plugins/storyboard_plugin/storyboard_settings.json b/plugins/storyboard_plugin/storyboard_settings.json deleted file mode 100644 index ca32d4e5..00000000 --- a/plugins/storyboard_plugin/storyboard_settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "ipAddress": "127.0.0.1", - "portNumber": 8888, - - "scaleOffset": [0.001, -0.001, -0.001], - "translationOffset": [0.0, -0.1, 1.19] -} \ No newline at end of file From f3985b2c03f3c8319c09606f89c9ee3af6a01906 Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Wed, 4 Oct 2023 15:48:59 -0500 Subject: [PATCH 17/18] Uses imageStart and imageEnd --- app/MultiWindows.cpp | 88 +++++++++++++++++++++++++++++---------- app/MultiWindows.h | 2 +- sg/camera/Perspective.cpp | 9 ---- 3 files changed, 66 insertions(+), 33 deletions(-) diff --git a/app/MultiWindows.cpp b/app/MultiWindows.cpp index d42fbcc6..6fd30753 100644 --- a/app/MultiWindows.cpp +++ b/app/MultiWindows.cpp @@ -104,6 +104,43 @@ static const std::vector g_lightTypes = {"ambient", "sunSky", "quad"}; +static +void offaxisStereoCamera(vec3f LL, vec3f LR, vec3f UR, vec3f eye, + vec3f &dirOUT, vec3f &upOUT, + float &fovyOUT, float &aspectOUT, + vec2f &imageStartOUT, vec2f &imageEndOUT) +{ + vec3f X = (LR-LL)/length(LR-LL); + vec3f Y = (UR-LR)/length(UR-LR); + vec3f Z = cross(X,Y); + + dirOUT = -Z; + upOUT = Y; + + // eye position relative to screen/wall + vec3f eyeP = eye-LL; + + // distance from eye to screen/wall + float dist = dot(eyeP,Z); + + float left = dot(eyeP,X); + float right = length(LR-LL)-left; + float bottom = dot(eyeP,Y); + float top = length(UR-LR)-bottom; + + float newWidth = left g_camPath; // interpolated path through cameraStack int g_camSelectedStackIndex = 0; int g_camCurrentPathIndex = 0; @@ -283,20 +320,6 @@ MultiWindows::MultiWindows(StudioCommon &_common) float mullionBottom = mullion[3]; botLeftLocal += normalize(tl - bl) * mullionBottom; botRightLocal += normalize(tl - bl) * mullionBottom; - - // update the camera - auto camera = frame->child("camera").nodeAs(); - - camera->child("offAxisMode").setValue(true); - camera->child("position").setValue(eyePos); - camera->child("topLeft").setValue(topLeftLocal); - camera->child("botLeft").setValue(botLeftLocal); - camera->child("botRight").setValue(botRightLocal); - - camera->child("aspect").setValue(length(botRightLocal - botLeftLocal) / length(topLeftLocal - botLeftLocal)); - float angle = acos(dot(topLeftLocal, botLeftLocal) / (length(topLeftLocal) * length(botLeftLocal))) * 180.f / M_PI; - camera->child("fovy").setValue(angle); - camera->child("direction").setValue(vec3f{0,0,-1}); } // further configure GLFW window based on rank @@ -523,8 +546,7 @@ MultiWindows::MultiWindows(StudioCommon &_common) // set the initial state sharedState.camChanged = true; - auto camera = frame->child("camera").nodeAs(); - sharedState.transform = camera->child("transform").valueAs(); + sharedState.state = arcballCamera->getState(); showUi = sg::sgMpiRank() == 0; // trigger window reshape events with current window size @@ -616,12 +638,8 @@ void MultiWindows::mainLoop() } if (sharedState.camChanged) { - auto camera = frame->child("camera").nodeAs(); - camera->child("transform").setValue(sharedState.transform); - camera->child("topLeft").setValue(xfmPoint(sharedState.transform, topLeftLocal)); - camera->child("botLeft").setValue(xfmPoint(sharedState.transform, botLeftLocal)); - camera->child("botRight").setValue(xfmPoint(sharedState.transform, botRightLocal)); - + arcballCamera->setState(sharedState.state); + updateCamera(); sharedState.camChanged = false; } } @@ -678,7 +696,7 @@ void MultiWindows::mainLoop() p->process("update"); sharedState.camChanged = true; - sharedState.transform = arcballCamera->getTransform(); + sharedState.state = arcballCamera->getState(); sharedState.quit = glfwWindowShouldClose(glfwWindow) || g_quitNextFrame; } MPI_Barrier(MPI_COMM_WORLD); @@ -793,6 +811,30 @@ void MultiWindows::updateCamera() } camera->child("focusDistance").setValue(focusDistance); } + + { + affine3f t = arcballCamera->getTransform(); + vec3f tl = xfmPoint(t, topLeftLocal); + vec3f bl = xfmPoint(t, botLeftLocal); + vec3f br = xfmPoint(t, botRightLocal); + vec3f tr = (tl - bl) + br; + + vec3f eye = t.p; + vec3f dir, up; + float fovy, aspect; + vec2f imgStart, imgEnd; + + // LL, LR, UR + offaxisStereoCamera(bl, br, tr, eye, dir, up, fovy, aspect, imgStart, imgEnd); + + camera->child("fovy").setValue(fovy); + camera->child("aspect").setValue(aspect); + camera->child("position").setValue(eye); + camera->child("direction").setValue(dir); + camera->child("up").setValue(up); + camera->child("imageStart").setValue(imgStart); + camera->child("imageEnd").setValue(imgEnd); + } } void MultiWindows::setCameraState(CameraState &cs) diff --git a/app/MultiWindows.h b/app/MultiWindows.h index 4e9727bc..096b0e6c 100644 --- a/app/MultiWindows.h +++ b/app/MultiWindows.h @@ -57,7 +57,7 @@ struct SharedState bool quit; bool camChanged; - affine3f transform; + CameraState state; SharedState(); }; diff --git a/sg/camera/Perspective.cpp b/sg/camera/Perspective.cpp index 6c4ff164..ec96032d 100644 --- a/sg/camera/Perspective.cpp +++ b/sg/camera/Perspective.cpp @@ -49,15 +49,6 @@ Perspective::Perspective() : Camera("perspective") child("interpupillaryDistance").setMinMax(0.f, 0.1f); child("aspect").setReadOnly(); - - createChild("offAxisMode", - "bool", - "toggle off-axis projection mode", - false); - createChild("transform", "affine3f", affine3f(one)); - createChild("topLeft", "vec3f", vec3f{-10.0f, 10.0f, -20.0f}); - createChild("botLeft", "vec3f", vec3f{-10.0f, -10.0f, -20.0f}); - createChild("botRight", "vec3f", vec3f{10.0f, -10.0f, -20.0f}); } OSP_REGISTER_SG_NODE_NAME(Perspective, camera_perspective); From 3ccc171cdb36b642300954b58fe1e2650ebe050a Mon Sep 17 00:00:00 2001 From: Jung Who Nam Date: Mon, 23 Oct 2023 11:20:54 -0500 Subject: [PATCH 18/18] Sync processes --- app/MultiWindows.cpp | 144 +++++++++++++++++++++++++++------------ app/MultiWindows.h | 8 ++- sg/importer/Importer.cpp | 45 ++++++++---- sg/importer/Importer.h | 3 + 4 files changed, 140 insertions(+), 60 deletions(-) diff --git a/app/MultiWindows.cpp b/app/MultiWindows.cpp index 6fd30753..cfe8d79d 100644 --- a/app/MultiWindows.cpp +++ b/app/MultiWindows.cpp @@ -157,6 +157,8 @@ double g_camMoveA = 0.0; double g_camMoveE = 0.0; double g_camMoveR = 0.0; +bool g_syncStates = false; + float lockAspectRatio = 0.0; sg::NodePtr g_copiedMat = nullptr; @@ -413,6 +415,9 @@ MultiWindows::MultiWindows(StudioCommon &_common) case GLFW_KEY_V: activeWindow->frame->child("camera").traverse(); break; + case GLFW_KEY_R: + g_syncStates = true; + break; case GLFW_KEY_SPACE: if (activeWindow->cameraStack.size() >= 2) { g_animatingPath = !g_animatingPath; @@ -545,8 +550,11 @@ MultiWindows::MultiWindows(StudioCommon &_common) refreshScene(true); // set the initial state - sharedState.camChanged = true; - sharedState.state = arcballCamera->getState(); + sharedState.camChanged = false; + sharedState.camState = arcballCamera->getState(); + sharedState.sceneChanged = false; + sharedState.sceneStateSize = 0; + sharedState.sceneState = ""; showUi = sg::sgMpiRank() == 0; // trigger window reshape events with current window size @@ -630,15 +638,45 @@ void MultiWindows::mainLoop() startNewOSPRayFrame(); while (true) { - MPI_Bcast(&sharedState, sizeof(sharedState), MPI_BYTE, 0, MPI_COMM_WORLD); - { // process changes in the shared state + MPI_Bcast(&sharedState.quit, 1, MPI_CXX_BOOL, 0, MPI_COMM_WORLD); if (sharedState.quit) { break; } + // sync the scene + MPI_Bcast(&sharedState.sceneChanged, 1, MPI_CXX_BOOL, 0, MPI_COMM_WORLD); + if (sharedState.sceneChanged) { + MPI_Bcast(&sharedState.sceneStateSize, 1, MPI_INT, 0, MPI_COMM_WORLD); + if (sg::sgMpiRank() != 0) { + sharedState.sceneState.resize(sharedState.sceneStateSize); + } + + MPI_Bcast(const_cast(sharedState.sceneState.c_str()), sharedState.sceneStateSize, MPI_CHAR, 0, MPI_COMM_WORLD); + if (sg::sgMpiRank() != 0) { + try { + clearScene(); + sg::importScene(shared_from_this(), sharedState.sceneState); + // arcballCamera->setState(sharedState.camState); + // updateCamera(); + } catch (const std::exception &e) { + std::cerr << "Failed to sync the scene: '" << e.what() << "'!\n"; + std::cerr << " " << e.what() << std::endl; + } catch (...) { + std::cerr << "Failed to sync the scene!\n"; + } + } + + sharedState.sceneStateSize = 0; + sharedState.sceneState = ""; + sharedState.sceneChanged = false; + } + + // sync the camera + MPI_Bcast(&sharedState.camChanged, 1, MPI_CXX_BOOL, 0, MPI_COMM_WORLD); if (sharedState.camChanged) { - arcballCamera->setState(sharedState.state); + MPI_Bcast(&sharedState.camState, sizeof(sharedState.camState), MPI_BYTE, 0, MPI_COMM_WORLD); + arcballCamera->setState(sharedState.camState); updateCamera(); sharedState.camChanged = false; } @@ -695,9 +733,17 @@ void MultiWindows::mainLoop() for (auto &p : pluginPanels) p->process("update"); - sharedState.camChanged = true; - sharedState.state = arcballCamera->getState(); sharedState.quit = glfwWindowShouldClose(glfwWindow) || g_quitNextFrame; + + sharedState.camChanged = true; + sharedState.camState = arcballCamera->getState(); + + if (g_syncStates) { + sharedState.sceneChanged = true; + sharedState.sceneState = getSceneState().dump(); + sharedState.sceneStateSize = sharedState.sceneState.size(); + g_syncStates = false; + } } MPI_Barrier(MPI_COMM_WORLD); } @@ -1429,6 +1475,51 @@ void MultiWindows::refreshScene(bool resetCam) fb.resetAccumulation(); } +void MultiWindows::clearScene() +{ + // Cancel any in-progress frame + frame->cancelFrame(); + frame->waitOnFrame(); + frame->remove("world"); + lightsManager->clear(); + animationManager->getAnimations().clear(); + animationManager->setTimeRange(range1f(rkcommon::math::empty)); + animationWidget->update(); + + // TODO: lights caching to avoid complete re-importing after clearing + sg::clearAssets(); + + // Recreate MaterialRegistry, clearing old registry and all materials + // Then, add the new one to the frame and set the renderer type + baseMaterialRegistry = sg::createNodeAs( + "baseMaterialRegistry", "materialRegistry"); + frame->add(baseMaterialRegistry); + baseMaterialRegistry->updateRendererType(); + + scene = ""; + refreshScene(true); +} + +nlohmann::ordered_json MultiWindows::getSceneState() { + auto ¤tCamera = frame->child("camera"); + JSON camera = { + {"cameraIdx", currentCamera.child("cameraId").valueAs()}, + {"cameraToWorld", arcballCamera->getTransform()}}; + if (currentCamera.hasChild("cameraSettingsId")) + camera["cameraSettingsIdx"] = + currentCamera.child("cameraSettingsId").valueAs(); + JSON animation; + animation = {{"time", animationManager->getTime()}, + {"shutter", animationManager->getShutter()}}; + JSON j = {{"world", frame->child("world")}, + {"camera", camera}, + {"lightsManager", *lightsManager}, + {"materialRegistry", *baseMaterialRegistry}, + {"animation", animation}}; + + return j; +} + void MultiWindows::addToCommandLine(std::shared_ptr app) { app->add_option( "--displayConfig", @@ -1669,22 +1760,7 @@ void MultiWindows::buildMainMenuFile() if (ImGui::BeginMenu("Save")) { if (ImGui::MenuItem("Scene (entire)")) { std::ofstream dump("studio_scene.sg"); - auto ¤tCamera = frame->child("camera"); - JSON camera = { - {"cameraIdx", currentCamera.child("cameraId").valueAs()}, - {"cameraToWorld", arcballCamera->getTransform()}}; - if (currentCamera.hasChild("cameraSettingsId")) - camera["cameraSettingsIdx"] = - currentCamera.child("cameraSettingsId").valueAs(); - JSON animation; - animation = {{"time", animationManager->getTime()}, - {"shutter", animationManager->getShutter()}}; - JSON j = {{"world", frame->child("world")}, - {"camera", camera}, - {"lightsManager", *lightsManager}, - {"materialRegistry", *baseMaterialRegistry}, - {"animation", animation}}; - dump << j.dump(); + dump << getSceneState().dump(); } ImGui::Separator(); @@ -1814,27 +1890,7 @@ void MultiWindows::buildMainMenuEdit() ImGui::SameLine(ImGui::GetWindowWidth()-(8*ImGui::GetFontSize())); if (ImGui::Button("Yes, clear it")) { - // Cancel any in-progress frame - frame->cancelFrame(); - frame->waitOnFrame(); - frame->remove("world"); - lightsManager->clear(); - animationManager->getAnimations().clear(); - animationManager->setTimeRange(range1f(rkcommon::math::empty)); - animationWidget->update(); - - // TODO: lights caching to avoid complete re-importing after clearing - sg::clearAssets(); - - // Recreate MaterialRegistry, clearing old registry and all materials - // Then, add the new one to the frame and set the renderer type - baseMaterialRegistry = sg::createNodeAs( - "baseMaterialRegistry", "materialRegistry"); - frame->add(baseMaterialRegistry); - baseMaterialRegistry->updateRendererType(); - - scene = ""; - refreshScene(true); + clearScene(); ImGui::CloseCurrentPopup(); } ImGui::EndPopup(); diff --git a/app/MultiWindows.h b/app/MultiWindows.h index 096b0e6c..a76f4f0f 100644 --- a/app/MultiWindows.h +++ b/app/MultiWindows.h @@ -57,7 +57,11 @@ struct SharedState bool quit; bool camChanged; - CameraState state; + CameraState camState; + + bool sceneChanged; + int sceneStateSize; + std::string sceneState; SharedState(); }; @@ -106,6 +110,8 @@ class MultiWindows : public StudioContext void updateCamera() override; void setCameraState(CameraState &cs) override; void refreshScene(bool resetCamera) override; + void clearScene(); + nlohmann::ordered_json getSceneState(); int whichLightType{-1}; int whichCamera{0}; std::string lightTypeStr{"ambient"}; diff --git a/sg/importer/Importer.cpp b/sg/importer/Importer.cpp index a3ef0fbd..1b3c7389 100644 --- a/sg/importer/Importer.cpp +++ b/sg/importer/Importer.cpp @@ -52,21 +52,9 @@ inline bool FindCameraNode::operator()(Node &node, TraversalContext &) return traverseChildren; } -OSPSG_INTERFACE void importScene( - std::shared_ptr context, rkcommon::FileName &sceneFileName) +void importScene( + std::shared_ptr context, JSON j, std::string filesToImportDir = "") { - std::cout << "Importing a scene" << std::endl; - context->filesToImport.clear(); - std::ifstream sgFile(sceneFileName.str()); - if (!sgFile) { - std::cerr << "Could not open " << sceneFileName << " for reading" - << std::endl; - return; - } - - JSON j; - sgFile >> j; - std::map jImporters; std::map jGenerators; sg::NodePtr lights; @@ -106,7 +94,7 @@ OSPSG_INTERFACE void importScene( // Try a couple different paths to find the file before giving up std::vector possibleFileNames = {fileName, // as imported - sceneFileName.path() + fileName.base(), // in scenefile directory + filesToImportDir + fileName.base(), // in scenefile directory fileName.base(), // in local directory ""}; @@ -314,6 +302,33 @@ OSPSG_INTERFACE void importScene( } } +OSPSG_INTERFACE void importScene( + std::shared_ptr context, rkcommon::FileName &sceneFileName) +{ + std::cout << "Importing a scene" << std::endl; + context->filesToImport.clear(); + std::ifstream sgFile(sceneFileName.str()); + if (!sgFile) { + std::cerr << "Could not open " << sceneFileName << " for reading" + << std::endl; + return; + } + + JSON j; + sgFile >> j; + + importScene(context, j, sceneFileName.path()); +} + +OSPSG_INTERFACE void importScene( + std::shared_ptr context, std::string json, std::string filesToImportDir) +{ + JSON j; + j = JSON::parse(json); + + importScene(context, j, filesToImportDir); +} + // global assets catalogue AssetsCatalogue cat; diff --git a/sg/importer/Importer.h b/sg/importer/Importer.h index e790b12c..b66c768a 100644 --- a/sg/importer/Importer.h +++ b/sg/importer/Importer.h @@ -218,5 +218,8 @@ inline void clearAssets() OSPSG_INTERFACE void importScene( std::shared_ptr context, rkcommon::FileName &fileName); +// for loading scene +OSPSG_INTERFACE void importScene( + std::shared_ptr context, std::string sceneDesc, std::string filesToImportDir = ""); } // namespace sg } // namespace ospray