Spotlight - Project Geneva #02 - [Details]

Making Of / 22 February 2020

Hey everyone, it's time again for another blogpost! As I already kinda spoiled on Twitter yesterday, this will be another 'Spotlight'. My job and Final Fantasy 14 just took up way to much of my time ... especially FF14. :D Also please note that all I'm gonna show you now is pretty early WIP, polishing will come ... well I don't know when. xD

Overview

Today I'm going to show you the Mesh-Decal-Normal-Trimsheet workflow I'm using in this project. I'll cover all aspects and some neat little 'Tips & Tricks' I discovered along the way. Here is a short list of stuff I'm going to cover:

  • Alpha & Hardsurface generation in Substance Designer
  • Alpha & Normal baking in 3ds Max
  • Trimsheet creation in Substance Painter
  • Mapping the meshes on the trimsheet
  • Material Set-Up & usage in UE4

Along the way I'm gonna show screenshots of each process and explain how I made it work for my specific use case. I'm glad you are following along, let's hop straight into this!

Generating all the ressources

I started with creating a bunch of simple (or medium complex) shapes inside Substance Designer. I chose SD because I'm pretty familiar with it and can generate every map needed (For my case mostly Normal and Opacity) directly out of the shapes created. 'Procedural Texturing' FTW! \o/ 

You could basically do the whole process in Photoshop as well though, just pick whatever software you are most comfortable with. I kinda went a bit overboard with creating alphas & normals and it quickly got out of hand ... as you can see in the screenshot below.

Here are the ones I'm actually planning to use in the project. As you can see, i trimmed the trims (pun intended :3).

At this time I took a small break, searched up some references and analysed them ... to be honest ... I should have done that from the  start. I built a bunch of useless shapes - or shapes which didn't work well in general - and wasted a lot of time. Well stuff like this happens, it's always a back and forth. This was also the point when I decided to model and bake the 'more complex' shapes in 3ds Max and then bake them down to a plane.

The neat thing about this method is, that you can go really crazy, as long as you keep a couple of things in mind. The most important thing is -  Normalmaps need slopes, bevels and gradients to work properly! Don't ever model in perfectly straight 90° angles ... you won't get the results you are looking for. Also you can go ham with the polycount, since you are basically building highpoly models ... so just go for it!

Assembling the trimsheet

