From a2beb63a0d4bc462485b1a3e0f84d04a9b9f92a9 Mon Sep 17 00:00:00 2001 From: Matthew Tancik Date: Mon, 1 May 2023 10:04:58 -0700 Subject: [PATCH] Fix viewer meshing options (#1846) --- nerfstudio/viewer/app/package.json | 4 +- .../src/modules/WebSocket/ViserMessages.tsx | 70 ++++++++----------- .../src/modules/WebSocket/ViserWebSocket.tsx | 8 +++ nerfstudio/viewer/app/src/reducer.js | 3 + .../viewer/server/render_state_machine.py | 7 +- nerfstudio/viewer/viser/message_api.py | 8 +++ nerfstudio/viewer/viser/messages.py | 10 +++ 7 files changed, 66 insertions(+), 44 deletions(-) diff --git a/nerfstudio/viewer/app/package.json b/nerfstudio/viewer/app/package.json index a232ef355..def16e3e9 100644 --- a/nerfstudio/viewer/app/package.json +++ b/nerfstudio/viewer/app/package.json @@ -1,7 +1,7 @@ { "name": "viewer", "homepage": ".", - "version": "23-04-18-0", + "version": "23-05-01-0", "private": true, "dependencies": { "@emotion/react": "^11.10.4", @@ -93,4 +93,4 @@ "resolve-url-loader": "^5.0.0", "yaml": "^2.2.2" } -} +} \ No newline at end of file diff --git a/nerfstudio/viewer/app/src/modules/WebSocket/ViserMessages.tsx b/nerfstudio/viewer/app/src/modules/WebSocket/ViserMessages.tsx index e0e713727..965e59ab6 100644 --- a/nerfstudio/viewer/app/src/modules/WebSocket/ViserMessages.tsx +++ b/nerfstudio/viewer/app/src/modules/WebSocket/ViserMessages.tsx @@ -1,123 +1,110 @@ // AUTOMATICALLY GENERATED message interfaces, from Python dataclass definitions. // This file should not be manually modified. interface BackgroundImageMessage { - type: 'BackgroundImageMessage'; + type: "BackgroundImageMessage"; media_type: 'image/jpeg' | 'image/png'; base64_data: string; } interface GuiAddMessage { - type: 'GuiAddMessage'; + type: "GuiAddMessage"; name: string; - folder_labels: [string]; + folder_labels: string[]; leva_conf: any; } interface GuiRemoveMessage { - type: 'GuiRemoveMessage'; + type: "GuiRemoveMessage"; name: string; } interface GuiUpdateMessage { - type: 'GuiUpdateMessage'; + type: "GuiUpdateMessage"; name: string; value: any; } interface GuiSetHiddenMessage { - type: 'GuiSetHiddenMessage'; + type: "GuiSetHiddenMessage"; name: string; hidden: boolean; } interface GuiSetValueMessage { - type: 'GuiSetValueMessage'; + type: "GuiSetValueMessage"; name: string; value: any; } interface GuiSetLevaConfMessage { - type: 'GuiSetLevaConfMessage'; + type: "GuiSetLevaConfMessage"; name: string; leva_conf: any; } interface FilePathInfoMessage { - type: 'FilePathInfoMessage'; + type: "FilePathInfoMessage"; config_base_dir: string; data_base_dir: string; export_path_name: string; } interface CameraMessage { - type: 'CameraMessage'; + type: "CameraMessage"; aspect: number; render_aspect: number; fov: number; - matrix: [ - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - number, - ]; + matrix: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]; camera_type: 'perspective' | 'fisheye' | 'equirectangular'; is_moving: boolean; timestamp: number; } interface SceneBoxMessage { - type: 'SceneBoxMessage'; + type: "SceneBoxMessage"; min: [number, number, number]; max: [number, number, number]; } interface DatasetImageMessage { - type: 'DatasetImageMessage'; + type: "DatasetImageMessage"; idx: string; json: any; } interface TrainingStateMessage { - type: 'TrainingStateMessage'; + type: "TrainingStateMessage"; training_state: 'training' | 'paused' | 'completed'; } interface CameraPathPayloadMessage { - type: 'CameraPathPayloadMessage'; + type: "CameraPathPayloadMessage"; camera_path_filename: string; camera_path: any; } interface CameraPathOptionsRequest { - type: 'CameraPathOptionsRequest'; + type: "CameraPathOptionsRequest"; } interface CameraPathsMessage { - type: 'CameraPathsMessage'; + type: "CameraPathsMessage"; payload: any; } interface CropParamsMessage { - type: 'CropParamsMessage'; + type: "CropParamsMessage"; crop_enabled: boolean; crop_bg_color: [number, number, number]; crop_center: [number, number, number]; crop_scale: [number, number, number]; } interface StatusMessage { - type: 'StatusMessage'; + type: "StatusMessage"; eval_res: string; step: number; } interface SaveCheckpointMessage { - type: 'SaveCheckpointMessage'; + type: "SaveCheckpointMessage"; } interface UseTimeConditioningMessage { - type: 'UseTimeConditioningMessage'; + type: "UseTimeConditioningMessage"; } interface TimeConditionMessage { - type: 'TimeConditionMessage'; + type: "TimeConditionMessage"; time: number; } +interface OutputOptionsMessage { + type: "OutputOptionsMessage"; + options: any; +} -export type Message = +export type Message = | BackgroundImageMessage | GuiAddMessage | GuiRemoveMessage @@ -137,4 +124,5 @@ export type Message = | StatusMessage | SaveCheckpointMessage | UseTimeConditioningMessage - | TimeConditionMessage; + | TimeConditionMessage + | OutputOptionsMessage; diff --git a/nerfstudio/viewer/app/src/modules/WebSocket/ViserWebSocket.tsx b/nerfstudio/viewer/app/src/modules/WebSocket/ViserWebSocket.tsx index 6bc1e312d..0b5b8f2e9 100644 --- a/nerfstudio/viewer/app/src/modules/WebSocket/ViserWebSocket.tsx +++ b/nerfstudio/viewer/app/src/modules/WebSocket/ViserWebSocket.tsx @@ -276,6 +276,14 @@ function handleMessage( }); break; } + case 'OutputOptionsMessage': { + dispatch({ + type: 'write', + path: 'renderingState/output_options', + data: message.options, + }); + break; + } default: { console.log('Received message did not match any known types:', message); break; diff --git a/nerfstudio/viewer/app/src/reducer.js b/nerfstudio/viewer/app/src/reducer.js index 65cb2f810..d22952010 100644 --- a/nerfstudio/viewer/app/src/reducer.js +++ b/nerfstudio/viewer/app/src/reducer.js @@ -58,6 +58,9 @@ const initialState = { // Time options use_time_conditioning: false, + + // Currently just used for mesh panel, should be removed + output_options: [], }, // the scene state sceneState: { diff --git a/nerfstudio/viewer/server/render_state_machine.py b/nerfstudio/viewer/server/render_state_machine.py index e94fc7a2a..39c17c1e0 100644 --- a/nerfstudio/viewer/server/render_state_machine.py +++ b/nerfstudio/viewer/server/render_state_machine.py @@ -79,6 +79,7 @@ class RenderStateMachine(threading.Thread): self.viewer = viewer self.interrupt_render_flag = False self.daemon = True + self.output_keys = {} def action(self, action: RenderAction): """Takes an action and updates the state machine @@ -227,7 +228,11 @@ class RenderStateMachine(threading.Thread): Args: outputs: the dictionary of outputs to choose from, from the model """ - self.viewer.control_panel.update_output_options(list(outputs.keys())) + output_keys = set(outputs.keys()) + if self.output_keys != output_keys: + self.output_keys = output_keys + self.viewer.viser_server.send_output_options_message(list(outputs.keys())) + self.viewer.control_panel.update_output_options(list(outputs.keys())) output_render = self.viewer.control_panel.output_render self.viewer.update_colormap_options( diff --git a/nerfstudio/viewer/viser/message_api.py b/nerfstudio/viewer/viser/message_api.py index 9c7a56ddd..8034440e6 100644 --- a/nerfstudio/viewer/viser/message_api.py +++ b/nerfstudio/viewer/viser/message_api.py @@ -485,6 +485,14 @@ class MessageApi(abc.ABC): """ self._queue(messages.StatusMessage(eval_res=eval_res, step=step)) + def send_output_options_message(self, options: List[str]): + """Send output options message + + Args: + options: The list of output options + """ + self._queue(messages.OutputOptionsMessage(options=options)) + def _add_gui_impl( self, name: str, diff --git a/nerfstudio/viewer/viser/messages.py b/nerfstudio/viewer/viser/messages.py index de4245d14..f3227f848 100644 --- a/nerfstudio/viewer/viser/messages.py +++ b/nerfstudio/viewer/viser/messages.py @@ -241,3 +241,13 @@ class TimeConditionMessage(NerfstudioMessage): time: float """ Time conditioning value """ + + +@dataclasses.dataclass +class OutputOptionsMessage(NerfstudioMessage): + """Output options message which are used in the export panel. + TODO: remove when export panel is becomes python defined. + """ + + options: Any + """ List of output option strings"""