Skip to content

Commit a40e0d2

Browse files
Use ResourceId for referring to Resources (#4176)
* Use ResourceId for referring to Resources * Use Doc * use error for preprocessor ResourceId replacement failure * Keep hashes in DocumentInfo * Migrate with less mem copy * Global ResourceMessage -> ResourceStorageMessage * Add document ResourceMessage * Move embedding logic * Fix * Cleanup * Review * Fix
1 parent bbbe049 commit a40e0d2

31 files changed

Lines changed: 400 additions & 111 deletions

File tree

editor/src/application.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl Editor {
3030
};
3131

3232
let mut application_io = PlatformApplicationIo::default();
33-
application_io.inject_resource_proxy(editor.dispatcher.message_handlers.resource_message_handler.resources());
33+
application_io.inject_resource_proxy(editor.dispatcher.message_handlers.resource_storage_message_handler.resources());
3434
runtime.replace_application_io(application_io);
3535

3636
(editor, runtime)
@@ -47,7 +47,7 @@ impl Editor {
4747
}
4848

4949
pub fn replace_application_io(&mut self, mut application_io: PlatformApplicationIo) {
50-
application_io.inject_resource_proxy(self.dispatcher.message_handlers.resource_message_handler.resources());
50+
application_io.inject_resource_proxy(self.dispatcher.message_handlers.resource_storage_message_handler.resources());
5151
crate::node_graph_executor::replace_application_io(application_io)
5252
}
5353
}

editor/src/dispatcher.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ pub struct DispatcherMessageHandlers {
3232
menu_bar_message_handler: MenuBarMessageHandler,
3333
pub(crate) portfolio_message_handler: PortfolioMessageHandler,
3434
preferences_message_handler: PreferencesMessageHandler,
35-
pub(crate) resource_message_handler: ResourceMessageHandler,
35+
pub(crate) resource_storage_message_handler: ResourceStorageMessageHandler,
3636
tool_message_handler: ToolMessageHandler,
3737
viewport_message_handler: ViewportMessageHandler,
3838
}
3939

