Skip to content
Merged
3 changes: 3 additions & 0 deletions tsd/apps/interactive/demos/network/RenderSession.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ enum MessageType
// All ping messages
PING,

// All disconnections
DISCONNECT,

// All errors
ERROR = 255
};
Expand Down
12 changes: 4 additions & 8 deletions tsd/apps/interactive/demos/network/client/RemoteViewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,8 @@ void RemoteViewport::buildUI()
if (m_viewportSize != viewportSize || m_wasConnected != isConnected)
reshape(viewportSize);

if (!m_wasConnected && isConnected) {
m_channel->send(
tsd::network::make_message(MessageType::SERVER_REQUEST_VIEW));
}
if (!m_wasConnected && isConnected)
m_channel->send(MessageType::SERVER_REQUEST_VIEW);

m_wasConnected = isConnected;
m_incomingFramePass->setEnabled(isConnected);
Expand Down Expand Up @@ -136,8 +134,7 @@ void RemoteViewport::reshape(tsd::math::int2 newSize)
if (m_channel && m_channel->isConnected()) {
tsd::network::RenderSession::Frame::Config frameConfig;
frameConfig.size = tsd::math::uint2(newSize.x, newSize.y);
m_channel->send(tsd::network::make_message(
MessageType::SERVER_SET_FRAME_CONFIG, &frameConfig));
m_channel->send(MessageType::SERVER_SET_FRAME_CONFIG, &frameConfig);
}
}

Expand All @@ -153,8 +150,7 @@ void RemoteViewport::updateCamera()
viewMsg.azeldist.z = m_arcball->distance();
viewMsg.lookat = m_arcball->at();

m_channel->send(
tsd::network::make_message(MessageType::SERVER_SET_VIEW, &viewMsg));
m_channel->send(MessageType::SERVER_SET_VIEW, &viewMsg);
}
}

Expand Down
30 changes: 14 additions & 16 deletions tsd/apps/interactive/demos/network/client/tsdRemoteViewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,12 @@ Application::Application()
tsd::core::logStatus(
"\n%s", tsd::core::objectDBInfo(scene.objectDB()).c_str());
tsd::core::logStatus("[Client] Requesting start of rendering...");
m_client->send(
tsd::network::make_message(MessageType::SERVER_START_RENDERING));
m_client->send(MessageType::SERVER_START_RENDERING);
appCore()->tsd.sceneLoadComplete = true;
});

core->tsd.scene.setUpdateDelegate(m_updateDelegate.get());
core->tsd.sceneLoadComplete = false;
}

Application::~Application() = default;
Expand All @@ -110,7 +111,6 @@ anari_viewer::WindowArray Application::setupWindows()

auto *core = appCore();
auto *manipulator = &core->view.manipulator;
core->tsd.sceneLoadComplete = true;

