Unlock the ability to change MeshId for Meshparts during runtime OR make SpecialMeshes work exactly like MeshParts

As a Roblox developer, it is currently too hard to recreate meshes on the client via serialization/deserialization when the models themselves are stored on the server for performance and loading time reasons as using SpecialMeshes in place of MeshParts results in degraded visual appearance both due to the lack of Vertex Paint support in SpecialMeshes and the lack of a doublesided property, among other things.

Being able to directly set the MeshId of MeshParts would alleviate all the above issues and make the overall user experience better as developers will be more inclined to store models on the server and have the client request to see them without degrading their visual appearance.

Alternatively, SpecialMeshes can be updated up to standards with the above features.

23 Likes

I’ve run into a relatively niche use case for needing identical behaviour between SpecialMeshes and MeshParts, but a use case is still a use case.

Currently, if I want to have the ability to recolour a mesh’s base colour independently from the mesh’s texture (while also needing the ability to change the texture’s colour), I need to use a special mesh with a decal. In my case, I need to make my actual mesh transparent while maintaining the texture’s opacity. Because of backface culling, I am unable to do this without it looking odd (I can see through the texture from the transparent side).

To mediate this, I currently have to duplicate the mesh and flipping the normals, doubling the number of vertices/edges/faces to get the desired effect.

image

If Roblox were to address this issue by making behaviour between MeshParts and SpecialMeshes identical from a visual standpoint (in my case through adding a DoubleSided property), I could make my mesh look much better without having to double the number of faces, and without having to fill my game up with SurfaceAppearances for a colour map that can’t even be recoloured.

4 Likes

I am currently trying to make a glowing after image effect, where your character’s model appears to trail behind you, I have to create new copies of the character’s parts as well as the meshes, the only issue is special meshes can’t use materials so I can’t make it glow. I would be fine with making mesh parts but I can’t do that since there is no way to update the Id to match the package the player is using. If Roblox could either make special meshes respect materials or make mesh parts MeshId property be able to be changed (even if it was like a custom function that spawned a meshpart with its Id already set) that would be very very useful.

1 Like

Bump.
Was making a blood system and since all accessory handles have a default CollisionFidelity property of Box, the blood splatters would behave very strangely, often times floating above the actual accessory. Unfortunately it is not possible to change both CollisionFidelity at runtime nor is it possible to change MeshId at runtime, so there is no possible workaround as of now.

1 Like

Are you unaware of MeshPart:ApplyMesh, or rather saying that using ApplyMesh with a library of MeshParts in ReplicatedStorage is too inconvenient for your purposes?

4 Likes

I can’t speak for the others but in my case, no it would not.

From what I understand, ApplyMesh requires you to have a mesh already existing where the client can access. However as I keep meshes on the server to reduce client memory and loading times, this method would be completely useless unfortunately.

2 Likes

Would having InsertService:CreateMeshPartAsync available ingame be a satisfying solution for your use case? That’s basically the direct equivalent to setting MeshId (which can’t mechanically work because setting the MeshId is not instantaneous, it requires computing collision meshes).

6 Likes

As long as the client would be able to access it, yes that would be ideal.

3 Likes

Yes this would be a good solution to the issue if it could be done on the client, but as far as I’m aware CreateMeshPartAsync can only be used on the server, makes no sense to me why its server only, maybe just InsertService itself is idk.

Is there an update on this so far? I’m not sure how it works internally, but, surely changing a method from PluginSecurity to ScriptSecurity is no more than changing the value of a flag?

Related: