Unreal Engine Materials in 6 Levels of Complexity
As a reminder folks! I’ve been selected as a judge in the official Honkai: Star Rail 3D Challenge! Make sure to join in on the fun and tune into my livestream on May 17 where I judge the submissions! hoyo.link/8sEiFBAL
Add this Master Material to your project right now with 50% OFF this week: bit.ly/TheMasterMaterialGumroad
Or grab all my assets by joining my Patreon: / pwnisher
Unreal Engine Training Playlist:
• Unreal Engine Training
Weekly Challenges on my Discord:
/ discord
After this video, materials in Unreal Engine won't be a problem for you. Because we're building a future-proofed master material, that all other materials will spawn from, in six levels of complexity. And we'll only have to build it once, because you can use this across all your past, present and future Unreal projects.
In level 1 I'll show you how to create a material, add textures to it, and make them swappable for other textures. In level 2, well add brightness, contrast, saturation, tint, roughness, specular and normal intensity controls to those textures. Level 3 is where we'll add switchers for each category incase you'd rather control them via 0-1 sliders vs using a texture. Level 4 w'ell cover material functions and build a position, scale, rotation function so we can tile and slide our textures around. In Level 5 we'll integrate surface imperfections into the roughness channel, complete with all the controls you'd want for blending the two together. And in level 6, we'll integrate a dirt overlay function into the albedo/color category, complete with their own position, scale and rotation controls too. Then finally, to wrap things out I'll show you how to migrate the master material to all your other projects, and how to actually use what we just created on a piece of art! This is a video I've been looking forward to dropping, so I hope it helps you a ton!
Edited by the glorious Matt Esteron: @l0fitherobot
CHAPTERS
00:00 You can do it!
01:39 50% off my Master Material
01:57 How Material work in Unreal Engine
03:44 How to Create a Material
04:23 Level 1 - Basic Material Setup
06:25 Honkai: Star Rail 3D Art Reveal
07:30 Level 2 - Color Correction & Intensity Sliders
13:20 Level 3 - Swap between Textures or 0-1 Sliders
17:24 Level 4 - UV Controls with Material Functions
23:15 Level 5 - Surface Imperfections
30:53 Level 6 - Dirt Texture Overlay
35:48 Migrate to Other Projects
38:09 Using our Material (finally!)
43:27 If you liked this video, then check these out!
JOIN THE COMMUNITY:
Patreon: / pwnisher
Discord: / discord
InstaGram: / _pwnisher_
Twitter: / _pwnisher_
PRINTS & ASSETS:
My VFX Assets: gumroad.com/clintonjones
Limited Edition Prints: www.noisegrainandlight.com/store
TOOLS I LOVE:
KitBash3D: www.kitbash3d.com/pwnisher
Camera: amzn.to/3ihzNg8
Lens: amzn.to/3cBB6TJ
360 Camera: amzn.to/3w1PKLn
Studio Lights: www.aputure.com/
Desktop Mic: amzn.to/37JmQoN
LAV Mic: amzn.to/3vg9wlh
Monitor Lamp: amzn.to/37JfyBI
How I Learned Cinema 4D: greyscalegorilla.com/join-plu...
MY RIG:
hubs.ly/H0_cR2l0
#3d #diveintodreams #honkaistarrail
Пікірлер: 370
Check out the Honkai: Star Rail 3D Challenge here: hoyo.link/8sEiFBAL --- MATERIAL VERISON UPDATES AND WISHLIST: v3 RELEASED: - added snow/dust layer controls - redesigned the normal map node structure - added "color correction" dropdowns for anything that uses (brightness, contrast, saturation, min/max) - disabled unneeded plugins from UE project file - added switchers & controls to use textures for metallic, opacity and emissive (with placeholder black_solid in the texture slot) - using the terminology "scale" as opposed to "tiling" as it's more accurate. WISHLIST: -realtime edge and recesses matte (curvature map) -option for packed textures (ORM, ORDp, etc.) -displacement -named reroutes -world aligned node for meshes w/o UV's.
@peetroar
26 күн бұрын
This was such a well presented and useful tutorial that has really inspired me. The step by step journey you are take us on is so approachable and gives a practical insight into materials. Would really love a new video to cover these new features as level 7 and beyond!
@pwnisher
25 күн бұрын
@@peetroar Thanks so much for the love and support! Yeah if things align, I don't see why not a part 2 wouldn't be fun =]
@Junglejuz
24 күн бұрын
Thanks for this great video. Perhaps on a bit more advanced topic, my only request would be to include some love for glass materials. This is very important for architectural work. For example: 1) TINTED GLASS - Most glass has varying degrees of iron, giving it a green tint. It's more visible the thicker the glass is. Other glass is purposefully coloured. 2) REFLECTIVE GLASS - Has a thin layer of metallic or metallic oxide coating making it more reflective 3) DICHROIC GLASS - Can display multiple different colors depending on lighting conditions. (Maybe Substrate materials will be more capable of this) 4) TEXTURED GLASS - Displaced surface (Best seen with proper refractive ray tracing, which Lumen is still limited with)
@zoeintelligence
23 күн бұрын
@@Junglejuz there's a package on marketplace called Advanced Glass material. check it out
@issacdhan
22 күн бұрын
@@pwnisher Just to inform, Your this video screenshots and clips were used on this video. kzread.info/dash/bejne/dXaMm6esltHeZaw.html
Watched the whole thing, great explanation! Some good suggestion already in the comments: I would suggest generally using a few more functions to clean up your master, adding detail normal (u can use BlendAngleCorrectedNormals node for that), adding a texture slot for metallic. Also I would suggest you to look into some blend nodes for combining your imperfections (blend_screen for example). You could also add some blank texture samplers for when you need to swap your Shading model, or use different masters for each. Another great organisation tip is using named reroutes. Small but very useful workflow tips: - toggle "hide unrelated" at the top of the graph, makes working on large materials a lot more managable. - press q when having nodes selected to straighten the connection! For more advanced stuff, you can make your own shader using Material Attributes (Layered Materials). Also for anything shader related, Ben Cloward here on youtube is the best teacher!
@pwnisher
28 күн бұрын
My god! Thank you for ALL of this!!!
@shark3D
27 күн бұрын
replying here just to have a reminder to self!
@curtissmith1507
26 күн бұрын
same i will forget immediately
@SuleBandi
24 күн бұрын
@@curtissmith1507 me too
@sanjeevansingh6090
23 күн бұрын
thxx
so helpful clint. i’ve recently been hired as an unreal artist for a commercial studio and thought that my knowledge in blender would transfer over and it definitely hasn’t been as easy, especially with the the way materials are set up. the material instance feature alone is different enough that needed its own understanding. super dope vid
@pwnisher
28 күн бұрын
YES! So glad u can benefit from this!
@jomesias
27 күн бұрын
The blender node system is more straightforward. But materials and Niagara system are quite powerful!!
@pks_90
24 күн бұрын
@lordnaps Which studio? I am also looking for start to career as Unreal engine artist. Is there remote job ? Can you share details like website or LinkedIn profile
Hey Clint! Great work on this video, must have been a hell of an editing job...by the way killer thumbnail! I love filmmaking and virtual production in Unreal Engine, it changed everything for me. Keep up the solid work, It's not easy but you're killing it.
I would suggest add something for emmisive, detail normals(for large objects), opacity option, and an option for objects that do not have any UV's, so an WorldAligned option. Oh and an option to use packed textures (quixel and SubPainter use that a lot)
@bernardvezina-gagnon24
28 күн бұрын
Some bump offset or parrallax occlusion mapping would be nice
@pwnisher
28 күн бұрын
Yeeeeees!!!! World aligned is what ive been looking for then!! I hate UVs and am glad i have an avenue to dive down now. Thanks mdzine
@sebastiankraus109
10 күн бұрын
I wouldn't necessarily add the opacity option, rather create a second master material specificly for translucent materials. The reason is, if you want to use opacity at all, you need to set your Shading Model to 'Translucent' for the whole material (and all instances), which is less performant than the default 'Opaque' option.
Nice start for a master material! Instead of migrating, though, I would recommend making your own plugin (which is super easy to do) and place your master material plus the necessary assets into your plugin and you're good to go. All you'd need to do is enable the plugin in whichever project you're working in. I do this with my own game development work and it's a great way to keep your custom library of tools in one easy to reach place.
Thanks Clint for this amazing tutorial! It makes life so much easier! So many things I still have to discover in UE and I am happy there are skilled artists all around to teach me more :) Keep up the good work!
Great tutorial, well explained. I think the other things key to a "Master Materal' would be to have nanite displacement controls (for 5.3 onwards displacement is back) + alpha controls for masked materials. Would also be interesting to have a switch for transparent materials (not supported by nanite), so one could still use the same master material, but switch when you need a transparent material. Also material blending controls to remove tiling etc would be very useful. Keep up the good work
@pwnisher
28 күн бұрын
All features im planning to add yes!! The v1 actually has the opacity mask feature you’re mentioning.
@3TQHAJSHNQ
26 күн бұрын
@@pwnisher I'm about to buy the master material, will these updates you plan to add be free for people who already bought it?
Dang dude this is a solid tutorial! Master class level stuff
Amazing Tutorial man! Feel so lucky to have seen you do it live at the event last time :) Thank you so much for being such an amzing creator and sharing you knowledge!
@pwnisher
25 күн бұрын
That was so much fun! Now lets see if I can pack this into 20 minutes!! xD
I've watched a lot of material tutorials, and this one by far had some of the most useful information and it was the easiest to follow. Thank you!
@pwnisher
27 күн бұрын
Yo that means a lot! Thank you and I'm glad it was helpful!
Amazing! This just might be the best materials video out there. Top notch. Thank you!!!
Damnnn judge for the Star Rail competition? That's awesome. Can't wait. Fantastic tutorial by the way, learned a lot.
Such amazing explanations of materials! I can’t wait to bring these ideas into my games in Unity as well!
Now this is the type of vids I love as someone who hasn't touched any real work with this stuff just enjoy the content made about it. No video has made me want to begin working with this stuff then these. I hope the vid does well I know I'm sharing it around so I can see a lot more of this content :D Love it keep it up :)
@pwnisher
28 күн бұрын
Thanks soooo so much for the support!! 🙏🏼
@AskKory
28 күн бұрын
@@pwnisher Thank you ive been following your content since you started at corridor.
This is a great intro to Materials in UE Clint. Thank you!
Another amazing video! Materials have been the scariest part about learning UE for me. Great job demystifying them!
@pwnisher
28 күн бұрын
Oh waddup Scouty!! So glad its helpful! I gotchu man!
I was looking for something like this a few weeks ago and had to piece together parts from multiple vids to get what I wanted. This vid has it all in one! Thanks Clint!
@pwnisher
27 күн бұрын
So glad to hear! Thanks for stopping by!
Amazing! This is super helpful thanks Clint, as always bringing the power to the people!
15:00 small workflow tip but great time saver - you can double click any of the lines in the material editor to insert a reroute node at cursor
I followed this video step by step, learned lots of skills, appreciate for sharing. Thanks again!
That was Awesome Pwnisher... I followed along till the end and created my first Master Material.... thanks A lot
@pwnisher
25 күн бұрын
Oh heck yeah!! Thanks for watching all the way through!
I've been watching you since the beginning of Corridor Digital. And if it wasn't for your 3D tutorials like these or showcasing of your guys' amazing skills through your short films, I wouldn't have a career in the industry. Thank you so much Clint and praying for your continued success always.
Excellent Tutorial! Very clear and easy to understand! Thanks again Pwnisher!
@pwnisher
28 күн бұрын
Im glad! Thanks for watching! 🙏🏼
Thank you! i'm saving this on my important playlist. 🙌🏿🙌🏿
Level 7 : Displacement. Ooohh boy that feature sure has some weird scaling variables.
@pwnisher
27 күн бұрын
Yeh I really wanna look into this!
@wolhoffacep104
26 күн бұрын
Yes displacement please
I was literally searching for good UE tutorial to start finally learning and this video popped up ok no need for anymore sign. Thank you. Can I say I love you.
Thank you so much. I've seen so many beginner unreal tutorials that tell you to use material instances, but none of them ever explained the performance benefits! I always thought it seemed like a lot of effort to go through just so you could see changes without clicking compile. Now I know better. Thanks Clint.
@pwnisher
26 күн бұрын
Yeah for sure! I try to break things down so we can all understand WHY were doing stuff. Thanks for watching and stopping by.
@MikolajF
15 күн бұрын
What is in this wideo about performance is not true. Yes- changing MI vs MM settings will be slower on MM because master is where the actual code is and it needs to recompile while saving, but MIs inherit the code so no recompiling. I was facepalming so hard my head hurt. Using MIs is a memory thing and a matter of convenience. Let say you have 2 assets, and you want them to use the same textures but different tiling. You DON'T want to use 2 different materials where the dif is only a tiling. UE doesn't know they are almost identical and it will keep both in memory. When using the same material with two different Mis, you will have just one code with parameters in memory. Its like building one slow blender for some gentle preparation and another very fast for liquefying something vs one blender with multiple speeds. Its faster in use and takes less space ;)
Words cannot express how helpful this is!
Thank you very much for such a detailed Material Tutorial.
Great tutorial! Thanks. This answered a lot of questions I had on mixing textures and imperfections
Great clean straight to the point. Thanks.
Unbelievable how you explain such complexity into understanding. Thank you!!!
Awesome work loved every minute of it. Scary to fully commit to unreal but with Tutorials like that it gets easier and easier. Maybe next up a Master-Landscape Material?
@pwnisher
27 күн бұрын
oh man i dont even know what a master landscape is! But it sounds cool cause I love environments
@faebetutorials
27 күн бұрын
@@pwnisher Hahahah yeah its so cool it adapts automatically depending how steep an area is. So for example if a mountain has a grass material the steeper areas will have a stone material. And you can do alot more for example height base textures to create snow at a certain height!
@pwnisher
27 күн бұрын
@@faebetutorials That's so awesome! I love that!
Best unreal tutorial I've watched so far. Keep the good job, you're a treat 😘
HECK YEAHHHH thank you so much for making this video. I’ve been trying to go down this road and following your videos are so much more helpful than the patchwork of tutorials I’ve been looking at ha
@pwnisher
28 күн бұрын
YES! So glad it’s helpful to you!!
Continue to be so impressed with your knowledge share! You are a master resource on master materials (and so many other topics)! 👏👏👏
@pwnisher
28 күн бұрын
Thanks so much!! I just love diving in deep and helpin other artists like myself understand this stuff
What led me to this channel was watching the Unreal Engine tutorials by Bad Decision Studios.. Awesome content, and yes , i’m watching them thru!
You forgot level 7 where you learn shader optimization techniques, level 8 where the materials allow for ultra customiztion of objects and characters, level 9 where you make complex realistic "simulated" surfaces such as water and level 10 where you start writing your own material domain.
Thank you so much for this video!
This is great! thank you so much.
so excited 👍🏼
For organization: Named Reroute nodes help a lot, as it lets you have disconnected structures that are linked through separate nodes. So your common UVs can go into a node named "Common UVs" and then you can add an output of that reroute node everywhere you need it without wires going everywhere.
Thank you, Clint! You are a gentleman and a scholar!
amazing explanation! thanks!
I Loved this complete walkthrough of how simple vs complex a material can develop. Watched in full! One-stop-shop with you videos haha. I'm curious how UE will continue to develop the experimental Substrate material work flow. That might be another can of worms to unpack though a lot of the concepts from what was shown would apply! Thanks for this Clint!
@pwnisher
27 күн бұрын
Im soooo glad you feel that way about my videos! That's always my goal, one-stop-shop! You said it perfectly =] And yeah! Substrate just looked weird and confusing, and I probably wont use it until they force it on us, or until Winbush puts out a video thats called like "Youve been Sleepin on Substrate" and makes me think otherwise.
Awesome Awesome Awesome! I realized at 30:30 that priority level is separate for each group, so thank you for showing that. I would have mentioned that earlier if it was me, but at least I get it now. You rock man. Also, for my MM I would add emissive toggle with intensity, color, maybe a mask for inner and outer radius. I would also add a way to make it look cell-shaded. I'm guessing you would use like an edge mask. And lastly, I would add the option to input a color pallete, mostly for Niagra effect purposes.
This is the upmost best tutorial for unreal engine material part. I learned it, loved it and enjoyed it Sir👍
@pwnisher
26 күн бұрын
Yaaaaaaaaaay! So glad to hear!!!
Would love to see a detailed video entirely for material optimization as well. Thank you!
you anwsered so many questions i had about UE5 in just the first ten minutes alone. you are amazing
Normal control can also be: lerp(float3(0, 0, 1), Normal, NormalStrength). Works both ways - for lowering and increasing). That’s because your Normal map is in tangent space and float3(0, 0, 1) is a flat normal in tangent space.
not me just randomly watching this despite not using unreal engine lol
@HowToHighrise
15 күн бұрын
I think I've learnt entire unreal engine without ever using it 😂
@frensisbasha
12 күн бұрын
Now imagine how much someone who wants to use unreal engine needs to see this
@Draliseth
9 күн бұрын
Nope.
Hey, great tutorial and a good starting point. I won't suggest new features as you are likely gonna add many in the future, but I think it is worth mentioning that it is generally better to have your power (contrast) nodes before your multiply ones. You can achieve the same results either way, but if you have modified the contrast, then the multiply will have a different impact (as the contrast turns linear changes into exponential changes) and it might be really finicky to get it right sometimes. On the other hand, if you swap them the multiply will always behave linearly and will be easier to control, as it is affecting the result of the power node. Keep the great job! It's always nice to see your content
@pwnisher
19 күн бұрын
Super useful tip 🙏🏼
Such a great tutorial!
first six minutes already learning new things, thank you!
Awesome video, and brought a lot of answers to questions I've asked myself for quite some time! Wishlist: Would love to see a different way to use Surface Imperfections, as an overlay rather than a linear blend, how you would add some scratches on a polished surface by adding (screening) it on top of the base roughness map. Always struggled to do this in an effective way!
literally great video thank u very much for everything man..
Thank you, was super easy to follow.👍
Dude thank you a lot!!!! May the unreal force be with you!!!
Thank you Clint 🙏
This was anvil-heavy Firing Unreal for the first time this week, so this is super useful Much. Thanks
awesome tutorial. brilliant! i cant seem to find an awesome glass texture that reacts to lighting properly. A master glass would be awesome. great work!
Did I just see a reference to Grandma's Boy? I love it here!
@pwnisher
19 күн бұрын
Hahaha yeah dude Jp’s the best! 🤣
An exceptionally interesting and high-quality tutorial 👍. However, it would have been much more interesting for me personally if it also showed how to include the option for triplanar, as I almost always use triplanar materials. Is it possible that you could demonstrate triplanar in the future?
@pwnisher
27 күн бұрын
Yeah i wanna get away from having to use UV's. So that will probably the first update tbh. Figure out a way to bypass any UV's and just have your textures flow by default.
Great video as always. Little tip: To add reroute node just double click the node line
@pwnisher
25 күн бұрын
WHHHAAAAAAA!!!!???!!!????!!! Frick YES!
@cutlervanalstine2984
20 күн бұрын
You beat me to this comment so I'll add another tip for a clean graph here: selecting multiple nodes and pressing Shift + W will align them by the top of the nodes, so you can get those perfectly straight connections without constantly wiggling nodes around by hand. (and Shift + S, or A, or D aligns in other directions)
Great efforts! 👌
This is the best material video I've seen. Would all this setup work the same with the substrate material?
Thanks for this. I was up until 1 am building and tweaking this. I've floated from Blender to CD4, back to Blender and now Unreal Engine. Blender / UE seem to be a great combo for me.
When rotating normal map UVs, you also need to rotate your normal map vectors. Example : normal map value of (x=1, y=0) vector is pointing right. If the UVs are rotated 90° CW it should now point down. However the value is still the same (1, 0), it needs to be rotated to be (0,1).
It's been almost 15 years or has been since I've been in games development. I gave up on it after poor leadership decisions/corporate takeovers lead to massive cutbacks and studio closures, which cost me my job at 2 different studios. The economy got pretty bad back then after the last loss and I had to move on to something else to provide some kind of income for my wife who was finishing college. Now all this time later and I still have a passion for art and games design. I see what people are able to do with these tools on their own and with small teams and it makes we want to try and produce some game ideas I had over the years. This video popped up and has got me wondering if maybe despite the state of the industry and economy... maybe I should try again and start over. It's been so long, and the tools have changed so much, it'll be like learning from scratch again, but there is nothing else I really enjoy other than making things, especially games. Thanks for your great video. I saved it for later so I can download unreal and start the process.
This kind of reminds me of the node grpups you can make in blender, Where you can hook up anything into the parmaters and change them for each object its applied to while keeping the node group an instance of itself
This Video came just at the perfect moment thanks clint!!!!
@pwnisher
26 күн бұрын
Glad to hear it =]
Great stuff! for the UV projection part I would add a Local/World Switch to get the additional option to enable projection of textures in world space. With Absolute World Position is an alternative to the TexCoord Input.
Another great content! ❤️
LOVED THIS MAN. Thank you so much..!!! Would love to see some Substrate material tutorial...!! Or maybe some Particles or procedural Stuff!!!
An absolute life saver Clint! Thank you soooo very much for sharing this! One cool feature would be to add directional dirt to, say, top of walls etc. I honestly have no idea whether this is possible or how one would go about doing this! Thank you again!
@pwnisher
28 күн бұрын
Oh it’s tooootally possible and i’ll have this updated by next week!
@wayneparker1235
27 күн бұрын
Still trying to get my head around the beast that is Unreal. Between you and William, I think I’ll get there! Thank you again!🙏👊
Ok this has to be the sign that I need to learn Unreal.. thanks a ton fam!!
Btw for the "re-route" node you can just double click on the line! :)
Great tutorial Clint! Thanks. I modified a couple of things to make it a little more accurate. 1) I changed the LERP for the Surface Imperfections to an Add. This doesn't change the material's intrinsic roughness, but adds the roughness. I just used a multiply on the Surface Imperfections to control how much I'm adding. 2) The Dirt should also affect the roughness, so I added a Static Switch that allows you to add the dirt to the roughness. I also set my version up to use packed maps for AO, Roughness & Metallic.
@pwnisher
25 күн бұрын
Yeeeeeeeeeeeees to number 2!!!!! I need to do this! And yeah im learning about packed textures, so it'll be in the v4 (v3 is live if you wanna redownload it)
@BudMyrick
24 күн бұрын
@@pwnisher I'm glad you like the suggestions. The thing about the 1st mod is that it won't affect the areas that don't have surface imperfections. The LERP will change the underlying roughness values as a whole.
Great Tutorial. Would love to see a follow up that deals with refraction because that uses a different blend mode.
YOU KNOW IT! (Build that bridge for us Clint!)
@pwnisher
25 күн бұрын
Oh waddup Cmike! I gotchu boiiiiiii
Just started with unreal and this was super helpful. Thanks for that! The only thing I’m missing isanother group for translucency/opacity to create thinks like glass, tinted glass, or materials with holes and things like that and also maybe emission. Then I would have averything I need for the beginning😊but still this is a great start, so thanks again!
Gracias. Me a servido mucho !
Great Work
@pwnisher
28 күн бұрын
Thanks a bunch!
I don't know if you're going to read this... but man that's some great work really!...keep going please!
@pwnisher
19 күн бұрын
Thanks a ton 🙏🏼
Thanks!
Where have you been all these years? ahah I've experimented quite a bit on unreal at this point, but I must admit that I kind of avoided material blueprints since I didn't understand how they worked. Did a planet Earth for a project lately and began to get it a little since it involves a lot of material blueprints, but it was still kind of obscure to me. Your video just makes everything perfectly clear now.
Thank you so much!!!
Hey thanks for this marvelous tutorial, i learned a lot from this, can you do a tutorial about animation blueprints, control rigs and stuff, that would be pretty usefull.
thanks for this
super useful!!
love this, full effort to make this vidio
picked it up during the last challenge its pretty good
Ok yeah I am totally using this for reference for my work
@pwnisher
26 күн бұрын
Heck yeah! Get it!
This is awesome thanks :) I knew somethings in blender but in unreal i thought i never have a chance to get to know theese now i can use it in everywhere BIIG thanks. (transparency and emission would be nice but i think based on your Step by step i could managge to add them somehow) :)
Wow, I'm amazed that Unreal doesn't have these types of controls built into Unreal Engine. Learned a lot of new nodes. I use blender and it's interesting to see similar nodes. Thanks so much for this.
Love this tutorial, exactly what i was looking for :) Thank you! Do you have any tips to make something soft looking? especially for fabric projects, giving that softer look
10 million out of 10 man! Well done :D
Can we add displacement??? Great tutorial!!! Excellent all around
good stuff. The next layer I'd think would be a map with color layers, using R G B A as masks to hue-shift parts of the material. this is useful especially in games for changing outfits, hair colors and other such things for customization. You might consider a normal bump offset. Otherwise, this is pretty thorough. great work!