Skip to content

Commit 648416f

Browse files
authored
Viewer reset and functions for remove (#280)
- reset - removes all views and reset the state of the editor - removeScene - removeView Signed-off-by: Petra Hapalova <phapalova@nvidia.com>
1 parent c51974a commit 648416f

File tree

7 files changed

+121
-18
lines changed

7 files changed

+121
-18
lines changed

fvdb/_Cpp.pyi

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -974,9 +974,12 @@ class Viewer:
974974
def __init__(self, ip_address: str, port: int, device_id: int, verbose: bool) -> None: ...
975975
def port(self) -> int: ...
976976
def ip_address(self) -> str: ...
977+
def reset(self) -> None: ...
977978
def add_scene(self, scene_name: str) -> None: ...
979+
def remove_scene(self, scene_name: str) -> None: ...
980+
def remove_view(self, scene_name: str, name: str) -> None: ...
978981
def add_gaussian_splat_3d_view(
979-
scene_name: str, self, name: str, gaussian_splat_3d: GaussianSplat3d
982+
self, scene_name: str, name: str, gaussian_splat_3d: GaussianSplat3d
980983
) -> GaussianSplat3dView: ...
981984
def has_gaussian_splat_3d_view(self, name: str) -> bool: ...
982985
def get_gaussian_splat_3d_view(self, name: str) -> GaussianSplat3dView: ...

fvdb/viz/_scene.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,21 @@ def __init__(self, name: str):
4545
server = _get_viewer_server_cpp()
4646
server.add_scene(name)
4747

48+
def __del__(self):
49+
"""
50+
Delete the scene. This will remove the scene and its views from the viewer.
51+
"""
52+
server = _get_viewer_server_cpp()
53+
server.remove_scene(self._name)
54+
55+
def reset(self):
56+
"""
57+
Reset the scene. This will reset viewer server state and clear all views in the scene.
58+
"""
59+
server = _get_viewer_server_cpp()
60+
server.reset()
61+
server.add_scene(self._name)
62+
4863
@torch.no_grad()
4964
def add_point_cloud(
5065
self,

fvdb/viz/_viewer_server.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,34 @@ def show():
105105
pass
106106

107107
webbrowser.open_new_tab(url)
108+
109+
110+
def reset():
111+
"""
112+
Reset the viewer server state. This will clear all scenes and views and ads back the default scene.
113+
"""
114+
viewer_server = _get_viewer_server_cpp()
115+
viewer_server.reset()
116+
117+
118+
def remove_scene(scene_name: str):
119+
"""
120+
Remove a scene from the viewer server.
121+
122+
Args:
123+
scene_name (str): The name of the scene to remove.
124+
"""
125+
viewer_server = _get_viewer_server_cpp()
126+
viewer_server.remove_scene(scene_name)
127+
128+
129+
def remove_view(scene_name: str, name: str):
130+
"""
131+
Remove a view from the viewer server.
132+
133+
Args:
134+
scene_name (str): The name of the scene view belongs to.
135+
name (str): The name of the view to remove.
136+
"""
137+
viewer_server = _get_viewer_server_cpp()
138+
viewer_server.remove_view(scene_name, name)

src/cmake/get_nanovdb_editor.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ option(NANOVDB_EDITOR_SKIP "Skip nanovdb_editor wheel build" OFF)
1515
set(NANOVDB_EDITOR_BUILD_TYPE "Release" CACHE STRING "Build type for nanovdb_editor (Release/Debug)")
1616

1717
# For fVDB main use nanovdb-editor main
18-
set(NANOVDB_EDITOR_TAG f71090f9c45f11fb57ee640c5bca63086cfcf8b6)
18+
set(NANOVDB_EDITOR_TAG 5132a9ae4f74098a990e729139ca73fea1e4b807)
1919
set(NANOVDB_EDITOR_VERSION 0.0.7) # version at this commit
2020

2121
# If skip is set, get the latest tagged version to prevent unnecessary rebuilds each hash update

src/fvdb/detail/viewer/Viewer.cpp

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,6 @@ Viewer::Viewer(const std::string &ipAddress,
115115

116116
startServer();
117117
}
118-
void
119-
Viewer::setSceneName(const std::string &scene_name) {
120-
mCurrentSceneName = scene_name;
121-
}
122118

123119
Viewer::~Viewer() {
124120
stopServer();
@@ -134,6 +130,53 @@ Viewer::~Viewer() {
134130
pnanovdb_compiler_free(&mEditor.compiler);
135131
}
136132

133+
void
134+
Viewer::reset() {
135+
mEditor.editor.reset(&mEditor.editor);
136+
137+
mCameraViews.clear();
138+
mSplat3dViews.clear();
139+
}
140+
141+
void
142+
Viewer::addScene(const std::string &scene_name) {
143+
pnanovdb_camera_init(&mEditor.camera);
144+
updateCamera(scene_name);
145+
}
146+
147+
void
148+
Viewer::removeScene(const std::string &scene_name) {
149+
pnanovdb_editor_token_t *sceneToken = mEditor.editor.get_token(scene_name.c_str());
150+
mEditor.editor.remove(&mEditor.editor, sceneToken, nullptr);
151+
152+
// Erase all camera views belonging to the removed scene
153+
for (auto it = mCameraViews.begin(); it != mCameraViews.end();) {
154+
if (it->second.mSceneToken == sceneToken) {
155+
it = mCameraViews.erase(it);
156+
} else {
157+
++it;
158+
}
159+
}
160+
// Erase all splat 3d views belonging to the removed scene
161+
for (auto it = mSplat3dViews.begin(); it != mSplat3dViews.end();) {
162+
if (it->second.mSceneToken == sceneToken) {
163+
it = mSplat3dViews.erase(it);
164+
} else {
165+
++it;
166+
}
167+
}
168+
}
169+
170+
void
171+
Viewer::removeView(const std::string &scene_name, const std::string &name) {
172+
pnanovdb_editor_token_t *sceneToken = mEditor.editor.get_token(scene_name.c_str());
173+
pnanovdb_editor_token_t *viewToken = mEditor.editor.get_token(name.c_str());
174+
mEditor.editor.remove(&mEditor.editor, sceneToken, viewToken);
175+
176+
mCameraViews.erase(name);
177+
mSplat3dViews.erase(name);
178+
}
179+
137180
fvdb::detail::viewer::GaussianSplat3dView &
138181
Viewer::addGaussianSplat3dView(const std::string &scene_name,
139182
const std::string &name,

src/fvdb/detail/viewer/Viewer.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,15 @@ class Viewer {
5353
const bool verbose = false);
5454
~Viewer();
5555

56-
void
57-
addScene(const std::string &scene_name) {
58-
pnanovdb_camera_init(&mEditor.camera);
59-
updateCamera(scene_name);
60-
}
56+
void reset();
57+
58+
void setSceneName(const std::string &scene_name);
59+
60+
void addScene(const std::string &scene_name);
61+
62+
void removeScene(const std::string &scene_name);
63+
64+
void removeView(const std::string &scene_name, const std::string &view_name);
6165

6266
pnanovdb_editor_token_t *
6367
getToken(const std::string &name) const {
@@ -131,8 +135,6 @@ class Viewer {
131135
port() const {
132136
return mPort;
133137
};
134-
135-
void setSceneName(const std::string &scene_name);
136138
};
137139

138140
} // namespace fvdb::detail::viewer

src/python/ViewerBinding.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,24 @@ bind_viewer(py::module &m) {
109109
&fvdb::detail::viewer::Viewer::port,
110110
"The port the viewer server is listening on.")
111111

112+
.def("reset", &fvdb::detail::viewer::Viewer::reset, "Reset the viewer server state")
113+
112114
.def("add_scene",
113115
&fvdb::detail::viewer::Viewer::addScene,
114116
py::arg("scene_name"),
115117
"Add a new scene to the viewer")
116118

119+
.def("remove_scene",
120+
&fvdb::detail::viewer::Viewer::removeScene,
121+
py::arg("scene_name"),
122+
"Remove a scene from the viewer")
123+
124+
.def("remove_view",
125+
&fvdb::detail::viewer::Viewer::removeView,
126+
py::arg("scene_name"),
127+
py::arg("name"),
128+
"Remove a view from a scene")
129+
117130
.def("camera_orbit_center",
118131
&fvdb::detail::viewer::Viewer::cameraOrbitCenter,
119132
py::arg("scene_name"),
@@ -214,9 +227,5 @@ bind_viewer(py::module &m) {
214227
&fvdb::detail::viewer::Viewer::getCameraView,
215228
py::arg("name"),
216229
py::return_value_policy::reference_internal,
217-
"Get a camera view by name")
218-
.def("set_scene_name",
219-
&fvdb::detail::viewer::Viewer::setSceneName,
220-
py::arg("scene_name"),
221-
"Set the current scene name");
230+
"Get a camera view by name");
222231
}

0 commit comments

Comments
 (0)