Fixes to world scale up over network

This commit is contained in:
Yousef Khadadeh 2026-05-30 20:57:50 +03:00
parent 015e9bc5df
commit 48823ebad6
4 changed files with 32 additions and 16 deletions

View file

@ -80,10 +80,16 @@ void ClientData::register_class(World& world) {
break;
}
case ClientDataCommand::SET_GRID_SIZE: {
uint32_t oldGridSize = o->gridSize;
a(o->gridSize);
if(oldGridSize < o->gridSize)
world.scale_up(get_canvas_scale_up_amount(o->gridSize, oldGridSize));
if(o != world.ownClientData) {
if(world.ownClientData->gridSize < o->gridSize) {
world.scale_up(get_canvas_scale_up_amount(o->gridSize, world.ownClientData->gridSize));
world.ownClientData->gridSize = o->gridSize;
world.ownClientData.send_update_to_all(RELIABLE_COMMAND_CHANNEL, [](const NetObjTemporaryPtr<ClientData>& o, cereal::PortableBinaryOutputArchive & a) {
a(ClientDataCommand::SET_GRID_SIZE, o->gridSize);
});
}
}
break;
}
}
@ -122,10 +128,14 @@ void ClientData::register_class(World& world) {
break;
}
case ClientDataCommand::SET_GRID_SIZE: {
uint32_t oldGridSize = o->gridSize;
a(o->gridSize);
if(oldGridSize < o->gridSize)
world.scale_up(get_canvas_scale_up_amount(o->gridSize, oldGridSize));
if(world.ownClientData->gridSize < o->gridSize) {
world.scale_up(get_canvas_scale_up_amount(o->gridSize, world.ownClientData->gridSize));
world.ownClientData->gridSize = o->gridSize;
world.ownClientData.send_update_to_all(RELIABLE_COMMAND_CHANNEL, [](const NetObjTemporaryPtr<ClientData>& o, cereal::PortableBinaryOutputArchive & a) {
a(ClientDataCommand::SET_GRID_SIZE, o->gridSize);
});
}
o.send_server_update_to_all_clients(RELIABLE_COMMAND_CHANNEL, [](const NetObjTemporaryPtr<ClientData>& o, cereal::PortableBinaryOutputArchive & a) {
a(ClientDataCommand::SET_GRID_SIZE, o->gridSize);
});

View file

@ -26,9 +26,13 @@
WorldScalar get_canvas_scale_up_amount(uint32_t newGridSize, uint32_t oldGridSize);
template <typename T> void canvas_scale_up_check(T& obj, World& world, const std::shared_ptr<NetServer::ClientData>& c) {
if(c) {
if(c) { // Server, compare server's grid size with client's (c) grid size
auto clientData = world.netObjMan.get_obj_temporary_ref_from_id<ClientData>(NetworkingObjects::NetObjID(c->customID));
if(clientData->get_grid_size() < world.ownClientData->get_grid_size())
obj.scale_up(get_canvas_scale_up_amount(world.ownClientData->get_grid_size(), clientData->get_grid_size()));
}
else { // Client, compare own grid size (world.ownClientData) with server's grid size
if(world.serverClientData->get_grid_size() < world.ownClientData->get_grid_size())
obj.scale_up(get_canvas_scale_up_amount(world.ownClientData->get_grid_size(), world.serverClientData->get_grid_size()));
}
}

View file

@ -98,7 +98,7 @@ World::World(MainProgram& initMain, const CustomEvents::OpenInfiniPaintFileEvent
void World::init_client_data_list() {
clients = netObjMan.make_obj<NetworkingObjects::NetObjUnorderedSet<ClientData>>();
ownClientData = clients->emplace_direct(clients, ClientData::InitStruct{
serverClientData = ownClientData = clients->emplace_direct(clients, ClientData::InitStruct{
.cursorColor = get_random_cursor_color(),
.displayName = main.conf.displayName
});
@ -156,16 +156,17 @@ void World::init_client(const std::string& serverFullID) {
drawProg.init_client_callbacks();
netClient->add_recv_callback(CLIENT_INITIAL_DATA, [&](cereal::PortableBinaryInputArchive& message) {
std::string fileDisplayName;
NetworkingObjects::NetObjID clientDataObjID;
message(fileDisplayName, clientDataObjID);
NetworkingObjects::NetObjID clientDataObjID, serverDataObjID;
message(fileDisplayName, clientDataObjID, serverDataObjID);
set_name(fileDisplayName);
clients = netObjMan.read_create_message<NetworkingObjects::NetObjUnorderedSet<ClientData>>(message, nullptr);
ownClientData = netObjMan.get_obj_temporary_ref_from_id<ClientData>(clientDataObjID);
serverClientData = netObjMan.get_obj_temporary_ref_from_id<ClientData>(serverDataObjID);
bMan.read_create_message(message);
gridMan.read_create_message(message);
drawProg.read_components_client(message);
canvasTheme.read_create_message(message);
clients = netObjMan.read_create_message<NetworkingObjects::NetObjUnorderedSet<ClientData>>(message, nullptr);
init_client_data_list_callbacks();
ownClientData = netObjMan.get_obj_temporary_ref_from_id<ClientData>(clientDataObjID);
drawData.cam.smooth_move_to(*main.world, ownClientData->get_cam_coords(), ownClientData->get_window_size(), true);
#ifdef ENABLE_ORDERED_LIST_TEST
@ -435,12 +436,12 @@ void World::start_hosting(const std::string& initNetSource, const std::string& s
auto ss(std::make_shared<std::stringstream>());
{
cereal::PortableBinaryOutputArchive a(*ss);
a(CLIENT_INITIAL_DATA, name, clientDataObjPtr.get_net_id());
a(CLIENT_INITIAL_DATA, name, clientDataObjPtr.get_net_id(), serverClientData.get_net_id());
clients.write_create_message(a);
bMan.bookmarkListRoot.write_create_message(a);
gridMan.grids.write_create_message(a);
drawProg.write_components_server(a);
canvasTheme.write_create_message(a);
clients.write_create_message(a);
#ifdef ENABLE_ORDERED_LIST_TEST
listDebugTest.write_create_message(a);
#endif

View file

@ -93,13 +93,14 @@ class World {
std::filesystem::path filePath;
std::string name;
NetworkingObjects::NetObjTemporaryPtr<ClientData> serverClientData; // For server, this is equal to ownClientData
NetworkingObjects::NetObjTemporaryPtr<ClientData> ownClientData;
NetworkingObjects::NetObjOwnerPtr<NetworkingObjects::NetObjUnorderedSet<ClientData>> clients;
CanvasTheme canvasTheme;
void scale_up(const WorldScalar& scaleUpAmount);
void scale_up_step();
void scale_up(const WorldScalar& scaleUpAmount); // Should only be called from ClientData
void scale_up_step(); // Call when scale up step happens
bool should_ask_before_closing();
void set_has_unsaved_local_changes(bool newHasUnsavedLocalChangesVal);