AnimToTexture, is putting holes in my static meshs during animation, but not for every mesh.

Ok, so I’m having a pretty game breaking issue, and I cant seem to run down the exact cause. Im very new with a lot of these systems, so bear with me. I’ve been creating a game in UE5.7 for a bit now, and I have been creating a world that will be filled with little VAT(Vertex Animated Texture) people, and each of those peoples meshs will all be VATS mixed with ISM(instanced static meshs). I potentially need several hundred to a few thousand of these little guys walking around at any given time, and have been looking into VATS for performance to get away from skeletal meshs. I’ve designed a system based on several tutorials for for creating VATS from skeletal meshs and their accompanying animation sets, and putting the data on material shaders for my static mesh that I create from the skeletal.
So every mesh for my characters VAT version(I have a “hero/skeletal” person, and I have a static mesh VAT person, that are both wrapped with a higher level more abstract “Root” character)

I do this so that I can dynamically switch between them at runtime. The VAT character is for performance, and the game will switch dynamically between them whenever we need more complexity, for things like our ragdolling physics and blend spaces/special animations, but for the majority of the time, these characters are all going to be driven by an automated system, and will be doing movements and actions that need a lot less complexity.

As for my VAT pipeline. Im going to step through how I’ve been approaching this issue up until now. I use blender for my modeling/UVs/Animation. This character has modular clothing/eyes/hand-held-items. The body and the clothes/eyes, all seem to work fine within this pipeline im using, and I dont have any issues. I can see all of my VAT meshs, they have their proper textures and materials on them, and the materials seem to properly drive my VAT animations.

You can see in this picture above, the man carrying the log, but the log has big hole in the side, but the mans meshs for his body/eyes/shirt/pants/shoes are all fine… I’m using the exact same pipeline to create these mesh’s and animations.

Now for the gritty details:
Im using blender:

In blender I rigged a human man, and all of his clothes/eyes/attached-objects are all their own meshs that are parented to this single armature(This includes the axe/pickaxe/hammer/log), and all of the items that will ever be used on the VAT man(because my VAT man has no skeleton in unreal, it was necessary for me to directly parent and weight paint each of these meshs onto the armature so that I could actually get him to “hold them”, because sockets dont seem to work for a static mesh thats being driven by VATS, and for the axe/hammer/pickaxe/log I paint them directly to my armatures right hand bone, and paint every other bone to 0 in the weight paint, that way that ONLY the hand effects it).


As you can see, the results look decent enough for rough drafting, but aside from my mediocre art skills, the systems seem to work in game good enough for the body/eyes/clothing, but for some reason every item that needs to attach to the right hand, and be animated via the VAT system seems to break the WPO/Normals for those objects, even though I’m burning the VATS the exact same way.


You can see in this picture, my hammer is full of holes, but the man has none (he has occasional weight painting related clipping through his clothes with his skin(but thats just my janky art/weight painting), but this seems to be directly related to the WPO or normals or something. I apply all my normals and apply all of my transforms from blender before I export my FBX in blender.

My settings for exporting EVERY skeletal mesh in my game:


I use these settings while I have both the mesh and the armature selected in the viewport so that I only export that mesh, but it retains its skeletal mesh settings. When I import it into unreal, I click and drag it from a file explorer window directly into the unreal editor viewport content space so that it brings up the import options, and within the “skeletal mesh” section, I assign the new skeletal mesh to the mans skeleton mesh I imported earlier on. So that I get a skeletal mesh for the item specifically, but it retains the animation data. So for instance:

I can attach my axe to my man in the animation via a display skeletal mesh, and everything plays seamlessly and fine.

Now for the content structure:

All of my VATS and their structures are laid out exactly the same way, you can see in the file editor I have a list of clothes/GenericResources/GenericTools/Appendages, these are all the skm’s/sm’s and their accompanying VATS:

Inside the VATS folders:

This is where I keep the Materials and the Material instances, the Anim to Texture data asset, and the VAT textures themselves.

Using a editor widget utility tool I built from watching several tutorials(ill show its source), I create the data assets and vats, and burn the VAT data into those VAT PNG’s. The tool looks like this(probably like most peoples who have ever done this and built one of these from the tutorials…):

Now for the blueprint source:

InitSKM:

CreateDataAsset:

CreateVAT:

UpdateDataAsset:

BakeVAT:

Now for the data asset and materials and static meshs themselves. Ill give a working example(the body), followed by an unworking example(the hammer):

Part1 of working body:

part2 of working body (I scrolled down in the data asset so you can see the rest):

part 3 working body(Actual material internals):


As you can see I use UV0 to drive the WPO and Normals, and I use UV1 for displaying my colors/textures(different on each, the eyeballs actually have a texture(it works and moves fine with VAT)). This is the human man body mesh.

Ok now for a NON-working full of holes data asset and materials(The hammer):

Part 1 hammer:

Part 2 hammer:

If anyone out there can point me in a different direction toward something that Im doing that is wrong or could be done better in my pipeline, please help. This is becoming a very niche rabbit hole of complexity the internet isnt yielding good results for solutions. Thanks again for any help.