 I don't think this is how it goes out, because you have to look at the pressure that you're making. Yes, this should give you some of the magicians that have contributed to credit. And it's a little useful. So you would like to merge every color map for instance, one... Yeah, yeah, you know, we're gonna have a light layer to choose between... Yeah, we could be nice to support some battle. Yes, but even though it's an impolite world, I'm not interested. But it's impolite. No, it seems really useful. Usually there are just the things that are most common, like escorting and stuff like that. Yeah, you have to watch it in a specific program. If you want to create a general mode for Photoshop, you merge everything down. And you destroy your video. Because everything, okay, it's very simple. They are... It's switching between... Yeah, I think it makes sense to export it already. Yeah, it's a good thing. Well, it's not a good question to ask. We are there to support the community. So, it's a multi-layer. Yeah. Yeah. You can always do it with a shape, but the thing is, you're simply fine. So, will there be a simple way to explore things when you have to fill in the standard Maybe you could invite people to this session, ask us everything, just to tell them there is only developers at home. So, the problem with machines is that if you want to have performance, you have to make the whole thing and make the whole run. So, even if we are to explore things. Okay, now we have to connect this. Yeah, do you have HDMI? Yes, there is some kind of plug-in for HDMI. Look at the table, maybe. Yeah, I wonder if there is a way to change the resolution, too. Oh, it's already working. Where are you from? Andrew, where are you from? From US, Oregon? US, what? USA? Oh, nice. How do you feel here? How are you feeling? Oh, I love it, yeah. It's great. It's the first time in Europe where the blender comes. Really? Oh, that's very nice. So, it's definitely... That's very fine. What site of USA you are? Around the West Coast. So, Oregon? Oh, Oregon. Oh my God, where is it? No. Okay, so there will be no questions at all at the end. And you have to fit yourself in 20 minutes. Oh, 20 minutes? Yes, looking at the schedule, you know. Okay, we will try to rush through. I think we had like 25 or so before. Maybe this one is working. This one. This is the standard one. Yeah, it's working. That seems like that one. Let's see if we can go just a little bit. Just try this just to see if it fits. It depends on the projector. Yeah. But did you press? Oh, yeah. Oh, yeah, it's working. But this is the optimal resolution. Full HD. Full HD is optimal for projector, but it doesn't matter. Okay. Let's just see what happens. Yeah, it's good. It's picture-to-pixel probably. Okay, so you can start. Okay, so now we're starting. Hello. Okay. Just make sure that this is working here. Hello, everyone. My name is Andrew Peel, and this is my good friend and co-worker Ryan Montes. And the title of the talk that we're going to be presenting is titled Modium Blender for Interior Design. And the main concept that we're going to be focusing on is how you can create specialized applications with Blender. And the way that we're going to be explaining this is by walking you through the project that we've been working on, which is called Fluid Designer. So just to get an idea, who knows about this project? Who doesn't know? That's probably a better question to ask. Okay, cool. Well, just to get you guys up to speed, Fluid Designer is an application that's obviously built on top of Blender. And the main focus is to give an intuitive and efficient way to design interior spaces. And the main keywords there are intuitive and efficient. So we're basically trying to make Blender quick and easy to use. And since we are focusing on the specific functionality of creating interior spaces, it's allowed us to design features around the workflow of designing interiors. And so we had to build features like drag and drop. So just to give users a quick way of appending data into the scenes, we had to simplify the user interface, by changing the default startup file and then including new interfaces like the right-click properties. We had to develop some new data structures to give users a streamlined way to create parametric assets. And we also had to automate several time-consuming and complex procedures. So I'm going to be talking about how we did the development of those features. And then Ryan's going to do a live demonstration of how those features work. But before we get into that, let's talk about just a quick overview of how this project got started. So Fluid Designer was funded by a company called Microvellum. And Microvellum is a software company that I've been working for since 2004. And we developed design and manufacturing software for the woodworking industry. And we primarily work with cabinet makers. And so the idea with Fluid Designer was to develop a workflow to allow them to quickly design their interior spaces for kitchens, bathrooms, and those types of spaces and then allow them to directly pull that information into our manufacturing tools. And so if we were to take a look at a timeline of this project, Ryan and I started development on August 2012. And at this point, we had a good understanding of how Blender worked, but we were still trying to figure out basically what sort of modifications we can make with the Blender Python API and what sort of changes we can make just modifying the source code directly. And so we just worked on our own time. It's basically nights and weekends trying to develop the project. And after several months of working, we decided to show the project to Microvellum. And on February 2013, we presented the project to them and they were really excited about it. They liked the progress that we were making. And so right then they put us on full-time development of the application. And so this was exciting for us because now we've got to come to work every day and build new features for Blender. So that was awesome, but we had a lot of work ahead of us. And so we developed the features for about a year before we even showed it to anybody. And when we started development on this, we kind of thought we were building a specialized application for Microvellum users. And as we continued the development, we were developing things like library management and parametric assets and things like that. And we thought that these features could probably be useful for the Blender community as well. And so on February 2014, we showed our progress to the Blender community and we got a very positive response and it was all good things. So that got us all pumped up, which was good because a few months after that we were going to be demonstrating this functionality at the IWF show in Atlanta on August 2014. And so this is a woodworking convention that Microvellum attends and this is where our target user group was. And so we got to demonstrate the features live and everyone was really excited about it. We got a very positive response from them as well. And the trade show organizers even put us on the front cover of the magazine that they hand out every day, which was kind of cool, because we were able to demonstrate the ability for users to quickly design their kitchens. And then not only that, they can also view their kitchens in the Oculus Rift. And so they can not only give them or our users can not only give their clients renderings but also a virtual walkthrough of the kitchen of their design. So that was quite cool to demonstrate. So that was all good things. And then here we are today just at the Blender conference presenting our project to you. Nice people. So that's kind of an overview of what we've been doing. So let's go and talk about the development. So we obviously know that Blender is an open source application which allows developers to modify and extend the functionality, which is great. But when developers do this, it's typically known as creating a fork of Blender. But I don't like to consider Fluid Designer a fork and we really tried hard not to do this. And the main reason being when you develop a fork of Blender, Blender is constantly being developed by a lot of really talented people. And so we wanted to make sure we can utilize all of that feature, all those features and functionality. And when you create a fork, you run the risk of possibly developing code that can't easily be merged in with the default code of Blender. And so early on we decided that we didn't want to create a fork and we would only modify the source code where we absolutely had to. And other than that, all the functionality that we would develop would be developed in Python. And so all the functionality I'm going to be showing you today is all functionality that we've developed using the Python API with the exception of a few things and I'll point those out as we go through them. So first, library management. That was a big feature that we had to include and Blender already implements the ability to link and append data within the scene, which is great and we use that functionality. But there was no way of really managing those assets on your hard drive. It's up to the user to determine where they need to be located and all that stuff, which is great. But for our users, they needed to have that all set up for them. So with the default installation of Fluid Designer, we automatically include the library management system. In order to display that information, we used the file browser space. And this worked out quite well because with the file browser space, we have the panel on the left which we included some tabs to allow the user to switch between the different library types, which is awesome. And then up at the top we have a header, which is just some pull-down menus, which allows the user to change the categories within that library. And not only that, the file browser also implements the ability to display the images as thumbnails. So it just gives the user a good visual representation of all those files. So we use the file browser space for those reasons, but not only that, we also use the file browser space because it implements the ability for drag and drop. And Blender implements all this functionality by default, which is awesome. And a lot of people I don't think know about this. In fact, if you open up just the default version of Blender, here I'm just going to go ahead and split my space and set it up kind of the way that we have the default user interface for Fluid. Just kind of organize some information and set it to display the thumbnails and then also filter out the information to only display the images. This is kind of just what we do behind the scenes within Blender. But if you take just the default Blender scene and drag an image onto the default cube, you get a texture on there, which is pretty cool. But it's not a cycles material, so it's a little bit limited, but at least demonstrates the functionality that that drag and drop is already there. So we didn't really have to do any of the heavy lifting. You can also see that in the 3D viewport, it sets that image as the background image, so it's awesome. That's really cool functionality. And there's even different functionality within the different spaces within Blender. And so here in the node editor, you can see you can just drag images and it automatically adds in that image node for you. So that's really cool functionality. Whoever did it, awesome. Tom. Tom. Nicely done. So the only problem that we had with this functionality was that all of the operators and everything that was being called were defined in the compiled C code. And we really wanted this functionality within the Python API. And so all we did is basically that event that fires when you drop the image onto the viewport, we just call an operator that's defined in Python, which is great because that allows us to define different functionality for each of the library types. And so here we have all the different library types defined, and depending on what type of image or what type of library you're in, different drag and drop functionality will be used. And so here if we're going to be dragging objects into the scene, you can see as you drag that image, we automatically append that information in the invoke function, and then we use the raycast system to allow the user to move their mouse and then we just determine where that object needs to be placed in the 3D environment. So it works for pretty much everything, and it's quite nice, very intuitive for users, and it works well. Apart from that, the materials are the same thing. So instead of just impending that image texture, we add the cycles material to the scene, and then as the user selects the objects, we automatically add that material to that object. And for materials, for objects with multiple material slots, we bring up this interface here that allows the user to select the different, you know, or I guess whatever material slot they want to apply that image to. So it works out quite well for appending materials as well. For the world environment, that was a pretty simple implementation. We just appended that world environment, and then we add that environment as the active world for that scene that you're working on. So it's pretty simple functionality, and that's how we implemented it for most of the default blender types. But we also include products, inserts, and parts. And I'll talk about these more in a little bit here, but just to see how the functionality works within Flu Designer, once we do that, we append all the information that we need, and then as you hover your cursor over the different walls, we can snap to that or we can snap to the floor. But then once you left-click, then we just append that information and set it to be textured. Once you hover over another product, then we can use the right-click mouse to kind of determine where that's going to be placed, and then you can see that that works out well. Apart from just selecting somewhere, if you right-click within the environment, we get this placement dialog option, which allows you to place on the left-right, or we can fill the gap that you're working on. We can add multiple quantities, and so there's a lot of functionality to help them place those objects within the scene automatically. For parts, parts are just basically things that make up products. So here for the door panels, we give the user a representation of where that's going to be added to the product, and so as they select these items, that allows them to switch out the different door panels and things like that for the products. And so it just gives them a little bit more flexibility when they're designing their rooms. If you take a look at a different product type here, we have some doors and windows, and so again, we do the same thing. We just match the wall's rotation, and then when you select, we just append that information, but for these, we're doing a little bit more. We're also adding in the Boolean operations for the wall, so we automatically cut the hole and things like that, just saving the user time so they don't have to automatically do that. So let's talk more about these groups. So we have the products, inserts, and parts, and these are just standard groups that we have inside Blender, and so we know that Blender implements groups, and groups are just collections of objects. So you have meshes, empties, curves, lights, and you can create groups from these, and that's all great. And from what I know, groups are pretty much just used for particle systems and linking data between scenes. So particle systems, you can instance those objects in that group, and that all works well. But for Fluid Designer, we wanted to implement specific data structures that were used in order to define what group you're creating. And so just to give you an idea of some of the data structures that we have, here all of the products are built on the same structure, so it all starts from the base point, and the base point is just a mesh object, and this mesh object is meant to be the parent of all the other objects. And by default, we just have it as a single vertex, but obviously it can be modeled into whatever you want, and this contains all the other objects. Now apart from that, the other objects that are needed are three empties to control the objects x, y, and z dimension. So we use these empties, they're parent to the base point, as you would imagine, and that just gives the user basically the bounds of the group that they're going to be creating. And so as you move the x, y, and z dimension objects, maybe. So as you move those, you can see that it's going to update the representation of the group that you're creating, just giving the user a little bit more understanding of the space that they have to work when they're building those objects. And you can obviously add as many objects as you want to those to build the types of information that you need. Now with these groups, we can do some pretty cool things, and this is pretty much how we implemented the right click property. So no matter what object you have selected in this group, if you right click, that is going to call an operator, and we can display this information. So operators inside Blender usually operate on the data in your scene, but in this case, we're really just using operators to display information. And so in the invoke function, we check to see what is selected, and we look for that structure. We look for the base point and those x, y, and z empties in order to determine if it's a group or not. And if it is, then we say, okay, great, we found a group. Let's go ahead and display that information to the user, and you can see that we're displaying the size of the group that you're creating based on those empties, and then the location and the rotation based on the base point. And so it makes it quite easy for users to modify those groups in just one single interface. Now apart from that, if you're looking at one of our default, or one of our groups that we've created, so this is just a one-door base cabinet that we use quite a bit. If you were to right click on this object, you would get this interface, which is pretty similar. We have that same information, but we also have some operators below that, which allow the user to see the custom properties that are assigned to that group. And these are very similar to the custom properties within Blender. But within Fluid Designer, we call these prompts. And pretty much the same thing, but we have a little bit more functionality added to them so we can organize them into groups. And so here for this one-door base, we have carcass options, we have door options, and shelf options. And then if you were to select, let's say, the door options, you would see this interface here. So it would allow you to display or view the options about that specific category. And apart from just that, we also have different control types that are implemented. So we have, you know, combo boxes, checkboxes, value sliders and things like that that just help the user be able to work with the products and things that they're working on. So let's talk really quick about why products insert some parts. So they all share the same structure with that base point and those three empties. So why do we need to have those three different group types? And the main reason being that we... there's a specific way that these groups can be nested together. And the idea being that you create simple part groups and then you can bind those part groups into inserts and then you can use those inserts and parts to define products. Another reason why we use this structure is because it matches a similar structure that Microfilm uses for its data. And one of the key things that this project needed to be able to do was be able to marry up with Microfilm's manufacturing technology. And so when we're trying to pull all the information from the design application, being Blender or Flu Designer, we can have a similar structure that we're using when we're trying to get the manufacturing information. And apart from that, we also have library maintenance. So rather than developing every product as just a single object or group or whatever, we develop the components that are needed for that group. So taking the cabinet library as an example, they're all made out of the same type of components. We have a cabinet carcass, we have doors, we have shelves, things like that. And we just build those components and then we combine them together into products. And then we have simple ways of allowing the user to modify, let's say, what door style they want to use. And then that just changes that one single part and then that allows the user to update their entire library based on that change. And so we have some tools that just allow the users to maintain their library rather than building single products one-off. So just to give you an idea, so this is a furniture product that Ryan made. And this just, all we're doing is switching out different parts for this group and then changing the size of what it is. And it just allows for a lot of different flexibility. So it's kind of cool and actually pretty easy to develop this sort of stuff. So the last thing that I want to talk about is automating Blender's functionality. It takes a whole time, really. But just to give you another example, we use the same thing when we're using the draw wall operator. So obviously with interior designs, you're going to need to draw some walls. And you might think that, okay, well, drawing a wall is pretty simple. It's just creating a simple mesh cube. But it's actually a little bit more complicated than that. In fact, when you create a wall, you will need to run all of these steps because we use the same structure for walls that we do for all of the other groups. So it has a base point. It's got a X dimension object, a Y dimension object and things like that. And by creating walls this way, it allows us to do some pretty cool things. So when the user is drawing multiple walls, we can automatically append those walls together and we use a constraint system or the Blender constraint system in order to do that. So as you draw a wall, we automatically check to see if a previous wall is selected. And if it is, then we add a constraint to the base point of that object and then constrain it to the X dimension so it's very simple. So if you change one wall, then it automatically will just change all the other walls. So it just makes for a little bit more intuitive. We can also automate the process of drawing floors, which is simple, but the same sort of functionality to where we just calculate the bounds of that room and then we draw a floor. So nothing too crazy, but it just helps the user out and makes it easy for them. So anyway, that's really all I wanted to talk about with the development work. Now I really want to show you the features and Ryan's going to be doing demonstration and we're going to be showing something quite a bit different. I mean, obviously this was all kind of revolving around cabinets and interiors and architecture and things like that, but we wanted to do something that we thought would be a little bit funner. And so we're going to be working on this science fiction scene here. And so Ryan developed just a library specific for what we needed. So we'll go ahead and let Ryan take over and show us something awesome. All right, cool. So what we're going to do here is I'm just going to pretty much reconstruct the scene that you see here. What we're going to do is just go ahead and open up the application. Gotcha, I know how to do things. All right, so let's go ahead and open up the application here. And what I've got here is just a hold on a second. So something we've got to do to make it to where it extends this monitor. Shut down the power point. So just try to select duplicate again. No. I knew something was going to happen. All right, cool. Well, let's pick up where we left off. I'm going to go ahead and open up the application. What we have here is just a blank scene. All I've got here is a light and a camera. That's already set up for me. And so what we're going to do is we're going to go ahead and start drawing some walls in here. So as you can see, we've got a nice visual preview of what's going to be happening here with our wireframe wall right there. So that's nice. So one of these presets right here, do you left, right, straight or center? So I'm going to do left here. I draw another wall. I go to the right. And our last wall we're going to draw it's going to be a little bit longer here. And as you saw earlier, we can go ahead and change the dimensions of one of these walls. And using the constraint system, we're going to be able to update the rest of these walls with it. So I'm just going to go ahead and change the size of this wall. It looks good. Next thing we need in here is a floor. So over here in my product library, they have a floor tile. I'm going to drag that in. I'm going to hover over this wall. I'm going to go ahead and place this on the left of this wall. And then using the prompt system, as you saw before, using the prompt system for the cabinet to change the amount of shelves or whether the door swings out of space of our scene. So that works nice. Another thing we can do is resize this if we want this to be a different size. I'm just going to go ahead and leave it as it is now. And we've got a good starting point here. So I'm going to go ahead and start putting some stuff on all these walls. Let's just start with this first one right over here. First I'm going to drag a column on here. I'm going to place that. I'm going to use something a lot in this demonstration. It's called bumping. So use the left and right areas to bump to the left and the cool thing about using our product groups that we have is that they kind of know their own dimensions and their location on this wall. So if I bump this wall here you can see that it goes right up against that next column instead of going all the way to the end of the wall. So it's a really useful thing to have. And another thing we can do here is we can hover over something that we want to put this next wall next to and I can select where I want it to be on the left right center. Then we're going to add another column. That wall is looking pretty good to move on to this next one here. As you can see from the camera you don't really see this wall that much. So all that I'm going to really get into is put a column here and bump it down. And then I don't really want to see this wall. I don't want it to get in the way so I'm going to open up my properties panel on the right here. We can go to our viewport options. I'm going to select this to be wire. So now we can see that this wall is not in the way that much. I'm going to go ahead and move on to this next wall we have right here. So I'm going to drag a door onto this and we can right click and here we have options whether to place it left, right or center. I'm going to place this on the center of this wall. It's going to make it nice and easy for me to put it right in the middle of this wall. One more thing I want to show you about this door that I'm not really going to use since this is going to be a still rendered image but it can be useful for things such as animations or possibly even making a level on a game. So I have a prompt here that controls the opening of this door so I can open the door and as you can see we have a brewing operation happening where it cuts out the hole in the wall so it does everything nice and easy for us. You can see as we did the furniture piece before you saw it animated what we really did there is we just animated we just added keyframes to all these properties or prompts that are on these products. So I'm going to set this back to zero because I'm not really going to use that door opening right now and we're going to go ahead and move on to this last wall right here. So I'm going to drag a column in bump to the left drag a wall here going to right click I'm going to go to the left we're going to say two for the quantity we're going to add one more column on the right and in here I'm going to add three more walls by right clicking by right clicking I'm going to put it on the left I'm going to select the quantity of three and you can see how these cage objects kind of show us a visual representation of what we're going to be seeing here and what's going to happen. So I click OK add those two walls in the room I set the end of this wall so we'll do one more column and then two more walls at the end of this so I'll press on the left select two click OK and it looks like we're getting pretty close to almost having the scene finished the one thing with this scene is that every wall looks the same so we kind of want to break that up by putting different pieces to these products here as you saw earlier we kind of Andrew demonstrated using that on cabinet doors as far as replacing them with different doors what I have here is a product that's made of three parts so it's got this top section here it has a mid section so if I go to my parts library here you can see I've created a couple of different parts and I have a few different mid sections that I can replace so I'm going to drag in this mid section and you can see as we're hovering over each part it shows us where it's going to go so I'm going to right click here it's going to replace that and then I'm also going to go and replace this wall right here it kind of breaks it up makes everything not look the same also I have a bottom section that's a little bit different so here we go cool, we're running out of time here so I'm just going to show you what this looks like right now here in VendedBlood and it's not quite a complete scene the things that we're missing here is the environment of the space outside I also had a big window that would have been pretty cool to show you guys but right now I'm just going to go ahead and show you the final Vended image of what this would come out to be and just to let you know how much longer it would take probably only take me another so hopefully this demo has shown that Fluid Designer is more than a one-track owner and can be used for other subject matter other than kitchens and cabinets and can also be used for animations and game design too if you guys have any thank you very much if you guys have any questions just come up and talk to me it's like we're out of time but I think that this project can be used for a lot of other things so if you have any questions about how it might be implemented into years yeah we'll be here all the whole time so come up and talk to us, we'd love to talk to all of you guys okay so next speaker is Jono did you manage to cut high the high resolution display? yes HD HD yeah we couldn't cut up together this morning yeah it seemed like it worked out so maybe it's because it's window yeah no one else has a Mac