#Blenvy

1 messages Β· Page 4 of 1

dawn shell
#

ah, found it

#

I see it was just renamed πŸ™‚

#

Installed it, got no errors, but the N menu seems to be incomplete

#

Let's close and restart

#

Aaand Blenvy is gone

#

ah, it was disabled

#

cannot enable

#

that concludes my testing πŸŽ‰

#

Using blenvy from the current blenvy branch

#

And Blender 4.2.0

steel vortex
#

I'm using this hook to add input actions with Leafwing Input Manager but getting a crash inside blenvy thread 'main' panicked at ~/.cargo/git/checkouts/blenvy-b36e3bfafcd31d12/c4d8e02/crates/blenvy/src/blueprints/copy_components.rs:73:60

#[derive(Reflect)]
#[reflect(Component)]
struct Player;
impl Component for Player {
    const STORAGE_TYPE: StorageType = StorageType::Table;

    fn register_component_hooks(hooks: &mut ComponentHooks) {
        hooks.on_add(|mut world, entity, _| {
            world
                .commands()
                .entity(entity)
                .insert(InputManagerBundle::with_map(
                    PlayerAction::default_input_map(),
                ));
        });
    }
}

Is this the wrong way to go about something like this?

#

I'm wondering if the issue is
A: because the blueprint is still being constructed while this happens and blenvy doesn't like that
B: InputMap doesn't have a #[reflect(Component)] (should it? I haven't really understood yet how the reflection works)
Guess I have to modify the libraries and see.

round cove
#

in this scenario you aren't sending the input map or any leafwing stuff to/from blender, its being added after you spawn a blueprint with the Player component, so that's all bevy-side afaik.

#

I've seen some copy warnings before but never a crash

steel vortex
#

Yeah true I just mean it looks like the hook is called before the blueprint of the world has been spawned yet. I'm getting this warning as well WARN bevy_ecs::world::command_queue: CommandQueue has un-applied commands being dropped. right before the crash.

#

Or "right before the crash" is maybe ambiguous. The panic happens before that, it's just the last log.

dawn shell
round cove
#

I just tried to trigger the crash and couldn't

#

I'm on commit #d08c2351 right now

#

(from cargo tree -i blenvy)

steel vortex
steel vortex
dawn shell
round cove
#

or could it be caused by a different type

steel vortex
#

I registered both PlayerAction and InputMap<PlayerAction> (although looking through leafwing input manager it registers InputMap<A>).

#

It doesn't crash if I swap out with another component at insert.

#

Found it. It was the #[reflect(Component)] on the Player that caused it.

#

And that probably makes sense I guess... I'm deriving behavior reflection while implementing it as well. πŸ€”

#

