HOLY SHIT THAT WORKS
This commit is contained in:
parent
3e14cc06bf
commit
4aa2ef382c
|
@ -1,11 +1,41 @@
|
||||||
use std::{alloc::Layout, num::NonZeroU32};
|
use std::{alloc::Layout, cell::Cell, num::NonZeroU32};
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
|
core::Name,
|
||||||
|
ecs::world::DeferredWorld,
|
||||||
|
gltf::GltfExtras,
|
||||||
log::{info, warn},
|
log::{info, warn},
|
||||||
|
prelude::{HierarchyQueryExt, Parent, QueryState, With, World},
|
||||||
reflect::ReflectDeserialize,
|
reflect::ReflectDeserialize,
|
||||||
|
scene::{InstanceId, SceneInstance},
|
||||||
};
|
};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
pub(crate) struct BadWorldAccess {
|
||||||
|
world: *mut World,
|
||||||
|
names: QueryState<(bevy::ecs::entity::Entity, &'static Name), With<GltfExtras>>,
|
||||||
|
hierarchy: QueryState<&'static Parent, ()>,
|
||||||
|
scene_instances: QueryState<&'static SceneInstance, ()>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BadWorldAccess {
|
||||||
|
pub unsafe fn new(world: &mut World) -> Self {
|
||||||
|
BadWorldAccess {
|
||||||
|
world,
|
||||||
|
// We have to check that we focus on a node, not a mesh with the same name.
|
||||||
|
// Currently, the only possible way of checking this is with `GltfExtras`, so selected entities must at least have one component.
|
||||||
|
names: world.query_filtered::<(bevy::ecs::entity::Entity, &Name), With<GltfExtras>>(),
|
||||||
|
hierarchy: world.query::<&Parent>(),
|
||||||
|
scene_instances: world.query::<&SceneInstance>(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
thread_local! {
|
||||||
|
pub(crate) static BAD_WORLD_ACCESS: Cell<Option<BadWorldAccess>> = Cell::new(None);
|
||||||
|
pub(crate) static INSTANCE_ID: Cell<Option<InstanceId>> = Cell::new(None);
|
||||||
|
}
|
||||||
|
|
||||||
const _: () = {
|
const _: () = {
|
||||||
let real = Layout::new::<bevy::ecs::entity::Entity>();
|
let real = Layout::new::<bevy::ecs::entity::Entity>();
|
||||||
let fake = Layout::new::<Entity>();
|
let fake = Layout::new::<Entity>();
|
||||||
|
@ -39,7 +69,46 @@ impl<'de> Deserialize<'de> for Entity {
|
||||||
|
|
||||||
let entity = if let Some(name) = entity_data.name {
|
let entity = if let Some(name) = entity_data.name {
|
||||||
info!("Found name {name}");
|
info!("Found name {name}");
|
||||||
|
let BadWorldAccess {
|
||||||
|
world,
|
||||||
|
mut names,
|
||||||
|
mut hierarchy,
|
||||||
|
mut scene_instances,
|
||||||
|
} = BAD_WORLD_ACCESS.take().expect("No bad world access :c");
|
||||||
|
let instance = INSTANCE_ID.get().expect("No instance id set :c");
|
||||||
|
|
||||||
|
let mut target = None;
|
||||||
|
let w = unsafe { &*world.cast_const() };
|
||||||
|
'search: for (e, n) in names.iter(w) {
|
||||||
|
if !name.eq(n.as_str()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut dw = DeferredWorld::from(unsafe { &mut *world });
|
||||||
|
let hierarchy = dw.query(&mut hierarchy);
|
||||||
|
|
||||||
|
for parent in hierarchy.iter_ancestors(e) {
|
||||||
|
let Ok(id) = scene_instances.get(w, parent) else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
if instance.eq(id) {
|
||||||
|
target = Some(e);
|
||||||
|
break 'search;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BAD_WORLD_ACCESS.set(Some(BadWorldAccess {
|
||||||
|
world,
|
||||||
|
names,
|
||||||
|
hierarchy,
|
||||||
|
scene_instances,
|
||||||
|
}));
|
||||||
|
|
||||||
|
target.unwrap_or_else(|| {
|
||||||
|
warn!("No entity found for '{name}' - perhaps it doesn't contain any components from blender?");
|
||||||
bevy::ecs::entity::Entity::PLACEHOLDER
|
bevy::ecs::entity::Entity::PLACEHOLDER
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
warn!("No object was specified for Entity relation, using `Entity::PLACEHOLDER`.");
|
warn!("No object was specified for Entity relation, using `Entity::PLACEHOLDER`.");
|
||||||
bevy::ecs::entity::Entity::PLACEHOLDER
|
bevy::ecs::entity::Entity::PLACEHOLDER
|
||||||
|
|
|
@ -1,20 +1,26 @@
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core::Name,
|
core::Name,
|
||||||
ecs::{
|
ecs::{
|
||||||
entity::Entity,
|
entity::Entity,
|
||||||
query::{Added, Without},
|
query::{Added, Without},
|
||||||
reflect::{AppTypeRegistry, ReflectComponent},
|
reflect::{AppTypeRegistry, ReflectComponent},
|
||||||
world::World,
|
world::{DeferredWorld, World},
|
||||||
},
|
},
|
||||||
gltf::{GltfExtras, GltfMaterialExtras, GltfMeshExtras, GltfSceneExtras},
|
gltf::{GltfExtras, GltfMaterialExtras, GltfMeshExtras, GltfSceneExtras},
|
||||||
hierarchy::Parent,
|
hierarchy::Parent,
|
||||||
log::{debug, warn},
|
log::{debug, warn},
|
||||||
|
prelude::HierarchyQueryExt,
|
||||||
reflect::{Reflect, TypeRegistration},
|
reflect::{Reflect, TypeRegistration},
|
||||||
|
scene::SceneInstance,
|
||||||
utils::HashMap,
|
utils::HashMap,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{ronstring_to_reflect_component, GltfProcessed};
|
use crate::{ronstring_to_reflect_component, GltfProcessed};
|
||||||
|
|
||||||
|
use super::fake_entity::{self, BadWorldAccess};
|
||||||
|
|
||||||
// , mut entity_components: HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>>
|
// , mut entity_components: HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>>
|
||||||
fn find_entity_components(
|
fn find_entity_components(
|
||||||
entity: Entity,
|
entity: Entity,
|
||||||
|
@ -57,22 +63,44 @@ fn find_entity_components(
|
||||||
|
|
||||||
/// main function: injects components into each entity in gltf files that have `gltf_extras`, using reflection
|
/// main function: injects components into each entity in gltf files that have `gltf_extras`, using reflection
|
||||||
pub fn add_components_from_gltf_extras(world: &mut World) {
|
pub fn add_components_from_gltf_extras(world: &mut World) {
|
||||||
let mut extras = world.query_filtered::<(Entity, Option<&Name>, &GltfExtras, Option<&Parent>), (Added<GltfExtras>, Without<GltfProcessed>)>();
|
let mut extras = world.query_filtered::<(Entity, Option<&Name>, &GltfExtras), (Added<GltfExtras>, Without<GltfProcessed>)>();
|
||||||
let mut scene_extras = world.query_filtered::<(Entity, Option<&Name>, &GltfSceneExtras, Option<&Parent>), (Added<GltfSceneExtras>, Without<GltfProcessed>)>();
|
let mut scene_extras = world.query_filtered::<(Entity, Option<&Name>, &GltfSceneExtras), (Added<GltfSceneExtras>, Without<GltfProcessed>)>();
|
||||||
let mut mesh_extras = world.query_filtered::<(Entity, Option<&Name>, &GltfMeshExtras, Option<&Parent>), (Added<GltfMeshExtras>, Without<GltfProcessed>)>();
|
let mut mesh_extras = world.query_filtered::<(Entity, Option<&Name>, &GltfMeshExtras), (Added<GltfMeshExtras>, Without<GltfProcessed>)>();
|
||||||
let mut material_extras = world.query_filtered::<(Entity, Option<&Name>, &GltfMaterialExtras, Option<&Parent>), (Added<GltfMaterialExtras>, Without<GltfProcessed>)>();
|
let mut material_extras = world.query_filtered::<(Entity, Option<&Name>, &GltfMaterialExtras), (Added<GltfMaterialExtras>, Without<GltfProcessed>)>();
|
||||||
|
|
||||||
|
let mut scene_instances = world.query::<&SceneInstance>();
|
||||||
|
|
||||||
|
let mut hierarchy_state = world.query::<&Parent>();
|
||||||
|
let mut __unsafe_dw = DeferredWorld::from(unsafe { &mut *(world as *mut _) });
|
||||||
|
let hierarchy = __unsafe_dw.query(&mut hierarchy_state);
|
||||||
|
|
||||||
let mut entity_components: HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>> =
|
let mut entity_components: HashMap<Entity, Vec<(Box<dyn Reflect>, TypeRegistration)>> =
|
||||||
HashMap::new();
|
HashMap::new();
|
||||||
|
|
||||||
// let gltf_components_config = world.resource::<GltfComponentsConfig>();
|
// let gltf_components_config = world.resource::<GltfComponentsConfig>();
|
||||||
|
|
||||||
for (entity, name, extra, parent) in extras.iter(world) {
|
unsafe {
|
||||||
|
// SAFETY: we don't do anything harmful until taking this, and have full world access
|
||||||
|
fake_entity::BAD_WORLD_ACCESS.set(Some(BadWorldAccess::new(world)));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (entity, name, extra) in extras.iter(world) {
|
||||||
|
let parent = hierarchy.get(entity).ok();
|
||||||
debug!(
|
debug!(
|
||||||
"Gltf Extra: Name: {:?}, entity {:?}, parent: {:?}, extras {:?}",
|
"Gltf Extra: Name: {:?}, entity {:?}, parent: {:?}, extras {:?}",
|
||||||
name, entity, parent, extra
|
name, entity, parent, extra
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if let Some(instance) = hierarchy
|
||||||
|
.iter_ancestors(entity)
|
||||||
|
.find_map(|p| scene_instances.get(world, p).ok())
|
||||||
|
{
|
||||||
|
fake_entity::INSTANCE_ID.set(Some(*instance.deref()));
|
||||||
|
} else {
|
||||||
|
warn!("Can't find higher-hierarchy `SceneInstance` for entity '{name:?}'");
|
||||||
|
fake_entity::INSTANCE_ID.set(None);
|
||||||
|
};
|
||||||
|
|
||||||
let type_registry: &AppTypeRegistry = world.resource();
|
let type_registry: &AppTypeRegistry = world.resource();
|
||||||
let mut type_registry = type_registry.write();
|
let mut type_registry = type_registry.write();
|
||||||
let reflect_components = ronstring_to_reflect_component(&extra.value, &mut type_registry);
|
let reflect_components = ronstring_to_reflect_component(&extra.value, &mut type_registry);
|
||||||
|
@ -80,15 +108,27 @@ pub fn add_components_from_gltf_extras(world: &mut World) {
|
||||||
|
|
||||||
let (target_entity, updated_components) =
|
let (target_entity, updated_components) =
|
||||||
find_entity_components(entity, name, parent, reflect_components, &entity_components);
|
find_entity_components(entity, name, parent, reflect_components, &entity_components);
|
||||||
|
|
||||||
entity_components.insert(target_entity, updated_components);
|
entity_components.insert(target_entity, updated_components);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (entity, name, extra, parent) in scene_extras.iter(world) {
|
for (entity, name, extra) in scene_extras.iter(world) {
|
||||||
|
let parent = hierarchy.get(entity).ok();
|
||||||
debug!(
|
debug!(
|
||||||
"Gltf Scene Extra: Name: {:?}, entity {:?}, parent: {:?}, scene_extras {:?}",
|
"Gltf Scene Extra: Name: {:?}, entity {:?}, parent: {:?}, scene_extras {:?}",
|
||||||
name, entity, parent, extra
|
name, entity, parent, extra
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if let Some(instance) = hierarchy
|
||||||
|
.iter_ancestors(entity)
|
||||||
|
.find_map(|p| scene_instances.get(world, p).ok())
|
||||||
|
{
|
||||||
|
fake_entity::INSTANCE_ID.set(Some(*instance.deref()));
|
||||||
|
} else {
|
||||||
|
warn!("Can't find higher-hierarchy `SceneInstance` for entity '{name:?}'");
|
||||||
|
fake_entity::INSTANCE_ID.set(None);
|
||||||
|
};
|
||||||
|
|
||||||
let type_registry: &AppTypeRegistry = world.resource();
|
let type_registry: &AppTypeRegistry = world.resource();
|
||||||
let mut type_registry = type_registry.write();
|
let mut type_registry = type_registry.write();
|
||||||
let reflect_components = ronstring_to_reflect_component(&extra.value, &mut type_registry);
|
let reflect_components = ronstring_to_reflect_component(&extra.value, &mut type_registry);
|
||||||
|
@ -98,12 +138,23 @@ pub fn add_components_from_gltf_extras(world: &mut World) {
|
||||||
entity_components.insert(target_entity, updated_components);
|
entity_components.insert(target_entity, updated_components);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (entity, name, extra, parent) in mesh_extras.iter(world) {
|
for (entity, name, extra) in mesh_extras.iter(world) {
|
||||||
|
let parent = hierarchy.get(entity).ok();
|
||||||
debug!(
|
debug!(
|
||||||
"Gltf Mesh Extra: Name: {:?}, entity {:?}, parent: {:?}, mesh_extras {:?}",
|
"Gltf Mesh Extra: Name: {:?}, entity {:?}, parent: {:?}, mesh_extras {:?}",
|
||||||
name, entity, parent, extra
|
name, entity, parent, extra
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if let Some(instance) = hierarchy
|
||||||
|
.iter_ancestors(entity)
|
||||||
|
.find_map(|p| scene_instances.get(world, p).ok())
|
||||||
|
{
|
||||||
|
fake_entity::INSTANCE_ID.set(Some(*instance.deref()));
|
||||||
|
} else {
|
||||||
|
warn!("Can't find higher-hierarchy `SceneInstance` for entity '{name:?}'");
|
||||||
|
fake_entity::INSTANCE_ID.set(None);
|
||||||
|
};
|
||||||
|
|
||||||
let type_registry: &AppTypeRegistry = world.resource();
|
let type_registry: &AppTypeRegistry = world.resource();
|
||||||
let mut type_registry = type_registry.write();
|
let mut type_registry = type_registry.write();
|
||||||
let reflect_components = ronstring_to_reflect_component(&extra.value, &mut type_registry);
|
let reflect_components = ronstring_to_reflect_component(&extra.value, &mut type_registry);
|
||||||
|
@ -113,12 +164,23 @@ pub fn add_components_from_gltf_extras(world: &mut World) {
|
||||||
entity_components.insert(target_entity, updated_components);
|
entity_components.insert(target_entity, updated_components);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (entity, name, extra, parent) in material_extras.iter(world) {
|
for (entity, name, extra) in material_extras.iter(world) {
|
||||||
|
let parent = hierarchy.get(entity).ok();
|
||||||
debug!(
|
debug!(
|
||||||
"Name: {:?}, entity {:?}, parent: {:?}, material_extras {:?}",
|
"Name: {:?}, entity {:?}, parent: {:?}, material_extras {:?}",
|
||||||
name, entity, parent, extra
|
name, entity, parent, extra
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if let Some(instance) = hierarchy
|
||||||
|
.iter_ancestors(entity)
|
||||||
|
.find_map(|p| scene_instances.get(world, p).ok())
|
||||||
|
{
|
||||||
|
fake_entity::INSTANCE_ID.set(Some(*instance.deref()));
|
||||||
|
} else {
|
||||||
|
warn!("Can't find higher-hierarchy `SceneInstance` for entity '{name:?}'");
|
||||||
|
fake_entity::INSTANCE_ID.set(None);
|
||||||
|
};
|
||||||
|
|
||||||
let type_registry: &AppTypeRegistry = world.resource();
|
let type_registry: &AppTypeRegistry = world.resource();
|
||||||
let mut type_registry = type_registry.write();
|
let mut type_registry = type_registry.write();
|
||||||
let reflect_components = ronstring_to_reflect_component(&extra.value, &mut type_registry);
|
let reflect_components = ronstring_to_reflect_component(&extra.value, &mut type_registry);
|
||||||
|
@ -128,6 +190,9 @@ pub fn add_components_from_gltf_extras(world: &mut World) {
|
||||||
entity_components.insert(target_entity, updated_components);
|
entity_components.insert(target_entity, updated_components);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fake_entity::BAD_WORLD_ACCESS.set(None);
|
||||||
|
fake_entity::INSTANCE_ID.set(None);
|
||||||
|
|
||||||
for (entity, components) in entity_components {
|
for (entity, components) in entity_components {
|
||||||
let type_registry: &AppTypeRegistry = world.resource();
|
let type_registry: &AppTypeRegistry = world.resource();
|
||||||
let type_registry = type_registry.clone();
|
let type_registry = type_registry.clone();
|
||||||
|
|
|
@ -6,4 +6,5 @@ license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bevy = { version = "0.14", features = ["dynamic_linking"] }
|
bevy = { version = "0.14", features = ["dynamic_linking"] }
|
||||||
|
bevy-inspector-egui = "0.25.2"
|
||||||
blenvy = { path = "../../crates/blenvy" }
|
blenvy = { path = "../../crates/blenvy" }
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -3609,6 +3609,30 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"typeInfo": "Value"
|
"typeInfo": "Value"
|
||||||
},
|
},
|
||||||
|
"bevy_egui::EguiSettings": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "bevy_egui::EguiSettings",
|
||||||
|
"properties": {
|
||||||
|
"default_open_url_target": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/core::option::Option<alloc::string::String>"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scale_factor": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f32"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"scale_factor"
|
||||||
|
],
|
||||||
|
"short_name": "EguiSettings",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
"bevy_gizmos::aabb::AabbGizmoConfigGroup": {
|
"bevy_gizmos::aabb::AabbGizmoConfigGroup": {
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"isComponent": false,
|
"isComponent": false,
|
||||||
|
@ -12776,6 +12800,14 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"typeInfo": "Value"
|
"typeInfo": "Value"
|
||||||
},
|
},
|
||||||
|
"core::ops::Range<f64>": {
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "core::ops::Range<f64>",
|
||||||
|
"short_name": "Range<f64>",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Value"
|
||||||
|
},
|
||||||
"core::option::Option<(u8, u8)>": {
|
"core::option::Option<(u8, u8)>": {
|
||||||
"isComponent": false,
|
"isComponent": false,
|
||||||
"isResource": false,
|
"isResource": false,
|
||||||
|
@ -13490,6 +13522,295 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"typeInfo": "Struct"
|
"typeInfo": "Struct"
|
||||||
},
|
},
|
||||||
|
"glam::BVec2": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::BVec2",
|
||||||
|
"properties": {
|
||||||
|
"x": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/bool"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/bool"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x",
|
||||||
|
"y"
|
||||||
|
],
|
||||||
|
"short_name": "BVec2",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::BVec3": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::BVec3",
|
||||||
|
"properties": {
|
||||||
|
"x": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/bool"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/bool"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/bool"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z"
|
||||||
|
],
|
||||||
|
"short_name": "BVec3",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::BVec3A": {
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::BVec3A",
|
||||||
|
"short_name": "BVec3A",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Value"
|
||||||
|
},
|
||||||
|
"glam::BVec4": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::BVec4",
|
||||||
|
"properties": {
|
||||||
|
"w": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/bool"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/bool"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/bool"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/bool"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z",
|
||||||
|
"w"
|
||||||
|
],
|
||||||
|
"short_name": "BVec4",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::BVec4A": {
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::BVec4A",
|
||||||
|
"short_name": "BVec4A",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Value"
|
||||||
|
},
|
||||||
|
"glam::DAffine2": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::DAffine2",
|
||||||
|
"properties": {
|
||||||
|
"matrix2": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DMat2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"matrix2",
|
||||||
|
"translation"
|
||||||
|
],
|
||||||
|
"short_name": "DAffine2",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::DAffine3": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::DAffine3",
|
||||||
|
"properties": {
|
||||||
|
"matrix3": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DMat3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"matrix3",
|
||||||
|
"translation"
|
||||||
|
],
|
||||||
|
"short_name": "DAffine3",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::DMat2": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::DMat2",
|
||||||
|
"properties": {
|
||||||
|
"x_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x_axis",
|
||||||
|
"y_axis"
|
||||||
|
],
|
||||||
|
"short_name": "DMat2",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::DMat3": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::DMat3",
|
||||||
|
"properties": {
|
||||||
|
"x_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x_axis",
|
||||||
|
"y_axis",
|
||||||
|
"z_axis"
|
||||||
|
],
|
||||||
|
"short_name": "DMat3",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::DMat4": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::DMat4",
|
||||||
|
"properties": {
|
||||||
|
"w_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::DVec4"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x_axis",
|
||||||
|
"y_axis",
|
||||||
|
"z_axis",
|
||||||
|
"w_axis"
|
||||||
|
],
|
||||||
|
"short_name": "DMat4",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::DQuat": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::DQuat",
|
||||||
|
"properties": {
|
||||||
|
"w": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z",
|
||||||
|
"w"
|
||||||
|
],
|
||||||
|
"short_name": "DQuat",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
"glam::DVec2": {
|
"glam::DVec2": {
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"isComponent": false,
|
"isComponent": false,
|
||||||
|
@ -13515,6 +13836,74 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"typeInfo": "Struct"
|
"typeInfo": "Struct"
|
||||||
},
|
},
|
||||||
|
"glam::DVec3": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::DVec3",
|
||||||
|
"properties": {
|
||||||
|
"x": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z"
|
||||||
|
],
|
||||||
|
"short_name": "DVec3",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::DVec4": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::DVec4",
|
||||||
|
"properties": {
|
||||||
|
"w": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/f64"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z",
|
||||||
|
"w"
|
||||||
|
],
|
||||||
|
"short_name": "DVec4",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
"glam::IVec2": {
|
"glam::IVec2": {
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"isComponent": false,
|
"isComponent": false,
|
||||||
|
@ -13540,6 +13929,74 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"typeInfo": "Struct"
|
"typeInfo": "Struct"
|
||||||
},
|
},
|
||||||
|
"glam::IVec3": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::IVec3",
|
||||||
|
"properties": {
|
||||||
|
"x": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/i32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/i32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/i32"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z"
|
||||||
|
],
|
||||||
|
"short_name": "IVec3",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
|
"glam::IVec4": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::IVec4",
|
||||||
|
"properties": {
|
||||||
|
"w": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/i32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/i32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/i32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/i32"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z",
|
||||||
|
"w"
|
||||||
|
],
|
||||||
|
"short_name": "IVec4",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
"glam::Mat2": {
|
"glam::Mat2": {
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"isComponent": false,
|
"isComponent": false,
|
||||||
|
@ -13565,6 +14022,37 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"typeInfo": "Struct"
|
"typeInfo": "Struct"
|
||||||
},
|
},
|
||||||
|
"glam::Mat3": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::Mat3",
|
||||||
|
"properties": {
|
||||||
|
"x_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::Vec3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::Vec3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z_axis": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/glam::Vec3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x_axis",
|
||||||
|
"y_axis",
|
||||||
|
"z_axis"
|
||||||
|
],
|
||||||
|
"short_name": "Mat3",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
"glam::Mat3A": {
|
"glam::Mat3A": {
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"isComponent": false,
|
"isComponent": false,
|
||||||
|
@ -13726,6 +14214,43 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"typeInfo": "Struct"
|
"typeInfo": "Struct"
|
||||||
},
|
},
|
||||||
|
"glam::UVec4": {
|
||||||
|
"additionalProperties": false,
|
||||||
|
"isComponent": false,
|
||||||
|
"isResource": false,
|
||||||
|
"long_name": "glam::UVec4",
|
||||||
|
"properties": {
|
||||||
|
"w": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/u32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/u32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/u32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"z": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/$defs/u32"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z",
|
||||||
|
"w"
|
||||||
|
],
|
||||||
|
"short_name": "UVec4",
|
||||||
|
"type": "object",
|
||||||
|
"typeInfo": "Struct"
|
||||||
|
},
|
||||||
"glam::Vec2": {
|
"glam::Vec2": {
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"isComponent": false,
|
"isComponent": false,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
use bevy_inspector_egui::quick::WorldInspectorPlugin;
|
||||||
use blenvy::{BlenvyPlugin, BlueprintInfo, GameWorldTag, HideUntilReady, SpawnBlueprint};
|
use blenvy::{BlenvyPlugin, BlueprintInfo, GameWorldTag, HideUntilReady, SpawnBlueprint};
|
||||||
|
|
||||||
#[derive(Component, Reflect, Debug)]
|
#[derive(Component, Reflect, Debug)]
|
||||||
|
@ -17,6 +18,7 @@ fn main() {
|
||||||
.add_plugins((
|
.add_plugins((
|
||||||
DefaultPlugins.set(AssetPlugin::default()),
|
DefaultPlugins.set(AssetPlugin::default()),
|
||||||
BlenvyPlugin::default(),
|
BlenvyPlugin::default(),
|
||||||
|
WorldInspectorPlugin::new(),
|
||||||
))
|
))
|
||||||
.register_type::<TupleRelations>()
|
.register_type::<TupleRelations>()
|
||||||
.register_type::<BigRelations>()
|
.register_type::<BigRelations>()
|
||||||
|
|
|
@ -26,7 +26,7 @@ def property_group_from_infos(property_group_name, property_group_parameters):
|
||||||
return (property_group_pointer, property_group_class)
|
return (property_group_pointer, property_group_class)
|
||||||
|
|
||||||
def is_entity_poll(self, object):
|
def is_entity_poll(self, object):
|
||||||
return bpy.context.scene in object.users_scene # TODO: only select `object.type`s that get converted to entities and maybe something against other collection(instances)?
|
return True # TODO: only select `object.type`s that get converted to entities and maybe something against other collection(instances)?
|
||||||
|
|
||||||
# this is where we store the information for all available components
|
# this is where we store the information for all available components
|
||||||
class ComponentsRegistry(PropertyGroup):
|
class ComponentsRegistry(PropertyGroup):
|
||||||
|
|
Loading…
Reference in New Issue