diff --git a/README.md b/README.md
index ed5bb264f..11239e7ed 100644
--- a/README.md
+++ b/README.md
@@ -46,7 +46,6 @@
-
- [Quickstart](#quickstart)
- [Learn more](#learn-more)
- [Supported Features](#supported-features)
@@ -190,7 +189,7 @@ If you're interested in learning more on how to create your own pipelines, devel
| [Documentation](https://docs.nerf.studio/en/latest/) | Full API documentation and tutorials |
| [Viewer](https://viewer.nerf.studio/) | Home page for our web viewer |
| 🎒 **Educational** |
-| [Model Descriptions](https://docs.nerf.studio/en/latest/nerfology/methods/index.html) | Description of all the models supported by nerfstudio and explanations of component parts. |
+| [Model Descriptions](https://docs.nerf.studio/en/latest/nerfology/methods/index.html) | Description of all the models supported by nerfstudio and explanations of component parts. |
| [Component Descriptions](https://docs.nerf.studio/en/latest/nerfology/model_components/index.html) | Interactive notebooks that explain notable/commonly used modules in various models. |
| 🏃 **Tutorials** |
| [Getting Started](https://docs.nerf.studio/en/latest/quickstart/installation.html) | A more in-depth guide on how to get started with nerfstudio from installation to contributing. |
@@ -200,9 +199,9 @@ If you're interested in learning more on how to create your own pipelines, devel
| [Creating datasets](https://docs.nerf.studio/en/latest/quickstart/custom_dataset.html) | Have a new dataset? Learn how to run it with nerfstudio. | |
| [Contributing](https://docs.nerf.studio/en/latest/reference/contributing.html) | Walk-through for how you can start contributing now. |
| 💖 **Community** |
-| [Discord](https://discord.gg/uMbNqcraFc) | Join our community to discuss more. We would love to hear from you! |
-| [Twitter](https://twitter.com/nerfstudioteam) | Follow us on Twitter @nerfstudioteam to see cool updates and announcements |
-| [TikTok](#) | Coming soon! Follow us on TikTok to see some of our fan favorite results |
+| [Discord](https://discord.gg/uMbNqcraFc) | Join our community to discuss more. We would love to hear from you! |
+| [Twitter](https://twitter.com/nerfstudioteam) | Follow us on Twitter @nerfstudioteam to see cool updates and announcements |
+| [TikTok](#) | Coming soon! Follow us on TikTok to see some of our fan favorite results |
# Supported Features
@@ -238,8 +237,8 @@ If you use this library or find the documentation useful for your research, plea
```
@misc{nerfstudio,
title={Nerfstudio: A Framework for Neural Radiance Field Development},
- author={Matthew Tancik*, Ethan Weber*, Evonne Ng*, Ruilong Li, Brent Yi,
- Terrance Wang, Alexander Kristoffersen, Jake Austin, Kamyar Salahi,
+ author={Matthew Tancik*, Ethan Weber*, Evonne Ng*, Ruilong Li, Brent Yi,
+ Terrance Wang, Alexander Kristoffersen, Jake Austin, Kamyar Salahi,
Abhik Ahuja, David McAllister, Angjoo Kanazawa},
year={2022},
url={https://github.com/nerfstudio-project/nerfstudio},
diff --git a/docs/index.md b/docs/index.md
index 1682365ff..c6bbb80c8 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -50,6 +50,7 @@ quickstart/installation
quickstart/first_nerf
quickstart/custom_dataset
quickstart/viewer_quickstart
+quickstart/google_colab
Contributing
```
@@ -126,7 +127,9 @@ If you use this library or find the documentation useful for your research, plea
```none
@misc{nerfstudio,
title={Nerfstudio: A Framework for Neural Radiance Field Development},
- author={Matthew Tancik*, Ethan Weber*, Evonne Ng*, Ruilong Li, Brent Yi, Terrance Wang, Alexander Kristoffersen, Jake Austin, Kamyar Salahi, Abhik Ahuja, David McAllister, Angjoo Kanazawa},
+ author={Matthew Tancik*, Ethan Weber*, Evonne Ng*, Ruilong Li, Brent Yi,
+ Terrance Wang, Alexander Kristoffersen, Jake Austin, Kamyar Salahi,
+ Abhik Ahuja, David McAllister, Angjoo Kanazawa},
year={2022},
url={https://github.com/nerfstudio-project/nerfstudio},
}
diff --git a/docs/quickstart/google_colab.md b/docs/quickstart/google_colab.md
new file mode 100644
index 000000000..b086e5e59
--- /dev/null
+++ b/docs/quickstart/google_colab.md
@@ -0,0 +1,3 @@
+# Google Colab
+
+Nerfstudio works in Google Colab using their hosted GPUs! Here is [the link](https://colab.research.google.com/drive/1l-QDYEcv759kUNJQrJ8z1CI8o1iIiU-l?usp=sharing). Make a copy of this file and go from there!
diff --git a/nerfstudio/configs/base_config.py b/nerfstudio/configs/base_config.py
index 218050a79..cecbc6ffe 100644
--- a/nerfstudio/configs/base_config.py
+++ b/nerfstudio/configs/base_config.py
@@ -18,7 +18,6 @@
from __future__ import annotations
-import logging
from dataclasses import dataclass
from datetime import datetime
from pathlib import Path
@@ -32,6 +31,7 @@ from nerfstudio.configs.config_utils import to_immutable_dict
# model instances
from nerfstudio.utils import writer
+CONSOLE = Console(width=120)
# Pretty printing class
class PrintableConfig: # pylint: disable=too-few-public-methods
@@ -167,9 +167,11 @@ class ViewerConfig(PrintableConfig):
zmq_port: Optional[int] = None
"""The zmq port to connect to for communication. If None, find an available port."""
launch_bridge_server: bool = True
- """whether or not to launch the zmq bridge server"""
- websocket_port: int = 7007
+ """whether or not to launch the bridge server"""
+ websocket_port: Optional[int] = 7007
"""the default websocket port to connect to"""
+ ip_address: str = "0.0.0.0"
+ """the ip address where the bridge server is running"""
num_rays_per_chunk: int = 32768
"""number of rays per chunk to render with viewer"""
@@ -249,10 +251,9 @@ class Config(PrintableConfig):
def print_to_terminal(self) -> None:
"""Helper to pretty print config to terminal"""
- console = Console(width=120)
- console.rule("Config")
- console.print(self)
- console.rule("")
+ CONSOLE.rule("Config")
+ CONSOLE.print(self)
+ CONSOLE.rule("")
def save_config(self) -> None:
"""Save config to base directory"""
@@ -260,5 +261,5 @@ class Config(PrintableConfig):
assert base_dir is not None
base_dir.mkdir(parents=True, exist_ok=True)
config_yaml_path = base_dir / "config.yml"
- logging.info(f"Saving config to: {config_yaml_path}")
+ CONSOLE.log(f"Saving config to: {config_yaml_path}")
config_yaml_path.write_text(yaml.dump(self), "utf8")
diff --git a/nerfstudio/configs/config_utils.py b/nerfstudio/configs/config_utils.py
index 259603cb3..59b1b252b 100644
--- a/nerfstudio/configs/config_utils.py
+++ b/nerfstudio/configs/config_utils.py
@@ -23,6 +23,7 @@ from typing import Any, Dict
from rich.console import Console
+CONSOLE = Console()
# pylint: disable=import-outside-toplevel
# cannot use mutable types directly within dataclass; abstracting default factory calls
@@ -44,7 +45,6 @@ def convert_markup_to_ansi(markup_string: str) -> str:
Returns:
Text formatted via ANSI sequences.
"""
- console = Console()
- with console.capture() as out:
- console.print(markup_string, soft_wrap=True)
+ with CONSOLE.capture() as out:
+ CONSOLE.print(markup_string, soft_wrap=True)
return out.get()
diff --git a/nerfstudio/data/dataparsers/instant_ngp_dataparser.py b/nerfstudio/data/dataparsers/instant_ngp_dataparser.py
index 613b6b6c1..1641ad43d 100644
--- a/nerfstudio/data/dataparsers/instant_ngp_dataparser.py
+++ b/nerfstudio/data/dataparsers/instant_ngp_dataparser.py
@@ -16,13 +16,13 @@
from __future__ import annotations
-import logging
from dataclasses import dataclass, field
from pathlib import Path
from typing import Dict, Tuple, Type
import numpy as np
import torch
+from rich.console import Console
from nerfstudio.cameras import camera_utils
from nerfstudio.cameras.cameras import Cameras, CameraType
@@ -34,6 +34,8 @@ from nerfstudio.data.dataparsers.base_dataparser import (
from nerfstudio.data.scene_box import SceneBox
from nerfstudio.utils.io import load_from_json
+CONSOLE = Console(width=120)
+
@dataclass
class InstantNGPDataParserConfig(DataParserConfig):
@@ -69,7 +71,7 @@ class InstantNGP(DataParser):
image_filenames.append(fname)
poses.append(np.array(frame["transform_matrix"]))
if num_skipped_image_filenames >= 0:
- logging.info("Skipping %s files in dataset split %s.", num_skipped_image_filenames, split)
+ CONSOLE.print(f"Skipping {num_skipped_image_filenames} files in dataset split {split}.")
assert (
len(image_filenames) != 0
), """
diff --git a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py
index 35f2412cf..1e29f6b11 100644
--- a/nerfstudio/data/dataparsers/nerfstudio_dataparser.py
+++ b/nerfstudio/data/dataparsers/nerfstudio_dataparser.py
@@ -15,7 +15,6 @@
from __future__ import annotations
-import logging
import math
from dataclasses import dataclass, field
from pathlib import Path, PureWindowsPath
@@ -36,8 +35,7 @@ from nerfstudio.data.dataparsers.base_dataparser import (
from nerfstudio.data.scene_box import SceneBox
from nerfstudio.utils.io import load_from_json
-console = Console()
-
+CONSOLE = Console(width=120)
MAX_AUTO_RESOLUTION = 1600
@@ -88,7 +86,7 @@ class Nerfstudio(DataParser):
image_filenames.append(fname)
poses.append(np.array(frame["transform_matrix"]))
if num_skipped_image_filenames >= 0:
- logging.info("Skipping %s files in dataset split %s.", num_skipped_image_filenames, split)
+ CONSOLE.log(f"Skipping {num_skipped_image_filenames} files in dataset split {split}.")
assert (
len(image_filenames) != 0
), """
@@ -185,8 +183,8 @@ class Nerfstudio(DataParser):
break
df += 1
- console.print(f"Auto image downscale factor of {2**df}")
self.downscale_factor = 2**df
+ CONSOLE.log(f"Auto image downscale factor of {self.downscale_factor}")
else:
self.downscale_factor = self.config.downscale_factor
diff --git a/nerfstudio/engine/trainer.py b/nerfstudio/engine/trainer.py
index 78f7ba0a9..686cfcca4 100644
--- a/nerfstudio/engine/trainer.py
+++ b/nerfstudio/engine/trainer.py
@@ -19,13 +19,12 @@ from __future__ import annotations
import dataclasses
import functools
-import logging
import os
import time
from typing import Any, Dict, List, Tuple
import torch
-from rich import console
+from rich.console import Console
from torch.cuda.amp.grad_scaler import GradScaler
from nerfstudio.configs import base_config as cfg
@@ -46,8 +45,7 @@ from nerfstudio.utils.misc import step_check
from nerfstudio.utils.writer import EventName, TimeWriter
from nerfstudio.viewer.server import viewer_utils
-logging.getLogger("PIL").setLevel(logging.WARNING)
-CONSOLE = console.Console()
+CONSOLE = Console(width=120)
def train_loop(local_rank: int, world_size: int, config: cfg.Config) -> Any:
@@ -94,7 +92,7 @@ class Trainer:
self.mixed_precision = self.config.trainer.mixed_precision
if self.device == "cpu":
self.mixed_precision = False
- logging.warning("Mixed precision is disabled for CPU training.")
+ CONSOLE.print("Mixed precision is disabled for CPU training.")
self._start_step = 0
# optimizers
self.grad_scaler = GradScaler(enabled=self.mixed_precision)
@@ -102,13 +100,12 @@ class Trainer:
self.base_dir = config.get_base_dir()
# directory to save checkpoints
self.checkpoint_dir = config.get_checkpoint_dir()
- logging.info("Saving checkpoints to: %s", self.checkpoint_dir)
+ CONSOLE.log(f"Saving checkpoints to: {self.checkpoint_dir}")
# set up viewer if enabled
viewer_log_path = self.base_dir / config.viewer.relative_log_filename
- ret = None
+ self.viewer_state, banner_messages = None, None
if self.config.is_viewer_enabled():
- ret = viewer_utils.setup_viewer(config.viewer, log_filename=viewer_log_path)
- (self.viewer_state, banner_messages) = ret if ret else (None, None)
+ self.viewer_state, banner_messages = viewer_utils.setup_viewer(config.viewer, log_filename=viewer_log_path)
self._check_viewer_warnings()
# set up writers/profilers if enabled
writer_log_path = self.base_dir / config.logging.relative_log_dir
@@ -145,7 +142,7 @@ class Trainer:
"""Train the model."""
assert self.pipeline.datamanager.train_dataset is not None, "Missing DatsetInputs"
- self._init_viewer_scene()
+ self._init_viewer_state()
with TimeWriter(writer, EventName.TOTAL_TRAIN_TIME):
num_iterations = self.config.trainer.max_num_iterations
for step in range(self._start_step, self._start_step + num_iterations):
@@ -207,7 +204,7 @@ class Trainer:
CONSOLE.print(f"[bold red]{string}")
@check_viewer_enabled
- def _init_viewer_scene(self) -> None:
+ def _init_viewer_state(self) -> None:
"""Initializes viewer scene with given train dataset"""
assert self.viewer_state and self.pipeline.datamanager.train_dataset
self.viewer_state.init_scene(
@@ -271,9 +268,9 @@ class Trainer:
self.pipeline.load_pipeline(loaded_state["pipeline"])
self.optimizers.load_optimizers(loaded_state["optimizers"])
self.grad_scaler.load_state_dict(loaded_state["scalers"])
- logging.info("done loading checkpoint from %s", load_path)
+ CONSOLE.print(f"done loading checkpoint from {load_path}")
else:
- logging.info("No checkpoints to load, training from scratch")
+ CONSOLE.print("No checkpoints to load, training from scratch")
@check_main_thread
def save_checkpoint(self, step: int) -> None:
diff --git a/nerfstudio/utils/eval_utils.py b/nerfstudio/utils/eval_utils.py
index a97997ffa..2f1ee4673 100644
--- a/nerfstudio/utils/eval_utils.py
+++ b/nerfstudio/utils/eval_utils.py
@@ -29,7 +29,7 @@ from rich.console import Console
from nerfstudio.configs import base_config as cfg
from nerfstudio.pipelines.base_pipeline import Pipeline
-console = Console(width=120)
+CONSOLE = Console(width=120)
def eval_load_checkpoint(config: cfg.TrainerConfig, pipeline: Pipeline) -> Path:
@@ -42,12 +42,12 @@ def eval_load_checkpoint(config: cfg.TrainerConfig, pipeline: Pipeline) -> Path:
"""
assert config.load_dir is not None
if config.load_step is None:
- console.print("Loading latest checkpoint from load_dir")
+ CONSOLE.print("Loading latest checkpoint from load_dir")
# NOTE: this is specific to the checkpoint name format
if not os.path.exists(config.load_dir):
- console.rule("Error", style="red")
- console.print(f"No checkpoint directory found at {config.load_dir}, ", justify="center")
- console.print(
+ CONSOLE.rule("Error", style="red")
+ CONSOLE.print(f"No checkpoint directory found at {config.load_dir}, ", justify="center")
+ CONSOLE.print(
"Please make sure the checkpoint exists, they should be generated periodically during training",
justify="center",
)
@@ -59,7 +59,7 @@ def eval_load_checkpoint(config: cfg.TrainerConfig, pipeline: Pipeline) -> Path:
assert load_path.exists(), f"Checkpoint {load_path} does not exist"
loaded_state = torch.load(load_path, map_location="cpu")
pipeline.load_pipeline(loaded_state["pipeline"])
- console.print(f":white_check_mark: Done loading checkpoint from {load_path}")
+ CONSOLE.print(f":white_check_mark: Done loading checkpoint from {load_path}")
return load_path
diff --git a/nerfstudio/utils/install_checks.py b/nerfstudio/utils/install_checks.py
index 0372130a8..23351a1b2 100644
--- a/nerfstudio/utils/install_checks.py
+++ b/nerfstudio/utils/install_checks.py
@@ -19,14 +19,14 @@ import sys
from rich.console import Console
-console = Console(width=120)
+CONSOLE = Console(width=120)
def check_ffmpeg_installed():
"""Checks if ffmpeg is installed."""
ffmpeg_path = shutil.which("ffmpeg")
if ffmpeg_path is None:
- console.print("[bold red]Could not find ffmpeg. Please install ffmpeg.")
+ CONSOLE.print("[bold red]Could not find ffmpeg. Please install ffmpeg.")
print("See https://ffmpeg.org/download.html for installation instructions.")
print("ffmpeg is only necessary if using videos as input.")
sys.exit(1)
@@ -36,6 +36,6 @@ def check_colmap_installed():
"""Checks if colmap is installed."""
colmap_path = shutil.which("colmap")
if colmap_path is None:
- console.print("[bold red]Could not find COLMAP. Please install COLMAP.")
+ CONSOLE.print("[bold red]Could not find COLMAP. Please install COLMAP.")
print("See https://colmap.github.io/install.html for installation instructions.")
sys.exit(1)
diff --git a/nerfstudio/utils/printing.py b/nerfstudio/utils/printing.py
index ba2556cf7..e6ebc18d1 100644
--- a/nerfstudio/utils/printing.py
+++ b/nerfstudio/utils/printing.py
@@ -18,19 +18,19 @@ from math import floor, log
from rich.console import Console
-console = Console(width=120)
+CONSOLE = Console(width=120)
def print_tcnn_speed_warning(method_name: str):
"""Prints a warning about the speed of the TCNN."""
- console.line()
- console.print(f"[bold yellow]WARNING: Using a slow implementation of {method_name}. ")
- console.print(
+ CONSOLE.line()
+ CONSOLE.print(f"[bold yellow]WARNING: Using a slow implementation of {method_name}. ")
+ CONSOLE.print(
"[bold yellow]:person_running: :person_running: "
+ "Install tcnn for speedups :person_running: :person_running:"
)
- console.print("[yellow]pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch")
- console.line()
+ CONSOLE.print("[yellow]pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch")
+ CONSOLE.line()
def human_format(num):
diff --git a/nerfstudio/utils/profiler.py b/nerfstudio/utils/profiler.py
index 3c90ef791..c1fc96dcb 100644
--- a/nerfstudio/utils/profiler.py
+++ b/nerfstudio/utils/profiler.py
@@ -17,10 +17,11 @@ Profiler base class and functionality
"""
from __future__ import annotations
-import logging
import time
from typing import Callable
+from rich.console import Console
+
from nerfstudio.configs import base_config as cfg
from nerfstudio.utils import comms
from nerfstudio.utils.decorators import (
@@ -29,6 +30,8 @@ from nerfstudio.utils.decorators import (
decorate_all,
)
+CONSOLE = Console(width=120)
+
PROFILER = []
@@ -82,7 +85,7 @@ class Profiler:
def print_profile(self):
"""helper to print out the profiler stats"""
- logging.info("Printing profiling stats, from longest to shortest duration in seconds")
+ CONSOLE.print("Printing profiling stats, from longest to shortest duration in seconds")
sorted_keys = sorted(
self.profiler_dict.keys(),
key=lambda k: self.profiler_dict[k]["val"],
@@ -90,4 +93,4 @@ class Profiler:
)
for k in sorted_keys:
val = f"{self.profiler_dict[k]['val']:0.4f}"
- print(f"{k:<20}: {val:<20}")
+ CONSOLE.print(f"{k:<20}: {val:<20}")
diff --git a/nerfstudio/utils/writer.py b/nerfstudio/utils/writer.py
index d7022b7fa..bd9741a7d 100644
--- a/nerfstudio/utils/writer.py
+++ b/nerfstudio/utils/writer.py
@@ -18,7 +18,6 @@ Generic Writer class
from __future__ import annotations
import enum
-import logging
from abc import abstractmethod
from pathlib import Path
from time import time
@@ -26,7 +25,7 @@ from typing import Any, Dict, List, Optional, Union
import torch
import wandb
-from rich import console
+from rich.console import Console
from torch.utils.tensorboard import SummaryWriter
from torchtyping import TensorType
@@ -34,8 +33,7 @@ from nerfstudio.configs import base_config as cfg
from nerfstudio.utils.decorators import check_main_thread, decorate_all
from nerfstudio.utils.printing import human_format
-CONSOLE = console.Console()
-
+CONSOLE = Console(width=120)
to8b = lambda x: (255 * torch.clamp(x, min=0, max=1)).to(torch.uint8)
EVENT_WRITERS = []
EVENT_STORAGE = []
@@ -181,7 +179,7 @@ def setup_local_writer(config: cfg.LoggingConfig, max_iter: int, banner_messages
curr_writer = config.local_writer.setup(banner_messages=banner_messages)
EVENT_WRITERS.append(curr_writer)
else:
- logging.info("disabled local writer")
+ CONSOLE.log("disabled local writer")
## configure all the global buffer basic information
GLOBAL_BUFFER["max_iter"] = max_iter
@@ -388,10 +386,10 @@ class LocalWriter:
valid_step = step > 0 and step % GLOBAL_BUFFER["steps_per_log"] == 0
if valid_step:
if not self.has_printed and self.config.max_log_size:
- logging.info(
- "\x1b[33;20mPrinting max of %d lines. Set flag `--logging.local-writer.max-log-size=0` "
- "to disable line wrapping.\x1b[0m",
- self.config.max_log_size,
+ CONSOLE.log(
+ f"Printing max of {self.config.max_log_size} lines. "
+ "Set flag `--logging.local-writer.max-log-size=0` "
+ "to disable line wrapping."
)
latest_map, new_key = self._consolidate_events()
self._update_header(latest_map, new_key)
@@ -433,6 +431,7 @@ class LocalWriter:
self.past_mssgs[0] = mssg
self.past_mssgs[1] = "-" * len(mssg)
if full_log_cond or not self.has_printed:
+ print("testeing testing!")
print(mssg)
print("-" * len(mssg))
# self.has_printed = True
diff --git a/nerfstudio/viewer/app/package.json b/nerfstudio/viewer/app/package.json
index de8ca23e8..b0768523b 100644
--- a/nerfstudio/viewer/app/package.json
+++ b/nerfstudio/viewer/app/package.json
@@ -1,7 +1,7 @@
{
"name": "viewer",
"homepage": ".",
- "version": "22-10-07-0",
+ "version": "22-10-13-0",
"private": true,
"dependencies": {
"@emotion/react": "^11.10.4",
diff --git a/nerfstudio/viewer/app/src/modules/Banner/Banner.jsx b/nerfstudio/viewer/app/src/modules/Banner/Banner.jsx
index bf3c51d28..0ab082edd 100644
--- a/nerfstudio/viewer/app/src/modules/Banner/Banner.jsx
+++ b/nerfstudio/viewer/app/src/modules/Banner/Banner.jsx
@@ -17,22 +17,19 @@ function getParam(param_name) {
return decodeURIComponent(params[1]);
}
-function getWebsocketEndpoint() {
- const endpoint = getParam('websocket_port');
- return endpoint;
-}
-
export default function Banner() {
const dispatch = useDispatch();
let open_modal = true;
- const websocket_port_from_argument = getWebsocketEndpoint();
- if (websocket_port_from_argument !== undefined) {
+
+ // possibly set the websocket url
+ const websocket_url_from_argument = getParam('websocket_url');
+ if (websocket_url_from_argument !== undefined) {
open_modal = false;
dispatch({
type: 'write',
- path: 'websocketState/websocket_port',
- data: websocket_port_from_argument,
+ path: 'websocketState/websocket_url',
+ data: websocket_url_from_argument,
});
}
diff --git a/nerfstudio/viewer/app/src/modules/LandingModal/LandingModal.jsx b/nerfstudio/viewer/app/src/modules/LandingModal/LandingModal.jsx
index 6de67049a..645445680 100644
--- a/nerfstudio/viewer/app/src/modules/LandingModal/LandingModal.jsx
+++ b/nerfstudio/viewer/app/src/modules/LandingModal/LandingModal.jsx
@@ -13,7 +13,6 @@ import {
} from '@mui/material';
import ContentCopyRoundedIcon from '@mui/icons-material/ContentCopyRounded';
-import { useSelector } from 'react-redux';
import WebSocketUrlField from '../WebSocketUrlField';
interface LandingModalProps {
@@ -57,12 +56,9 @@ export default function LandingModel(props: LandingModalProps) {
const handleOpen = () => setOpen(true);
const handleClose = () => setOpen(false);
- const text_intro = `To use our viewer, you need to connect to the WebSocket server where your training job is running. Enter your WebSocket Port below and click the link to connect to your training job.`;
+ const text_intro = `To use our viewer, you need to connect to the WebSocket server where your training job is running. Enter your WebSocket URL below and click the link to connect to your training job.`;
- const websocket_port = useSelector(
- (state) => state.websocketState.websocket_port,
- );
- const command = `ssh -L ${websocket_port}:localhost:${websocket_port} USER@REMOTE.SERVER.IP`;
+ const command = `ssh -L :localhost: USER@REMOTE.SERVER.IP`;
const platform = window.navigator.platform.toLowerCase();
let initial_tab = 0;
@@ -180,9 +176,15 @@ export default function LandingModel(props: LandingModalProps) {
Camera Keyboard Controls
-
WASD - horizontal camera translation, QE - vertical camera translation
+
+ WASD - horizontal camera translation, QE - vertical camera
+ translation
+
Arrow Keys - camera rotation
-
Spacebar - reset camera orbit point and view direction to origin
+
+ Spacebar - reset camera orbit point and view direction to
+ origin
+