4040
impl DispatcherMessageHandlers {
4141
pub fn with_resource_storage(resource_storage: Box<dyn ResourceStorage>) -> Self {
4242
Self {
43-
resource_message_handler: ResourceMessageHandler::new(resource_storage),
43+
resource_storage_message_handler: ResourceStorageMessageHandler::new(resource_storage),
4444
..Self::default()
4545
}
4646
}
@@ -89,7 +89,7 @@ const DEBUG_MESSAGE_ENDING_BLOCK_LIST: &[&str] = &["PointerMove", "PointerOutsid
8989
impl Dispatcher {
9090
pub fn new(resource_storage: Box<dyn ResourceStorage>) -> Self {
9191
let mut s = Self::default();
92-
s.message_handlers.resource_message_handler = ResourceMessageHandler::new(resource_storage);
92+
s.message_handlers.resource_storage_message_handler = ResourceStorageMessageHandler::new(resource_storage);
9393
s
9494
}
9595

@@ -228,8 +228,10 @@ impl Dispatcher {
228228

229229
self.message_handlers.layout_message_handler.process_message(message, &mut queue, context);
230230
}
231-
Message::Resource(message) => {
232-
self.message_handlers.resource_message_handler.process_message(message, &mut queue, ResourceMessageContext {});
231+
Message::ResourceStorage(message) => {
232+
self.message_handlers
233+
.resource_storage_message_handler
234+
.process_message(message, &mut queue, ResourceStorageMessageContext {});
233235
}
234236
Message::Portfolio(message) => {
235237
self.message_handlers.portfolio_message_handler.process_message(
@@ -243,7 +245,7 @@ impl Dispatcher {
243245
timing_information: self.message_handlers.animation_message_handler.timing_information(),
244246
animation: &self.message_handlers.animation_message_handler,
245247
viewport: &self.message_handlers.viewport_message_handler,
246-
resources: &self.message_handlers.resource_message_handler,
248+
resource_storage: &self.message_handlers.resource_storage_message_handler,
247249
},
248250
);
249251
}

editor/src/messages/message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub enum Message {
3636
#[child]
3737
Preferences(PreferencesMessage),
3838
#[child]
39-
Resource(ResourceMessage),
39+
ResourceStorage(ResourceStorageMessage),
4040
#[child]
4141
Tool(ToolMessage),
4242
#[child]

editor/src/messages/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ pub mod message;
1717
pub mod portfolio;
1818
pub mod preferences;
1919
pub mod prelude;
20-
pub mod resource;
20+
pub mod resource_storage;
2121
pub mod tool;
2222
pub mod viewport;

editor/src/messages/portfolio/document/document_message.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ pub enum DocumentMessage {
3737
PropertiesPanel(PropertiesPanelMessage),
3838
#[child]
3939
DataPanel(DataPanelMessage),
40+
#[child]
41+
Resource(ResourceMessage),
4042

4143
// Messages
4244
AlignSelectedLayers {

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use crate::messages::portfolio::document::overlays::grid_overlays::{grid_overlay
1919
use crate::messages::portfolio::document::overlays::utility_types::{OverlaysType, OverlaysVisibilitySettings, Pivot};
2020
use crate::messages::portfolio::document::properties_panel::properties_panel_message_handler::PropertiesPanelMessageContext;
2121
use crate::messages::portfolio::document::utility_types::document_metadata::{DocumentMetadata, LayerNodeIdentifier};
22-
use crate::messages::portfolio::document::utility_types::embedded_resources::EmbeddedResources;
2322
use crate::messages::portfolio::document::utility_types::misc::{AlignAggregate, AlignAxis, FlipAxis, PTZ};
2423
use crate::messages::portfolio::document::utility_types::network_interface::{FlowType, InputConnector, NodeTemplate, OutputConnector};
2524
use crate::messages::portfolio::utility_types::{CachedData, PanelType};
@@ -30,7 +29,7 @@ use crate::messages::tool::tool_messages::tool_prelude::Key;
3029
use crate::messages::tool::utility_types::ToolType;
3130
use crate::node_graph_executor::NodeGraphExecutor;
3231
use glam::{DAffine2, DVec2};
33-
use graph_craft::application_io::resource::ResourceHash;
32+
use graph_craft::application_io::resource::ResourceId;
3433
use graph_craft::application_io::wgpu_available;
3534
use graph_craft::descriptor;
3635
use graph_craft::document::value::TaggedValue;
@@ -61,7 +60,7 @@ pub struct DocumentMessageContext<'a> {
6160
pub layers_panel_open: bool,
6261
pub properties_panel_open: bool,
6362
pub viewport: &'a ViewportMessageHandler,
64-
pub resources: &'a ResourceMessageHandler,
63+
pub resource_storage: &'a ResourceStorageMessageHandler,
6564
}
6665

6766
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, ExtractField)]
@@ -88,6 +87,9 @@ pub struct DocumentMessageHandler {
8887
//
8988
// Contains the NodeNetwork and acts an an interface to manipulate the NodeNetwork with custom setters in order to keep NetworkMetadata in sync
9089
pub network_interface: NodeNetworkInterface,
90+
/// Resources embedded in the document.
91+
#[serde(default, skip_serializing_if = "ResourceMessageHandler::is_empty")]
92+
pub resources: ResourceMessageHandler,
9193
/// Tracks which layer occurrences are collapsed in the Layers panel, keyed by tree path.
9294
#[serde(deserialize_with = "deserialize_collapsed_layers", default)]
9395
pub collapsed: CollapsedLayers,
@@ -110,9 +112,6 @@ pub struct DocumentMessageHandler {
110112
pub graph_view_overlay_open: bool,
111113
/// The current opacity of the faded node graph background that covers up the artwork.
112114
pub graph_fade_artwork_percentage: f64,
113-
/// Resources embedded in the document. Only propagated if saving to an external file and never for autosaved documents.
114-
#[serde(rename = "resources", default, skip_serializing_if = "EmbeddedResources::is_empty")]
115-
pub embedded_resources: EmbeddedResources,
116115

117116
// =============================================
118117
// Fields omitted from the saved document format
@@ -166,6 +165,7 @@ impl Default for DocumentMessageHandler {
166165
// Fields that are saved in the document format
167166
// ============================================
168167
network_interface: default_document_network_interface(),
168+
resources: ResourceMessageHandler::default(),
169169
collapsed: CollapsedLayers::default(),
170170
commit_hash: GRAPHITE_GIT_COMMIT_HASH.to_string(),
171171
document_ptz: PTZ::default(),
@@ -175,7 +175,6 @@ impl Default for DocumentMessageHandler {
175175
graph_view_overlay_open: false,
176176
snapping_state: SnappingState::default(),
177177
graph_fade_artwork_percentage: 80.,
178-
embedded_resources: EmbeddedResources::default(),
179178
// =============================================
180179
// Fields omitted from the saved document format
181180
// =============================================
@@ -207,7 +206,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
207206
data_panel_open,
208207
layers_panel_open,
209208
properties_panel_open,
210-
resources,
209+
resource_storage,
211210
} = context;
212211

213212
match message {
@@ -282,6 +281,10 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
282281
let mut graph_operation_message_handler = GraphOperationMessageHandler {};
283282
graph_operation_message_handler.process_message(message, responses, context);
284283
}
284+
DocumentMessage::Resource(message) => {
285+
let context = ResourceMessageContext {};
286+
self.resources.process_message(message, responses, context);
287+
}
285288
DocumentMessage::AlignSelectedLayers { axis, aggregate } => {
286289
let axis = match axis {
287290
AlignAxis::X => DVec2::X,
@@ -920,36 +923,29 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
920923
DocumentMessage::SaveDocument | DocumentMessage::SaveDocumentAs => {
921924
responses.add(PortfolioMessage::AutoSaveActiveDocument);
922925

926+
let name = format!("{}.{}", self.name.clone(), FILE_EXTENSION);
923927
let path = if let DocumentMessage::SaveDocumentAs = message { None } else { self.path.clone() };
924928
if path.is_some() {
925929
responses.add(DocumentMessage::MarkAsSaved);
926930
}
927931
let folder = self.path.as_ref().and_then(|path| path.parent()).map(|parent| parent.to_path_buf());
928932

929-
let resource_hashes = Vec::from_iter(self.used_resources(false)).into_boxed_slice();
930-
let resources = resources.resources();
931933
let mut document = self.clone();
932-
let name = format!("{}.{}", self.name.clone(), FILE_EXTENSION);
934+
let resources_load_handle = resource_storage.resources();
933935

934936
responses.add(FrontendMessage::Await {
935937
future: FrontendMessageFuture::new(async move {
936-
let loads = resource_hashes
937-
.into_iter()
938-
.map(|hash| {
939-
let resource = resources.load(hash);
940-
async move { resource.await.map(|resource| (hash, resource)) }
941-
})
942-
.collect::<Vec<_>>();
938+
document.resources.garbage_collect(document.used_resources(false).as_ref());
939+
document.resources.embed_resources(resources_load_handle).await;
943940

944-
document.embedded_resources = EmbeddedResources::from_iter(futures::future::join_all(loads).await.into_iter().flatten());
945-
let content = document.serialize_document();
941+
let content = document.serialize_document().into_bytes().into();
946942

947943
FrontendMessage::TriggerSaveDocument {
948944
document_id,
949945
name,
950946
path,
951947
folder,
952-
content: content.into_bytes().into(),
948+
content,
953949
}
954950
}),
955951
});
@@ -3472,14 +3468,19 @@ impl DocumentMessageHandler {
34723468
self.graph_view_overlay_open
34733469
}
34743470

3475-
pub fn used_resources(&self, include_history: bool) -> HashSet<ResourceHash> {
3471+
pub fn garbage_collect_resources(&mut self) {
3472+
let used_resources = self.used_resources(true);
3473+
self.resources.garbage_collect(&used_resources);
3474+
}
3475+
3476+
pub fn used_resources(&self, include_history: bool) -> Box<[ResourceId]> {
34763477
let mut resources = HashSet::new();
34773478
self.network_interface.collect_used_resources(&mut resources);
34783479
if include_history {
34793480
self.document_undo_history.iter().for_each(|interface| interface.collect_used_resources(&mut resources));
34803481
self.document_redo_history.iter().for_each(|interface| interface.collect_used_resources(&mut resources));
34813482
}
3482-
resources
3483+
resources.into_iter().collect::<Vec<_>>().into_boxed_slice()
34833484
}
34843485
}
34853486

editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub struct GraphOperationMessageHandler {}
3232
#[message_handler_data]
3333
impl MessageHandler<GraphOperationMessage, GraphOperationMessageContext<'_>> for GraphOperationMessageHandler {
3434
fn process_message(&mut self, message: GraphOperationMessage, responses: &mut VecDeque<Message>, context: GraphOperationMessageContext) {
35-
let network_interface = context.network_interface;
35+
let GraphOperationMessageContext { network_interface, .. } = context;
3636

3737
match message {
3838
GraphOperationMessage::FillSet { layer, fill } => {

editor/src/messages/portfolio/document/graph_operation/utility_types.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::messages::portfolio::document::utility_types::document_metadata::Laye
44
use crate::messages::portfolio::document::utility_types::network_interface::{self, InputConnector, NodeNetworkInterface, OutputConnector};
55
use crate::messages::prelude::*;
66
use glam::{DAffine2, DVec2};
7+
use graph_craft::application_io::resource::ResourceId;
78
use graph_craft::document::value::TaggedValue;
89
use graph_craft::document::{NodeId, NodeInput};
910
use graph_craft::{ProtoNodeIdentifier, concrete, descriptor};
@@ -299,13 +300,15 @@ impl<'a> ModifyInputsContext<'a> {
299300
.expect("Transform node does not exist")
300301
.default_node_template();
301302

302-
let png_bytes: std::sync::Arc<[u8]> = image.to_png().into();
303-
let hash = graphene_std::application_io::resource::ResourceHash::from(png_bytes.as_ref());
304-
self.responses.add(ResourceMessage::Store { data: png_bytes });
303+
let resource_id = ResourceId::new();
304+
self.responses.add(ResourceMessage::StoreEmbedded {
305+
resource_id,
306+
data: image.to_png().into(),
307+
});
305308

306309
let image_node = resolve_proto_node_type(graphene_std::raster_nodes::std_nodes::image::IDENTIFIER)
307310
.expect("Image node does not exist")
308-
.node_template_input_override([Some(NodeInput::value(TaggedValue::Resource(hash), false))]);
311+
.node_template_input_override([Some(NodeInput::value(TaggedValue::Resource(resource_id), false))]);
309312

310313
let image_node_id = NodeId::new();
311314
self.network_interface.insert_node(image_node_id, image_node, &[]);

editor/src/messages/portfolio/document/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub mod navigation;
77
pub mod node_graph;
88
pub mod overlays;
99
pub mod properties_panel;
10+
pub mod resource;
1011
pub mod utility_types;
1112

1213
#[doc(inline)]

editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1557,7 +1557,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphMessageContext<'a>> for NodeG
15571557
// Only disconnect inputs to non selected nodes
15581558
if network_interface
15591559
.upstream_output_connector(&input_connector, selection_network_path)
1560-
.is_some_and(|connector| connector.node_id().map_or(true, |node_id| !all_selected_nodes.contains(&node_id)))
1560+
.is_some_and(|connector| connector.node_id().is_none_or(|node_id| !all_selected_nodes.contains(&node_id)))
15611561
{
15621562
responses.add(NodeGraphMessage::DisconnectInput { input_connector });
15631563
}

0 commit comments

Comments
 (0)