I have started to work on trying to add an option to the subsurf modifier that will preserve the existing custom normals of a mesh and interpolate the loops normals to the newly generated geometry.
In NPR stylised modeling custom normals are extremely important in getting nice shading on your characters. Currently the subsurf modifier overwrites the existing loop normals.
I spent some time testing and breaking the modifier to try and understand how it works. I currently have it working to where I can give the resulting mesh custom normals. Right now it is just a simple vector for each loop not actually based on the geometry.
In the subsurf code there is a CustomData_interp function that interpolates the loops UVs between the source mesh and the resulting mesh. In that function it also can access the custom normals of both meshes, but the way it is setup currently it skips this when it calls a if (!typeInfo->interp) {} check.
I tried to manually force it to skip this check for the custom normals layers, but it resulted in crashes. Not sure why it crashed, but I will keep prodding at it to see if I can get it to not crash. I just want to see if the interp function could work with the custom normals layer as it is.
EDIT: seems it crashes because the interp check is not just a boolean check or something similar like I thought. The typeinfo->interp is a function itself. So by bypassing that it was trying to interpolate the data with no actual interpolate function. So it seems like that may be where I need to modify the code to interpolate the custom normals.
I just wanted to share this to see if anyone else maybe has attempted this or has some ideas of how to approach it.