Okay, after having tried stuff and failed, and then continued with other important work, I’ve been thinking about this some more.
The basic gist is that any object, be it a static or skeletal mesh, should be able to interact with the surface. That means no distance fields, since they only work with static meshes. Similarly, since not every object should interact with the surface, whole scene effects such as depth fade and such can’t be used either. I did some more research and found some work done in Assassin’s Creed III / IV. AC uses spheres placed around the hull to interact with the water, which sparked an idea:
Fill up the mesh with small collision spheres (not too small and not too many) to approximate the shape, taking animation for skeletal meshes into account (perhaps by using a physics asset with only spheres). It doesn’t have to be precise, as long as the spheres are not sticking out of the mesh too much and there aren’t any large gaps. Then it’s just a matter of detecting the spheres overlapping with the surface and “paint” the surface’s render target based on the location of the spheres to create the splat map. This is then updated each (couple of) frame(s) to check if the spheres are still overlapping.
Since we’re only using a small water surface and only one will be used at any one time, the cost of the many overlaps should not be too much of a problem. There might be ways to optimize it based on distance and not have it calculate all the time.
I believe this is similar to how NVIDIA Flex works. Soft-bodies, fluid volumes and cloth are all made up of spherical particles that interact with each other and affect the connected surfaces. In this case however, we don’t use them as particles/fluid/soft-bodies, but merely to detect objects interacting with a surface.
So, the question: Is there a way to quickly do this without having to manually place all the spheres? Fill up a static mesh to approximate the volume (and control the resolution which controls the size and amount of spheres)? I imagine for skeletal meshes I just create a separate physics asset with only spheres and make sure it’s only used to interact with the water surface, then somehow synchronize it with the visible mesh (as the skeletal mesh itself will probably use a standard physics asset for all other collision interaction).