auto *log = new tsd_ui::Log(this);
m_viewport =
Expand Down Expand Up @@ -172,22 +172,19 @@ void Application::uiMainMenuBar()
if (ImGui::BeginMenu("Server")) {
if (ImGui::MenuItem("Start Rendering")) {
tsd::core::logStatus("[Client] Sending START_RENDERING command");
m_client->send(
tsd::network::make_message(MessageType::SERVER_START_RENDERING));
m_client->send(MessageType::SERVER_START_RENDERING);
}

if (ImGui::MenuItem("Pause Rendering")) {
tsd::core::logStatus("[Client] Sending STOP_RENDERING command");
m_client->send(
tsd::network::make_message(MessageType::SERVER_STOP_RENDERING));
m_client->send(MessageType::SERVER_STOP_RENDERING);
}

ImGui::Separator();

if (ImGui::MenuItem("Shutdown")) {
tsd::core::logStatus("[Client] Sending SHUTDOWN command");
m_client->send(tsd::network::make_message(MessageType::SERVER_SHUTDOWN))
.get();
m_client->send(MessageType::SERVER_SHUTDOWN).get();
disconnect();
}

Expand All @@ -200,7 +197,7 @@ void Application::uiMainMenuBar()

if (ImGui::IsKeyPressed(ImGuiKey_P, false)) {
tsd::core::logStatus("[Client] Sending PING");
m_client->send(tsd::network::make_message(MessageType::PING));
m_client->send(MessageType::PING);
}

if (ImGui::IsKeyPressed(ImGuiKey_F1, false)) {
Expand Down Expand Up @@ -325,9 +322,7 @@ void Application::connect()
tsd::core::logStatus(
"[Client] Connected to server at %s:%d", m_host.c_str(), m_port);
tsd::core::logStatus("[Client] Requesting scene from server");
m_client->send(
tsd::network::make_message(MessageType::SERVER_REQUEST_SCENE))
.get();
m_client->send(MessageType::SERVER_REQUEST_SCENE).get();
} else {
tsd::core::logError("[Client] Failed to connect to server at %s:%d",
m_host.c_str(),
Expand All @@ -338,11 +333,14 @@ void Application::connect()
void Application::disconnect()
{
tsd::core::logStatus("[Client] Disconnecting from server...");
m_client->send(tsd::network::make_message(MessageType::SERVER_STOP_RENDERING))
.get();
m_updateDelegate->setEnabled(false);
m_client->send(MessageType::DISCONNECT).get();
m_client->disconnect();

auto &scene = appCore()->tsd.scene;
auto *core = appCore();
core->tsd.sceneLoadComplete = false;
core->clearSelected();
auto &scene = core->tsd.scene;
scene.removeAllLayers();
scene.removeAllObjects();
}
Expand Down
12 changes: 6 additions & 6 deletions tsd/apps/interactive/demos/network/client/tsdTestClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,19 +85,19 @@ int main()

client->connect("127.0.0.1", 12345);

client->send(make_message(MessageType::SERVER_START_RENDERING));
client->send(MessageType::SERVER_START_RENDERING);

tsd::core::logStatus("[Client] Rendering for 1 second...");
std::this_thread::sleep_for(std::chrono::seconds(1));

client->send(make_message(MessageType::SERVER_STOP_RENDERING)).get();
client->send(make_message(MessageType::SERVER_REQUEST_FRAME_CONFIG)).get();
client->send(make_message(MessageType::SERVER_REQUEST_VIEW)).get();
client->send(MessageType::SERVER_STOP_RENDERING).get();
client->send(MessageType::SERVER_REQUEST_FRAME_CONFIG).get();
client->send(MessageType::SERVER_REQUEST_VIEW).get();

for (int i = 0; i < 3; ++i) {
tsd::core::logStatus("[Client] Sending PING #%d", i + 1);
std::this_thread::sleep_for(std::chrono::seconds(1));
client->send(make_message(MessageType::PING));
client->send(MessageType::PING);
}

tsd::core::logStatus("[Client] Waiting for 3 seconds...");
Expand All @@ -106,7 +106,7 @@ int main()
// Shutdown //

tsd::core::logStatus("[Client] Sending SHUTDOWN");
client->send(make_message(MessageType::SERVER_SHUTDOWN)).get();
client->send(MessageType::SERVER_SHUTDOWN).get();
client->disconnect();

// Store fine frame //
Expand Down
53 changes: 29 additions & 24 deletions tsd/apps/interactive/demos/network/server/RenderServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,24 +41,25 @@ void RenderServer::run(short port)

tsd::core::logStatus("[Server] Listening on port %i...", int(port));

while (m_mode != ServerMode::SHUTDOWN) {
if (!m_server->isConnected() || m_mode == ServerMode::DISCONNECTED) {
while (m_nextMode != ServerMode::SHUTDOWN) {
bool wasRendering = m_currentMode == ServerMode::RENDERING;

m_currentMode =
m_server->isConnected() ? m_nextMode : ServerMode::DISCONNECTED;

if (m_currentMode == ServerMode::DISCONNECTED) {
if (m_previousMode != ServerMode::DISCONNECTED) {
tsd::core::logStatus("[Server] Listening on port %i...", int(port));
if (m_lastSentFrame.valid())
m_lastSentFrame.get();
m_mode = ServerMode::DISCONNECTED;
m_server->restart();
}
m_wasRenderingBeforeSendScene = false;
std::this_thread::sleep_for(std::chrono::seconds(1));
} else if (m_mode == ServerMode::RENDERING) {
} else if (m_currentMode == ServerMode::RENDERING) {
tsd::core::logDebug("[Server] Rendering frame...");
update_FrameConfig();
update_View();
m_renderPipeline.render();
send_FrameBuffer();
m_wasRenderingBeforeSendScene = true;
} else if (m_mode == ServerMode::SEND_SCENE) {
} else if (m_currentMode == ServerMode::SEND_SCENE) {
tsd::core::logStatus("[Server] Serializing + sending scene...");

tsd::core::Timer timer;
Expand All @@ -69,18 +70,14 @@ void RenderServer::run(short port)
timer.end();
tsd::core::logStatus("[Server] ...done! (%.3f s)", timer.seconds());

m_mode = m_wasRenderingBeforeSendScene ? ServerMode::RENDERING
: ServerMode::PAUSED;
set_Mode(wasRendering ? ServerMode::RENDERING : ServerMode::PAUSED);
} else {
if (m_previousMode != ServerMode::PAUSED)
tsd::core::logStatus("[Server] Rendering paused...");
m_wasRenderingBeforeSendScene = false;
if (m_lastSentFrame.valid())
m_lastSentFrame.get();
std::this_thread::sleep_for(std::chrono::seconds(1));
}

m_previousMode = m_mode;
m_previousMode = m_currentMode;
}

tsd::core::logStatus("[Server] Shutting down...");
Expand Down Expand Up @@ -191,6 +188,12 @@ void RenderServer::setup_Messaging()
tsd::core::logStatus("[Server] Received PING from client");
});

m_server->registerHandler(
MessageType::DISCONNECT, [&](const tsd::network::Message &msg) {
tsd::core::logStatus("[Server] Client signaled disconnection.");
set_Mode(ServerMode::DISCONNECTED);
});

m_server->registerHandler(MessageType::SERVER_START_RENDERING,
[&](const tsd::network::Message &msg) {
tsd::core::logStatus(
Expand Down Expand Up @@ -298,21 +301,21 @@ void RenderServer::setup_Messaging()
m_server->registerHandler(MessageType::SERVER_REQUEST_FRAME_CONFIG,
[s = m_server, session = &m_session](const tsd::network::Message &msg) {
tsd::core::logDebug("[Server] Client requested frame config.");
s->send(make_message(
MessageType::CLIENT_RECEIVE_FRAME_CONFIG, &session->frame.config));
s->send(
MessageType::CLIENT_RECEIVE_FRAME_CONFIG, &session->frame.config);
});

m_server->registerHandler(MessageType::SERVER_REQUEST_VIEW,
[s = m_server, session = &m_session](const tsd::network::Message &msg) {
tsd::core::logDebug("[Server] Client requested view.");
s->send(make_message(MessageType::CLIENT_RECEIVE_VIEW, &session->view));
s->send(MessageType::CLIENT_RECEIVE_VIEW, &session->view);
});

m_server->registerHandler(MessageType::SERVER_REQUEST_SCENE,
[this](const tsd::network::Message &msg) {
tsd::core::logDebug("[Server] Client requested scene...");
// Notify client a big message is coming...
m_server->send(make_message(MessageType::CLIENT_SCENE_TRANSFER_BEGIN));
m_server->send(MessageType::CLIENT_SCENE_TRANSFER_BEGIN);
set_Mode(ServerMode::SEND_SCENE);
});
}
Expand Down Expand Up @@ -357,16 +360,18 @@ void RenderServer::send_FrameBuffer()
return;
}

m_lastSentFrame = m_server->send(
tsd::network::make_message(MessageType::CLIENT_RECEIVE_FRAME_BUFFER_COLOR,
m_session.frame.buffers.color));
m_lastSentFrame =
m_server->send(MessageType::CLIENT_RECEIVE_FRAME_BUFFER_COLOR,
m_session.frame.buffers.color);
}

void RenderServer::set_Mode(ServerMode mode)
{
if (m_mode == ServerMode::SHUTDOWN) // if shutting down, do not change mode
const bool shuttingDown = m_nextMode == ServerMode::SHUTDOWN
|| m_currentMode == ServerMode::SHUTDOWN;
if (shuttingDown) // if shutting down, do not change mode
return;
m_mode = mode;
m_nextMode = mode;
}

} // namespace tsd::network
4 changes: 2 additions & 2 deletions tsd/apps/interactive/demos/network/server/RenderServer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ struct RenderServer
tsd::rendering::Manipulator m_manipulator;
tsd::rendering::RenderIndex *m_renderIndex{nullptr};
tsd::rendering::RenderPipeline m_renderPipeline;
ServerMode m_mode{ServerMode::DISCONNECTED};
ServerMode m_currentMode{ServerMode::DISCONNECTED};
ServerMode m_nextMode{ServerMode::DISCONNECTED};
ServerMode m_previousMode{ServerMode::DISCONNECTED};
bool m_wasRenderingBeforeSendScene{false};

struct SessionVersions
{
Expand Down
39 changes: 0 additions & 39 deletions tsd/src/tsd/network/Message.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,6 @@ bool payloadRead(
const Message &msg, uint32_t &offset, T *data, uint32_t length = 1);
bool payloadRead(const Message &msg, uint32_t &offset, std::string &str);

// make_message() //

Message make_message(uint8_t type);
Message make_message(uint8_t type, const std::string &data);
template <typename T>
Message make_message(uint8_t type, const T *data, uint32_t count = 1);
template <typename T>
Message make_message(uint8_t type, const std::vector<T> &data);

///////////////////////////////////////////////////////////////////////////////
// Inlined definitions ////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -179,34 +170,4 @@ inline bool payloadRead(const Message &msg, uint32_t &offset, std::string &str)
return true;
}

inline Message make_message(uint8_t type)
{
Message msg;
msg.header.type = type;
return msg;
}

inline Message make_message(uint8_t type, const std::string &data)
{
Message msg = make_message(type);
payloadWrite(msg, data);
return msg;
}

template <typename T>
inline Message make_message(uint8_t type, const T *data, uint32_t count)
{
Message msg = make_message(type);
payloadWrite(msg, data, count);
return msg;
}

template <typename T>
inline Message make_message(uint8_t type, const std::vector<T> &data)
{
static_assert(std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>,
"Message payload must be a POD type");
return make_message(type, data.data(), static_cast<uint32_t>(data.size()));
}

} // namespace tsd::network
Loading