Canvas theme moved to net objects
This commit is contained in:
parent
86858d238e
commit
0b67c9cc46
18 changed files with 164 additions and 112 deletions
|
|
@ -38,6 +38,7 @@ set(sources "src/main.cpp"
|
||||||
"src/ConnectionManager.cpp"
|
"src/ConnectionManager.cpp"
|
||||||
"src/InputManager.cpp"
|
"src/InputManager.cpp"
|
||||||
"src/UndoManager.cpp"
|
"src/UndoManager.cpp"
|
||||||
|
"src/CanvasTheme.cpp"
|
||||||
"src/DrawCamera.cpp"
|
"src/DrawCamera.cpp"
|
||||||
"src/DrawCollision.cpp"
|
"src/DrawCollision.cpp"
|
||||||
"src/CoordSpaceHelper.cpp"
|
"src/CoordSpaceHelper.cpp"
|
||||||
|
|
|
||||||
65
src/CanvasTheme.cpp
Normal file
65
src/CanvasTheme.cpp
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
#include "CanvasTheme.hpp"
|
||||||
|
#include "DrawingProgram/DrawingProgram.hpp"
|
||||||
|
#include <Helpers/HsvRgb.hpp>
|
||||||
|
#include "MainProgram.hpp"
|
||||||
|
#include "Helpers/Networking/NetLibrary.hpp"
|
||||||
|
#include "World.hpp"
|
||||||
|
|
||||||
|
using namespace NetworkingObjects;
|
||||||
|
|
||||||
|
CanvasTheme::CanvasTheme(World& w):
|
||||||
|
world(w)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void CanvasTheme::init() {
|
||||||
|
if(world.netObjMan.is_server()) {
|
||||||
|
backColor = world.netObjMan.make_obj_direct<BackColor>(world.main.defaultCanvasBackgroundColor);
|
||||||
|
set_tool_front_color(world.drawProg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SkColor4f CanvasTheme::get_back_color() const {
|
||||||
|
if(!backColor)
|
||||||
|
return SkColor4f{DEFAULT_CANVAS_BACKGROUND_COLOR.x(), DEFAULT_CANVAS_BACKGROUND_COLOR.y(), DEFAULT_CANVAS_BACKGROUND_COLOR.z(), 1.0f};
|
||||||
|
else
|
||||||
|
return SkColor4f{backColor->c.x(), backColor->c.y(), backColor->c.z(), 1.0f};
|
||||||
|
}
|
||||||
|
|
||||||
|
const SkColor4f& CanvasTheme::get_tool_front_color() const {
|
||||||
|
return toolFrontColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CanvasTheme::set_back_color(const Vector3f& newBackColor) {
|
||||||
|
if(backColor && newBackColor != backColor->c) {
|
||||||
|
backColor->c = newBackColor;
|
||||||
|
world.delayedUpdateObjectManager.send_update_to_all<BackColor>(backColor, true);
|
||||||
|
set_tool_front_color(world.drawProg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CanvasTheme::set_tool_front_color(DrawingProgram& drawP) {
|
||||||
|
Vector3f newHSV = rgb_to_hsv<Vector3f>(backColor->c);
|
||||||
|
SkColor4f oldToolFrontColor = toolFrontColor;
|
||||||
|
if(newHSV.z() >= 0.6f)
|
||||||
|
toolFrontColor = SkColor4f{0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
else
|
||||||
|
toolFrontColor = SkColor4f{1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
if(oldToolFrontColor != toolFrontColor)
|
||||||
|
drawP.clear_draw_cache();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CanvasTheme::register_class() {
|
||||||
|
world.delayedUpdateObjectManager.register_class<BackColor>(world.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors<BackColor>{
|
||||||
|
.postUpdateFunc = [&](BackColor& o) {
|
||||||
|
set_tool_front_color(world.drawProg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void CanvasTheme::read_create_message(cereal::PortableBinaryInputArchive& a) {
|
||||||
|
backColor = world.netObjMan.read_create_message<BackColor>(a, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CanvasTheme::write_create_message(cereal::PortableBinaryOutputArchive& a) const {
|
||||||
|
backColor.write_create_message(a);
|
||||||
|
}
|
||||||
32
src/CanvasTheme.hpp
Normal file
32
src/CanvasTheme.hpp
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
#pragma once
|
||||||
|
#include "cereal/archives/portable_binary.hpp"
|
||||||
|
#include <include/core/SkColor.h>
|
||||||
|
#include <Helpers/ConvertVec.hpp>
|
||||||
|
#include <Helpers/NetworkingObjects/NetObjOwnerPtr.hpp>
|
||||||
|
#include <Helpers/Serializers.hpp>
|
||||||
|
|
||||||
|
class DrawingProgram;
|
||||||
|
class World;
|
||||||
|
|
||||||
|
class CanvasTheme {
|
||||||
|
public:
|
||||||
|
CanvasTheme(World& w);
|
||||||
|
void init();
|
||||||
|
SkColor4f get_back_color() const;
|
||||||
|
const SkColor4f& get_tool_front_color() const;
|
||||||
|
void set_back_color(const Vector3f& newBackColor);
|
||||||
|
void register_class();
|
||||||
|
void read_create_message(cereal::PortableBinaryInputArchive& a);
|
||||||
|
void write_create_message(cereal::PortableBinaryOutputArchive& a) const;
|
||||||
|
private:
|
||||||
|
void set_tool_front_color(DrawingProgram& drawP);
|
||||||
|
struct BackColor {
|
||||||
|
Vector3f c;
|
||||||
|
template <typename Archive> void serialize(Archive& a) {
|
||||||
|
a(c);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
NetworkingObjects::NetObjOwnerPtr<BackColor> backColor;
|
||||||
|
SkColor4f toolFrontColor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
World& world;
|
||||||
|
};
|
||||||
|
|
@ -183,7 +183,7 @@ bool BrushTool::prevent_undo_or_redo() {
|
||||||
void BrushTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
void BrushTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
||||||
if(!drawData.main->toolbar.io->hoverObstructed) {
|
if(!drawData.main->toolbar.io->hoverObstructed) {
|
||||||
SkPaint linePaint;
|
SkPaint linePaint;
|
||||||
linePaint.setColor4f(drawP.world.canvasTheme.toolFrontColor);
|
linePaint.setColor4f(drawP.world.canvasTheme.get_tool_front_color());
|
||||||
linePaint.setStroke(true);
|
linePaint.setStroke(true);
|
||||||
linePaint.setStrokeWidth(0.0f);
|
linePaint.setStrokeWidth(0.0f);
|
||||||
float width;
|
float width;
|
||||||
|
|
|
||||||
|
|
@ -385,7 +385,7 @@ SkPaint DrawingProgram::select_tool_line_paint() {
|
||||||
SkPaint selectLinePaint;
|
SkPaint selectLinePaint;
|
||||||
selectLinePaint.setStyle(SkPaint::kStroke_Style);
|
selectLinePaint.setStyle(SkPaint::kStroke_Style);
|
||||||
selectLinePaint.setStrokeWidth(3);
|
selectLinePaint.setStrokeWidth(3);
|
||||||
selectLinePaint.setColor4f(world.canvasTheme.toolFrontColor);
|
selectLinePaint.setColor4f(world.canvasTheme.get_tool_front_color());
|
||||||
selectLinePaint.setPathEffect(lassoLineDashEffect);
|
selectLinePaint.setPathEffect(lassoLineDashEffect);
|
||||||
|
|
||||||
return selectLinePaint;
|
return selectLinePaint;
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ bool EraserTool::prevent_undo_or_redo() {
|
||||||
|
|
||||||
void EraserTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
void EraserTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
||||||
if(!drawData.main->toolbar.io->hoverObstructed) {
|
if(!drawData.main->toolbar.io->hoverObstructed) {
|
||||||
SkColor4f c = drawP.world.canvasTheme.toolFrontColor;
|
SkColor4f c = drawP.world.canvasTheme.get_tool_front_color();
|
||||||
c.fA = 0.5f;
|
c.fA = 0.5f;
|
||||||
|
|
||||||
SkPaint linePaint;
|
SkPaint linePaint;
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,7 @@ void GridModifyTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
||||||
Vector2f bMin = drawP.world.drawData.cam.c.to_space(b.min);
|
Vector2f bMin = drawP.world.drawData.cam.c.to_space(b.min);
|
||||||
Vector2f bMax = drawP.world.drawData.cam.c.to_space(b.max);
|
Vector2f bMax = drawP.world.drawData.cam.c.to_space(b.max);
|
||||||
SkPaint rectBoundsPaint;
|
SkPaint rectBoundsPaint;
|
||||||
rectBoundsPaint.setColor4f(drawP.world.canvasTheme.toolFrontColor);
|
rectBoundsPaint.setColor4f(drawP.world.canvasTheme.get_tool_front_color());
|
||||||
rectBoundsPaint.setStroke(true);
|
rectBoundsPaint.setStroke(true);
|
||||||
rectBoundsPaint.setStrokeWidth(0.0f);
|
rectBoundsPaint.setStrokeWidth(0.0f);
|
||||||
canvas->drawRect(SkRect::MakeLTRB(bMin.x(), bMin.y(), bMax.x(), bMax.y()), rectBoundsPaint);
|
canvas->drawRect(SkRect::MakeLTRB(bMin.x(), bMin.y(), bMax.x(), bMax.y()), rectBoundsPaint);
|
||||||
|
|
|
||||||
|
|
@ -308,15 +308,15 @@ class GUIManager {
|
||||||
bool clicked;
|
bool clicked;
|
||||||
CLAY_AUTO_ID({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(BIG_BUTTON_SIZE), .height = CLAY_SIZING_FIXED(BIG_BUTTON_SIZE) } } }) {
|
CLAY_AUTO_ID({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(BIG_BUTTON_SIZE), .height = CLAY_SIZING_FIXED(BIG_BUTTON_SIZE) } } }) {
|
||||||
clicked = color_button("0", val, isOpen, elemUpdate);
|
clicked = color_button("0", val, isOpen, elemUpdate);
|
||||||
}
|
if(clicked)
|
||||||
if(clicked)
|
isOpen = true;
|
||||||
isOpen = true;
|
if(isOpen) {
|
||||||
if(isOpen) {
|
top_to_bottom_window_popup_layout(CLAY_SIZING_FIT(300), CLAY_SIZING_FIT(0), [&]() {
|
||||||
top_to_bottom_window_popup_layout(CLAY_SIZING_FIT(300), CLAY_SIZING_FIT(0), [&]() {
|
isUpdating = color_picker_items("c", val, selectAlpha);
|
||||||
isUpdating = color_picker_items("c", val, selectAlpha);
|
if(io->mouse.leftClick && !Clay_Hovered() && !clicked)
|
||||||
if(io->mouse.leftClick && !Clay_Hovered() && !clicked)
|
isOpen = false;
|
||||||
isOpen = false;
|
});
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
pop_id();
|
pop_id();
|
||||||
return isUpdating;
|
return isUpdating;
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ void GridManager::add_default_grid(const std::string& newName) {
|
||||||
if(grids) {
|
if(grids) {
|
||||||
WorldGrid g;
|
WorldGrid g;
|
||||||
g.name = newName;
|
g.name = newName;
|
||||||
g.color = color_mul_alpha(convert_vec4<Vector4f>(world.canvasTheme.toolFrontColor), 0.4f);
|
g.color = color_mul_alpha(convert_vec4<Vector4f>(world.canvasTheme.get_tool_front_color()), 0.4f);
|
||||||
g.size = world.drawData.cam.c.inverseScale * WorldScalar(WorldGrid::GRID_UNIT_PIXEL_SIZE);
|
g.size = world.drawData.cam.c.inverseScale * WorldScalar(WorldGrid::GRID_UNIT_PIXEL_SIZE);
|
||||||
g.offset = world.drawData.cam.c.pos + world.drawData.cam.c.dir_from_space(world.main.window.size.cast<float>() * 0.5f);
|
g.offset = world.drawData.cam.c.pos + world.drawData.cam.c.dir_from_space(world.main.window.size.cast<float>() * 0.5f);
|
||||||
grids->emplace_back_direct(grids, g);
|
grids->emplace_back_direct(grids, g);
|
||||||
|
|
|
||||||
|
|
@ -282,7 +282,7 @@ float MainProgram::get_scale_and_density_factor_gui() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainProgram::draw(SkCanvas* canvas) {
|
void MainProgram::draw(SkCanvas* canvas) {
|
||||||
canvas->clear(transparentBackground ? SkColor4f{0.0f, 0.0f, 0.0f, 0.0f} : world->canvasTheme.backColor);
|
canvas->clear(transparentBackground ? SkColor4f{0.0f, 0.0f, 0.0f, 0.0f} : world->canvasTheme.get_back_color());
|
||||||
world->draw(canvas);
|
world->draw(canvas);
|
||||||
toolbar.draw(canvas);
|
toolbar.draw(canvas);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ void FileResourceDisplay::draw(SkCanvas* canvas, const DrawData& drawData, const
|
||||||
svgDom = findSVGData->second;
|
svgDom = findSVGData->second;
|
||||||
|
|
||||||
SkPaint blendingPaint;
|
SkPaint blendingPaint;
|
||||||
blendingPaint.setColorFilter(SkColorFilters::Blend(drawData.main->world->canvasTheme.toolFrontColor, SkColorSpace::MakeSRGB(), SkBlendMode::kSrcIn));
|
blendingPaint.setColorFilter(SkColorFilters::Blend(drawData.main->world->canvasTheme.get_tool_front_color(), SkColorSpace::MakeSRGB(), SkBlendMode::kSrcIn));
|
||||||
canvas->saveLayer(imRect, &blendingPaint);
|
canvas->saveLayer(imRect, &blendingPaint);
|
||||||
canvas->translate(imRect.x(), imRect.y());
|
canvas->translate(imRect.x(), imRect.y());
|
||||||
canvas->scale(imRect.width() / svgDom->containerSize().width(), imRect.height() / svgDom->containerSize().height());
|
canvas->scale(imRect.width() / svgDom->containerSize().width(), imRect.height() / svgDom->containerSize().height());
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,9 @@ enum ServerCommands : MessageCommandType {
|
||||||
SERVER_UPDATE_NETWORK_OBJECT,
|
SERVER_UPDATE_NETWORK_OBJECT,
|
||||||
SERVER_MOVE_CAMERA,
|
SERVER_MOVE_CAMERA,
|
||||||
SERVER_MOVE_SCREEN_MOUSE,
|
SERVER_MOVE_SCREEN_MOUSE,
|
||||||
SERVER_PLACE_SINGLE_COMPONENT,
|
|
||||||
SERVER_PLACE_MANY_COMPONENTS,
|
|
||||||
SERVER_TRANSFORM_MANY_COMPONENTS,
|
|
||||||
SERVER_NEW_RESOURCE_ID,
|
SERVER_NEW_RESOURCE_ID,
|
||||||
SERVER_NEW_RESOURCE_DATA,
|
SERVER_NEW_RESOURCE_DATA,
|
||||||
SERVER_CHAT_MESSAGE,
|
SERVER_CHAT_MESSAGE
|
||||||
SERVER_CANVAS_COLOR,
|
|
||||||
SERVER_CANVAS_SCALE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ClientCommands : MessageCommandType {
|
enum ClientCommands : MessageCommandType {
|
||||||
|
|
@ -26,14 +21,11 @@ enum ClientCommands : MessageCommandType {
|
||||||
CLIENT_UPDATE_NETWORK_OBJECT,
|
CLIENT_UPDATE_NETWORK_OBJECT,
|
||||||
CLIENT_USER_CONNECT,
|
CLIENT_USER_CONNECT,
|
||||||
CLIENT_USER_DISCONNECT,
|
CLIENT_USER_DISCONNECT,
|
||||||
CLIENT_TRANSFORM_MANY_COMPONENTS,
|
|
||||||
CLIENT_MOVE_CAMERA,
|
CLIENT_MOVE_CAMERA,
|
||||||
CLIENT_MOVE_SCREEN_MOUSE,
|
CLIENT_MOVE_SCREEN_MOUSE,
|
||||||
CLIENT_NEW_RESOURCE_ID,
|
CLIENT_NEW_RESOURCE_ID,
|
||||||
CLIENT_NEW_RESOURCE_DATA,
|
CLIENT_NEW_RESOURCE_DATA,
|
||||||
CLIENT_CHAT_MESSAGE,
|
CLIENT_CHAT_MESSAGE
|
||||||
CLIENT_CANVAS_COLOR,
|
|
||||||
CLIENT_CANVAS_SCALE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Arbitrary value. Higher scale up values lead to less scale up events (which can cause stuttering), but leads to larger numbers overall, which can cause a tiny bit of lag and increased memory usage
|
// Arbitrary value. Higher scale up values lead to less scale up events (which can cause stuttering), but leads to larger numbers overall, which can cause a tiny bit of lag and increased memory usage
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ MainServer::MainServer(World& initWorld, const std::string& serverLocalID):
|
||||||
world(initWorld)
|
world(initWorld)
|
||||||
{
|
{
|
||||||
data.canvasScale = world.canvasScale;
|
data.canvasScale = world.canvasScale;
|
||||||
data.canvasBackColor = convert_vec3<Vector3f>(world.canvasTheme.backColor);
|
|
||||||
|
|
||||||
lastKeepAliveSent = std::chrono::steady_clock::now();
|
lastKeepAliveSent = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
|
@ -66,6 +65,7 @@ MainServer::MainServer(World& initWorld, const std::string& serverLocalID):
|
||||||
world.bMan.bookmarks.write_create_message(a);
|
world.bMan.bookmarks.write_create_message(a);
|
||||||
world.gridMan.grids.write_create_message(a);
|
world.gridMan.grids.write_create_message(a);
|
||||||
world.drawProg.write_components_server(a);
|
world.drawProg.write_components_server(a);
|
||||||
|
world.canvasTheme.write_create_message(a);
|
||||||
}
|
}
|
||||||
netServer->send_string_stream_to_client(client, RELIABLE_COMMAND_CHANNEL, ss);
|
netServer->send_string_stream_to_client(client, RELIABLE_COMMAND_CHANNEL, ss);
|
||||||
for(auto& r : world.rMan.resource_list()) {
|
for(auto& r : world.rMan.resource_list()) {
|
||||||
|
|
@ -88,24 +88,6 @@ MainServer::MainServer(World& initWorld, const std::string& serverLocalID):
|
||||||
message(c.cursorPos);
|
message(c.cursorPos);
|
||||||
netServer->send_items_to_all_clients_except(client, UNRELIABLE_COMMAND_CHANNEL, CLIENT_MOVE_SCREEN_MOUSE, c.serverID, c.cursorPos);
|
netServer->send_items_to_all_clients_except(client, UNRELIABLE_COMMAND_CHANNEL, CLIENT_MOVE_SCREEN_MOUSE, c.serverID, c.cursorPos);
|
||||||
});
|
});
|
||||||
netServer->add_recv_callback(SERVER_CHAT_MESSAGE, [&](std::shared_ptr<NetServer::ClientData> client, cereal::PortableBinaryInputArchive& message) {
|
|
||||||
std::string chatMessage;
|
|
||||||
message(chatMessage);
|
|
||||||
netServer->send_items_to_all_clients_except(client, RELIABLE_COMMAND_CHANNEL, CLIENT_CHAT_MESSAGE, client->customID, chatMessage);
|
|
||||||
});
|
|
||||||
netServer->add_recv_callback(SERVER_CANVAS_COLOR, [&](std::shared_ptr<NetServer::ClientData> client, cereal::PortableBinaryInputArchive& message) {
|
|
||||||
message(data.canvasBackColor);
|
|
||||||
netServer->send_items_to_all_clients(RELIABLE_COMMAND_CHANNEL, CLIENT_CANVAS_COLOR, data.canvasBackColor);
|
|
||||||
});
|
|
||||||
netServer->add_recv_callback(SERVER_CANVAS_SCALE, [&](std::shared_ptr<NetServer::ClientData> client, cereal::PortableBinaryInputArchive& message) {
|
|
||||||
auto& c = clients[client->customID];
|
|
||||||
message(c.canvasScale);
|
|
||||||
if(c.canvasScale > data.canvasScale) {
|
|
||||||
data.scale_up(FixedPoint::pow_int(CANVAS_SCALE_UP_STEP, c.canvasScale - data.canvasScale));
|
|
||||||
data.canvasScale = c.canvasScale;
|
|
||||||
netServer->send_items_to_all_clients(RELIABLE_COMMAND_CHANNEL, CLIENT_CANVAS_SCALE, data.canvasScale);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
netServer->add_recv_callback(SERVER_KEEP_ALIVE, [&](std::shared_ptr<NetServer::ClientData> client, cereal::PortableBinaryInputArchive& message) {
|
netServer->add_recv_callback(SERVER_KEEP_ALIVE, [&](std::shared_ptr<NetServer::ClientData> client, cereal::PortableBinaryInputArchive& message) {
|
||||||
});
|
});
|
||||||
netServer->add_disconnect_callback([&](std::shared_ptr<NetServer::ClientData> client) {
|
netServer->add_disconnect_callback([&](std::shared_ptr<NetServer::ClientData> client) {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
#include "ServerData.hpp"
|
#include "ServerData.hpp"
|
||||||
|
|
||||||
void ServerData::save(cereal::PortableBinaryOutputArchive& a) const {
|
void ServerData::save(cereal::PortableBinaryOutputArchive& a) const {
|
||||||
a(canvasBackColor, canvasScale);
|
a(canvasScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerData::load(cereal::PortableBinaryInputArchive& a) {
|
void ServerData::load(cereal::PortableBinaryInputArchive& a) {
|
||||||
a(canvasBackColor, canvasScale);
|
a(canvasScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerData::scale_up(const WorldScalar& scaleUpAmount) {
|
void ServerData::scale_up(const WorldScalar& scaleUpAmount) {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ class DrawComponent;
|
||||||
class ServerData {
|
class ServerData {
|
||||||
public:
|
public:
|
||||||
uint64_t canvasScale = 0;
|
uint64_t canvasScale = 0;
|
||||||
Vector3f canvasBackColor;
|
|
||||||
|
|
||||||
void save(cereal::PortableBinaryOutputArchive& a) const;
|
void save(cereal::PortableBinaryOutputArchive& a) const;
|
||||||
void load(cereal::PortableBinaryInputArchive& a);
|
void load(cereal::PortableBinaryInputArchive& a);
|
||||||
|
|
|
||||||
|
|
@ -1691,9 +1691,9 @@ void Toolbar::options_menu() {
|
||||||
}) {
|
}) {
|
||||||
gui.push_id("canvas settings menu");
|
gui.push_id("canvas settings menu");
|
||||||
gui.obstructing_window();
|
gui.obstructing_window();
|
||||||
SkColor4f newColorToSet = main.world->canvasTheme.backColor;
|
SkColor4f newColorToSet = main.world->canvasTheme.get_back_color();
|
||||||
gui.color_picker_button_field("canvasColor", "Canvas Color", &newColorToSet, false);
|
gui.color_picker_button_field("canvasColor", "Canvas Color", &newColorToSet, false);
|
||||||
main.world->set_canvas_background_color(convert_vec3<Vector3f>(newColorToSet));
|
main.world->canvasTheme.set_back_color(convert_vec3<Vector3f>(newColorToSet));
|
||||||
if(gui.text_button_wide("done", "Done"))
|
if(gui.text_button_wide("done", "Done"))
|
||||||
optionsMenuOpen = false;
|
optionsMenuOpen = false;
|
||||||
gui.pop_id();
|
gui.pop_id();
|
||||||
|
|
|
||||||
|
|
@ -38,14 +38,15 @@ World::World(MainProgram& initMain, OpenWorldInfo& worldInfo):
|
||||||
rMan(*this),
|
rMan(*this),
|
||||||
drawProg(*this),
|
drawProg(*this),
|
||||||
bMan(*this),
|
bMan(*this),
|
||||||
gridMan(*this)
|
gridMan(*this),
|
||||||
|
canvasTheme(*this)
|
||||||
{
|
{
|
||||||
init_net_obj_type_list();
|
init_net_obj_type_list();
|
||||||
gridMan.init();
|
gridMan.init();
|
||||||
bMan.init();
|
bMan.init();
|
||||||
drawProg.init();
|
drawProg.init();
|
||||||
|
canvasTheme.init();
|
||||||
|
|
||||||
set_canvas_background_color(main.defaultCanvasBackgroundColor);
|
|
||||||
displayName = main.displayName;
|
displayName = main.displayName;
|
||||||
|
|
||||||
netSource = worldInfo.netSource;
|
netSource = worldInfo.netSource;
|
||||||
|
|
@ -88,6 +89,16 @@ void World::init_net_obj_type_list() {
|
||||||
CanvasComponentAllocator::register_class(*this, netObjMan);
|
CanvasComponentAllocator::register_class(*this, netObjMan);
|
||||||
CanvasComponentContainer::register_class(netObjMan);
|
CanvasComponentContainer::register_class(netObjMan);
|
||||||
NetworkingObjects::register_ordered_list_class<CanvasComponentContainer>(netObjMan);
|
NetworkingObjects::register_ordered_list_class<CanvasComponentContainer>(netObjMan);
|
||||||
|
canvasTheme.register_class();
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::init_server_callbacks() {
|
||||||
|
con.localServer->netServer->add_recv_callback(SERVER_CHAT_MESSAGE, [&](std::shared_ptr<NetServer::ClientData> client, cereal::PortableBinaryInputArchive& message) {
|
||||||
|
std::string chatMessage;
|
||||||
|
message(chatMessage);
|
||||||
|
add_chat_message(clients[client->customID].displayName, chatMessage, Toolbar::ChatMessage::Type::NORMAL);
|
||||||
|
con.localServer->netServer->send_items_to_all_clients_except(client, RELIABLE_COMMAND_CHANNEL, CLIENT_CHAT_MESSAGE, client->customID, chatMessage);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::init_client_callbacks() {
|
void World::init_client_callbacks() {
|
||||||
|
|
@ -105,13 +116,11 @@ void World::init_client_callbacks() {
|
||||||
message(clients);
|
message(clients);
|
||||||
set_name(fileDisplayName);
|
set_name(fileDisplayName);
|
||||||
drawData.cam.smooth_move_to(*main.world, camCoordsToMoveTo, windowSizeToMoveTo, true);
|
drawData.cam.smooth_move_to(*main.world, camCoordsToMoveTo, windowSizeToMoveTo, true);
|
||||||
Vector3f newBackColor;
|
|
||||||
message(newBackColor);
|
|
||||||
set_canvas_background_color(newBackColor, false);
|
|
||||||
message(canvasScale);
|
message(canvasScale);
|
||||||
bMan.bookmarks = netObjMan.read_create_message<NetworkingObjects::NetObjOrderedList<Bookmark>>(message, nullptr);
|
bMan.bookmarks = netObjMan.read_create_message<NetworkingObjects::NetObjOrderedList<Bookmark>>(message, nullptr);
|
||||||
gridMan.grids = netObjMan.read_create_message<NetworkingObjects::NetObjOrderedList<WorldGrid>>(message, nullptr);
|
gridMan.grids = netObjMan.read_create_message<NetworkingObjects::NetObjOrderedList<WorldGrid>>(message, nullptr);
|
||||||
drawProg.read_components_client(message);
|
drawProg.read_components_client(message);
|
||||||
|
canvasTheme.read_create_message(message);
|
||||||
}
|
}
|
||||||
clientStillConnecting = false;
|
clientStillConnecting = false;
|
||||||
});
|
});
|
||||||
|
|
@ -150,25 +159,13 @@ void World::init_client_callbacks() {
|
||||||
message(c.cursorPos);
|
message(c.cursorPos);
|
||||||
});
|
});
|
||||||
con.client_add_recv_callback(CLIENT_CHAT_MESSAGE, [&](cereal::PortableBinaryInputArchive& message) {
|
con.client_add_recv_callback(CLIENT_CHAT_MESSAGE, [&](cereal::PortableBinaryInputArchive& message) {
|
||||||
ServerPortionID senderID;
|
if(!con.host_exists() && !clientStillConnecting) { // Dont update a direct connected client (which is just the server), and dont process these until the CLIENT_INITIAL_DATA message is received first
|
||||||
std::string chatMessage;
|
ServerPortionID senderID;
|
||||||
message(senderID, chatMessage);
|
std::string chatMessage;
|
||||||
auto it = clients.find(senderID);
|
message(senderID, chatMessage);
|
||||||
if(it != clients.end())
|
auto it = clients.find(senderID);
|
||||||
add_chat_message(clients[senderID].displayName, chatMessage, Toolbar::ChatMessage::Type::NORMAL);
|
if(it != clients.end())
|
||||||
});
|
add_chat_message(clients[senderID].displayName, chatMessage, Toolbar::ChatMessage::Type::NORMAL);
|
||||||
con.client_add_recv_callback(CLIENT_CANVAS_COLOR, [&](cereal::PortableBinaryInputArchive& message) {
|
|
||||||
Vector3f newBackColor;
|
|
||||||
message(newBackColor);
|
|
||||||
set_canvas_background_color(newBackColor, false);
|
|
||||||
});
|
|
||||||
con.client_add_recv_callback(CLIENT_CANVAS_SCALE, [&](cereal::PortableBinaryInputArchive& message) {
|
|
||||||
uint64_t newCanvasScale;
|
|
||||||
message(newCanvasScale);
|
|
||||||
if(newCanvasScale > canvasScale) {
|
|
||||||
con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_CANVAS_SCALE, newCanvasScale);
|
|
||||||
scale_up(FixedPoint::pow_int(CANVAS_SCALE_UP_STEP, newCanvasScale - canvasScale));
|
|
||||||
canvasScale = newCanvasScale;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
con.client_add_recv_callback(CLIENT_KEEP_ALIVE, [&](cereal::PortableBinaryInputArchive& message) {
|
con.client_add_recv_callback(CLIENT_KEEP_ALIVE, [&](cereal::PortableBinaryInputArchive& message) {
|
||||||
|
|
@ -242,25 +239,12 @@ void World::unfocus_update() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::set_canvas_background_color(const Vector3f& newBackColor, bool sendChangeOverNetwork) {
|
|
||||||
if(newBackColor != convert_vec3<Vector3f>(canvasTheme.backColor)) {
|
|
||||||
canvasTheme.backColor = SkColor4f{newBackColor.x(), newBackColor.y(), newBackColor.z(), 1.0f};
|
|
||||||
Vector3f newHSV = rgb_to_hsv<Vector3f>(newBackColor);
|
|
||||||
SkColor4f oldToolFrontColor = canvasTheme.toolFrontColor;
|
|
||||||
if(newHSV.z() >= 0.6f)
|
|
||||||
canvasTheme.toolFrontColor = SkColor4f{0.0f, 0.0f, 0.0f, 1.0f};
|
|
||||||
else
|
|
||||||
canvasTheme.toolFrontColor = SkColor4f{1.0f, 1.0f, 1.0f, 1.0f};
|
|
||||||
if(oldToolFrontColor != canvasTheme.toolFrontColor)
|
|
||||||
drawProg.clear_draw_cache();
|
|
||||||
if(sendChangeOverNetwork)
|
|
||||||
con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_CANVAS_COLOR, newBackColor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void World::send_chat_message(const std::string& message) {
|
void World::send_chat_message(const std::string& message) {
|
||||||
if(!clientStillConnecting) {
|
if(!clientStillConnecting) {
|
||||||
con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_CHAT_MESSAGE, message);
|
if(con.localServer)
|
||||||
|
con.localServer->netServer->send_items_to_all_clients(RELIABLE_COMMAND_CHANNEL, CLIENT_CHAT_MESSAGE, ownID, message);
|
||||||
|
else
|
||||||
|
con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_CHAT_MESSAGE, message);
|
||||||
add_chat_message(displayName, message, Toolbar::ChatMessage::Type::NORMAL);
|
add_chat_message(displayName, message, Toolbar::ChatMessage::Type::NORMAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -390,7 +374,7 @@ void World::load_from_file(const std::filesystem::path& filePathToLoadFrom, std:
|
||||||
|
|
||||||
void World::save_file(cereal::PortableBinaryOutputArchive& a) const {
|
void World::save_file(cereal::PortableBinaryOutputArchive& a) const {
|
||||||
a(drawData.cam.c, main.window.size.cast<float>().eval());
|
a(drawData.cam.c, main.window.size.cast<float>().eval());
|
||||||
a(convert_vec3<Vector3f>(canvasTheme.backColor));
|
//a(convert_vec3<Vector3f>(canvasTheme.backColor));
|
||||||
drawProg.save_file(a);
|
drawProg.save_file(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -399,17 +383,17 @@ void World::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber versi
|
||||||
Vector2f windowSizeToJumpTo;
|
Vector2f windowSizeToJumpTo;
|
||||||
a(coordsToJumpTo, windowSizeToJumpTo);
|
a(coordsToJumpTo, windowSizeToJumpTo);
|
||||||
|
|
||||||
if(version < VersionNumber(0, 1, 0))
|
//if(version < VersionNumber(0, 1, 0))
|
||||||
set_canvas_background_color(DEFAULT_CANVAS_BACKGROUND_COLOR);
|
// set_canvas_background_color(DEFAULT_CANVAS_BACKGROUND_COLOR);
|
||||||
else {
|
//else {
|
||||||
Vector3f canvasBackColor;
|
// Vector3f canvasBackColor;
|
||||||
a(canvasBackColor);
|
// a(canvasBackColor);
|
||||||
const Vector3f OLD_DEFAULT_CANVAS_BACKGROUND_COLOR{0.12f, 0.12f, 0.12f};
|
// const Vector3f OLD_DEFAULT_CANVAS_BACKGROUND_COLOR{0.12f, 0.12f, 0.12f};
|
||||||
if(version < VersionNumber(0, 3, 0) && canvasBackColor == OLD_DEFAULT_CANVAS_BACKGROUND_COLOR)
|
// if(version < VersionNumber(0, 3, 0) && canvasBackColor == OLD_DEFAULT_CANVAS_BACKGROUND_COLOR)
|
||||||
set_canvas_background_color(DEFAULT_CANVAS_BACKGROUND_COLOR);
|
// set_canvas_background_color(DEFAULT_CANVAS_BACKGROUND_COLOR);
|
||||||
else
|
// else
|
||||||
set_canvas_background_color(canvasBackColor);
|
// set_canvas_background_color(canvasBackColor);
|
||||||
}
|
//}
|
||||||
|
|
||||||
drawData.cam.smooth_move_to(*this, coordsToJumpTo, windowSizeToJumpTo, true);
|
drawData.cam.smooth_move_to(*this, coordsToJumpTo, windowSizeToJumpTo, true);
|
||||||
drawProg.load_file(a, version);
|
drawProg.load_file(a, version);
|
||||||
|
|
@ -458,9 +442,9 @@ void World::draw_other_player_cursors(SkCanvas* canvas, const DrawData& drawData
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::scale_up_step() {
|
void World::scale_up_step() {
|
||||||
canvasScale++;
|
//canvasScale++;
|
||||||
con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_CANVAS_SCALE, canvasScale);
|
//con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_CANVAS_SCALE, canvasScale);
|
||||||
scale_up(WorldScalar(CANVAS_SCALE_UP_STEP));
|
//scale_up(WorldScalar(CANVAS_SCALE_UP_STEP));
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::scale_up(const WorldScalar& scaleUpAmount) {
|
void World::scale_up(const WorldScalar& scaleUpAmount) {
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#include "DrawingProgram/DrawingProgram.hpp"
|
#include "DrawingProgram/DrawingProgram.hpp"
|
||||||
#include "Toolbar.hpp"
|
#include "Toolbar.hpp"
|
||||||
#include "SharedTypes.hpp"
|
#include "SharedTypes.hpp"
|
||||||
|
#include "CanvasTheme.hpp"
|
||||||
#include "GridManager.hpp"
|
#include "GridManager.hpp"
|
||||||
#include <Helpers/NetworkingObjects/NetObjManager.hpp>
|
#include <Helpers/NetworkingObjects/NetObjManager.hpp>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
@ -92,12 +93,7 @@ class World {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::unordered_map<ServerPortionID, ClientData> clients;
|
std::unordered_map<ServerPortionID, ClientData> clients;
|
||||||
|
|
||||||
void set_canvas_background_color(const Vector3f& newBackColor, bool sendChangeOverNetwork = true);
|
CanvasTheme canvasTheme;
|
||||||
|
|
||||||
struct CanvasTheme {
|
|
||||||
SkColor4f backColor = {0.0f, 0.0f, 0.0f, 1.0f};
|
|
||||||
SkColor4f toolFrontColor = {1.0f, 1.0f, 1.0f, 1.0f};
|
|
||||||
} canvasTheme;
|
|
||||||
|
|
||||||
void scale_up(const WorldScalar& scaleUpAmount);
|
void scale_up(const WorldScalar& scaleUpAmount);
|
||||||
void scale_up_step();
|
void scale_up_step();
|
||||||
|
|
@ -111,6 +107,7 @@ class World {
|
||||||
|
|
||||||
|
|
||||||
void init_client_callbacks();
|
void init_client_callbacks();
|
||||||
|
void init_server_callbacks();
|
||||||
void set_name(const std::string& n);
|
void set_name(const std::string& n);
|
||||||
|
|
||||||
void draw_other_player_cursors(SkCanvas* canvas, const DrawData& drawData);
|
void draw_other_player_cursors(SkCanvas* canvas, const DrawData& drawData);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue