Save for material (#101)

This commit is contained in:
rewin
2024-03-22 23:35:20 +03:00
committed by GitHub
parent dc6ab893a6
commit 87ecf2d7e4
3 changed files with 61 additions and 21 deletions
Generated
+8 -8
View File
@@ -4685,7 +4685,7 @@ dependencies = [
[[package]] [[package]]
name = "space_bevy_xpbd_plugin" name = "space_bevy_xpbd_plugin"
version = "0.3.1" version = "0.3.1"
source = "git+https://github.com/rewin123/space_editor?rev=ce83f86dc902787ab16213f3209276a784654df6#ce83f86dc902787ab16213f3209276a784654df6" source = "git+https://github.com/rewin123/space_editor?rev=0f2439ba8cd38ebf2db8d90ea6de736992bcb56e#0f2439ba8cd38ebf2db8d90ea6de736992bcb56e"
dependencies = [ dependencies = [
"bevy", "bevy",
"bevy_xpbd_3d", "bevy_xpbd_3d",
@@ -4695,7 +4695,7 @@ dependencies = [
[[package]] [[package]]
name = "space_editor" name = "space_editor"
version = "0.3.1" version = "0.3.1"
source = "git+https://github.com/rewin123/space_editor?rev=ce83f86dc902787ab16213f3209276a784654df6#ce83f86dc902787ab16213f3209276a784654df6" source = "git+https://github.com/rewin123/space_editor?rev=0f2439ba8cd38ebf2db8d90ea6de736992bcb56e#0f2439ba8cd38ebf2db8d90ea6de736992bcb56e"
dependencies = [ dependencies = [
"bevy", "bevy",
"space_bevy_xpbd_plugin", "space_bevy_xpbd_plugin",
@@ -4706,7 +4706,7 @@ dependencies = [
[[package]] [[package]]
name = "space_editor_core" name = "space_editor_core"
version = "0.3.1" version = "0.3.1"
source = "git+https://github.com/rewin123/space_editor?rev=ce83f86dc902787ab16213f3209276a784654df6#ce83f86dc902787ab16213f3209276a784654df6" source = "git+https://github.com/rewin123/space_editor?rev=0f2439ba8cd38ebf2db8d90ea6de736992bcb56e#0f2439ba8cd38ebf2db8d90ea6de736992bcb56e"
dependencies = [ dependencies = [
"bevy", "bevy",
"space_persistence", "space_persistence",
@@ -4718,7 +4718,7 @@ dependencies = [
[[package]] [[package]]
name = "space_editor_ui" name = "space_editor_ui"
version = "0.3.1" version = "0.3.1"
source = "git+https://github.com/rewin123/space_editor?rev=ce83f86dc902787ab16213f3209276a784654df6#ce83f86dc902787ab16213f3209276a784654df6" source = "git+https://github.com/rewin123/space_editor?rev=0f2439ba8cd38ebf2db8d90ea6de736992bcb56e#0f2439ba8cd38ebf2db8d90ea6de736992bcb56e"
dependencies = [ dependencies = [
"bevy", "bevy",
"bevy_debug_grid", "bevy_debug_grid",
@@ -4739,7 +4739,7 @@ dependencies = [
[[package]] [[package]]
name = "space_persistence" name = "space_persistence"
version = "0.3.1" version = "0.3.1"
source = "git+https://github.com/rewin123/space_editor?rev=ce83f86dc902787ab16213f3209276a784654df6#ce83f86dc902787ab16213f3209276a784654df6" source = "git+https://github.com/rewin123/space_editor?rev=0f2439ba8cd38ebf2db8d90ea6de736992bcb56e#0f2439ba8cd38ebf2db8d90ea6de736992bcb56e"
dependencies = [ dependencies = [
"bevy", "bevy",
"ron", "ron",
@@ -4749,7 +4749,7 @@ dependencies = [
[[package]] [[package]]
name = "space_prefab" name = "space_prefab"
version = "0.3.1" version = "0.3.1"
source = "git+https://github.com/rewin123/space_editor?rev=ce83f86dc902787ab16213f3209276a784654df6#ce83f86dc902787ab16213f3209276a784654df6" source = "git+https://github.com/rewin123/space_editor?rev=0f2439ba8cd38ebf2db8d90ea6de736992bcb56e#0f2439ba8cd38ebf2db8d90ea6de736992bcb56e"
dependencies = [ dependencies = [
"bevy", "bevy",
"bevy-inspector-egui", "bevy-inspector-egui",
@@ -4763,7 +4763,7 @@ dependencies = [
[[package]] [[package]]
name = "space_shared" name = "space_shared"
version = "0.3.1" version = "0.3.1"
source = "git+https://github.com/rewin123/space_editor?rev=ce83f86dc902787ab16213f3209276a784654df6#ce83f86dc902787ab16213f3209276a784654df6" source = "git+https://github.com/rewin123/space_editor?rev=0f2439ba8cd38ebf2db8d90ea6de736992bcb56e#0f2439ba8cd38ebf2db8d90ea6de736992bcb56e"
dependencies = [ dependencies = [
"bevy", "bevy",
"bevy-inspector-egui", "bevy-inspector-egui",
@@ -4773,7 +4773,7 @@ dependencies = [
[[package]] [[package]]
name = "space_undo" name = "space_undo"
version = "0.3.1" version = "0.3.1"
source = "git+https://github.com/rewin123/space_editor?rev=ce83f86dc902787ab16213f3209276a784654df6#ce83f86dc902787ab16213f3209276a784654df6" source = "git+https://github.com/rewin123/space_editor?rev=0f2439ba8cd38ebf2db8d90ea6de736992bcb56e#0f2439ba8cd38ebf2db8d90ea6de736992bcb56e"
dependencies = [ dependencies = [
"bevy", "bevy",
"pretty-type-name", "pretty-type-name",
+1 -1
View File
@@ -46,7 +46,7 @@ futures-lite = "2.2.0"
futures = "0.3.30" futures = "0.3.30"
image = "0.24.8" image = "0.24.8"
bytemuck = "1.14.1" bytemuck = "1.14.1"
space_editor = {git = "https://github.com/rewin123/space_editor", rev = "ce83f86dc902787ab16213f3209276a784654df6"} space_editor = {git = "https://github.com/rewin123/space_editor", rev = "0f2439ba8cd38ebf2db8d90ea6de736992bcb56e"}
anyhow.workspace = true anyhow.workspace = true
serde_repr = "0.1.18" serde_repr = "0.1.18"
bevy_tweening = "0.9" bevy_tweening = "0.9"
+52 -12
View File
@@ -1,11 +1,7 @@
use std::{marker::PhantomData, sync::Arc}; use std::{marker::PhantomData, sync::Arc};
use bevy::{ use bevy::{
ecs::world::unsafe_world_cell::UnsafeWorldCell, ecs::world::unsafe_world_cell::UnsafeWorldCell, prelude::*, reflect::{serde::ReflectSerializer, GetTypeRegistration}, transform::commands, utils::HashMap, window::PrimaryWindow
prelude::*,
reflect::{serde::ReflectSerializer, GetTypeRegistration},
utils::HashMap,
window::PrimaryWindow,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::{self, json, Map as JsonMap, Value as JsonValue}; use serde_json::{self, json, Map as JsonMap, Value as JsonValue};
@@ -14,7 +10,7 @@ use space_editor::{
editor_tab::{EditorTab, EditorTabName}, editor_tab::{EditorTab, EditorTabName},
EditorUiAppExt, EditorUiAppExt,
}, },
space_prefab::component::MeshPrimitivePrefab, space_prefab::{component::MeshPrimitivePrefab, editor_registry::EditorRegistryExt, save::SaveState},
}; };
use wasm_bindgen::prelude::*; use wasm_bindgen::prelude::*;
@@ -66,7 +62,8 @@ impl Plugin for InspectorPlugin {
//register standart material //register standart material
{ {
app.register_type::<ShortMaterial>()
app.editor_registry::<ShortMaterial>()
.add_event::<UpdateInspect<Handle<StandardMaterial>>>() .add_event::<UpdateInspect<Handle<StandardMaterial>>>()
.add_systems( .add_systems(
Update, Update,
@@ -84,6 +81,14 @@ impl Plugin for InspectorPlugin {
serialize_standart_materal.in_set(InspectorSystem::PerComponentCollect), serialize_standart_materal.in_set(InspectorSystem::PerComponentCollect),
); );
app.add_systems(
OnEnter(SaveState::Save),
(create_short_materials, apply_deferred).chain().before(space_editor::space_prefab::sub_scene::prepare_auto_scene)
);
app.add_systems(PostUpdate, apply_short_materials);
app.world.resource_mut::<InspectGetters>().getters.insert( app.world.resource_mut::<InspectGetters>().getters.insert(
StandardMaterial::get_type_registration() StandardMaterial::get_type_registration()
.type_info() .type_info()
@@ -118,6 +123,40 @@ impl Plugin for InspectorPlugin {
} }
} }
fn create_short_materials(
mut commands : Commands,
q_mats: Query<(Entity, &Handle<StandardMaterial>)>,
materials: Res<Assets<StandardMaterial>>,
) {
for (entity, handle) in q_mats.iter() {
if let Some(material) = materials.get(handle) {
commands.entity(entity).insert(ShortMaterial::new(material));
}
}
}
fn apply_short_materials(
mut commands : Commands,
q_mats: Query<(Entity, &Handle<StandardMaterial>, &ShortMaterial)>,
mut materials: ResMut<Assets<StandardMaterial>>,)
{
for (entity, handle, short) in q_mats.iter() {
let Some(mut material) = materials.get_mut(handle) else {
continue;
};
material.base_color = short.base_color;
material.perceptual_roughness = short.perceptual_roughness;
material.metallic = short.metallic;
material.reflectance = short.reflectance;
commands.entity(entity).remove::<ShortMaterial>();
}
}
#[derive(Resource, Default)] #[derive(Resource, Default)]
struct InspectGetters { struct InspectGetters {
getters: HashMap< getters: HashMap<
@@ -538,8 +577,8 @@ fn auto_serialize_asset<T: Asset + Reflect + GetTypeRegistration>(
ev_update_description.send(UpdateEntityDescription); ev_update_description.send(UpdateEntityDescription);
} }
#[derive(Reflect, Default)] #[derive(Reflect, Default, Clone, Component)]
#[reflect(Default)] #[reflect(Default, Component)]
struct ShortMaterial { struct ShortMaterial {
pub base_color: Color, pub base_color: Color,
pub perceptual_roughness: f32, pub perceptual_roughness: f32,
@@ -558,6 +597,7 @@ impl ShortMaterial {
} }
} }
fn serialize_standart_materal( fn serialize_standart_materal(
r_selection: Option<Res<Selection>>, r_selection: Option<Res<Selection>>,
q_m: Query<&Handle<StandardMaterial>>, q_m: Query<&Handle<StandardMaterial>>,
@@ -574,12 +614,12 @@ fn serialize_standart_materal(
ev_inspect.clear(); ev_inspect.clear();
if let Some(handle) = r_selection if let Some((target, handle)) = r_selection
.as_ref() .as_ref()
.and_then(|selection| find_handle_in_self_or_children(***selection, &q_children, &q_m)) .and_then(|selection| find_handle_in_self_or_children(***selection, &q_children, &q_m))
.and_then(|target| q_m.get(target).ok()) .and_then(|target| q_m.get(target).ok().map(|h| (target, h.clone())))
{ {
if let Some(material) = assets.get(handle) { if let Some(material) = assets.get(handle.clone()) {
let registry = registry.read(); let registry = registry.read();
let short_material = ShortMaterial::new(material); let short_material = ShortMaterial::new(material);
let json = let json =