ReSharper is an extension for Visual Studio that provides a lot of quality-of-life improvements over the initial VS user experience. It was initially made for C# (hence the name), but also exists in C++ ! If you never used it, but know competing products like VAX (Visual Assist X) for example, you basically know what ReSharper is.
It happens pretty often that, working on a C++ project, I want to make a new class (separated in two files : a header file and a source file) based on a kind of template, like they should all follow the same basic structure, have the same copyright disclaimers at the beginning, then start implementation surrounded in a specific namespace, etc…
Visual Studio in itself is pretty limited in that respect. And to be honest it’s very possible to just copy-paste existing files and make the necessary arrangements each time, but it becomes kind of tedious and boring over time. Turns out, ReSharper happens to know how to do this kind of thing : behold the ReSharper File Templates ! Unfortunately, it’s pretty complicated to use at first and documentation is scarce (at the time I’m writing this).
So here’s a quick guide on how to do it. It assumes you have ReSharper up and running (for brevity, I skip the part about installing it).
Edit January, 4th 2022 : The Assimp maintainers merged just a few days ago a pull request that enables PBR support by Assimp’s OBJ importer. If you are able to use a recent version of Assimp, I would advise you to go get it and work with it the way Assimp expects it. See the pull request here.
These days, I’m trying to import 3D models exported as Wavefront OBJ files in my Vulkan renderer. In order to achieve that effortlessly (kinda), I’m using the very good Assimp (pun not intended) library.
It kinda works well if you stick to a « traditional Blinn-Phong » lighting pipeline (also known as « prehistoric lighting » 😉 ), with ambient/diffuse/specular components and so on. Everything is there. Things become trickier if you try to bring PBR into the mix, with roughness, metallic and ambient occlusion maps for example.
What parameters should you use in Assimp to read those values ? What texture type should be used in order to import those maps ? Turns out it’s not as easy as one would think, because support on both the Wavefront OBJ specification and Assimp is just not there.
I’d like to talk here about two not-so-new features of C++ (auto types and lambda functions) that managed to bite me recently, even though I thought I knew them well enough (I still do!).
According to me, it doesn’t show that one should ditch them into oblivion and neveruse them (but some people make their life easier by doing so), but clearly that they should be handled with care, as they more or less act as syntactic sugar on C++ type system, which can be, unfortunately, both overly rigid (which is why we use them in the first place) and overly flexible (which is usually why bugs get in our way).