Submind YouTube summaries
Thumbnail for Controlling Physics With Geometry Nodes — BCON26

Controlling Physics With Geometry Nodes — BCON26

Watch on YouTube

Video summary

This presentation introduces the new physics framework arriving with Blender 5.2, which fundamentally shifts how simulations are controlled within Geometry Nodes. Instead of relying on a traditional imperative workflow where operations run sequentially in a fixed order, the new system utilizes a declarative approach. In this model, users define constraints and rules from the outside, passing them into a solver that iteratively calculates a solution to satisfy all conditions simultaneously. This architecture is demonstrated through built-in assets like cloth dynamics, where complex interactions such as gravity, pinning, and collisions are managed by passing data bundles that encapsulate specific properties. This method allows for high scalability and customization, enabling artists to easily adjust simulation parameters or add custom forces without needing to deeply understand the internal nested structure of the solver. The tutorial further explores advanced applications, including garment sewing and realistic fabric tearing, which showcase the system's ability to handle "physics on top of physics." A key feature highlighted is the new tearing mechanism, which can split geometry when strain thresholds are exceeded. To achieve natural results, the presenter demonstrates how to customize these behaviors using named attributes and custom factors. For instance, by defining different thresholds for specific areas like a shirt's neckline, users can prevent unwanted rips while allowing them elsewhere. Additionally, the system supports spawning individual threads at tear sites, which are then simulated using hair dynamics. The presentation details the technical steps required to manage these dynamic changes, such as identifying new edges frame-by-frame and ensuring they are added in an order that prevents the simulation from becoming unstable. Looking toward the future of the software, the video concludes with a look at experimental features involving modal tools and real-time interaction. This upcoming functionality allows Geometry Nodes to run as active tools that update in a loop while waiting for user input, effectively turning simulations into interactive brushes. The presenter demonstrates how this can be achieved using closure sockets and modal event nodes to track mouse clicks and drag actions. By raycasting from the cursor position onto the cloth, users can dynamically pin points to arbitrary locations or manipulate geometry in real-time. While these features are still in development and subject to change, they represent a significant evolution for Blender, promising a more intuitive and powerful way to interact with simulations directly within the viewport.
Read the full video transcript
Um but yeah, this is the next presentation about uh controlling physics with geometry notes. There's a QR code in the bottom right you can see with some files. Um there's also the link so you don't have to scan it with your phone. Uh I would recommend to maybe also check that out later at home if you want to uh take a closer look. Uh this is not going to be like a fully follow along right now uh kind of workshop. I think because it's relatively densely packed and also not super uh focused on being beginner friendly. I'll try to explain as much as I can, but the idea is really digging in a little bit more onto the new physics framework that's shipping with uh Blender 5.2 for geometry nodes. Um yeah, that's pretty much all I wanted to say. Okay. Oh, yeah. And is this also in this link you can find uh in the another link to an experimental bender version which I'm going to be using for this. It's not necessary for most of the presentation. Just at the very end there's going to be a little extra uh that requires an experimental version. But yeah, B conference 76 uh controlling physics with geometry nodes. Let's go. uh fun. Well, I had some slides prepared, but I'll go over that a little bit later. It's going to be a little bit of theory. Uh for now, let's start with uh just going over the basics. So, since Blender 5.2, two, there's going to be a bunch or there is a bunch of built-in uh physics assets that are fully using geometry nodes to do uh simulation physics simulation. And uh to just get started with that, I'll just show you a simple example uh on a plane. Actually, let's get rid of that in a new plane just so it's proven that this is nothing more than just a plane subdivided a couple of times. and then jump straight into geometry nodes. And in there, just add the cloth dynamics uh note group, which just ships with Blender. And when I press play, you can see there's already stuff happening. Nothing super interesting because it's just gravity doing its thing. Uh but then it's quite easy to go from there and add some settings here and there that you can see there's sliders and stuff. For now, let's make a new uh weight map to add some pinning very easily. Just call this group pin and pop it into the node tree as a named attribute. And then it's as simple as that. Plug it in uh plugging that in here. And then you can see we have our class simulation. a little bit of a way to move this cloth around. So, not a lot of noding really necessary to get some some basics done. And then you have some settings that you can control here that we'll go over a little bit more later. Uh, but yeah, as you can see, it's not too hard to use the system already to get some basics. Uh, the next thing I wanted to show is adding uh interaction to this with a uh collider. So for that I'm going to add a new collection where I'm going to add a sphere. And the way this works in this physics framework is that the information from the different objects is passed uh via geometry nodes. So uh to make this into an actual collider that can interact with the cloth uh we need to add a modifier. Uh, and there's a built-in collider modifier that you can use for that. And, uh, by default, it doesn't do anything yet because the cloth doesn't know anything specifically about this uh, collider yet. So, we need to pass it in uh, as an aector, which is a new term of just anything that can yeah affect the simulation. Just search for this. Ignore the other collection that's from a demo that I'll show later. And then, oh, where am I right now? There you go. Oh, yeah. Another thing I wanted to show was that you can also interact with this and actually adjust the inputs while the simulation is running. This is pretty neat. That's something that wasn't really possible before uh to get a bit more interactivity. Okay, so far so good. That's like the basic setup of uh yeah, not diving too much into the details of how things work, but we're going to go a bit more complex from here. Um so let's look a bit more of uh how you can customize these things. Here on the cloth dynamics node group, you see the uhectors here. I just pass in as a collection but instead you can also pass them in directly as a socket and this is a yeah a new socket type called a bundle. So let me just quickly show you how you can do that. So instead of using just the object collection you can also add the collider node in the node tree itself. Drag the collection in here directly like this. and then instead of just the geometry output here, use the collider bundle and pop it in there and has the same effect. So essentially what the modifier on the sphere is doing can actually look at it here is it's setting theector on the uh geometry that's being output and then uh by assigning it to the collection the uh simulation can go over all the differentectors and then read out the information from the bundle which is essentially the same thing as what I've done now here uh and we can also inspect the bundle here with the viewer node. Taking a look, we can see that the bundle is basically just a container of data can be anything. In this case, you can see it's a whole bunch of properties of the uh collider uh that the simulation uh uses and one of those properties or one of the data uh is the geometry itself. So yeah, you can really nest a bundle, put all sorts of information in there, and that's what this uh system is using. Um, you can also have multipleectors and you can just simply do that by putting them into yet another bundle with the combine bundle node. And then you can just put as many factors as you want in there basically and the physics system will just deal with it. So another thing that I want to put here is a custom force and then you can just add a new input here. You can give them a name so that later when you look at the bundle you can see okay these are my entries that are part of the collider these are the entries for the force and can really get like a little bit of a structure like that. Uh, right. Get rid of the viewer. And now when I run the simulation, you can see I can just add like a custom force like this. Change it as it's running how I want. But right now, that's just a single yeah directional value. Uh, it can also be something that depends on the geometry like for example the normal. And then when I plug that in there, maybe scale it up a little bit because it's not strong enough. You can see how the direction of the force changes based on the orientation. This basically like applies some kind of pressure uh on the on the surface of the cloth. Uh yeah, and then this is already like one way of you how you can customize setups relatively easily without really having to know too much about the setup itself, how it works. Uh let me just add a couple more nodes to play around with this a little bit more to show you how how easily you can build some stuff together. So just uh multiply this with some some value the the group that I'm painting in and use that for the stretchiness and the bendiness to actually get some more interesting results. invert the pin group and you can get some really fun like interesting results like this. And just play around uh to see what kind of effects you can achieve like this. Uh yeah, I mean that's pretty much what I wanted to show for this first section. Just a small little introduction to get everybody up to speed. Um so let me just quickly talk over a little bit of theory of like what this uh system is based on. Go back to my presentation view. Uh there's basically two different ways of approaching a system like this. um where like the like what's been previously kind of been the default for how geometry nodes works is an imperative workflow where you just have different operations running one after the other and that just defined where they are running. So you have like something going in being processed by different steps and then coming out. But as soon as you try to kind of encapsulate this functionality like when you want to ship this as a system that people can use and customize in Blender, uh you need to put it like into a box and then it becomes very hard to uh to adjust because then for any little change that the user might want to make, they really need to like dig deep into this nested uh structure of operations to just make small little changes. and it's not great for like the architecture of a framework like this. Uh so the other approach which is how this system was actually built now which you've already seen also uh is a declarative approach where you just have uh this black box that is processing stuff uh where stuff data goes in and out uh but you can pass in the instructions of how the processing is supposed to work from the outside uh and is very well scalable like this and highly customizable. So this is already what you've seen with the bundles. You really pass in what the solver actually does from the outside. And the setup itself is built like this too. We're going to see that in just a bit. All right. So let's go to a bit more of an advanced use case. Oh, it's already running. So this is what we're going to build. Uh I'm not going to model this again. Maybe you recognize what's going on here. Uh, I don't know if you already picked up your shirt at the store. Little bit of a uh a little bit of an advertisement here in the middle. Um, so yeah, we're going to build a system that basically can do, let me enable this. It can do this kind of sewing. So you can start with like a pattern like a garment pattern uh to put it on a character uh and then also do other funky stuff like ripping it and having a simulation of individual threads that are kind of popping up on the tears uh and also are being simulated. So you have like physics on top of physics and that's not really something that you could really do before with the old system, but that's something that the new system very much allows. And yeah, this is what we're going to build. All right, but I'm not going to do the modeling for this again. Uh so we're starting with this as a base. There's nothing on there, no geodes or anything. We're going to build everything now. Uh, and we're first going to start with the sewing. So, the idea that's also something that was already in the previous uh, system, but that doesn't currently um, natively come with the new cloth system is this kind of idea of sewing where you can have these loose edges to connected individual parts of the garment that are supposed to be sewn together. And then as the simulation runs, it uh, those kind of pull together to really uh, create the shape. Uh, so that's not currently natively in there. It's going to be at some point, but it's already customizable enough so you can quite easily add it yourself. And I'm going to show you how. So, we're going to start with the new geometry nodes uh note tree. And same thing as before, add the cloth dynamics uh note group. Okay, just checking that gravity still works. And then right I need to I need to uh still make it uh collide with the collider here. For now I'm just going to uh very simply do the same thing as what I did before. Just select my collider collection. Just check that that works. Uh does it work? Yeah, works. Uh and then I'm going to do something else than what I showed you before. So the declarative approach allows us to uh passeectors from the outside. But of course, this setup itself is also still just a node group that we can edit. So another option with this system is that you can also go inside of the node group and see how the system is defined. And you will see that very much like what we've done from the outside also in the inside it's using this declarative approach to uh to set up the framework. So you can have all of these different uh factors here that the base setup already has set up for you and those are all passed as a bundle into the simulation. Uh and that's what the simulation is based on. So it's really just collecting gathering all the information together and then solving it in a different place. Uh so yeah, let me also quickly go over a slide for that to just quickly go over like the general concept of how the solver works. So uh essentially the physics simulation is uh based around the idea that you have just a bunch of constraints like based on actual math right for physics uh and the and the geometry itself and everything like the edges that two points should stay at a certain distance or pinning constraints where a point should stay at a certain location and other things like that. Those are all constraints that the solution that you're looking for that's physical movement uh should satisfy that all gets uh collected into this container as a bundle and then you just pass it into the solver which uh is currently in go nodes just a node that's built into Blender and the solver just does a bunch of math. It does like iterative stuff to kind of try and satisfy all the constraints to more or less the same degree and uh it fails because there's no perfect solution usually but it gives you some kind of solution plus an error and then you can see how well the solution actually works. Uh and that's the and that's the solver. So it's really based on all of these constraints and that's what we're looking at here when we uh look at the note tree here. So there's all these constraints going in to the system and uh one of these constraints I mentioned it already is an edge length constraint and that's actually exactly the one that we need to hook up to to make the suing work. To actually make changes though we need to uh show the node options and make this local because by default it comes as a packed asset. And now I can actually adjust this node group. So the edge length constraint already has an option to pass in a custom length. If I just click that, you'll see it's a big mess because now all of a sudden all the edges think they're supposed to be zero length and they're trying their best, but they're not really getting there. Uh obviously we don't want to do that with all edges, just with the loose ones. So I can easily just take the is lose edge uh is edge loose node pass it in there. There you go. That's that's basically already what we wanted. Uh I'll make it a little bit fancier because right now it's extremely snappy, which can be nice, but it's not really how sewing works. It's a bit fast. Uh and it might be nicer for some effects to have it a bit more of a slow progression rather than just immediately snapping everything, which makes the cloth go haywire potentially. Uh so it's better to have something that progressively like over like a second or something uh goes there. So I'm going to make some some changes. Uh I get the edge length node and then multiply it. So it's basically taking the current length of the edge then multiplying it by a factor that's less than one. And in this case I want to do it over the progression of a second. And uh to get that I can quite easily use a simulation zone which is not maybe the most intuitive way to do it but it's if you think about it makes a lot of sense. And I just add up the delta time between all the steps. So every every simulation step I get how much time has passed. Just add that up and that's the total time that's passed. And then with a map range node, I can just say, okay, from zero to one second, I want this multiplier to go from one to zero. And then over the progression of a second, they slowly pull together and tighten up, which makes it less snappy. I mean, you can change the timing also here if maybe it doesn't work, maybe gravity is too strong. uh and then you get a bit more of a natural uh result in some cases. Here it doesn't really make a difference, right? Uh and that's the sewing already. That was pretty quick. And then you can do all sorts of uh fun stuff like uh for example, let's grab some of these. Is this the right ones? No, I don't think so. grab these faces and then delete them. So, we basically create new seams like this. You can just grab these and kind of scale them up. Create different types of fabric effects like ruffles like this. Pretty fun to play around with. Uh anyways, it's not actually what I want to do. Okay. Uh right. So the next thing then is to uh add these threads that I was talking about. For that we still uh or first of all need tearing and that is built into the new system. There's just a Oh, there's quite quite a lot of tearing going on here. Wasn't that much maybe uh to to create rips like to to split the edges basically when there's too much strain uh going on the uh on the geometry. So like this for example all falls apart. Doesn't look very natural right now. So there's a couple of things we need to do. Uh, one thing is there's usually like on a t-shirt there's some support around the neck to actually uh make it a bit more uh durable. So to simulate that I'll just create a my shortcuts are different. Create a vertex group. around the neck. And there I just want to uh use a different threshold for the tearing. So I'll use a switch node. And then around those areas there's going to be a uh higher threshold. So the tearing is less likely. I'll just use 10. And here I just need the named attribute node. the neck. Oh, well, one is maybe a bit low because if the if the edge becomes longer than it was at all, it's it's a bit sensitive, maybe. And now you see it doesn't rip around the neck. So, that's already nice. But then there's some other things that you can enable to make it look better. like there's a built-in option to uh basically have a different tearing pattern because right now just everything might or might not tear depending on the simulation and there's an option to choose voronoi which is quite nice uh it gives a lot nicer results usually uh kind of like this and then on top of that I want to do one more thing because it's still a little bit symmetrical and unnatural in my opinion so instead of just having a flat value uh for all the other edges and not on the neck. I'm just going to use a random value. That just adds a little bit more natural randomization to everything. Uh between one and two. Well, maybe 1.1. Oh. I remember this working better in my testing. Oh yeah. Uh I need to also because right now the uh fabric is basically, as you can tell, not bendy or stretchy at all. Well, it's a little bit of a lie. It's naturally still going to be a bit bendy even if this is on zero, which is just how uh it works kind of because the uh information of the bending needs to kind of propagate throughout the mesh. So, it's a bit tricky for a solver to really make something super stiff, at least in the iteration that it is right now. So, things are always going to be a bit bendy, but this one we want to actually be bendy because it's fabric. Uh, so let's cranked it a bit higher and then we get some nice tearing like this. Great. Looks a lot more natural. And then uh the next thing I wanted to do is on top of these tears spawn the individual threads. And for that we need to first of all find out uh which of the edges are actually part of the tear. And uh well one easy way to kind of do that is use boundary selection. So there's the is edge boundary node. uh and you can see okay this gives us a pretty clear idea of what the boundary edges are which the tears are boundary edges problem is just uh that currently it's all boundary edges including the ones that were already there in the beginning so not just the tears and uh for that we need to figure out only uh the tears themselves uh well actually let me let me do one step before which is spawning on the individual threads. We just act like this is already great. Um to convert this to a curve around these edges like this, we get an curve representation of the uh torn edges like that because that's where we're going to spawn the threads. And uh then on this I can just do uh subdivision of the curve instance on points to put uh a little thread on all of these individual points that I'm creating. And that's just going to be a curved line. a bit long right now, but do like negative 2 cmters or something. And then you get this. Now, I do want physics on top of them. So, I need to first realize them because right now they're still instances. And then also throw a hair dynamics notebook on there, which is also new shipping with Blender 5.2. And it already does something like without any more changes. You can see that it actually does like wiggle around a little bit. So actually I need to resample this a little bit so we get more points because right now it's just two points per curve. But yeah, you can see there is already physics acting on these. So without too much work, we actually have like a system of physics that's working on top of another one. Uh there's just a little bit of a problem right now with the setup, which is when there's tears being created, everything goes crazy. Uh which is not what I want. Uh I'll also crank down the amount of points to three for the sake of performance. And the problem that we're facing now is that the hair dynamics is not really made for the amount of hair changing during the simulation. And the the problem right now is that the uh the order of the curves is kind of random. Like the new ones that are being created that the physics system doesn't know about yet are kind of inserted somewhere in the middle. Uh but for the physics system to not freak out, it needs to uh basically only have them added at the end. Uh and for that we need to uh make some changes here. But the nice thing is that the the system really allows us for some really custom changes. So that shouldn't be too hard to do. Uh first of all uh what I want to do is basically identify which edge is new on each frame like is a new tear and then add that to a cache. So I just collect all of the new ones, add them all together, and that way I can really ensure that the new ones are at the end. And yeah, that I can just do with a simulation zone which starts out with nothing and then joins in the new uh edges on every step. But now I need to find out what those are. Uh and that's going to be the next setup. Uh and for that we're going to do a custom aector which uh is another way of really on a pretty low level hooking up to the uh simulation system to to get information about it or yeah make changes to the geometry. So going from here I just type in customtor and there you go. This is a pretty small node. Just has two uh menus, a filter, and then this interesting socket, a the geometry factor sockets, which is a closure socket. Uh and a closure is also relatively new in bender and it's a very nice way to enable this kind of declarative workflow. uh to add a closure zone like this can just type in closure and then because I dragged from here and then searched it already comes uh prepopulated with the correct in and outputs and uh a closure is essentially like a function that uh gets some inputs and sends some outputs uh but doesn't actually here process any data yet it's used somewhere else for the evaluation which is really enabling that system that I was talking about earlier for the declarative uh nature where you have uh processes uh that you instructions that you pass in from the outside and that's done via a closure for example. Uh and this is very neat because here we actually have access to the data from the simulation. the geometry that's being simulated on that is basically only accessible within the simulation but without having to go inside. Uh and then we just need to choose at what stage this is supposed to be evaluated because like it makes a big difference if you do something at the beginning or at the end and there's a bunch of different options. Uh and you can basically see when those are happening in the note tree. Like if you dig a little bit deeper, you can see, okay, there's a pre-solve, posts solve step. There's a bunch of other stuff going on. So I made a little uh breakdown that is a bit easier to uh look at maybe. Nope, it's just like this. Where's the different uh stages that you can hook up to? And there's uh the geometry going in. And then before the simulation starts, there's the presim stage which is just uh useful if you want to initialize some data or something that you then use later on. And then for each step of the simulation uh that gets repeated in a loop, there's then the pre-solve stage, then the solver does its thing and then there's the posts solve stage which is pretty intuitive I would say. uh but these are going to be all of these we're going to use uh throughout. Now first of all we need to initialize some information because we need to remember which of these tears were there in the very beginning. So first of all, I'm going to use the pre-simulation stage that only runs once in the beginning to store the uh information about the boundary edges like this as an attribute. Call it boundary edge uh like this. And then we can use it as a named attribute later on uh yeah you can you can see that's the original boundary edges. So even now if I start creating the tears those don't uh become part of the selection because we just made it once in the beginning and then stored that information. Uh, okay. So, we basically need a selection of the opposite, but more than that because we really want to get the information of each tear that was created for each frame. So, I'm going to create another custom uh in the presolve stage. Let me think about that for a second. uh posts solve sorry in the posts solve stage to really because the the tearing happens in the solver uh and then afterwards we want to check what changed. Add a combine bundle node here to get these all in there. Create a new closure. And then in here I'm going to create some new attributes. One of them is going to be called torn edge new. That's only going to be the newly added torn edges. And to get the information of that, I'm just going to use the boundary edge attribute that I initialized in the very beginning and subtract it should be a boolean. uh subtract it from the edges that are currently a boundary and then that becomes my uh my uh new torn edge and uh then I just need to add that to the uh current boundary edges. So I just take that new torn edge and update my selection. So every single frame first the new torn edge is identified and then it's added to the selection of the boundary edges. And then this way I really should get uh information about the currently new torn edge as it pops up. Oh, this is still the wrong one. Um, this is not right. Okay, let me let me shuffle the setup around a little bit. Not sure what I did wrong here. Okay, this is basically I thought this is doing the same thing. Ah, tricked myself. There's one more thing that we need to do. Uh, which is this is just going to magically work. uh type in boundary edge in here and this should fix it for some reason. Although I'm going to explain why. There you go. So now only the new edges actually just pop up. They like flash that they're currently new and then they become black again because the selection is gone. And the reason it didn't work before uh it's something that you can very easily fall into. But uh I'm going to show with another little graphic. M I thought I was going to show it. Wait. Uh I don't know where the graphic selection >> ah I was on frame negative one. Sorry about that. That was my bad. Uh anyways uh what's happening in the simulation system is that there is a cache transfer that happens. So we get the data in the geometry that you're simulating on and instead of just doing all of the processing on there directly uh the system creates a copy basically which is then uh processed and the simulation happens on it and there's a bunch of attributes that are generated for the simulation specifically to happen. Uh and then everything that needs to uh make its way back onto the original geometry uh is then merged together basically to uh yeah to update the geometry that you passed in. And the reason this works like this is that this way it allows you to still after your simulation is baked make changes uh to the input geometry like add attributes, change colors, whatever like make do vertex painting on the cloth basically. uh after the bake is done and it still updates properly and only the actual stuff that needs to update for the simulation like position attribute and stuff like that only that is really used from the bake. So it's really the information is transferred from the cache and uh that's the reason why it didn't work because that attribute was not known to the simulation system as something that's relevant to be transferred. So uh that's why we needed to add it here for the simulation to be aware of this being a property that needs to be taken care of. So any attribute that you want to propagate uh from one step to another basically needs to be added here and then it just magically works. Okay. Few um where was I here? Okay. Okay, so we have information about the new edge on every frame. So now we can use that to uh populate the edges in the correct order. And uh I'm going to try and do that relatively quickly here. So this was already the setup we had, but instead of just using the boundary edge to create the curves, we need to use the uh named attribute that we just gained. on the torn edges. Uh, and then that only creates these uh, well, this is not the best way of previewing it maybe. So, I'm going to add those into uh, like join them together here every single frame. Okay. Select the viewer. There you go. And then they pop up. But uh this doesn't look quite right because now they're just static there. They're just baked in the frame when they were created. So we need to actually update the position of the ones that are still there. Use a set position node. Sample index node. Uh and then we can sample the uh position of the deformed mesh to update the uh curves. Uh and to make this properly work, I'm going to use the face corner domain because if you if you think about it, when the cloth tears, one edge turns into two, right? So it's not enough to know about like the uh uh the indices of the points. you really need to do it per face corner uh like for each individual phase that has been separated. Uh so there I'm going to sample the position but now we just need to know which face corner the points correspond to that I'm just going to use the same trick again of initializing some data in the beginning of the simulation. So I just store the uh index of the face co that's not it of the face corners in the beginning corner index uh and then use it later on to really know which point corresponded to which corner before the tearing happened. But for this to properly work, I also need to uh still do one more thing, which is splitting all the faces to individuals. Do that with a duplicate elements node set to face. This just makes sure that all the faces are split because I only really want the split edges anyways. And then this keeps it indices coherent and everything. I need to worry about uh weird uh interpolation stuff. So now in theory, yeah, this gives us a live updating result of just the torn edges deformed with the original geometry. Great. So now can just pop that in there and in theory it should just work. Okay, let me add a join node. Okay. And there you go. So now the threads are really spawned on the right places and they're not going crazy anymore when new ones are added because the new ones are only added at the end that don't confuse the simulation system. Uh that's already the well already it's been 45 minutes but uh that's the core of what I wanted to show done. Now we have a little bit of an extra and I am not very confident I can do it in five minutes but I'm going to try uh which is a look into the future of Blender. You've seen it in the keynote maybe like this was pretty much this exact demo uh with some real-time interaction uh using model node tools where you can actually in real time uh yeah with your mouse interact with the geometry and uh okay I'm going to try to build this real quick. Okay, this is based on the experimental version that I'm linking to in the QR linked from the QR code and uh this adds the functionality to node tools which have been there already in Blender uh to run as a modal tool which means that they basically update in a loop uh and wait for your uh key inputs. So first of all I'm just going to enable this to run as a tool which means I can select it here geometry nodes.003 003. Um, and then I just need to make sure that I can run it for meshes in object mode. Give it a an amazing identifier. There we go. Um, and now it's here. I click it, nothing happens. Okay. So, the problem is not now it's not running modal at all. Uh for that just full disclosure design of this might still change of how the exact workflows are but in general it's going to work something like this. I can add a modal timer node and then all of a sudden now it does the simulation just as a tool. Uh so I don't have the modifier on it at all or anything. And uh in theory it's a bit unfortunate that now everything fell down but uh I don't need to run the scene time at all. This is just the tool running on its own clock and that allows a lot of uh things like implementing brushes and stuff with geometry nodes which hasn't been possible before. Uh oh. Uh, okay. I have four minutes left. I'm wondering how much sense it makes for me to actually attempt to Well, auto save works. That's great. Um, well, it didn't save the things I did. Okay, I'm going to fast forward and act like I just did everything now, but I'm going to show you the result because I don't think I have the time and it's not fair to the next speaker to bleed into their time. Uh, but there's this, which looks pretty much the same as what I just built, plus this stuff at the bottom here, uh, which does some cool stuff. So, I'm just going to explain what these nodes do instead of building everything. Uh, so there's a pinning constraint which is basically the same as the one that's already built in up here with the pin group that we already used before, but this is a custom pinning constraint. Uh, which just means we can pass in a custom position. So it's not just going to pin it where it originally was, but instead it's going to pin it where I tell it to pin it, which is very powerful because then I can drag the cloth around with my mouse cursor, for example. Uh and the way that's done is by there's the modal timer uh adding events that the tool can react to. So here this is also a new node the uh you can see the modal event node which makes a key map uh pop up here that can be customized. So we have an event defined as click down, an event as click up, and this is mapped to the left mouse cursor pressing down and pressing up. And then with a simulation uh we can keep track of whether or not the mouse is uh held down right now. uh with this kind of setup and that just uh gives me the information of whether or not the cursor is pressed and then this can be used to do different operations as the modal loop is running. It's basically just evaluating the simulation over that modal clock. And uh what this is doing here is using information about the viewport and the cursor position to do a raycast on the cloth. So we can basically do selection. Uh and then here it's basically using the information from the raycast to then find the closest point here by checking the position of all of the uh points to the raycast hit position. Finding the closest one and making a selection that is then captured to pin the point and also writing the uh hit point as the pin position. So, this happens when the click is held. You can see here with the switch node. Uh, if the click doesn't just happen, but if it's still being held down, for example, the pin position is just updated. So, the same vertex stays pinned, but the position is changed uh to be within the view plane. And if neither is happening, the mouse isn't pressed down. The pin attribute is just cleared. And uh the way that looks in here is that then you can actually interact with the cloth like this. And uh if I if I just tear hard enough, I can actually tear off pieces of this. This is just really using the same simulation system that we had. And uh yeah, I mean this is still uh in development. The design might still change a little bit here and there, but this is uh something that's very exciting for the future of uh geometry nodes and blender in general. And uh yeah, that's what I wanted to show.