(I didn't understand what #[reflect(Component)] meant until half an hour ago)

round cove
#

isn't reflect(component) required for it to show up in blender though?

#

pretty sure your registry.json will show Player as no longer being a component without it

steel vortex
#

Yeah have to check. It changed isComponent to false in the registry.

round cove
#

the component reflection is the data that blenvy is trying to access in the above source link

steel vortex
#

Oh I see... Yeah now it disappeared from Blender...

dawn shell
#

Could you try adding the other derives I have that you're missing?

round cove
#

I have components without Clone/Copy that this approach is working with, so I don't think its that

dawn shell
#

It cannot be the Debug, right? right???

steel vortex
round cove
#

I removed Debug from mine earlier to check lol

#

definitely at the "wtf, maybe its this set of characters" debugging level

#

I'd start putting in some extra logs when its fetching the component reflection data at this point

steel vortex
#

But it's the PlayerAction more like causing the issues I think because when I printed in blenvy it was the InputMap<PlayerAction> showing up as None. And it's not a Component. Should it be? I added the reflects on PlayerAction just in case but it didn't help.

#

Currently looking like this

#[derive(PartialEq, Eq, Hash, Clone, Copy, Debug, Reflect)]
enum PlayerAction {
    Move,
    Jump,
}
#

Tried this as well

#[derive(PartialEq, Eq, Hash, Clone, Copy, Debug, Reflect, Component)]
#[reflect(Component)]
enum PlayerAction {
    Move,
    Jump,
}
steel vortex
#
impl Actionlike for PlayerAction {
    fn input_control_kind(&self) -> InputControlKind {
        match self {
            PlayerAction::Move => InputControlKind::DualAxis,
            PlayerAction::Jump => InputControlKind::Button,
        }
    }
}
dawn shell
#

Ah, alright

steel vortex
#

I tried just deriving that one as well.

dawn shell
#

This is some spooky stuff we're getting into πŸ‘€

steel vortex
#

I tried every permutation I could think of about an hour ago πŸ˜…

round cove
#

have you enabled the debug level logging yet?

#

there's a number of debug-level logs right before the blenvy line that panics

#

you'll probably want to filter it to exclude wgpu and such

#

something like

RUST_LOG=none,blenvy=debug
steel vortex
#

It's not giving me anything more.

#

There doesn't seem to be that many debug! in blenvy.

#

Ok there were some really long ones above

#

DEBUG blenvy::blueprints::copy_components: cloning: component: "leafwing_input_manager::action_state::ActionState<squash_the_creeps::PlayerAction>" TypeId(0x7245a2970c27aa0a8018f94f98411672)

#

This got too long for discord but it's dbg! for the InputData component that is failing. Not sure if it's useful.

round cove
#

that looks cut off, which debug log is that?

#

if its too long for discord, throw it in a gist or similar

#

ah shoot I was on the wrong branch to link to that sadcowboy

steel vortex
round cove
#

oh gotcha, so you don't actually see any of the debug logs

steel vortex
#

I see them as well but some of them are huge. I can post them in another text file. Just a sec.

round cove
steel vortex
round cove
#

I have a hunch, gonna try it out in my project

round cove
#

I am unable to make it crash

#

what is the Player component attached to in your scene?

#

is it on a blueprint that is then instanced into the scene?

#

aha!

#

that is the way to make it crash

round cove
# steel vortex

workaround is to place the Player component on the instance, not the blueprint for now

brazen ermine
#

Quick question, if my game doesn't have a physical "Player" its just a camera that moves through the sky should i just spawn it in code and not bother with adding it with Blenvy

round cove
#

its up to you I think. I could see valid reasons for both

#

my game using blenvy currently uses a code-spawned camera and it works fine that way

#

but I could imagine if I needed many fixed perspectives or something like that that I would want to set them up in blender

brazen ermine
#

Yeah, i can't really see a reason i'd need it in blender, its a City-Builder type game that may eventually spin-off into a seperate RTS game.. the camera just needs to move from edge to edge and have a x/y limit and maybe simple rotation.

dawn shell
round cove
dawn shell
round cove
#

If I just filter out any components that don't have .data, the relevant components still show up anyway

#

so I'm not even sure that we'd need the data because this would be already handled by the component hook adding the components

dawn shell
round cove
#

I think blenvy is "instantiating" the blueprint somehow, which results in the components being applied via the hook, which then attempts to copy the component info for all components on the entity, which can't be done because there's no .data, but if you just skip that then the hook adds the needed components anyway

#

is blenvy using a separate world for spawning blueprints and then copying them over?

round cove
#

what are we calling blenvy marker component hooks?

#

I guess "blenvy marker component with hooks" isn't bad.

round cove
#

tldr it feels like there are two points that can customize the active component set for an entity: when loading the blueprint and when instantiating it. Right now component hooks run at both times, but it may be worth adding a BlueprintInstantiated observer event to only customize the instantiation phase component set.

ebon zealot
rich helm
#

Re our discussion yesterday: I was able to override components on linked blueprints just fine. Yesterday I tried to add the components onto the linked sub-collection itself, but today I added it onto the parent and everything worked OK. Thanks for the help!

ebon zealot
# dawn shell And Blender 4.2.0

Thanks for trying it out !
So I tested it again after seeing your results and it now also fails on my end because ...I closed blender and restarted it again πŸ˜„ so the bad news is , Blender 4.2 does not seem to clean up things correctly, and it would indeed be a good idea to tell users to restart Blender after installing the add-on ...sigh
In the mean time I will be working on this specific issue (4.2 + manifest)

ebon zealot
round cove
dawn shell
round cove
#

it does have the panic, so we could just change the message

#

I'll write a PR for that at least

#

I closed the investigation issue, since blenvy doesn't have to do anything right now, but it may be useful to consider that there could be an observer event to separate instantiation from loading if its ever needed

#

I wonder if the loaded blueprint would get added to a spatial index, for example, when using hooks

#
thread 'main' panicked at /Users/chris/github/kaosat-dev/Blenvy/crates/blenvy/src/blueprints/copy_components.rs:78:29:
type "leafwing_input_manager::action_state::ActionState<wash_cycle::leafwing_test::PlayerAction>"'s ReflectComponent data was not found in the type registry, this could be because the type is missing a #[reflect(Component)]
dawn shell
round cove
dawn shell
#

thanks a bunch πŸ˜„

steel vortex
steel vortex
round cove
steel vortex
#

I modified LWIM. I also reflected everything I could in my local project.

#

Oh wait nevermind. It's crashing on something else now. I just saw it crashing and didn't even look at the message. That part seems to work fine then.

pulsar whale
#

Hey all, I'm trying to follow the quickstart guide and the add-on menu seems to be a bit weird for me

#

Clicking most of the icons doesn't seem to change anything for me

dawn shell
pulsar whale
#

Tried a couple times, no dice 😿

dawn shell
#

Are you using Blender 4.2 on English?

pulsar whale
#

Ope, I'm on 4.0.2, let me update

dawn shell
steel vortex
dawn shell
#

@ebon zealot, correct if what I'm about to write is outdated

#

But AFAIK, Blenvy does not set your Bevy camera's FOV at all, so you'll have to manually set it if you want it to match Blender

#

However

#

there values are not really useful for that

#

So first, you change the Lens Unit to "Field of View"

#

Then set that to match your angle in Bevy

steel vortex
#

Do you know what the default FOV is in Bevy on the top of your head?

dawn shell
#

Note that Bevy uses radians and blender degrees

dawn shell
#

Which makes it 180 / 4 = 45, which is pretty low

#

Now, second caveat, and this one is not documented anywhere AFAIK

steel vortex
#

Yeah weird that it looks different then when it should be 40 but it's way too zoomed in from the same distance.

dawn shell
#

this setting here does not correspond to Bevy

#

Set it to Vertical!

#

I think the default height is correct, but don't quote me on that

dawn shell
#

let me experiment real quick

#

Yeah, my memory was correct

#

this setup will match Bevy's default

#

Blender (the orange rectangle is the camera)

#

Ignore the fact that the physics objects fell down πŸ˜„

dawn shell
steel vortex
#

Ok now I see what's going on. When I switch to vertical the FOV jumps to a lower value. So putting it back to 40 after the switch looks more reasonable.

dawn shell
#

If not, I made a mistake somewhere

#

(If you've set your FOV in Bevy to 40. The default is 45)

dawn shell
rich helm
#

The camera FOV and all the lighting ”strengths” in Blender sure are confusing when trying to match Bevy πŸ˜„

dawn shell
#

I upstreamed my experiments to make the ambient color somewhat match Blender, but it’s still obviously not the same

dawn shell
steel vortex
#

Isn't the registry.json file supposed to update every time I add a component and do cargo run?

dawn shell
grim lance
#

...can I also ask questions about the codebase here? πŸ˜…

dawn shell
steel vortex
grim lance
#

first of all, python is, in my eyes, objectivelybad

dawn shell
ebon zealot
grim lance
#

There is a nested check for fields but it's always set on True?

dawn shell
ebon zealot
dawn shell
#

With the caveat that Blender's default are, in my humble opinion, completely bonkers

grim lance
#

@ebon zealot ||no, I havent edited this in, this is here from the original message||
and how does this propertyGroup stuff work?
I have a bool in process_components that is true, checked it via print statements, how else of course. I also store it in the dict down below.
but when I get that bool in draw_propertyGroup, it is always false... is there any intermediate step that I am not seeing?

#

also, with that dict, does that mean that having a field named with_enum bricks the system?

ebon zealot
dawn shell
dawn shell
#

Or maybe it should be an opt-in?

#

Idk

ebon zealot
dawn shell
#

TIL

#

Aaah, the "export scene settings" stuff, right?

ebon zealot
ebon zealot
grim lance
#

so my plan is to try relations, e.g. for an Entity field, have the option to either still specify an integer, or drop in a reference, and then somehow resolve that reference when loading the gltf.

I now check for is_entity = long_name == "bevy_ecs::entity::Entity" and put that in the dict, but getting getattr(propertyGroup, "is_entity") will never get me true

ebon zealot
grim lance
#

rust -> wasm -> python should be a thing

#

actually, now I wanna know if i can write rust addons for blender

ebon zealot
dawn shell
ebon zealot
dawn shell
#

Which is a bit worrying, given that I added that feature in the first place

#

For example, in Crazy Bike, I wanted to have a 14:00 sunny day, blue sky kind of mood

#

but setting that in Blender and exporting it results in something either too dark or too bright in Bevy

ebon zealot
#

@grim lance suggested moving the registry.json file out of assets into art which ... I find makes a lot of sense, as it is only used at dev time as far as I recall ?

dawn shell
#

Of course, we could add a toggle for each "match Blender" option, but I imagine setting that up would be a bit annoying

ebon zealot
dawn shell
dawn shell
ebon zealot
ebon zealot
ebon zealot
dawn shell
ebon zealot
dawn shell
#

At least, as far as I could tell

#

If the rest of the lights are wrong, the ambient is at least more obviously wrong

dawn shell
#

(except for the shadows)

ebon zealot
# dawn shell exactly

Ok, in that case, give me a bit of time, I think I should be able to trace down what I found a few months ago, (I tend to use very strong colors, so I should be able to find it again)

dawn shell
grim lance
dawn shell
ebon zealot
dawn shell
#

The shadow cascade settings are still a bit of a mystery to me

ebon zealot
# grim lance

Thanks for sharing ! It seems like it should work at a glance, I'll try it out locally and figure it out

ebon zealot
ebon zealot
dawn shell
ebon zealot
ebon zealot
dawn shell
# ebon zealot hahaha πŸ˜„ well I did not even notice it at all ! so it might be "creator's obse...

The movement in the game is so frantic that many small things are extremely hard to notice.
On one hand, the issues with the character models and the shadows are not noticeable at all
On the other hand, my little environmental details I carefully placed are not noticeable either πŸ˜„
For instance, I bet most players did not notice that there are quite a few posters on the walls in alleyways

ebon zealot
#

I think I'll add this one to the release too : https://github.com/kaosat-dev/Blenvy/issues/226
I am BAD at anything animation related (I do not understand most of it) , but separating animations for reuse, makes WAY more sense than the current implementation

GitHub

For example, suppose I have 20 different character rigged models with the same skeleton, all using same set of animations. (For example, if I want to make a game like Baldur's Gate which has ma...

round cove
ebon zealot
round cove
#

I guess if its dev-time only I shouldn't be comitting it either

ebon zealot
dawn shell
ebon zealot
dawn shell
round cove
dawn shell
#

Be like "Blenvy expects .blend files to be in the art dir." and allow configuring it in the future if people need it and you have time

round cove
#

feels weird to force a directory for .blend when you can configure locations anyway

#

git isn't great at large assets, so what if you do some alternative storage for art assets

dawn shell
round cove
#

other storages are flexible so force them to be art/?

dawn shell
#

Idk πŸ€·β€β™‚οΈ

round cove
#

seems like unnecessary restriction

dawn shell
#

I mean, from a point of view where configuration is free, totally

#

But from the point of view where that means dealing with things like "where can the registry go" and such, it's worth questioning if that is something Blenvy needs for an alpha

#

Imo it's better to start simple and then expand configuration options

#

Often you find a simpler solution along the way

round cove
#

its already configurable? so is no work to leave it the way it is right?

dawn shell
round cove
#

for registry.json, it probably belongs in target/ anyway

#

if its going to be moved

dawn shell
round cove
#

anywhere in target/. target/blenvy/registry.json would work too

#

if we're saying its a dev-time-only build artifact is my thought process

dawn shell
#

That's fair, but you can override cargo's output dir

round cove
#

yeah, and that's available via an env var right?

dawn shell
#

No clue actually

round cove
#

it is in build scripts at least

dawn shell
dawn shell
#

Kinda fits, because a user doesn't even need to see that file in their working environment

ebon zealot
ebon zealot
dawn shell
round cove
dawn shell
#

Secret option: just create a .blenvy dir that contains files managed by blenvy that the user shouldn't manually touch

round cove
#

I think if you're configuring the location of target/ you can be expected to configure the location of target/ for blenvy right?

dawn shell
#

Just saying that that configuration needs to be present on the Blender side as well

round cove
#

(I'm not against .blenvy either, but the js ecosytem has so many root-level dotfiles)

dawn shell
ebon zealot
ebon zealot
dawn shell
#

The more I think about it, the more I like @round cove's idea of using the target (or whatever output) dir

steel vortex
dawn shell
#

If you feel like it, I'm sure @agile bear would appreciate upstreaming something like that type in bevy_rapier πŸ™‚

steel vortex
#

Yeah I might try my hand at that tomorrow then. I just actually wanted rapier instead for the character controller and I only need the sphere and cube shapes currently. Looking at the code it looks somewhat straightforward but I'll start with the simple shapes first and see how far I get.

final aspen
#

@ebon zealot just upgraded to Blenvy and just wanted to say nice work. it works amazingly

grim lance
#

hrmm... that could be a reason why I hadn't had success yesterday.... did the ID change somehow?

#

now the question.... which one is which? :p

#

good news: I now use the correct blender addon
bad news: still doesn't work :c

grim lance
# grim lance

this patch file, tried to replace the number picker with something different for bevy_ecs::entity::Entity

#

but the getattr("is_entity") is always false, even when the one I put in the dict is true for one entity

steel vortex
# steel vortex Yeah I might try my hand at that tomorrow then. I just actually wanted rapier in...

Haven't been able to get this to work since Collider is not reflected in bevy_rapier and that depends on SharedShape inside parry which obviously is not reflected. Is a newtype around SharedShape with manual impl of Reflect (and TypePath) needed in this situation? Seems you cannot put #[reflect(Component)] unless you derive the Reflect trait? Is there some good reference to see anywhere to see how this is generally done?

hollow dove
steel vortex
# hollow dove That's exactly what the `ColliderConstructor` component in Avian is for; it's es...

Oh right yeah. The problem is that copy_components in blenvy yells at me when it tries to copy the shape at some point. I've looked at how ColliderConstructor is done in Avian and it seems to create colliders once it finds ColliderConstructor components in Update. I tried to do it with a hook instead. Maybe that's causing the difference here then. I don't see explicitly how avian gets around this problem with blenvy so that's why I got confused about the Collider reflection.

#

Ok yeah it doesn't complain anymore if I do it in Update instead.

#

(One thing I noticed before with Avian is that dropping a box straight down causes it to almost topple over. Now I can see with Rapier that it just drops straight down as I imagine is more physically accurate. I'm sure you're already aware of this but just wanted to mention it since it was pretty apparent right away that something was off.)

#

(Also rapier objects seem to become twice the size with the same params, which I guess would be slightly annoying for users switching back and forth between the two. No my bad, it was just the cuboid API using half extents in rapier.)

hollow dove
grim lance
hollow dove
hollow dove
#

*or Rapier has Collider::ball which is also different from Bevy

hollow dove
dawn shell
dawn shell
brazen ermine
#

i'm going to assume this to be a blenvy specific issue, if i use cargo run the game will launch just fine, if however i directly launch the game executable from the debug target it will fail to find the World file becaused its looking for it in ../target/debug/assets/level/World.gllb and clearly it isn't there am i expect to manually copy it over and if so that presents a interation challenge because it means everytime i build the game the assets could chance and need to be copied

dawn shell
brazen ermine
grim lance
ebon zealot
steel vortex
dawn shell
steel vortex
#

What's interesting also is that the colliders didn't work when I got the warning but adding a KinematicCharacterController in a hook and getting the same warning, that controller seems to work. The hooks are for two different components (Player hook works but "MyColliderConstructor" doesn't). Something strange seems to be going on.

2024-08-11T18:57:17.744200Z  WARN blenvy::blueprints::copy_components: cannot clone component: component: "bevy_rapier3d::control::character_controller::KinematicCharacterController" is not registered
2024-08-11T18:57:17.744521Z  WARN blenvy::blueprints::copy_components: cannot clone component: component: "bevy_rapier3d::geometry::collider::Collider" is not registered
#

Maybe it has something to do with the ordering of how things are added with regards to rigid body and collider? I'm guessing you always have to add the rigid body first (or the other way around)? So the hypothesis might be that collider was added to an object first which is not allowed.

#

What is actually not working in the MyCollisionConstructor case is that the rigid body isn't moving and the not the collider either. So presumably it is the rigid body component that breaks.

#

Actually there is a slight complication because the working example has the collider on a child entity of the rigid body entity. But assuming the parent is spawned first (?) that shouldn't change what I said above.

pulsar whale
#

Hey all, I'm just now getting Blenvy set up in a project (the improvements are all great btw) and I had a question about some components used in the quickstart

#

Just wondering what HideUntilReady and GameWorldTag actually do

#

My assumption is that HideUntilReady is just waiting until the scene has loaded to toggle visibility, but I'm a bit lost on GameWorldTag

dawn shell
pulsar whale
#

For that reason, does it make more sense to just use the blueprint bundle for things that aren't a full world?

dawn shell
pulsar whale
#

And something not related, have you guys taken a crack at building animation graphs for blueprints that contain an armature? If not I may take a crack at a PR

ebon zealot
dawn shell
dawn shell
pulsar whale
#

I wouldn't get too excited, i'm still a fledgling rust dev, but I would love to help out with such a great crate (and hopefully an upstream candidate)

ebon zealot
ebon zealot
pulsar whale
ebon zealot
ebon zealot
pulsar whale
#

also @ebon zealot do you have github sponsor set up?

ebon zealot
dawn shell
#

Ping me when you have GH sponsor stuff

#

I just gained a sponsor recently and would like to funnel some of that to you

ebon zealot
ebon zealot
#

Btw does anybody know if non-armature based animations are also reusable ?

pulsar whale
#

I don't know for certain but my guess would be no

ebon zealot
pulsar whale
#

Let me dig around and see If i can find a more concrete answer

dawn shell
#

I've never worked with non-armature animations

#

What are they used for?

#

Are they like morph targets?

ebon zealot
dawn shell
#

Like for making a cube follow a line?

ebon zealot
dawn shell
#

I didn't know those could be exported

#

I remember specifically not using them because I thought "yeah, sounds like some Blender-specific thing that's not supported anywhere else"

#

Good to know that is apparently not the case!

round cove
#

I've been staring at morph targets intending to figure them out for about a week, so might look into that soon

dawn shell
ebon zealot
dawn shell
ebon zealot
#

Honestly I 100% get why Bevy has per domain (assets, animation etc) "specialists", my brain is splitting from all these specific topics

dawn shell
#

I can imagine

#

I can be your SME for finding bugs that don’t happen on your machine πŸ˜›

ebon zealot
ebon zealot
round cove
#

||I think that enough people are downloading/trying to use it that directing them towards an alpha release is effectively already happening. so having a single crates.io/zip to point to would be helpful more than hurtful. Then bugs don't have to stream in constantly, but rather people who aren't comfortable with main-branch dev can just wait for a release too.||

#

spoilered because its technically a vote

dawn shell
open steeple
#

i think what's more important is making a video that explains how to use and what's unfinished/bugged

dawn shell
open steeple
#

it wouldn't have a version if there was no code

dawn shell
open steeple
#

ok fair enough

#

0.0.2 then

grim lance
grim lance
#

For the animation, I am currently using single bone armatures, linking the bone to the object and modifying the bone in the animation. Never thought of doing that directly but I dont think it works with bevy..

#

Having the animations split up will be interesting.. I was planning to do an β€žasset chainβ€œ where I would load the gltf, get animations by name and construct them together there. Having the possibility to load them directly makes this much easier

#

Oh wait you export every single armature, right? So animations are still packed together :c

ebon zealot
# grim lance Having the animations split up will be interesting.. I was planning to do an β€žas...

I am currently just experimenting with splitting animations/ armatures out, so not opposed to exporting each animation out , if it makes sense and mostly if it is even possible. Not sure if I could even extract them out on the Blender side. My understanding was that most people want to reuse armatures and their animations.
There is also the issue with non armature animations, which I have no idea how to handle atm πŸ˜…

grim lance
#

Non armature animations might not even work with bevy so…

ebon zealot
grim lance
#

Either way, I am so confused with blender animations, there are like 4 editors for different things but everything feels like one timeline when you not found that special hidden button that lets you seperate clips… meh

ebon zealot
grim lance
ebon zealot
# grim lance my idea was to have an object picker with `layout.prop_search` and a button next...

Ok, that sound like a good idea, in practice it will not be easy (hurray for Blender's convoluted internals)

  • so the reason why you are not seeing the is_entity in the UI, is because Entity is considered a value type by Blenvy (as it is just an id), and handled differently : ie your Entity is just a field so it is displayed here
  • value types are handled differently when processed: see here for example
  • value types are currently essentially hardcoded for convenience see here and here
grim lance
#

prepares to read a trilogy

#

huh? But for it to get down there it has to recursively call draw_propertyGroup first, doesn't it?

ebon zealot
ebon zealot
grim lance
#

but doesn't it in the end need more boilerplate when you stop at value types?

#

so

struct Testtt {
  lol: Entity,
}

would work?! 😭

#

also, the default for bool is false in rust πŸ€“

#

thanks for the links, lets see how much good I can do this πŸ˜„

#

funny how you change so often between presets=, and "presets":

ebon zealot
ebon zealot
grim lance
#

no worries, I might have a hot path :0

#

...or not

ebon zealot
grim lance
#

so I now can get rid of the integer, but it should already display a picker :c

ebon zealot
grim lance
#

oh I got an error πŸ˜› didn't even know python has those

#

wait... my is_entity gets triggered now? whut ._.

#

so... I got collapsing back... from removing the is_entity check.... that makes no sense at all

#

YEEEEEEEEEESSSS πŸŽ‰

#

thanks for your help πŸ˜„

#

it was trivial at the end, some cleanup made it way easier πŸ˜›

dawn shell
grim lance
#

references, yes

grim lance
grim lance
#

why does conversions_to_prop_group exist and what does it do / is it used for?

ebon zealot
grim lance
#

huh? blender doesn't directly store the property groups on the objects? O.o

ebon zealot
grim lance
#

"oh no, I dropped a value.. meh, it's only 12 cents" or what 😭

ebon zealot
grim lance
#

oh..

#

problem is.. how do I serialize a reference to an object for a blend file? O.o

ebon zealot
# grim lance problem is.. how do I serialize a reference to an object for a blend file? O.o

you mean a reference to an object inside a blend file ? .... I have bad news :

  • references to objects are not stable in Blender, so you need to use ....their names
  • oohh but then again, names can be changed ! , so that is not reliable or requires a ton of workarounds
  • perhaps objects have an immutable ID that could be used ? NOPE
    (in case that was not clear, this is an issue I hit over and over and over again ....) 😱

So I am currently still looking for a way to generate unique ids for objects (and scenes , need that there too) that do not get copied when an object is duplicated
There are a few possible solutions that I have not yet had time to try out, I am off for now but I can share the links later

#

I should just rename the Blender part of Blenvy to "I suffered through months of illogical design and code so you won't have to " πŸ˜„

grim lance
#

well I found a help forum post that says since 2.79 it's possible via PointerProperty, which is what I use, so no direct name. It behaves like a Pointer, but no clue what it does on the inside

#

actually, I'll try to rename the mesh I picked

#

lets see what happens

#

name gets updated, they are really related πŸ˜„

#

noice

ebon zealot
grim lance
#

so no saving of relations? :c

#

or should I save the name because it can't change as long as it's not open?

#

still, the "values sometimes get dropped" seem weird to me.. is there any article / forum thingy about this?

ebon zealot
grim lance
#

not really

#

I would store 0 as the entity and add an additional prop that relates to the other gltf node...

ebon zealot
grim lance
#

hmm... maybe I need to think about that for a bit longer, what about multiple entities?

ebon zealot
grim lance
ebon zealot
grim lance
#

no I have no idea if this works

ebon zealot
grim lance
#

😭

ebon zealot
grim lance
#

well then it will be the id πŸ˜„

#

so name for .blend save and id for .gltf export?

grim lance
#

for conversions_to_prop_group, should I use the name of the object? but then id when exporting

grim lance
#

ok so.... I don't have any clue why it works.. but it works..

#

now I just need to actually make the id system export and bevy side work πŸ˜„

pulsar whale
ebon zealot
#

Tweaking a few minor things before the release.
As part of the release I will:

  • merge the Blenvy branch into main
  • close a ton of tickets in the process ( a bit unorthodox for an alpha but will allow me to have a better overview of the current issues, not ones already resolved)
  • tag & release the Bevy crate & the Blender add-on
ebon zealot
#

Could somebody kindly try to create a zip file of the Blender add-on from the Blenvy branch & try it out under Blender 4.2 ? Double checked a few times, but want to be 100% sure it works out of the box before releasing . Thanks !

ebon zealot
# ebon zealot
poll_question_text

Lots of bugs & missing features (save-load broken, split animations unfinished, lacking docs etc) , should I still release the alpha1 as it is and continue working from there ?
(ie crate on crates.io with the alpha1 version, matching Blender add-on)

victor_answer_votes

10

total_votes

10

victor_answer_id

1

victor_answer_text

Release alpha1 now as it is

grim lance
#

Stupid idea for post-Alpha, we could introduce bevy as a render engine.. will not be easy, because we somehow get to get all resources etc… and when there’s custom renderers whooops.. we would basically have to link to the game, add all our controls and hope that players don’t just use Camera, but Camera, With<PlayCamera> queries instead

final aspen
ebon zealot
tender oyster
#

Adding/removing components also works

ebon zealot
round cove
dawn shell
#

Can confirm the "copy paste ColliderContructor fails" bug is still there, but I assume you didn't try fixing that

#

Contrary to what we suspected before, it seems like the target doesn't need to be an empty, as you can see from my selection

#

And this was what I copied

#

These are all old news, just used the opportunity to test out different targets to gain a bit of information on the bug πŸ™‚

dawn shell
#

I also notice that the addon is now called Blenvy instead of blenvy in my list, which is a nice confirmation that I indeed installed the right thing πŸ™‚

#

Does this mean you can publish the addon on https://extensions.blender.org/ now? πŸ‘€

glacial terrace
#

ls

tender oyster
#

What will happen when a user will try to use the newest blender blenvy plugin and older bevy blenvy library? Or vice versa. There should probably be some compatibility check implemented before the stable blenvy release (not alpha) to prevent some weird bugs or maby mentioning this in a readme is enough.

ebon zealot
ebon zealot
ebon zealot
#

So folks, you might have noticed that the alpha is STILL not out : I found a nasty bug yesterday that could "brick" your Blenvy setup on the Blender side (not really brick it, but reseting things would be tedious until I add "reset to factory defaults"), and I have a little cherry on top feature I wanted to squeeze in , but it is almost all ready πŸ™‚

dawn shell
ebon zealot
dawn shell
#

Otherwise, cargo update could result in undefined behavior

dawn shell
# ebon zealot ?

If only the exact same versions are guaranteed to work together, updating the Bevy side from 0.1.0 to 0.1.1 without updating the Blender addon is undefined behavior

ebon zealot
dawn shell
#

Imo it’s fine if you just specify that the bevy and blender version must be EXACTLY the same, semver be damned

#

Just need to make a user aware that they need to update their Blender version after they innocently did a cargo update and accidentally (and correctly!) updated Blenvy through that

#

This is very similar to how wasm-bindgen works, btw

#

Their crate and CLI will refuse to work unless they have the exact same version, and they always release both in perfect lockstep

ebon zealot
ebon zealot
#

Hmm, what could these features be ? 😲

tender oyster
ebon zealot
# tender oyster "Start editing blueprint" on selected blueprint instance switched scene and allo...

Bingo ! It was an awesome feature created by @jolly crypt in a fork of Blenvy, which I made a few QOL changes to (you can jump between the main scene & editing a blueprint and back using the same keyboard shortcut)
it also :

  • if nothing is selected it will automatically a new empty Blueprint & an instance & start edit mode
  • it selects the root collection of your blueprint automatically to make it even easier to place components
  • it saves & resets your viewport camera when jumping between main scene & editing scene
  • a lot more !
ebon zealot
tender oyster
#

Nice features!!
Waiting for the alpha release, raleeeeseeeesee...πŸ˜ƒ

ebon zealot
dawn shell
#

No more searching my giant library for the right thingy!

#

Can the camera save and reset trick be used for the bug where saving the file causes you to exit the numpad zero view?

ebon zealot
dawn shell
ebon zealot
#

So , I 'm done with the last few tweaks & testing, pushing them & releasing
Disclaimer: I am dead tired, so I might make a huge mistake somewhere, so there might be another alpha realy fast if I mess up πŸ˜„

#

(also , nope , not STRESSED at all to do a first release after so many months, even if it is an alpha)

dawn shell
#

Heck πŸ˜„

ebon zealot
#

publish dry run no happy !

#

crap, I just saw I forgot to update the quickstart to match the release too 😦

dawn shell
#

Now that the jam is over, I can try updating Crazy Bike to the released alpha on the weekend or so πŸ‘

dawn shell
#

The hyperlink on docs.rs is probably broken anyways since it’s local, so you can just change it on GitHub

ebon zealot
grim lance
dawn shell
ebon zealot
# ebon zealot Damn

I am stumped on this, I added bevy_animation to the features (was missing and never caused problems ? odd) but the problems with publish are still the same

#

also seems coherent ?

dawn shell
#

Try cargo update?

#

Good thing to do before a release anyways

ebon zealot
dawn shell
#

Not sure actually

#

I would have expected it to respect the lock file

ebon zealot
dawn shell
#

But then again, cargo install only does that when adding --locked, so πŸ€·β€β™‚οΈ

ebon zealot
#

ok , so I stand corrected, it seems to have fixed almost all problems:

ebon zealot
#

Ok this is hilarious, found the answer in one of my own posts from last year πŸ˜„

#

Bingo !

ebon zealot
#

@dawn shell for the quickstart, cargo add blenvy should suffice now for the alpha right ? (sorry if these questions are basic, I have to leave for a day in a few minutes πŸ˜„ )

dawn shell
#

Do you wanna fix the links in the readme to be absolute while you're on it?

#

Otherwise I think someone clicking on quickstart will get a 404 on docs.rs

ebon zealot
dawn shell
#

Assuming the quickstart will land on main

#

Same goes for all links really

ebon zealot
dawn shell
dawn shell
#

Oh, I see that you're not doing #![doc = include_str!("../../../readme.md")] or so in lib.rs

#

Maybe consider that for the release @ebon zealot

ebon zealot
dawn shell
#

Otherwise your readme only lands on crates.io and not docs.rs

dawn shell
#

congrats on the release πŸŽ‰

ebon zealot
#

Release is out, and so am I , I hope I did not break things somehow, have fun !

ebon zealot
tender oyster
dawn shell
#

@ebon zealot hold up, type registry filtering works now?

#

that's cool!

ebon zealot
#

Yes πŸ™‚ has been in there a few months I think πŸ™‚

dawn shell
#

I guess now that we have a nice search bar it's not that important anymore hmm

tender oyster
brazen ermine
#

so i'm trying to implement a skybox from the bevy examples but its causing a problem with blenvy.

type annotations needed for blenvy::Handle<_>

dawn shell
brazen ermine
#

based on this code

dawn shell
#

Add it to your camera from an observer on OnAdd, Camera

brazen ermine
#

i'll have to look into that because my camera goes through the smooth_bevy_cameras crates plugin which means for the moment its done in code in a specific way

dawn shell
#
pub(super) fn plugin(app: &mut App) {
  app.observe(insert_skybox);
  app.register_type::<IngameCamera>();
}

#[derive(Debug, Component, Reflect)]
#[reflect(Component)]
struct IngameCamera;

fn insert_skybox(
  trigger: Trigger<OnAdd, IngameCamera>,
  mut commands: Commands
) {
  commands
    .entity(trigger.entity())
    .insert(Skybox { 
      ... 
    });
}
#

Then just make sure that IngameCamera is placed on your camera, no matter if you spawn it through Blenvy or code @brazen ermine πŸ™‚

#

(Note that a hook would be slightly more performant in this case, but a lot more boilerplate)

brazen ermine
#

i'll have to tinker with it the code they give in the example is a lot different and being new to rust i'm going to have to figure out how to translate that

dawn shell
brazen ermine
#

the reason the camera is done is code is i couldn't figure out how to specify a specifc cameracontroller as provided by the bevy_smooth_cameras plugin inside blenvy

round cove
#

Is there/should there be a "blenvy component hooks" doc page?

#

its kind of a general bevy thing, but seems very relevant if its going to be a repeated pattern for new users

round cove
#

ok, I'll take a crack at writing one

dawn shell
brazen ermine
dawn shell
#

(Along with the skybox)

brazen ermine
#

at least not great

dawn shell
brazen ermine
#

well the observer what is that in refernece to

dawn shell
#

It will get called when the event in its Trigger is happening

#

In this case, whenever the IngameCamera component is added to an entity

#

The idea is that you add the IngameCamera component to an object in Blender using Blenvy. Then, on the Bevy side, Blenvy will build that entity and insert an IngameCamera for you.
The observer then reacts to that happening and inserts further stuff into the entity

brazen ermine
#

so, one thing i saw was the abality to add again unsure the nomenclature but compoenents with blevy:::something here to the camera inside blenvy but i couldn't find anything that wasn't a built-in like i couldn't just create my own function and get it to call inside blenvy that i could find so i couldn't figure it out, are you saying that there is a way to do that or that there are specific funtions that it can call

#

?

#

it'd have been epic if blenvy could have indexed (parsed?) additional calls from our custom code but i don't think it does that

dawn shell
#

This is a way for you to tell Bevy to call stuff when Blenvy is done building an object, essentially

dawn shell
#

If you go through the Blenvy quickstart, you can see how that is done for a custom component called Player

brazen ermine
#

i see, well that clarify's it a bit, still its gonna be a lot of tinkering to figure out how to get it to work but i think in the long run it'd be better to have the camera inside blenvy and to figure out how to call observers

dawn shell
#

The code should be fairly small, I think you’ll figure it out quickly πŸ™‚

#

Also, observers are a great tool to know in general!

brazen ermine
dawn shell
#

pub(super) fn foo means that foo is only visible to the parent module

#

It's a style of organizing your code into plugins, where nearly each file has its own plugin

#

In your case, your lib.rs or main.rs might look like this:

use bevy::prelude::*;

mod camera;
mod player;

pub fn main() -> AppExit {
  App::new()
    .add_plugins(DefaultPlugins)
    .add_plugins((camera::plugin, player::plugin))
    .run()
}
#

And your camera.rs contains the code I wrote above:

pub(super) fn plugin(app: &mut App) {
  app.observe(setup_camera);
  app.register_type::<IngameCamera>();
}

#[derive(Debug, Component, Reflect)]
#[reflect(Component)]
struct IngameCamera;

fn setup_camera(
  trigger: Trigger<OnAdd, IngameCamera>,
  mut commands: Commands
) {
  commands
    .entity(trigger.entity())
    .insert(
      Skybox { 
        ... 
      },
      UnrealCameraController {
        ...
      },
    );
}
dawn shell
brazen ermine
#

i will eventually learn to seperate everyting into plugins i very much want to structure the project like that, but it's too much to learn at once kinda, right now everything is in main.rs

dawn shell
#

You will notice I use pub(super) fn plugin in nearly all examples I post because it's quicker than to say "add this to wherever you register your stuff for your app"

brazen ermine
#

your way is better, it's just i've tried to create my own modules or plugins in bevy/rust before and it always failed so it's just overwhelming to try to learn that on top of learning the laanguage itself

dawn shell
#

Note that while this plugin organizational style is the one I personally like best, there are others who disagree, that's fine too. Do whatever fits your use-case best πŸ™‚

dawn shell
brazen ermine
brazen ermine
# dawn shell hehe, understandable

A suggestion, for the quickstart, because i'm not seeing it myself and by extension, it's not obvious for a beginning (your target audience), i'd add a section about how all the modules hook back into the main.rs or the main loop as it were

final aspen
#

@ebon zealot amazing work on the release. have a good rest you earned it. πŸš€

open steeple
#

wait, it's out? there's no post in #crates so i missed it ferris_sob

ebon zealot
ebon zealot
round cove
#

its a sneaky alpha πŸ˜†

grim lance
#

@ebon zealot mind help me figuring out where the gltf export happens in the blender site? It's in the auto_export folder, right? but what then?

ebon zealot
grim lance
#

thanks

#

other question: why copy the components from one entity to another?

#

on the rust side

grim lance
#

wait.. is the whole serialization of components happening in the conversions_to_prop_group function?

ebon zealot
# grim lance other question: why copy the components from one entity to another?

In order to "merge" the components from the nested entity (as gltf files at least those from blender have an additional, useless nesting level) with the root entity (the one you actually care about as a user).
The children of the nested entity are also copied over to the root entity and finally the nested entity gets despawned.

ebon zealot
dawn shell
ebon zealot
# dawn shell Couldn't you just despawn the useless intermediate and set the useful entity as ...

nope, because as a user you expect the components to be where you placed them in Blender, not at a sub level, also it causes lots of incoherent results in queries (because your components would land on a child, not the root), also if you spawn a blueprint into an existing entity (like when spawning a level, or dynamic spawning of entities at run time), you want the components to be on the same level as the original entity. It might be hard to get it across in writing, but you are going to have to take my word for it, I tried many different versions of this, and the current one is the only one that "feels right" (regardless of implementation details)

dawn shell
#

Fair enough

iron gale
round cove
#

@dawn shell do you have a shader node/texture baking workflow that you like with blenvy. Not loving the qbaker setup I have at the moment.

dawn shell
ebon zealot
round cove
# ebon zealot Is that an area where I could help via Blenvy? (I have zero knowledge about baki...

theoretically yes, but it would increase scope a decent amount and there's already a number of baking plugins for blender.

the tldr; basics explanation is "have complicated/heavy-to-compute thing, need simpler thing", so for a shader you'd be writing the material output, or a specific node's output, to an image which you can then use. for example, baking the base color or displacement to a texture, and then using that texture in Bevy for the base color or parallax depth.

You can also bake a whole bunch of other stuff. mesh detail, shaders, physics sims, etc. Generally speaking its the act of "pre-compute and store information to a texture".

I'm using QuickBaker at the moment for baking and the workflow is... ok. it works for the most part

You can also bake global illumination lightmaps and such, so its a pretty wide topic and could potentially get very big in scope: https://github.com/Naxela/The_Lightmapper

grim lance
#

Current thoughts are:
I don't want to reference entities via their names, because that's bulky and feels unsafe, can't I just use IDs, they should be safer.
Well... every object has unique names, and they should only be able to change after the relations are already resolved..
And when having multiple instances of a collection, IDs won't be any safer than names...

brazen ermine
#

@dawn shell I've been working on trying to convert my code to follow your quickstart. can you point me torwards why or more preceicecely where i'm suppose to call this compoenent its added to the camera in Blenvy but, its not being called.

dawn shell
brazen ermine
#

?

#

sorry i'm still wraping my head around the whole module strcture in Bevy/Rust

dawn shell
#

If you are using the organization proposed here, that would be:

// camera.rs
use bevy::prelude::*;

pub(super) fn plugin(app: &mut App) {
  app.observe(setup_camera);
}

fn setup_camera(...) {
  // ...
}
#

Does that help?

dawn shell
#

There are exceptions of course, but that is the general rule of thumb

#

(But opinions vary! Not everyone uses that style)

round cove
#

a global observer can be added to any app

dawn shell
#

Use whatever convention you personally think is best in that regard πŸ™‚

#

If you see me throwing around pub(super) fn plugin in any of my example snippets, that is just what I personally like πŸ˜„

brazen ermine
#

i gotcha, well its tough to ask someone hey so i need you to sorta of abstract your guide for me so that i can take the modular parts but use it in my style. especially when your learning, you kinda have to follow the guide to the letter to get anything useful from it.. i'll decide how much l like the style later i guess.. but i knew i needed to seperate things into modules now..

#

And, nonetheless, i got it to work, i do however, put my camera on the player module, because, well technically the player itself is really just a camera in this game..

dawn shell
brazen ermine
#

I do have a question, the way i added IngameCamera to the camera inside Blenvy, is that the generally accecpted method to add logic to a entity that is pre-placed inside the scene? and if so is there any cost/overhead to doing it like that with a observer?

round cove
#

@dawn shell might have additional opinions, but I think the "ideal" situation is to put the UnrealCameraController on the object in blender and skip the observer entirely. The observer is a necessary workaround if you're attaching code like click handlers with bevy_mod_picking, or if the types aren't reflected and accessible in blender.

dawn shell
#

No idea where UnrealCameraController falls

dawn shell
brazen ermine
#

the controller is a bit of a pain to directly configure and it needs several fields. but it has a bundle that i don't quite understand yet, but this is how i set it up on the .insert

.insert(UnrealCameraBundle::new(
            UnrealCameraController::default(),
            Vec3::new(-2.0, 5.0, 5.0),
            Vec3::new(0., 0., 0.),
            Vec3::Y,
        ));;
      }

And i couldn't figure out how to directly add this inside blenvy in stock form, but for the sake of learning if you can explain how i would do that i'd love to know, it's not avaliable in the component list and its not straightforward to figure out how to add logic to entitys otherwise

dawn shell
#

Looking at the source, you'd need to add these in Blender

#

Where ::new does this

#

So imo, I would use observers in this case

brazen ermine
#

yeah its like 7 of them i think maybe more

dawn shell
#

7 is the correct number

brazen ermine
#

but lets simply the question then, let's say i have a cube and i want to attache specific logic to that cube inside blender (blenvy) how would i attach it to that entity not using an observer lets say i have

fn cube { 
 do stuff;  
}

Is there a way to call cube inside blender or am i looking at it from the wrong angle

dawn shell
dawn shell
#
pub(super) fn plugin(app: &mut App) {
  app.register_type::<Cube>();
  app.add_systems(Update, do_cube_stuff);
}

#[derive(Debug, Component, Reflect)]
#[reflect(Component)]
struct Cube;

fn do_cube_stuff(mut q_cube: Query<&mut Transform, With<Cube>>) {
  for mut transform in &mut q_cube {
    info!("Cube is at {transform:?}");
    transform.translation += Vec3::X * 5.0;
  }
}
brazen ermine
#

ok so it's just a Struct and it'll appear in the componenet list at that point, if i understand correctly

dawn shell
#

Exactly!

round cove
#

Yeah you're just adding components to objects in blenvy

dawn shell
#

This kind of marker component pattern is very common in ECS in general and nothing Blenvy specific

#

The only Blenvy specific part is the fact that you insert that component through the UI in Blender as opposed to code

brazen ermine
#

right, my reasoning for using Blenvy is i like to visually prototype, and it probably holds me back on becoming a better coder, but i like to add logic to actual object when i do my prototyping, so i guess i learn that workflow before anything else which may or many not be wrong LOL

#

especially in ECS workflow

dawn shell
#

Yeah, "adding logic to object" is usually something we don’t do in ECS land πŸ˜„

#

(There are exceptions, but that's more of a reactivity thing with callbacks)

brazen ermine
#

Yeah i figured as much, but for someone new to ECS it's very difficult for someone to explain to them in text, this is how to convert your brain from object based system (most engines) it's hard for me to kinda figure out without trial and error without a full time tutor saying do it like this.. which isn't practical lol

dawn shell
grim lance
#

@ebon zealot I am so confused.. the ronstring_to_reflect_component gets the whole gltf extra data, which is just one string (btw, is there any reason not making this a Key value hashmap, even the gltf specs suggest that, maybe bevy PR potential?) which you then parse as ron, and either the key is bevy_components, where you call an function to extract the components, or it's not, where you call another function which looks similar, but doesn't remove "component: ", from whereever that comes from..
What's going on there?

#

How can you even parse json as ron πŸ€”

#

what is wrong with blender..
I had it working to the Entity(name:Object.001) part, now wanted to make it between string brackets, it changed nothing, so I had to change the object it selected and now it's Entity(name: \\\"<bpy_struct, Object(\\\"Cube.002\\\") at 0x000002358336A408>\\\") 😭

grim lance
#

when was the last time testing/bevy_example worked?

tender oyster
dawn shell
grim lance
#

could be

grim lance
#

super interesting.. I really don't know if we need conversions_to_prop_group actually.. It always remembered the relations for me, also with reloading the registry, BUT: The parse_entity part never returned anything, I did a rust-style return, aka. I returned nothing from loading ._. but it still worked

grim lance
#

yay they now work for named fields and lists and I start to understand some parts of the codebase πŸ˜„

dawn shell
#

How do you link them on Bevy's side?

#

Name?

#

(I remember you discussed this, but I don't remember the takeaway)

grim lance
#

it got worse

#

currently they're stored as Entity(name: Some("NAME")), which works because blender enforces unqiue names

#

I then have to search for the same name in the same scene instance, because they could be instanciated multiple times

#

I'm unsure if

  • I'll go to the Scene root and traverse down there to search
    or
  • search for name first and then look up it's SceneInstance
#

But first I have to get reflection working, waiting for answers in #1275079261463511092

grim lance
#

Ok, another attempt: having the type first as a dynamic type, then modify the entity values, then make into real struct

#

meh.. it already fails on the type

grim lance
#

First up: I got a strategy that works for reflection manipulation

#

Secondly: serialization is broken and I don't know why but pretty sure it's not my code (I'll test it with the normal addon right after this message)
I serialize the entity to Entity(name: (..)) successfully, and I've counted the parens multiple times, but the wrapping ( for the struct doesn't close at the end for some reason. With a 1-depth tuplestruct this isn't a problem, now I wanted to test it with Vec3 and this is the error I get on adding the component

#

weird.. on the normal addon it doesn't error..

#

but this is on the normal addon, with Option<String>...

#

both seem to happen only when I reload the registry, not on the first time ._.

ebon zealot
# grim lance <@789848437582725140> I am so confused.. the `ronstring_to_reflect_component` ge...

Sorry, for the late reply !
So:

  • storage as a string vs hashmap: you can thank Blender for that (again), I tried it, and Blender has a limit of 63 chars for the lenght of the keys !!! so you woud not be able to store full (long names) for components as keys ...
  • bevy_components is the canonical way to store ...well bevy components (the ones manipulated via Blender's ui), but I kept the simpler custom properties based components as an escape hatch (because Bevy components's keys NEED to be long_names (ie full paths of components for disambiguation)
ebon zealot
ebon zealot
ebon zealot
ebon zealot
ebon zealot
#

Folks, could somebody please try to switch Blender to any other language that is not English and try exporting with Blenvy ?
I am trying to track down & fix an issue, but for some reason changing languages has no effect at all on Blender's UI for me ?

round cove
ebon zealot
round cove
ebon zealot
round cove
#

ViewLayer in english

#

Calque de vue in french i think

ebon zealot
# round cove

Bingo thanks a lot ! Ok , that is hilarious in a way πŸ™‚
Thanks for trying it out !
I normally have a fix (at least as far as export goes, that special layer is also used in other less important parts)

#

But also, once again, wow Blender, having internal (non renamable) parts change based on language ..

grim lance
grim lance
#

Nothing makes sense, I can't reprod it no matter what I try, blender is dark magic

#

oh look, the tuplestruct closing param bug is not there anymore.. lets look at my changes
THERE ARE NO 😭

#

I wonder if that happened because of me changing how the serialization works while blender was running, me changing there stuff for testing + the change detection stuff playing with me

dawn shell
grim lance
#

Good news: i don’t need any thread_local hacks but have direct access to world
Bad news: Iβ€˜ve just written 8 files, together around 350 lines of code or so, and opened 2 issues, just to manipulate reflection Type trees

dawn shell
#

Link to the issues?

grim lance
#

yess!!! those are extracted from the reflect type hierarchy.
But I can't just apply a completely different kind of reflect item there, so I have to set it from the parent... that will be interesting

#

Bad news: I don't think it will be possible to do the stuff with how sparse the implementation of manipulating dynamic reflect types currently is.. 3 issues, which I'll later try to address/discuss in the reflection dev channel so that we can get better support in 0.15 (hopefully)

#

but i have one idea left :p

#

completely hacky (but it's already hacky so who cares)

grim lance
#

YES πŸ₯Ή

#

finally

#

the game doesn't panic anymore

#

@ebon zealot one question.. The thing where it copies over components.. when/for what does it happen? because i would need to know the new entities :p

#

because I see that Cube.001 exists twice..

dawn shell
#

That is certainly how I felt coding parts of bevy_quickstart

#

Or getting a skybox working with something other than the one image that is already in the Bevy repo

grim lance
#

like I had to make a mutable version of every iterator, which all had the same piece of "make this to a pointer and back to reference, yes this is safe like for all the other ones"

ebon zealot
ebon zealot
ebon zealot
grim lance
#

There is the removing of some nested entities, which I think is what is happening here, right?

ebon zealot
# grim lance Yeah πŸ˜„

Copying of components happens in order to "merge" the components from the nested entity (as gltf files at least those from blender have an additional, useless nesting level) with the root entity (the one you actually care about as a user).
The children of the nested entity are also copied over to the root entity and finally the nested entity gets despawned.

ebon zealot
grim lance
ebon zealot
ebon zealot
grim lance
ebon zealot
grim lance
ebon zealot
grim lance
#

I am always like β€žohh editor stuff will be so cool to helpβ€œ but then there are just big PRs and not really easy help… and I want to do graph stuff first, and school also will start soon.. meh

ebon zealot
grim lance
ebon zealot
# grim lance Wait i can send a link

I'll be honest, I currently won't have much time to look at things , I haven't even had time to post about the release of the crate in the crates channel or showcase , sorry.
I'll try to sneak a peak as soon as I can

grim lance
#

No problem πŸ˜„

ebon zealot
ebon zealot
grim lance
#

(That wasn’t meant as β€šassβ€˜, that was emoji completion with touchkeyboard)

grim lance
ebon zealot
grim lance
#

Ah that is why there is an entity called World :0

#

Thought that was some weird bevy scene shenanigan πŸ˜„

ebon zealot
ebon zealot
ebon zealot
grim lance
#

Ah now I get it… nodes get normal GltfExtras and mesh, etc. are custom entities with GltfMeshExtras? O.o

ebon zealot
grim lance
#

And you then merge the mesh on the node above?

ebon zealot
grim lance
#

I really sometimes have the wish to rewrite bevy_gltf at some places.. the extras could be a map, as they are in the specs, one could mark the nodes, meshes, etc. better with marker components, asset path queries with named references instead of indices, etc.

ebon zealot
grim lance
ebon zealot
grim lance
#

:0

#

At some point I should also try to implement my 3 issues for reflection

#

It’s like β€žahh this is impossible currently, I need a really ugly workaround and open an issue, I don’t want to wait for bevy 0.15β€œ but then I already have the workaround so why bother implementing it?

dawn shell
grim lance
#

But I kinda want to do it with ids now.. searching the whole tree, or even all names, seems really expensive

dawn shell
grim lance
#

but with an internal component, that isn’t loaded when other components load.. arghhh

grim lance
#

yeah I now know where the other cubes come from.. not even named correctly, this will be fun

#

damn #13681 looks so promising

grim lance
#

BLENVY RELATIONS WORKING

#

You don't know how lucky y'all are: no more messages from a lil kiddo crying about code every 5 minutes

dawn shell
#

I did not expect that to ever work

#

holy heck, good job!

grim lance
#

thanks πŸ˜„

grim lance
#

first, let me delete 8GiB of target folder or my PC won't have enough space to reboot again

coral anchor
gusty fiber
#

finally had time to check out the new blenvy version, and the setup is so much faster now!

Just couldn't get hot reloading to work.

How does it work (I added the file-watchter to the bevy features.

ebon zealot
gusty fiber
#

I think it’s this issue?

dawn shell
sand ledge
#

@ebon zealot hey, blenvy is a great tool that'd i'd like to contribute to as i start integrating it into my workflow

#

is there a tracking page anywhere besides the github issues page?

dawn shell
dawn shell
#

That issue says "document", but you could also instead make the cameras spawned by Blenvy to inherit the settings from Blender. This should be a good first PR imo πŸ™‚

#

This here would be the correct module to put this functionality under.

dawn shell
dawn shell
#

@ebon zealot could you help me out if you find time? I'd like to port Foxtrot to Blenvy and have started by adapting the bike game Blend file, which used to work with the pre-alpha plugin.
I installed the alpha plugin, went through the Blend file and removed all components other than Avian ones.
When I save the file, one of two things happens:

#

When I click on this funky button...

#

...I get this

dawn shell
# dawn shell ...I get this

Update on this: when I manually create the levels directory, the ron file gets created. No luck with the rest though

dawn shell
#

If you want to test this yourself, the offending blueprint is Npc Pizza before this commit

#

Sidenote: can I make the generated RON files use LF on Windows?

#

I'm running dos2unix on them right now, but every time I save something in Blender, it reverts my line endings to CRLF πŸ˜…

sand ledge
#

yeah this is the sort of thing i was hoping to help smooth out

#

like for example if you use folders that aren't in the root folder the generated ron files mixes backslahes and forward slashes in the file paths and bevy can't parse it

grim lance
dawn shell
slow lotus
#

Are there any notes on how the upcoming scene/bsn changes are going to affect Blenvy? From searching this thread, I get the feeling that Blenvy plans to stay gltf centric and that there is overlap between the blenvy crate and what bsn plans to support?

round cove
#

hard to say how it will impact without any implementation of bsn IMO. Blender exports gltfs, but you could theoretically use them in a bsn-described scene or whatnot. gltf != bsn even though gltf can be scenes.

final aspen
#

just wondering how hard would it be to automaticly generate avain colliders from the mesh? but instead of using the mesh directly if possible use the shape.
i.e. if you make a cube and add a colider Blenvy would get the size of the cube and create a colider with same dimensions?

round cove
#

sounds like it leads to some "infer value from blender property" type functionality

grim lance
#

Ok i think I now have a relatively clear plan for 0% unsafe (ok maybe not 0%, I want to experiment with making attributes unsafe :p) entity relations πŸŽ‰ I’m excited for all the PRs to bevy I have in mind πŸ˜„ but, should we wait for bevy 0.15 and modify my PR or merge (atleast review?) the hacky one first?

sonic hollow
#

@dawn shellHI!Does blenvy currently support importing point lights into bevy (or serializing them into ron)? I have a Blender scene with many point lights.πŸ™‚

low glade
#

i think it's supported yes

#

at least I think in my level the point lights get added to bevy automatically, but maybe I added a component on them, not sure though

rich helm
#

Point, spot and directional lights (sun) get automatically added. You'll just have to figure out the intensities to match.

dawn shell
dawn shell
sonic hollow
#

Okay, thank you all.1000

grim lance
#

Current list is

  • directly put Handle<GltfNode> on gltf nodes
  • make fake-reflect possible in-house (needs look at unsafe attributes)
  • create/init multiple non-clashing system params from DeferredWorld safely
  • visit over reflection type tree
  • replace contents of reflection fields entirely
  • directly hook visiting into parsing (optional, not sure if performance impact is that big)
  • edit and remove fields in dynamic types (optional, isn’t needed anymore but the issue currently kinda contains both replace values and replace whole fields so I’ll just list it here)
#

That should make all the pointer shenanigans to e.g. have multiple worlds because every query needs one, static threadlocals to pass data around etc. go away and the only β€žunsafeβ€œ thing remaining would ideally be #[unsafe reflect(fake = bevy_ecs::entity::Entity)] but I have to test if I can just put an unsafe there with custom parsing πŸ˜„

grim lance
round cove
# grim lance https://doc.rust-lang.org/nightly/edition-guide/rust-2024/unsafe-attributes.html...

1.81 is coming out tomorrow, so it'll be another 6 weeks before 1.82 πŸ˜… -- https://releases.rs/docs/1.81.0/

round cove
grim lance
#

Or is it doing some weird local timezone shenanigan

#

Oh ok

#

I just look at releases.rs and when there’s only 2 versions I know it released

round cove
#

nods

#

I've had to track it before for videos, which is the only reason I know

dawn shell
#

@ebon zealot how does Blenvy's asset preloading work right now? What do I do if I want to properly wait in a state until every sub-gltf required by a world is done loading? I know I could just manually wait for all generated gltfs, but I remember you mentioned that Blenvy does something like that internally now. Note that I'd like to do this before actually spawning the blueprint.

dawn shell
#

Looking at the code, it seems like the preloading is happening while spawning. Can I somehow trigger that manually by sending an event?

dawn shell
#

Also, I'm getting these again with freshly generated blueprints. That's a bug, right?

#

And here it is in a glTF:

solemn echo
# dawn shell <@789848437582725140> how does Blenvy's asset preloading work right now? What do...

I'm less sure how this works for worlds since I've only been using blueprints, but from what I understand, Blenvy adds to the meta.ron file the list of GLTF blueprints that will be used in the blueprint. The blueprint then only spawns once all those handles are loaded. On the Blender side, collection instances are replaced with their own BlueprintInfo component and a SpawnHere component, which will cause those instances to get spawned on the next frame.

#

So in other words, a system takes BlueprintInfo, finds its meta file, then stores all those handles, waits for them all to be loaded, and then spawns the root after that.

#

And then child blueprints go through the same process over the course of the next frames (I think)

dawn shell
ebon zealot
#

Hi folks ! Sorry for the lack of reply in the past few weeks, had barely any time and currently in the hospital for the birth of my son. Will reply to the various questions and issues as soon as I can. Sorry to keep you waiting.

grim lance
#

Ok back from vacation, tried something yesterday night but my lifetime-knowledge seems to be "rusty" (oh wow, a "dad" joke, I'm so funny...).
Tried it again today, and got rid of most of the unsafe code I didn't like πŸ˜„ (what I was looking for already existed, just was hard to find)

grim lance
#

so yeah, anyone bored, feel free to review :3

dawn shell
#

@ebon zealot I'm investigating a weird issue that is causing my objects to spawn with a wrong Transform on the first frame. During that, I noticed that GltfComponentsSet is never added to any schedule. This means that GltfBlueprintsSet is in fact not ordered after GltfComponentsSet::Injection, even if the code looks like it is. This is a really really subtle thing Bevy ignores without warning.

#

Do you think this might be causing some issues?

dawn shell
#

Update: that wasn't it, but I'll submit a tiny PR later anyways

dawn shell
dawn shell
#

Ooh, you added a .blend and .glb. That seems less scary πŸ˜…

#

Why do you not just use Some? Same for Result, Box, into, etc.
Pretty sure clippy will yell about that once someone does a general linting pass.

#

This is a pretty cool trick though. That assert would hit at compile time, right?

dawn shell
grim lance
dawn shell
#

Wer lesen kann ist klar im Vorteil

grim lance
#

Yes

grim lance
# dawn shell o.O

IIRC blend and glb don't count as lines but theres a 14k registry.json πŸ˜„

cloud tartan
#

I am currently trying blenvy and followed the quickstart. I have now a collection in Library with a Rotator Component that has a speed value. I want to instance two of these entities with different speed values, but changing one also changes the other. What can I do?

grim lance
cloud tartan
#

Thank you. I will try that

dawn shell
#

It's not very documented yet, but that will override the "inner" value, so to speak

#

Does that make sense? It's a bit hard to describe πŸ˜„

grim lance
#

thats what I meant, but I would then also remove the old one and that doesn't work for nested stuff, does it?

cloud tartan
#

Thats useful, ty

dawn shell
#

IIRC Blenvy on the Rust side makes sure to overwrite the inner with the outer component while it is removing the intermediate entity in the hierarchy

#

(don't quote me on the implementation details, haha)

grim lance
#

I know that you dont have to (because that would require more logic that definitely isn't there πŸ˜„ ) but it seems like an common error source, and I'm not sure if it will overwrite changes or everything

grim lance
dawn shell
dawn shell
cloud tartan
#

I have tested it. It works perfectly

grim lance
dawn shell
#

In the library, I put the components on the collection named Box

#

got a rigidbody there

#

In the world, the object named Crate.001 can be used to override this specific instance

grim lance
#

:0

#

multiple collections, smart

dawn shell
#

for example, like this I have just changed the rigid body of just one box

dawn shell
#

The stuff in world looks like that when using a collection instance

grim lance
#

oh Crate is the instance of Box, right?

dawn shell
grim lance
#

yeah that's what I've meant the whole time πŸ˜„ sorry- blender is confusing

dawn shell
#

haha, agreed

grim lance
#

what i meant is that when rigidbody has two values, you can't easily just overwrite one because it will overwrite all of it

#

so it would be better to not have the same component on both

dawn shell
grim lance
#

well then split the component apart πŸ˜„

dawn shell
#

But why, if I can already override specific instances? hmm

#

If my dialog component used to make sense with 2 fields, but now after a rework it only makes sense with 3 fields, it seems wrong to put that new field in its own component just to save time on updating the scene in Blender imo

grim lance
#

when you know what you're doing.. but at the moment you want to change the field that is the same for all instances, you feel bad for that decision πŸ˜„

dawn shell
frail tiger
#

Hejhej! Is the json the file that is constantly written to, when using blenvy? I would like to know what to ignore when using cargo watch πŸ™‚

#

Maybe I should default to ignoring assets anyway because of hot reloading πŸ€”

dawn shell
cloud tartan
#

Is it possible to reference another mesh with Handle<Mesh> in blender with Blenvy?

dawn shell
#

But @grim lance's branch allows you to reference another Entity

grim lance
#

mesh would involve even more shenanigans because of how it has a special meaning in gltf, sadly

#

you could try to put custom data on a mesh, reference that as handle<mesh> and resolve it in a fork of blenvy, just like I did for entities, but beware of blender hating you

dawn shell
#

Just use a marker component, it will save you the headache πŸ˜„

grim lance
#

and I hate blender, currently waiting for a response in a half-dead seeming help forum for "how can I use 3rd party package in my addon" because I want wasmtime because my simple doing-nothing iterator is running and blocking the app since 20 minutes, the array would probably be finished in rust in 2 seconds

grim lance
dawn shell
#

Assuming they just want a relation to an entity holding a specific mesh

#

If they want a specific mesh out of all possible meshes… yeah, that’s gonna be tough

#

Outside of just writing out the raw string

cloud tartan
#

Thanks. How would I reference another entity then?

grim lance
cloud tartan
#

Thank you- SOunds really useful

glass abyss
#

how can i tell blenvy not to look for materials in rust since i unchecked the split out materials box in blender?

#

ERROR bevy_asset::server: Path not found: D:\Dev\Rust\horror_game\dev_assets\models\materials/Ch20_body.glb

glass abyss
#

also in blender can i make objects with different sizes without changing the transform scale? like for example making a Cuboid in bevy i can change the size but i can keep the transform scale the same (xyz at 1.0), how can i do the same with blender?

glass abyss
glass abyss
glass abyss
#
called `Option::unwrap()` on a `None` value
Encountered a panic in system `blenvy::blueprints::animation::trigger_blueprint_animation_markers_events`!

is blenvy messing with animations? and is there a way to turn it off?

tender oyster
#

What if Blenvy worked directly with blend format instead of exporting to GLTF? Saving changes would take lass time and resources. Working with blend format directly would also allow to support huge amount of features that are not included in GLTF. How hard it would be to make Blenvy work with blend directly? Godot for example has native blend support.

open steeple
#

same as unity

tender oyster
earnest sky
#

Hi! Ive been using Blenvy to add meshes to the scene and attach Avian3d colliders to them. The mesh I add is a cube, the collider is also a cube with the same dimensions added via ColliderConstructor::Cuboid. Additionally, I add Sensor component, as I do not need the collider react physically to any interaction with it.
Later on I can query for this mesh from inside bevy, and I do indeed see collider attached to the mesh. The bevy_inspector_egui also shows it in the components hierarchy.

However, when I try to query for CollidingEntities, I dont have any entities in there. But when I do the same mesh + collider setup in Bevy programmatically, I do get CollidingEntities correctly. If I take a look at the components attached to meshes from Blender and from Bevy, they are identical, except for the Blender ones having additional Gltf-thingies.

Another interesting thing is that if I try to add collider in Blender via ColliderConstructor::ConvexHullFromMesh I do get CollidingEntities (the shape of collider is wrong, but thats a whole another issue).

I have enabled PhysicsDebugPlugin and I do see colliders with a proper shape in the rendered frame for both the mesh I have added through Blender and from inside Bevy.

What could be the reason for CollidingEntities being empty (i.e. no collisions being detected)?

ps: this is a repost from help channel, thought this place may be more appropriate for such a question.

cloud tartan
#

Does Blenvy support Hot Reload, so when I change my blend file, bevy reloads the changes, like when changing the position of a model or adding a cube?

open steeple
cloud tartan
#

It does, but it does not always work. When I edit a mesh or material it works. When I add a new mesh or change a parameter of a component, it doesn't. I also cannot detect changes in Queries with Changed<T>

rich helm
#

I'm not completely sure about this, but I think gltf hot-reloading was broken in 0.14 somehow. I also don't get hot-reloading for the levels, but the meshes and materials are hot-reloaded correctly.

#

Unrelated: What is the recommended way to "preload" blueprints? I would like to load up the blueprint gltf during a loading screen so I can spawn instances of said blueprint without having to wait for any loading.

round cove
rich helm
#

I'm just wondering whether it's enough to load the gltf blueprint once into memory during a loading step to have SpawnBlueprint work nicely. To me it seems like I get a one frame flash of a non-ready mesh or material when I spawn things directly with BlueprintInfo runtime - not only on the first object, but even when spawning further objects.

My question boils down to: What should I do, to get the nicest end user experience with no glitches?
A) Spawn stuff with (BlueprintInfo, SpawnBlueprint, HideUntilReady) during gameplay
OR
B) Spawn one blueprint during loading, and then clone this entity with all relevant components

glass abyss
#

is it possible to only apply this system to blender cameras and leave normal ones alone?
it's in src/components/blender_settings/lighting.rs

fn process_tonemapping(
    tonemappings: Query<(Entity, &BlenderToneMapping), Added<BlenderToneMapping>>,
    cameras: Query<Entity, With<Camera>>,
    mut commands: Commands,
) {
    for entity in cameras.iter() {
        for (scene_id, tone_mapping) in tonemappings.iter() {
            match tone_mapping {
                BlenderToneMapping::None => {
                    //println!("TONEMAPPING NONE");
                    commands.entity(entity).remove::<Tonemapping>();
                }
                BlenderToneMapping::AgX => {
                    //println!("TONEMAPPING Agx");
                    commands.entity(entity).insert(Tonemapping::AgX);
                }
                BlenderToneMapping::Filmic => {
                    //println!("TONEMAPPING Filmic");
                    commands.entity(entity).insert(Tonemapping::BlenderFilmic);
                }
            }
            commands.entity(scene_id).remove::<BlenderToneMapping>();
        }
    }
}
rich helm
#

I would assume it leaves other cameras alone, unless they have the BlenderToneMapping component πŸ€”

cloud tartan
#

Can you disable Blenvy overriding the DirectionalLightShadowMap? I want to control it myself with a settingmenu, but it gets overriden when i load a new level

tender oyster
round cove
# tender oyster Just in case. There is a crate https://github.com/lukebitts/blend for parsing bl...

Using blend files outside of blender seems to be heavily discouraged: https://devtalk.blender.org/t/blend-file-errors/15985/2

#

And it seems largely undocumented and unstable as a format (so including it in blenvy is probably not a good idea)

tender oyster
# round cove And it seems largely undocumented and unstable as a format (so including it in b...

Blend is blender main format and from blender perspective blend is very stable. So if an external parser is written properly it should be stable. It seems that documentation is sparse but it shouldn't be an issue once you get acquainted with the structure and we can read blender source. Parser won't even need to parse the whole file structure. Only what's needed.

Export on save to gltf is expensive. For testing and small projects it works but it gets slow once the project grows, even on fast machines.

Plus gltf doesn't support a lot of features.

round cove
# tender oyster Blend is blender main format and from blender perspective blend is very stable. ...

Do you know of a spec somewhere or something that I'm unaware of? I'm curious as to what makes you confident enough to say it would be stable when the core developers (from the link I posted) say it won't be and are actively saying "don't do this".

My first advice here is always, don’t write a .blend file reader or writer. It’s Blender’s internal file format and we make no guarantee that it remains stable or try to document all the quirks.

tender oyster
#

I don't know why the developer says it's unstable. Maybe they just don't want to write docs, migration guides and answer relented questions. But fact is a fact. If the blender works with it than something else can work too when written properly.

round cove
#

the fact that the .blend extension is used for the file across many blender versions does not mean all .blend files are compatible with all blender versions, for example

#

"it would need to be updated for potentially every single release, and maintained as different versions for each of those releases to work properly" is exactly what is meant by unstable.

#

truly the effort here would require tracking basically all applicable changes to the .blend file that make their way into the blender repo, which is imo a very large amount of work.

tender oyster
#

Parser can just check the blend version before parsing and use appropriate parser version or show an error if input blend version is not supported (in a similar way blender does it). Blenvy not necessarily need to support every blender version and for example only the latest version or LTS.
Blend file will also contain a lot of blender specific data that external parsers won't need.
I've checked this https://github.com/jeraldamo/bevy_blender parser and it is quite small (but it doesn't have a lot of features).

GitHub

bevy_blender is a Bevy library that allows you to use assets created in Blender directly from the .blend file - jeraldamo/bevy_blender

tender oyster
#

Also reading blender exporter to gltf and bevy gltf reader should help with some things.

One thing I'm not sure of is if we need to apply object modifiers (including geometry nodes) when parsing object data from blend or modifiers already stored in applied state. If we need to apply object modifiers when parsing objects it will probably complicate things.

I do not insist, just sharing info.

rich helm
#

What’s the status of Blenvy right now? I can see many juicy PRs unreviewed and unmerged. We’re building our blueprints and levels using it, so just wanna know if we should have a plan B.. πŸ˜„

round cove
silver rune
#

Hi new to blenvy here, am curious as to how to preload a material:
materials file materials/Ship.glb should have been preloaded skipping

#

.

Another question is what does injecting materials do:
Step 6: injecting/replacing materials

shut drift
#

Hi! So I followed the quick start guide, and I've created a Library scene and a World scene. I create my blueprints in the Library scene, but they're never exported to assets/blueprints, unless I first instance them in the World scene. Which is tedious, because I don't want them in my world, I want to spawn them dynamically. Am I missing something, or is this the only way to get them to be exported as blueprints?