[Music] and welcome to a presentation about the character pipeline and customization system of Far Cry primal I'm Karen O'Sullivan I'm the character technical director for far cry primal and I'm Meridian and vo is the character pokamamil on the core primal can everyone hear so good up the back yep great okay so far cry primal hopefully most of you have played it but if you haven't it's a [ __ ] games set in 10,000 BC so prehistoric cave people times you don't need to know much more than that you can probably fill in the blanks in your head some things you might need to know for this presentation a few buzzwords so DTC we use it all the time you've probably heard it tons of the convention already you probably know what it means it stands for digital content creation software and that's things like 3d studio max Maya blender Houdini motion builder or whatever anything that the artists or animator works in outside of
the game engine we also have dunya dunya is the name of the game engine that we use on far cry wolf skin so we're gonna be talking about will skin a lot today it's the name of our new system to assemble and customize characters and DNA which is a piece of data inside that that represents a whole character so when we started on Far Cry primal we were starting with the pipeline that we used for Far Cry 3 and Far Cry 4 so that was a Mac script based pipeline this is unfortunately a typical Mac's viewport from Far Cry 3 so you can see our character has maybe a couple of meshes for his upper body here's some pants you know he has some arms and things he doesn't have legs and he doesn't have shoes so they're probably coming from a totally different max flow as well he
doesn't have shaders so you see like there's no textures on this guy and that was unfortunately very common for artists in max on the previous Far Cry games so what does it look like in a more abstract sense we'd have these big max files like really like you know it would be full of like a lot of meshes this is a conservative example where we're just exporting four meshes out of a max file after that we'd go into a game engine and we would assemble a character from different mesh parts so here we're pulling two of the meshes out of this Maxwell and we're using them for the hair and the body of this character some other parts of him are probably coming from a totally different place if you remember that character didn't have legs or shoes so he may be pulling other parts of himself from a different Maxine that's not really great because now you can see if I actually wanted to work on this character I don't have all the meshes that I need to actually edit him because I'm gonna check out that max flaw and I'm gonna work on stuff in there I'm basically blocking it from
anyone else working on any mesh that comes out of that file so you can see in red there's a few meshes I don't even need but they're locked and no one can work on them I don't really care though because like who cares well if someone else checks out I max file I care because now I can't work on any measures that came out of that scene it gets a bit worse again because we also had skeletons and we had a big monster skeleton on the previous Parker Games and we would use that for all the characters and we would need that skeleton to be up to date in all of the files that had meshes in them so that meant it was really difficult for us to actually update the skeleton on the project because we'd have to go to that source file and we changed the skeleton but we'd also like have to change that skeleton air in Avery Maxwell so it became very complicated and time-consuming and it basically means you can't do it like it's just never gonna happen so before we figure out what pipeline we'd like to have we want to look at who's the team because that's the most
important thing so the primary uses of the pipeline the guys that work the most with exporting things to the engine are actually lead character artists the TDs and the riggers a model is also use it a fair bit but in this case these are the guys that are iterating a lot back and forth whereas the muddlers are more creating the asset and then it's going through her pipeline so what do I want to use well Aldi character artist likes to use Maya he's always been using Maya and in the past he would have to then send that to max with the FBX file I like to use Meier as well on the character TD but I do use max we had a rigger who liked Maya and we had three riggers that liked max so we knew based on our team we had to support both software packages if we let them use the software they want to use they're going to be faster they're going to be more efficient they're gonna have more time for polish and we can use the best tool for the job so what would that look like if we had this ideal pipeline well every mesh would be its
own separate piece we don't want the big max files anymore we just want to have all these separate meshes and we want to assemble characters from them as well if I want to edit them I just want to pull whichever mesh I need and I open it into the 3d studio max or into Maya and I want to be able to pull any of the meshes I need as well you can see down the bottom there's the skeleton so that skeleton that was hard to update now we've made it its own asset and it can just be pulled in first and then all the other measures can come in and skin to it so that's really cool when I export I'm only going to check out the file that I changed so that way like even if I have all the pants on the project checked out and I'm only changing one of them it's the only file that's locked everyone else can keep working so ideally this means that how artists could work in parallel maybe even on the same character while the mothers working on the hair a rigger might be working on the pants so how do we get there so to
understand how we went from what we had and where what we got in the end first let's look at the technical aspects of where we were on 83 and 84 so we had a very tradition trick pipeline it was all introduced max 2012 a lot of maxscript some 3ds max plugins in C++ some trivia smack specific shaders was a lot of Max scriptorium once again to bind the shaders we also have the dependency on the avec plugins and all these things and as you saw we have one Maxine's goes into the pipeline and then a bunch of meshes come out now if we go back a few years ago here at GDC or colleagues dhamma felix and PR blazer presented a session entitled passenger story of a convergent pipeline how this is related is that the point of that framework was to create a communication framework between the game engines and the DC C's to sort of extract assets from the game engine into any DCC that we wanted for marketing
purpose so you would be able to go into Assassin's Creed and then select the characters and the world and import all of that in 3ds max and then there you would be able to like make pre-rendered trailers because of that they supported a lot of DCC such as Julius max Maya Moby and to make it happen they created a standard file format for the assets which they called game X which would and then provide functionality to load this thing into many diseases so at this point we had from the passenger framework the possibility to load standard assets in all the diseases and the question was what if the game engine was also reading this format so we would be in a situation where we would be we'd be able to make back and forth between Andy DCC and the source format and we could get rid completely of the magazines and the source files so this is what we implemented we this is what
the pipeline looks like now so there's only the guy max mesh for each asset so each asset is going to be its own file there is no maximum grouping anything anymore and the sender from technology group at Ubisoft provided us with the plugins to load or standard asset formats they support many DC C's and many versions of them so we were already able to load the files in for instance Max and Maya but then on top of that you want to create a pipeline that's going to be able to like be customized for your game engines needs so very often you want to add some metadata you want to link the materials in a way that your game engine is going to understand and do this kind of stuff so we we did not think it was feasible for us to create one pipeline in Maya and in EXO we wanted to share the pipeline so we're going to show now all the things that we did to share the pipeline between nice and Maya the first thing was we needed to share code so we
looked at the options in the Autodesk packages and python is well supported now between Max and Maya so this is what the Python pipeline looks like you can see there's a few things there first is there's some stuff like an import/export module there with the exporter and an importer these things are can IGCC agnostic but you can see there's also some stuff like there's a GCC helpers module and in there you can see this GCC albers file but there's also DCC helpers Max and this is helpers Maya so let's look at how how that works most of the code is in the DCC agnostic higher-level code so the exporter doesn't know in which TCC training for instance there you see the expo geometry function how do we exploit a geometry so first thing we do is we get the selection from the user what did they select in the editor and then we are going to apply some manipulation to these assets and export the assets to the disk you can see the first line
there is like DCC helpers that get selected nodes so obviously the API is in 3ds Max and Maya to do this thing are going to be different so this is where we branch the code so we going to the lower level of the pipeline we become like very much unit atomic operations the DC GL perspire is going to try to figure out first okay which this is this if it's Maya we're going to import their Maya version of the code and then if it's max we're going to import the Max version of the code so there you go and finally were in the low-level code and we get the selection engineers max we call the Max Plus API in Python and in my recall the Maya comments we returned we wrap the nodes into a DCC agnostic wrapper and then we pass that to the DCC on a stick pipeline so that the big pipeline doesn't know where we are so the good thing with that is that as you go through production you're going to build this little library that
hides the API of 3ds Max and Maya and you're going to have like little operations in there such as getting a selection renaming nodes deleting nodes creating nodes and each time you know you create new features at the beginning you're going to have a bunch of those operation but as you go there's going to be less and less that you need to add to this library and you're going to be able to focus on the building the logic of the pipeline instead of building the library so that is how we shared code now the next thing that we needed to do was sharing a UI between the DC sees so for this we looked once again what supported in max in Maya this time and we found that PI side which is the Python bindings for qt4 is available in a bunch of those DC's when we were studying production we were at the 2015 version of Max and Maya so pi set seemed like a good fit so this is just an
example of some of the tools we have in the middle you can see how node editor so this is where the artists will go in and set things like maybe LOD distances they can set up their simplygon settings for LEDs for automatic generation and it's stored with the mesh there's a few properties and other things that they can do in there but what's really important there is because it's a QT UI and because this UI is exactly the same in both Max and Maya it's very easy for artists to switch back and forwards it also is really easy for us to build documentation because we're not documenting a max by planning a maya pipeline we're just documenting the pipeline at the top is a toolbar so same toolbar in Max and Maya in Maya it's a shelf in max it's a toolbar that you move around and the icons are the same in both packages and they have the exact same behavior so again if an artist is switching back and forwards or if they want to migrate from one to the other it's really easy
then for them to learn the software that they're gonna be using because the pipeline will be the same and lastly there's just a drop-down menu which you you know standard kind of thing you see from the top of the application and for us we actually made the exact same order as the icons in the toolbar so it's really simple and straight forwards so shaders if you remember back at the start I showed you this screenshot of Max and there's just no textures no shaders so we knew that had to change but we had to support 2d CCS so when we had a look the best option for us was shader effects it was integrated in both the 2015 version of Max and Moya so that seemed like a pretty good choice for us if you don't know what shader effects is it's a node based shader creation system it comes built in so you can just open it up from maximum Oya and start creating shaders using nodes it was really great for us because it meant that the TDs all the artists even could go in there and understand this thing and start building the shader and for us
it's it's all about matching like basically what the engine shaders are doing and making it easy for the artists to work on their UV there protects color that type of thing and that also meant that the 3d programmers could focus on just getting the features into the engine shaders and they didn't need to worry about the DCC the TVs could just jump in there and quickly update the shaders whenever an engine shader changed as well it also has a automatic mapping so we just made it so like if you name the texture node in the graph diffuse map or detail diffuse one detail diffuse to it automatically maps to the properties from your engine materials so it's really easy and there's no extra code like around this thing so what does it look like when an artist is using this pipe well there we go okay so okay so here we're gonna game engine duniya and we have our character we just
selected the character in the game engine and we're going into 3d studio Max and we click our import button so what that does is using the passion passenger framework it's communicating to the game engine and asking what's selected and then importing all the meshes for that character so I can just click on one of the meshes and I can just make a change so you can see something happen okay so now we've made some changes to a mesh we just want to click our export button and it'll export the mesh back to the engine so we get this little pop-up it doesn't like get in your face you don't have to click it away it's just a little notification and when we switch back to the engine you can see it's already actually hot reloaded so usually before we even go back there like it's hot reloaded now just to show that this pipeline is the same in Maya we're just opening the character into Maya and you can see we've got that new change that we've made and we can just remove it again and then we're gonna click export and again you'll see these little
pop-ups down the bottom these little notifications just telling us export successful so now if we switch back to the game engine you can see she's already hot reloaded and it's live updated so really fast and easy turnaround and you can see that artists can use whatever they want to use so that means there's no more big scenes there's no more giant max files we're not if an artist wants to use one package they're not forcing everyone else to use that and the artists can just open the meshes whichever meshes they want into any package once it's in the game engine we actually need to assemble that character from different meshes this is the old system we used I don't want to get too into it but you can see it's kind of pretty big confusing UI and I would wager you can't
guess how to use this just by looking at it the other problem with it was it was a single user tool it was one giant database for the whole project so that meant that if someone wanted to work in there it would check it out no one else could work it became a little bit annoying on Far Cry 3 and 4 because we were doing Co dev with a shanghai studio who were doing animals for us so they might check out this database unlock it and then if they go home at night and don't check it in that means the next day in Montreal none of us can work in there it's an even bigger problem for us because on primal we were actually doing co dev without Toronto team in Toronto Montreal in the same time zone so now you've got a database where only one person in two studios can never work in there at the same time so it creates a giant bottleneck and it ends up being mostly the readers had to be the ones that work in there and they really hated it so instead oh no sorry this is a this is just an abstract view of like what this meant so
you've got all these different meshes and you load them into this little part database and then from the parts you make a character it's very simple nothing too complicated but also kind of frustrating to use so that's where we turn to our new system which we called wool skin ok so now we're going to describe we built the character system and how we were based on a customization system so Wolfskin like in the first part we show that we repurposed or Marketing framework to become a mulling pipeline war schemes also started before Fakher primal and it was mostly a character customization system and thing is when we entered the production for factor primal we thought maybe we could actually turn this character customization system into a character system for building characters so that's what we did now I'm going to describe in detail how the system works and how you can build a customization system like this the one thing to understand about
both skin is that it's completely data oriented so it doesn't know what it's customizing so you can apply it to many things so a good way to describe data oriented pipeline is to look at the data and then find out what's in there so there's going to be two types of data I'm going to talk about in more skin there's the config files on one side and there's the item files on the other side the config files they're going to be shared by all the entity of the same group so for instance all the humans are going to point to the human configuration file and then and then on the side you're gonna have like a bunch of items that describe human parts and stuff like this so the config file has three parts which I'm going to go into in details right after but first we have the slot hierarchy there so the slot hierarchy is just basically going to define how you build a character so there we have a human slot at the top then we have a morphology folder in which we have head and body and then you could have a bunch of closed body parts stuff like this then we have solver
rules wall skin runs solvers on the data to find out what it should spawn when building a character for instance there we have a rule that undoes the conflict between head mesh like the Hamish and the Hat mesh that could occur finally we have automation hints when we're building was in we found it's very important that it's super fast to add data and so for that we created some automation hints that the artists can make to speed up the process so let's look at the [ __ ] hierarchy for a while there you have the human slot on the top it has a special meaning the top slot but I'll show it with the item then you have stuff like the red slots they're like body torso and bends these are typically slots in which you're going to find meshes you could also have stuff in nodes in the hierarchy such as a suit which is basically they're just grouping a torso and a pens item you can have other things in the slit hierarchy such as enumerated values of our boolean
flags there we have a gender animated value which we described can just take male and female of values finally we can have some stuff like material parameters so there we have a body paint slot and we have some team team logo slot these are going to feed material parameters to the meshes and interact with each other and we'll see that in detail so that's the slot hierarchy in the config file now what are the items so the items it's just going to be any piece of data that I gets a particular slot in the hierarchy so if you target the top slot of the hierarchy you'll basically describe in your full human and you're going to reuse items that I get the other slots so hopefully we can look at a workflow video so wall skin is integrated in Maya where the artists work and max there we are just saying okay I'm going to create a new item I said this is for the human config file and then we're targeting the top slot so human now we're just gonna give a name
to our character and this is going to create a file on disk now you can see on the left side of all the Boscombe data and on the right side of an addition pain because I have targeted the main the top slot there I have like pker values for all the other slots so I'm just selecting a gender there and then I'm gonna select items that I get the other slots such as maybe you buddy maybe your shirt and some pants and because we are running in the DCC right now we have control over the modeling pipelines so we are going to be able to save a file and then click an eye icon to see the character and this is going to trigger a loading of the skeleton loading of the gamax meshes and then put that all together in the Maya port and a little disclaimer here the the loading times are shortened but this is still pretty fast so there you see I can
just change the gender of my character and it's the same character which is loading you in in the DCCC so the characters look the same but with the adaptive morphology we can continue editing the the character add some clothes again changing the gender is an atomic operation so you can just quickly gender swap the character and click the icon and save a little loading there we go so maybe just once we're happy we're going to be able to just save a file integrate it into the game engine let's go into jr. so we go into the game
engine which is a component based game engine so I'm just going to drop a character and on this character I have a working component in which I'm just going to point to the file that we just created as you can see we're loading the character now because as you saw it so before we have our loading of all the resources in the game engine so it's the simple skin I can go back into my I open my application to a change save the file and then it's going to watch reload the character in the engine then we can start like continue customizing the character so before it would take us a really long time to integrate the character and as you see right now it takes like a minute or two to create a character and integrate them in the game engine so that was a really good force so that's was how you create a DNA character so a full character now let's look a little bit at the other items and now you create them and make them usable
for the system so you're going to have very simple item for instance the shoes in Far Cry primal they're unisex so it's just one mesh so maybe a shoes item is just gonna be pointing to one mesh then you have more complex items such as the torso items there you see an easier armoire and there's a male and a female version of the same mesh and these are going to be tagged appropriately so that this'll work and I load them so I think we can see an example of that so let's see how the artists work with this so in this tab this is the mesh tab they have a quick view of every mesh that's on data for the project so it's really fast and easy they can just filter your link type some keywords in there and find meshes so we just clicked we're just loading some meshes so you can see specifically the the meshes we're going to be working with so it's the same meshes you just saw before so if the artist is just
finished creating these meshes and now they want to put them inside wool skin so that they could be used by a character they're going to go into the mesh tab select the two meshes that they have and they'll just click the new item button that's gonna guess automatically that this is a human piece and it's going to be targeting the torso power now it's also going to suggest a file name for this asset and it's gonna suggest a folder to save that file in every piece of wool skin daters is on separate files so we're not walking anyone else from working if we're working on parts lastly this is the again you can see like we'll skin here and this is what it looks like when you're editing a specific item so there's the two meshes and there's some tags and then we're going to be set up so let's say it like a little bit faster so I'll select my two meshes click OK it's giving me a file name folder and I just have to validate that the tags have been correctly tagged for male female for the two versions of meshes and that's about it so it's really really fast and we're just gonna do one more so
you can get a real idea of like how easy it was to integrate okay so how does that work so just the when I was describing in configuration file I said there's a section about automate Janine's is a really simple there's just two types of automation hint the first is going to be a folder structure to start mapping so basically we'll skin if we're creating a an item with meshes in the human / body folder we're just going to guess that this is a human item for the body slot likewise we have naming convention to tags so that meshes themselves when you create the easel armoire for the female character you're going to name it maybe underscore F and in a configuration file you're going to say if you find underscore F just tag it female automatically so this enforces good practice in the data structure you'll make sure that your data is nice and organized and it also makes the creating the items really fast so before we move on to a few other
things in the [ __ ] hierarchy let's look at how the solver works so you saw that I was able to change the gender and then just read out the character we're going to run into detail the example of how the solver is running on the data so I mentioned there's the rules section in a configuration file and these are basically the pieces of data I'm going to say this is how you select the best version of the mesh's for each items that you are finding DNA so let's run through an example we have a very simple configuration file which is just one rule in there and it says required tag from animal [ __ ] gender so let's just build a DNA I'm just gonna add some items in there you can see you have body a leather top and some pens and the body and the leather top each have two mesh versions one tag male one type female and then the pants have only one version which is tagged male and female so it would be a unisex match that fits both
characters I also need to select the gender so I'm just gonna go in my DNA and select a female gender now the solver is gonna run on the character and select the right versions so the first thing that a solver does is to initialize a score of 0 on all the mesh's versions and then run through the rules so we run for the first rule I'm quite like from an M sub gender we can eliminate anything that doesn't have a female tag and as you can see basically we just remove them versions because this is a really simple example the solving is done now so we have we have female messages and unisex mesh is selected now let's look at a more complex example on this character hopefully oops yeah notice how she has a hair in the back of her head that would clip and we're going to add a hood on the character so you can see that the part
that would be clipping has disappeared but you can still see the fringe that she had on the front so that the visual quality of the the thing is still there there just for fun we added a boolean flag in the DNA that makes you able to select whether or not you want the hood so we also remove the hood you see there a comeback now let's put on a big hat like let's put the hood back and then I try to put a big hat on the character and you can see likewise they had would not fit under the hood so it remove the hood and the hair back can I cool effects to look really cool so let's look at how an example like this works so we start again from our same configuration file but we had two rules now so the first one that we are these bonus 2 covers the head in top of +1 so this is basically going to be a default selecting rule there we are just saying if you have the choice between a version that covers the head or that doesn't in top just give a bonus to this one
finally we have a conditional rule in there if the Hat has a tag is fake then you're going to as to reject covers the head in terms so this is basically the translation of if the Hat does not fit under the hood then remove the hood you could have a hat which is not tied is fake and it would fit nicely in that hood so you can support those let's fill our example our DNA so now you can see that the hoodie has four meshes male and female version again but this time there's the covers the head and doesn't cover the head versions the Hat has only two versions and they are both big because the Hat doesn't fit in there so once again we initialize a scored zero to all the measure and then we run through the rules the gender role is going to eliminate half of the choices again then the default selecting rule banished is going to try and select the version with the hood on so we give a bonus score to the female hood but then we run the last one and we
look at all the available version in the Hat and we see that there is the tag is fake and this rule is rejecting the covers the head covers the head tag in the hoodie so now solver has finished selecting right mesh versions and you can see that the character would have the Hat on the head and she would not have the hood on her same time so that's how the solver works the good thing was having us over in data and the rule is that you can come in anytime at the lid in the prediction and try to to fix some conflicts that you have for instance on primal lady in a prediction we noticed that the Quivers were made to fit on the on top of a coat so the problem was when we add the topless cocktails the quiver would not match their body very well so we created a new version of the quiver to better match the mythology and in just like when our two sitting with the artist we created rule and in creating the created data I created some mesh
variations and then put that in in the game so that's it for the solver now a little more about the slots that we didn't mention there so I mentioned that there's some material slots in there and because they're separate from all the meshes we can wonder how that works so when you define those material parameter slots you're going to be free of the logic of how to apply those material parameters to the items so the only thing that you're going to do you're going to say I have a pallet slot there and it just takes two colors and those colors are named so we just say okay a palette is a main color and a secondary color and the team skin is maybe just a team logo now when you create items for those slots in moleskin you're just basically going to field values for them so for instance I can create a palette select two colors I can create a team logo and then just point to a texture and I can create a lot of those but we still are away from logic on the other hand
when you create an item which uses meshes there you're going to have an interface that lets you override the parameters of this item so you're going to gather all the materials in those meshes and then be able to point okay for this item I want you to override the diffuse color of this material and then put those values so you could put the values by hand but you could also point to variables in the DNA so there we're just gonna say my diffuse color is the main color my diffuse color to is the secondary color and all these things this lets you have those automate cooperation that deal with the meshes and all the meshes are free to do whatever they want with the palette the good point the good thing with that is that because we have it erogenous sharers in meshes it's easier for us to have the logic in the meshes that way we can support many setups and variations instead of having you know a very strict like all the items all the shirts needs
to add the material setup like this another example like an example in primal I think we have some class-based body paints so the enemies they all share the same body but based on that class they're going to change the body paint of the of their body will serve some pre-order bonus for the car when he as a custom tattoos was what we used it for now one last detail that I want to go over is the horan slots in this hierarchy so there I just mentioned that we have a skew slot sometimes and it groups items but there's a little more to it so let's look at an example now we have to go back a little bit to the research phase of the system because this is not really a it's not greatly using primal but if you remember in Far Cry 3 and 4 we had some PvP with the team base in play so there we just created a simple hierarchy
we have the top and pens slot and we have a pallet slot and then on top of that we have a false shoot slot and again play slot so I'm creating my character and I can just select top and pants in a palette and have my character look at the way it won't now sometime you want to give a suit to the player but you don't want them to mix and match items so there we created a hunter's or inter suit and it's a very specific tab that goes well with some very specific top pants and a palette now the this character could like try and go into PvP mode now and you want to display the team color on after character the thing is so then you can give control to the gameplay team and be like ok so I created a slot for you in hierarchy and the rule with the hierarchy is that the higher the slot is the more on the priority it has already other slots so when you put the suit it overrides the top and pants and when I give the gameplay team like they're
override the palette they put their item higher in the hierarchy and they're going to be able to override the palette now the good thing about that is that energy and I now I have like three tabs but they all come from different levels in hierarchy and priority so conflict solving is is handling that but it also means that it's a non-destructive operation so as soon as they exit the arena I'm going to be able to remove the gameplay item and it's going to remove my team color without destroying my customization likewise if I remove my suit I'm gonna still find my character there so that's it for war skin you know we have little more details so the next thing we wanted to look at was variety so what is variety in a game like far cry it's taking all these separate meshes that we built all these separate parts and assembling them in different ways to build an even greater number of characters in the past we we we do this
through like random combinations whenever character spawns and we decided to solve that a little differently for this project because what we wanted to do was actually do full dnas for our NPCs and then randomly spawn full characters so why would we want to do that the way we used to work was we would have to tag meshes that worked well together so these pants work well with these shirts the skirt works well with these shirts but the the hood and tunic don't work well with the one on the top left so you can imagine the more and more and more things we add this thing can just swap out of control and it's a giant maze of tags of include exclude and that type of thing experience showed us this is like really difficult also dangerous because when a Lada star dropping
characters in the map they're gonna see random spawn characters but they're not gonna see every possible combination that could be millions of possible combinations so that becomes really hard to debug and make sure that we actually don't have any problems especially because once it gets in the hands of our players you know if this gets in the hands of millions of players and each of them sees thousands of characters through the course of the game they're gonna see combinations that we just never ever source artists the other issue is even if our QC team did find issues and flag them and say hey here's a screenshot of a character that has meshes that don't work together or they're their skin color is the wrong color on the hands in their face that's it that's another big problem because now it's really hard with this mess of tagging data to figure out like what combination of tags actually let that happen so instead we decided to just simplify it and break it down into small solvable problems so what we did was we could take a bunch of meshes that we
knew worked well together and throw them into something we called a generator and that would generate random DNA's it would tell us how many possible DNA is we could build and we would tell it how many we would like it to build so in this example maybe we built six of a possible six hundred combinations of these meshes when we're done we might go to a different generator build another selection of meshes and build a few more characters and then we just keep going and we keep going and we just add meshes that we know will work well together or that fit this character class throw them into generators and build randomly generated characters but we can also build them by hand if an artist builds a new asset and they want to actually you know custom build a character or if they want to tweak one that's being built by the generator and sometimes we even want to pull them out of a list so whenever they go out of the generator they just get thrown into a list of NPCs to spawn but sometimes we want to pull them out and make them a quest giver so we can go in and like play with it however we want and when we're done we have a giant list of dnas
for characters and then their deterministic so we can control them we can bug fix them if there's ever an issue we can just go into the DNA of any specific character and change the items that it's wearing or fix the bug or even debug what specific tags are causing like conflict so that's really cool and of course if we ever find that we don't have enough possible combinations we can just go back to that original generator and generate some more of that 600 possible combinations so we're coming towards the end and we're just going to talk a little bit about what went right and then we'll also talk about what went wrong so what went right we built a complete character customization and modeling pipeline we supported skinned characters skeletons and Static and breakable props we didn't talk about them but if you play through primal you'll see a lot of armor or helmets that can be shattered when you strike them so we we supported those as well
and our pipeline we had to maximize support so artists could use whatever they wanted and riggers could use whatever they wanted we have this fast wool skin and game act iteration loop where the to the customization system and the modeling pipeline really connected to each other and it's really fast and easy to work and then integrate new items and lastly because all of this we actually got to do a lot of stuff that we normally wouldn't bother doing so for example we added DLC Julian mentioned we have this paint that you can unlock as a pre-order bonus and crafting costumes during the course of the game even though it's first person you are crafting your winter gear so when you go into the the northern part of the map it's it's frozen off and you need to upgrade your gear to go there so we actually were able to really easily on the artists team just integrate this this upgrading clothing and we use some of those things we saw with the folder slots and things and we also use them on the NPCs as well so the NPC is also quick winter degree when they go on the north and then so we were able to do
a few things like that that we normally would have required programmers or support and instead we could just build it out in data so lastly we'll just have a for what went right we'll just go through a little video so you can see some more things about what we built with the pipeline and see some of the characters in action [Music] [Music] [Music]
[Music] [Music]
[Music] [Applause] so that was for what when right now
let's talk a little bit about what went wrong there's also obviously a lot of debt as well first thing we want to talk about is that very commonly now in try triple-a we're not equipped to deal with transversal tests very well so there was a longer research priority we think this is the direction we want to go with the character system and the thing is when you start pulling something in a triple engine like everything comes together so it's true about characters you try to you start pulling that and then get my engine tools animation online graphics they all come at the same time so when you try and sit down with everybody you all the stakeholders in a room and then you try to say okay this is the direction that we want to go it's very hard to like have ten people agree on a direction especially when it's not you know I think that you can see at the time so the actually like there was two thing on primal that helped us solve that the first was clearing up the creek
clearing up the decision process we really had a very tight schedule on primal so we agreed that we only had like maybe a very short amount of time to make that decision so we reduced the number of stakeholders we made a clear decision process and that helped us the second thing is we instead of having like teams waiting for each other you know like you have the engine team does their part and then we wait for the tools team to do their part and all this thing you can have like scheduling conflicts and everything instead we sort of made it more a topic in itself so I took over even though I wasn't a tool programmer or something I took over all the parts from the pipeline to the tools to the engine and then try to make all the characters work together that way we would not be trying to wait for each other the other thing was Junior is a very old engine it's actually based on on CryEngine that we
bought from Crytek when Ubisoft bought far cry so it's been like 15 years probably in use that be soft and over like very large production a lot of people have come and gone so there's a lot of the engine that we don't know now so we have lost knowledge for instance the the 3ds max biplane was a big mystery bugs so it creates a lot of fear in in in your discussion when you're like okay we think we want to change the pipeline but we don't know it works so we don't know we cannot evaluate it so in the end yeah we had to we had to like jump in the dark let's talk a little bit about the future Wolfskin so we're not there to make any announcements obviously but if you look at our past games in fact right there's been a lot of focus on weapons vehicles animals we think because of all skin is data oriented it's it would be a good fit to extend the customization take to all these things and then extend
the pipeline as well the other thing is we mentioned that you can load the assets into machine builder but right now what skin is not there so we'd find it really cool if we could have wall skinning motion motion builder so that the animators can just load the last version of the character and then have the the cooler sets instead of right now where we have to export an FBX and then for the animators to work on motion builder so that's it for us thanks for listening to us and special thanks to everyone that worked on the pipeline and provided support needed to make it possible there's a few of you in the audience I think so thank you to everyone here as well [Applause] and looks like we have a few minutes for questions if anyone has questions just jump up there's a couple of mics there and don't forget to do the review when the server comes out hi I was wondering
did you guys have issues with piercing on like like tight fitting meshes particularly like the body slot did you have to call out certain parts of the body to fix piercing issues yeah that's actually something that we identified at the beginning in the research phase and with the previous Far Cry games we might actually have different versions of the the naked body with different parts hidden or on him specifically for primal we actually have a lot of naked characters and a lot of their clothes are like really loose-fitting so we got really lucky on that side where because of this we actually kind of wanted to keep that naked body there the whole time but definitely like on the previous Parker games we needed to do with like hiding parts of the naked mesh in order to make sure that there was no clipping with the outer layers of clothes and even potentially with layering of clothes as well tuition the first one we can see that you can
navigate through a different piece of the body and you can see the last version can you navigate through the different version that have been pushed previously sometimes it's really cool to see the evolution of one asset and yet sometimes you're losing something instead of ink yeah it's not better than before you want yes change it's actually a really interesting thing that we actually benefit from with this pipeline in the past all of our data like our Big Macs files and things would be in their own separate kind of data structure we didn't actually keep a lot of the history on those things because they're such big files especially the ZBrush phones because now our data format that you you load the mesh and you save the mesh is actually inside our project data we always keep a history of that and so with perforce just like with standard peripherals provisioning we could just roll back between things it would be nice to actually link a little bit more logic there between
the mesh and it's texture you can feel that if you have this button to and have gets through the previous version yeah and the same thing it could be great because you have already a lot of things so yeah we did do that a few times we're just manually and perforce rolling back but because you're actually importing it from the engines or the same data format the engine uses you can kind of roll back that one see the change in the engine and if you wanted to grab it back in tomorrow you could you could open it still yeah and just the second question was about the morphology of the characters because you have a woman man and they are pretty a lot of muscle or not or something like this yeah did you manage specific topologies it seemed to be when we see all the characters regenerates have pretty all the same size and everything does its material you need to have some consistency on this of do you manage to upgrade this maybe you already do this I don't know yes so they actually share the skeleton that's for we have a lot of male and female enemies so all of the
enemy animation ends up being used for both genders we did share the base topology for the naked mesh and then I think pretty much most of the clothing as well because they're often adapted at the low poly so we might do a high poly on one gender and then just adapt the low poly sometimes so they were kept kind of consistent between the genders and I think that's part of it but definitely the shapes were very different between the genders so it did mean for things like shoes you know it's the same for hands I think there were the same but once we got into the arms and the torso we would have to adapt the the meshes as well to fit that morphology okay thanks a lot thank you for the main character as well as the NPCs yeah yeah I think when we started we weren't using hear it on the main character and at a certain point we switched because it just made perfect sense for us so we do use it on the on the main character and that's how we got like the unlockable or DLC paint on the
on the players arm is a is a actual texture swap that's a separate item in the system and the same with the crafting of the clothing and if you go further in like you can actually in Primal you can switch to the eagle and fly around and you can see yourself third person so it was really valuable for us to actually be able to to show that progression on the character through the game because you you actually do see him even though it's a first-person game system that prevents NPCs to get items from when Tata I took some crowns of very specific so no it was really up to the artists to just choose if they wanted to share the meshes between the player or not they're on the same skeleton and they're the player I think the player was actually the same config it was the same config right yeah so is the same configures the NPCs so yeah they shared things in fact a lot of the things that the player wears are the
same for for NPC clothing especially one of the main narrative characters at the start of the game you meet he wears pretty much the same outfit as you your similar kind of war warrior type character yeah thank you thanks hi great talk thank you thanks when I saw a miner max interface I couldn't even know that big simple even simple Agana icon was it part of your scheme by prying to make a roadie or it's totally separate and didn't really work yes so yeah we were using simply gun we didn't talk about it here but actually at the booth later we'll be demoing a video of that but it's there we go there's the time that will be at the Ubisoft booth so 2 p.m. this afternoon will show a few more videos and one of them is simply gun so there we chose to use simply gun in the pipeline because before we used to have a LOD tool in max but of course it's only a max and then on primal I
built one in Maya but you know that was really good because you get different quality LEDs with those two separate tools and simplygon is just way better at doing it than my tool was ever so we actually used the the passenger in-game x data to send the data from either max or maya off to simply go on and we worked with our tools group to to have like a little Python API for dealing simplygon and so we send the meshes out of either max room I ascend it's a simply gun and then it comes back again and we just get these little notifications as they start coming into your Maya file so it's really good and as well we we actually embedded a lot of the simplygon settings into that node editor that I showed at the start the big thing so a lot of this stuff for simplygon was set there and you could save it with the mesh so if a rigger came and like did a skinning pass on your character or something you could click regenerate first simply gum and you would actually get the same LOD simplygon settings whenever anyone clicked that button so yeah thank you no
problem I got two questions first off is how do you manage the rigging process you know let's say character has a big wolf head here and goes to down low here yeah how do you auto rig it cuz you know I saw that you got a previous within you know all three packages yep and you can just so the characters are sharing skeletons but all the extra stuff that goes on top could be customized for the characters in primal we had we would put these these shared rig extra constraints and bones and things into the core skeleton so they could be reused across different characters so in the video you might have noticed there was some muscle system on the character so that was set up in max but it we have a plug-in for that so the the constraints are like a muscle constraint or look at position
orientation type constraints or pose correctives like a driven key sight system so you the riggers could actually rig this in max and then there's plugins from Maya from motion builder as well so the animators see the muscle deformation and they see the constraints in motion builder and the exact same code runs in a game engine so all those extra bones like there's the core 60 and then there's probably another hundred or so extra muscle bones and dynamic bones and things so all of those kind of get saved into this little XML description of what the constraint is and what bones it's and then it gets sent to two MotionBuilder for the animators to the game engine for the runtime version of those constraints which should have a bit more at the launch at 2:00 p.m. so we also have a bit video of oh yeah yeah yeah I think we have to free the room so I think oh yeah yeah I think we thank you thank you for come up and [Applause]
Auto-generated captions from YouTube — names and numbers may be misheard.
Distilling the key insights…
Game Developers Conference · 2026
Game Developers Conference · 2021
Comments