Ship 0.8 fog/freistellen and fix Windows CI for friends
Some checks are pending
Windows Release / windows-x86_64 (push) Waiting to run

Publish the portable zip to public Forgejo from the private GitHub
builder, and force Ninja so MSVC 195 deps build without CMake 4.2.
This commit is contained in:
copilot 2026-10-25 18:07:47 +01:00
parent 97b136de3b
commit 1c1d63f376
46 changed files with 1748 additions and 156 deletions

View file

@ -21,6 +21,7 @@
#include <cereal/types/string.hpp>
#include "DrawingProgramLayer.hpp"
#include "../../World.hpp"
#include "../../MainProgram.hpp"
#include "SerializedBlendMode.hpp"
using namespace NetworkingObjects;
@ -78,6 +79,8 @@ DrawingProgramLayerListItem::DrawingProgramLayerListItem(World& w, const Drawing
displayData = w.netObjMan.make_obj<DisplayData>();
displayData->alpha = initData.metaInfo.alpha;
displayData->blendMode = initData.metaInfo.blendMode;
displayData->playerLocked = initData.metaInfo.playerLocked;
displayData->fogLayer = initData.metaInfo.fogLayer;
}
DrawingProgramLayerListItemUndoData DrawingProgramLayerListItem::get_undo_data(WorldUndoManager& u) const {
@ -85,6 +88,8 @@ DrawingProgramLayerListItemUndoData DrawingProgramLayerListItem::get_undo_data(W
toRet.metaInfo.name = nameData->name;
toRet.metaInfo.blendMode = displayData->blendMode;
toRet.metaInfo.alpha = displayData->alpha;
toRet.metaInfo.playerLocked = displayData->playerLocked;
toRet.metaInfo.fogLayer = displayData->fogLayer;
if(folderData) {
toRet.containerUndoID = u.get_undoid_from_netid(folderData->folderList.get_net_id());
toRet.folderData = std::vector<DrawingProgramLayerListItemUndoData>();
@ -178,11 +183,24 @@ void DrawingProgramLayerListItem::load_file(cereal::PortableBinaryInputArchive&
a(*nameData);
displayData = layerMan.drawP.world.netObjMan.make_obj<DisplayData>();
a(*displayData);
if(version >= VersionNumber(0, 8, 0)) {
a(*displayData);
// Normalize cereal bools (non-0/1 bytes must not stick as "true" forever).
displayData->visible = displayData->visible ? true : false;
displayData->playerLocked = displayData->playerLocked ? true : false;
displayData->fogLayer = displayData->fogLayer ? true : false;
}
else {
a(displayData->alpha, displayData->visible, displayData->blendMode);
displayData->visible = displayData->visible ? true : false;
displayData->playerLocked = false;
displayData->fogLayer = false;
}
bool isFolder;
a(isFolder);
if(isFolder) {
displayData->fogLayer = false;
folderData = std::make_unique<DrawingProgramLayerFolder>();
folderData->load_file(a, version, layerMan);
}
@ -275,20 +293,84 @@ SerializedBlendMode DrawingProgramLayerListItem::get_blend_mode() const {
return displayData->blendMode;
}
void DrawingProgramLayerListItem::set_player_locked(DrawingProgramLayerManager& layerMan, bool locked) const {
if(!displayData)
return;
bool newLocked = locked || displayData->fogLayer;
if(displayData->playerLocked != newLocked) {
displayData->playerLocked = newLocked;
layerMan.drawP.drawCache.clear_own_cached_surfaces();
layerMan.drawP.world.delayedUpdateObjectManager.send_update_to_all<DisplayData>(displayData, false);
layerMan.refresh_fog_client_projection();
}
}
bool DrawingProgramLayerListItem::get_player_locked() const {
return displayData && displayData->playerLocked;
}
void DrawingProgramLayerListItem::set_fog_layer(DrawingProgramLayerManager& layerMan, bool fog) const {
if(!displayData || displayData->fogLayer == fog || is_folder())
return;
displayData->fogLayer = fog;
if(fog)
displayData->playerLocked = true;
layerMan.drawP.drawCache.clear_own_cached_surfaces();
layerMan.drawP.world.delayedUpdateObjectManager.send_update_to_all<DisplayData>(displayData, false);
layerMan.refresh_fog_client_projection();
}
bool DrawingProgramLayerListItem::is_fog_layer() const {
return displayData && displayData->fogLayer;
}
bool DrawingProgramLayerListItem::is_player_edit_blocked() const {
return is_fog_layer() || get_player_locked();
}
void DrawingProgramLayerListItem::set_metainfo(DrawingProgramLayerManager& layerMan, const DrawingProgramLayerListItemMetaInfo& metaInfo) {
set_blend_mode(layerMan, metaInfo.blendMode);
set_alpha(layerMan, metaInfo.alpha);
set_name(layerMan.drawP.world.delayedUpdateObjectManager, metaInfo.name);
set_fog_layer(layerMan, metaInfo.fogLayer);
set_player_locked(layerMan, metaInfo.playerLocked || metaInfo.fogLayer);
}
DrawingProgramLayerListItemMetaInfo DrawingProgramLayerListItem::get_metainfo() const {
return DrawingProgramLayerListItemMetaInfo{
.name = get_name(),
.alpha = get_alpha(),
.blendMode = get_blend_mode()
.blendMode = get_blend_mode(),
.playerLocked = get_player_locked(),
.fogLayer = is_fog_layer()
};
}
void DrawingProgramLayerListItem::write_stripped_constructor(cereal::PortableBinaryOutputArchive& a, const std::unordered_set<NetworkingObjects::NetObjID>& hiddenComponentIds) const {
a(static_cast<bool>(folderData));
if(folderData) {
a(folderData->folderList.get_net_id());
a(static_cast<uint32_t>(folderData->folderList->size()));
for(auto& child : *folderData->folderList) {
a(child.obj.get_net_id());
child.obj->write_stripped_constructor(a, hiddenComponentIds);
}
}
else {
std::vector<NetworkingObjects::NetObjTemporaryPtr<CanvasComponentContainer>> keep;
for(auto& c : *layerData->components) {
if(!hiddenComponentIds.contains(c.obj.get_net_id()))
keep.emplace_back(c.obj);
}
a(layerData->components.get_net_id());
a(static_cast<uint32_t>(keep.size()));
for(auto& c : keep)
c.write_create_message(a);
}
nameData.write_create_message(a);
displayData.write_create_message(a);
}
void DrawingProgramLayerListItem::erase_invalid_components() {
if(folderData)
folderData->erase_invalid_components();
@ -312,7 +394,9 @@ void DrawingProgramLayerListItem::register_class(World& w) {
});
w.delayedUpdateObjectManager.register_class<DisplayData>(w.netObjMan, NetworkingObjects::DelayUpdateSerializedClassManager::CustomConstructors<DisplayData>{
.postUpdateFunc = [&](DisplayData& o) {
(void)o;
w.drawProg.drawCache.clear_own_cached_surfaces();
w.drawProg.layerMan.ensure_editing_layer_is_editable();
w.set_to_layout_gui_if_focus();
}
});