From d0bb8ff644bde68243609f4efd89633cdf29d3c4 Mon Sep 17 00:00:00 2001
From: Lucas Gandel <lucas.gandel@kitware.com>
Date: Thu, 13 Feb 2025 08:41:18 +0100
Subject: [PATCH] Allow specifying a custom path to look for controller models

---
 Rendering/OpenXR/vtkOpenXRRenderWindow.cxx | 20 ++++++++++++++++++++
 Rendering/OpenXR/vtkOpenXRRenderWindow.h   | 10 ++++++++++
 2 files changed, 30 insertions(+)

diff --git a/Rendering/OpenXR/vtkOpenXRRenderWindow.cxx b/Rendering/OpenXR/vtkOpenXRRenderWindow.cxx
index 8c9d6f806e2..71a33bab5c1 100644
--- a/Rendering/OpenXR/vtkOpenXRRenderWindow.cxx
+++ b/Rendering/OpenXR/vtkOpenXRRenderWindow.cxx
@@ -68,6 +68,12 @@ public:
     fileGlobber->SetDirectory(rootSearchDir.c_str());
     fileGlobber->SetRecurse(true);
     fileGlobber->AddFileNames(modelsFile.c_str());
+    if (!this->ModelsManifestDirectory.empty())
+    {
+      std::string fullpath =
+        vtksys::SystemTools::JoinPath({ this->ModelsManifestDirectory, modelsFile });
+      fileGlobber->AddFileNames(fullpath.c_str());
+    }
     if (fileGlobber->GetNumberOfFileNames() <= 0)
     {
       vtkWarningWithObjectMacro(
@@ -139,6 +145,8 @@ public:
 
   std::map<uint32_t, std::string> CurrentInteractionProfiles;
   std::map<std::string, std::map<uint32_t, std::string>> ProfileToModelMapping;
+
+  std::string ModelsManifestDirectory;
 };
 
 vtkStandardNewMacro(vtkOpenXRRenderWindow);
@@ -542,4 +550,16 @@ void vtkOpenXRRenderWindow::SetCurrentInteractionProfile(uint32_t hand, const st
   }
 }
 
+//------------------------------------------------------------------------------
+std::string& vtkOpenXRRenderWindow::GetModelsManifestDirectory()
+{
+  return this->Internal->ModelsManifestDirectory;
+}
+
+//------------------------------------------------------------------------------
+void vtkOpenXRRenderWindow::SetModelsManifestDirectory(const std::string& path)
+{
+  this->Internal->ModelsManifestDirectory = path;
+}
+
 VTK_ABI_NAMESPACE_END
diff --git a/Rendering/OpenXR/vtkOpenXRRenderWindow.h b/Rendering/OpenXR/vtkOpenXRRenderWindow.h
index 7442f324495..35f9df001cc 100644
--- a/Rendering/OpenXR/vtkOpenXRRenderWindow.h
+++ b/Rendering/OpenXR/vtkOpenXRRenderWindow.h
@@ -140,6 +140,16 @@ public:
   std::string& GetCurrentInteractionProfile(uint32_t);
   void SetCurrentInteractionProfile(uint32_t, const std::string& profile);
 
+  ///@{
+  /**
+   * Get/Set a custom path to look for the controllers models.
+   * Default is empty, only the parent of the directory containing the library/executable is
+   * checked.
+   */
+  std::string& GetModelsManifestDirectory();
+  void SetModelsManifestDirectory(const std::string& path);
+  ///@}
+
 protected:
   vtkOpenXRRenderWindow();
   ~vtkOpenXRRenderWindow() override;
-- 
GitLab