Ideally you would want all of the single trims ready by this point, but your mind on which to use can change pretty quickly (trust me I've been there). So I started assembling while still baking and generating even more shapes. To be flexible and adaptable to changes was also one of the reasons I decided to assemble the trimsheet in Substance Painter. It gave me great control over where which trim should be placed and I didn't have to worry about any extra work, since I just placed normal and opacity maps at the same time.

The 3D viewport was pretty handy as well. I could just check the results directly in a realtime environment, which made adjustments easy and errors - or suboptimal stuff - pretty obvious. To aid me with placing all the single trims I quickly built a grid texture in SD. I know that my placement with this grid is not the best solution, but it would guarantee me an even distribution and fast iteration opportunities.

I could easily erase and swap out different trims without having to worry about them fitting in or overlapping with others ... it's just a convenience thing. The grid also helps me to create a 'cheatsheet' afterwards. Here I can see which plane in my engine will be what decal.

Mapping geometry to the trimsheet

This task can vary from simple to annoyingly tricky. First I loaded the trimsheets opacity and normal into 3ds Max and mapped them to a 2x2m plane. Since I worked on a grid inside SP I could just subdivide the plane to perfectly match my grid. This enabled me to simply cut out each individual trim and clean them up. This task would have been way more time consuming if I hadn't been working grid orientated.

The planes you see above are mostly for quick testing uses inside UE4. With them I can try what works well and can break up the modularity of certain parts by adding them on top of the actual mesh in the engine. Most of them will be added to the final meshes before I export them to UE4 though. 

Those planes alone are a great start to get some details going, but my choices of what to place where (especially where) still were limited. So I decided to add some 'custom' mesh decals into the mix. What do I mean by that? It's simple ... I wrapped some planes around certain parts of already existing meshes and mapped them onto the trimsheet as well. And voila ... I'm now having mesh decals which wrap around corners and fit perfectly onto certain parts of my level geometry. 

This method can't only be used on the tiling trims at the bottom of my sheet, you just need to get creative with UVs and topology. On the next screenshot you can see the same trim being mapped to different geometries. To not stretch the corners of the trim I simply used some support loops ... those work almost the same as traditional support edges in highpoly modelling. You just gotta cheat your way through! :D

But keep in mind to not overextend the use of this, figure out the limits! If you squash 4m of geometry onto something like 20 pixels ... well you know what happens then. 'RIP TexelDensity'

Setting up the material in UE4 and finally using them

It's finally time to see the fruits of our labour! :D (But not without some more work to be done first.)

UE4 has some neat features regarding decals and blending of them. This methods only works (as far as I know) when you enable deferred decal rendering in your project settings. Let's have a look at some of the materials features and how I set it up:

  • Blending only the normal pass over the other maps
  • Setting intensity of the normal details
  • Inverting the normal details
  • Automatically adjusting the normal intensity based on the distance from the player camera
  • Ability to swap normal & opacity maps

So now, let's have a look at the material and the instance. It surprised me, but it's rather small.

I had to implement the 'distance-normal-intensity-adjustment-thingy' cause my decals tended to completely fade out once you were a couple of meters away from them and I didn't find any settings to fix that ... so I just built it directly into the material. If it works ... it's good enough! :D

And finally ... here are some screenshots of actual used trim decals inside UE4. Took me long enough to get to this part in the post. :D

What's next?

Well ... that's easy ... generating, baking and placing more of them! Yay ... someone has any good Netflix recommendations for me? :D

Also I hope you liked this short breakdown and got some insights into how I achieved the results you saw and will be seeing in the future. If you have any questions - as always - don't hesitate to ask! I'll try to provide answers and help where I can.

Thanks for sticking through this, feedback is always appreciated!

Cheers and have a great day / evening / night :D

Spotlight - Project Geneva #01 - [Trains]

Making Of / 25 January 2020

Heya all ... finally it's time for one of those spotlights \o/. Hope you enjoy!

To be honest I didn't plan a spotlight post for today, but my schedule got kinda scrambled around a bit. I literally didn't get any noteworthy progress in on the project itself, but still wanted to continue the bi-weekly posts. :D

The reason for this? On January 14th Substance announced and started their next Substance Painter contest ... and I just had to join in on the fun! #MeetMAT2 is a great chance to learn, network and generally just have fun. Definitely head over there and check out all the great WIPs on Twitter & the Substance Forums from artists around the world. :D

Today's topic?

Trains ... yes seriously trains. As I, either said somewhere before or most of you have figured out by themself, 'Project Geneva' is basically only a train station ... and what would a train station be without trains? Ye ... kinda lame.

That's what I thought as well, so a couple of months ago, when I didn't want to model, unwrap, texture, etc... I just sat down and fiddled around with blueprints in UE4. I'm not completely new to the system, but for something that intertwined with different parts in the level it still took me a lot of trial and error.

Also ... it's probably nowhere near perfect ... please don't hang me @programmers :3

Today I'm gonna show you what this blueprint controls, how it works and what routes I chose to build it. First up here is a little .gif for you:

Train System Example [Speed: 1.5x]

What features are built in for now?

  • Spawning trains on both tracks in different intervals
  • 50/50 chances of them stopping or moving through
  • Track display sequences for both options
  • Safety LED lights on the track something's happening
  • Some useless stuff, like decal colors?! ... why? don't ask me :D

The components & What's happening

So what different components / blueprints are interacting with each other? The answer is ... 6 (I think), let's see them in a list:

  • Control BP - just chilling in the centre of the map - controlling everything
  • Train BP - this one obviously gets spawned
  • 3 different kinds of platform border modules - function to check which track they are on
  • Track screen BP  - basically the same functionality as the border modules
  • Ceiling LED tube BP - again the same functionality

Ok ... well it's 7 different BPs communicating, but most of the communication isn't directly BP --> BP. Cause let's be honest, I'm an artist, so I'm gonna do it the 'creative' way. :D

The only really BP --> BP communication is the spawning & de spawning of the trains itself. The rest is handled via 'Material Instance Parameters', cause ... ye it's only changes in materials. The only reason stuff like the border modules, etc... are considered a BP by me, is that I needed to be able to set on which side of the platform they'll gonna be placed. 

Modular border piece BP | In editor variables [Corner]

Even though this is one of the most simplest event graphs ever created in UE4, it still took me a while to figure this one out, so it would work flawlessly. And all of that, because I wanted it to be random, if the trains are stopping or moving through, in addition of them arriving in different intervals. :3

The real heart of this system is the 'Material Parameter Collection' ... you can find this one in every of the materials and the parameters are set in the big 'Control BP'. After testing a bit this was the best method I could come up with to achieve this kind of communication between assets and still have it quite easy to change stuff later on, without breaking something.

Material Parameter Collection 

For an example on how I used this, here is a screenshot of the most complex material involved in this:

Static & Moving Parts Material [TOP] | Timer Material [BOT]

So now, that I briefly gone over all the different components let's jump into how it's all connected. :D

The big boi

The 'Control BP' might look a bit messy to you, but well ... I tried to build it as organized as possible. First up let's look at the whole thing, then I'm gonna break some parts down into smaller segments. Prepare for a flood of images. :DMain Control BPInfinite Looping of the SystemSimple Event Decider for 'Moving' or 'Stopping'

Event Graph for the moving train

Event Graph for the stopping train

All of those segemnt screenshots (except for the looping) are present for each track individually. There's still a lot of tweaking & polishing to be done, but for a working prototype and the state the project is in currently, it's working out fine.

Conclusion

That's it for the first spotlight (at least for now). Please let me know if something was written / described kinda confusing, or if you want to know a bit more details about some of the parts I've shown in here. I'm always glad to receive questions and / or feedback!

Also if there are some @programmers (or other people who are more proficient with UE4's BPs) please let me know what you would have done differently. 

Hope you enjoyed it or even learned something ... even though this spotlight was kinda improvised, to not break posting schedule. :3

Cheers and have a great day / evening / night!