More control over MaterialVariant tiling origin/direction

As a Roblox developer, it is currently too hard to achieve consistent visual results with the tiling of MaterialVariants on MeshParts.

Due to MaterialVariants tiling from the center of the surface, any sizing of the part that isn’t an uneven multiplication of the StudsPerTile property results in the texture looking like it’s been shifted over.

A visual example:

With the tiling originating in the center of the part, instead of the top left corner as an example, the middle example surface has been shifted. The desired result is for it to tile correctly from the top left corner to match the other surface sizes.

Using Texture instances this can be combatted with the OffsetStudsU and OffsetStudsV properties to offset it on a per-part basis, but Texture instances are much more costly on a larger scale and also do not support the same SurfaceAppearance style of parameters, meaning less visual detail is possible.

Regular Part instances seem to tile in the expected manner just fine, but MeshParts with their MeshId set (even if the mesh is the same shape as a regular Part) do not.

If Roblox is able to address this issue, it would improve my development experience because it is currently impossible to adjust or tween a part’s size during runtime without significant visually jarring results.

A voxel style terrain engine I’m working on is currently at a standstill because, due to the forced tiling origin point and my greedy meshing algorithm to lower rendering costs, performing any action completely shifts over the majority of textures in a single, incredibly jarring motion.

The only way I can solve this myself currently is by uploading 4 copies of every surface texture with shifted dimensions and having 4 MaterialVariants per surface texture which are dynamically changed based on surface size. I should not need to quadruple the texture memory usage in my game to achieve this effect.

And that’s only because the surface size is always a multiple of StudsPerTile, any other increment would require even more. With any arbitrarily sized parts there is no solution for this.

I would suggest a property to MaterialVariants similar to the StartCorner Enum used in UIGridLayouts, but including a Center value to keep the current behaviour, or an AnchorPoint style property. This is just me throwing ideas out though, no idea how easy this is to do in the engine.