Finale of Part Surface Changes: No More Hinges

Hello Devs,

Our epic Part Surface trilogy is coming to an end.

Last year, we made some changes to remove part Surface behavior, which was about a year after the previous time.

As Roblox evolves, there are older features that don’t make sense anymore, have better alternatives, and only confuse new developers. SurfaceTypes and the Joints they create are one of these features. Over the last several years they have lost functionality due to the new physics solver and other updates. We are continuing to slowly move them to the background in order to put more focus on a singular Studio building standard.

The goal is typical of Studio changes like this: prevent heavy use of part surfaces going forward, while maintaining existing game behavior.


The following is now live:

  • The Surface Tool (surface selection drop-down on Studio top ribbon) no longer performs any joining operations on parts. It will only ever apply the surface texture.
  • The “Surface” and “Surface Input” sections of a Part’s properties are hidden if the part is all Smooth. If the part has a Surface assigned to a SurfaceType other than Smooth, the sections will be visible as usual.

The following are now also live:

  • The Studio move tool’s “Join Surfaces” option will ignore Hinge and Motor surfaces. It will create Weld instances on all SurfaceTypes.
  • The Workspace:JoinToOutsiders API will ignore Hinge and Motor surfaces. It will create Weld instances on all SurfaceTypes.

After all this, SurfaceTypes will truly have no impact on building.

Why the wait?

We want to give some time for developers that may still be using Hinge and Motor surfaces to switch to HingeConstraints. Additionally, anyone currently relying on the Workspace:JointToOutsiders API to generate Rotate joints at runtime will need to create them at edit time and save, or switch to using MakeJoints. The delayed second phase of this change is now live.


How can I still create these old JointInstances and SurfaceTypes?

  • They can all still be instantiated via scripting, and BasePart:MakeJoints and Model:MakeJoints will still follow legacy joining rules. Using Constraints instead is encouraged however. (Also note that Weld, ManualWeld, Snap, Glue, and ManualGlue are all functionally identical to the WeldConstraint.)

Will my old toolbox models and games break?

  • No, thanks to the explicit JointInstances change (the first chapter in the trilogy), all old models and places will build their respective joints based on part surfaces if they aren’t already there.

I use the Hinge and Motor SurfaceTypes to mark part directions! What do I do now?

  • We are aware of this use case and the problem it solves, but I think we can all agree that slapping a hinge surface on it is not very elegant solution. There are several alternatives, and we plan to further solve this problem with the new Lua Dragger/Move tools.

Alternatives include:
  1. This awesome plugin by @PeZsmistic :
    Studio Tweaks - Disable selection box, disable UI Editor, anchor new parts, show selection faces, and more
  2. Attachments
    Attachments are easy to insert and very light weight. You can toggle multiple levels of detail, and in-game visibility can be toggled with the Visible property.
  3. Adornments
    You can add HandleAdornments to parts. This example shows a cone and cylinder adornment. (Thanks @Zeezy2204!)
  4. Using textures/decals
    This is another common method that could also provide the benefit of showing a grid. You can even use the SurfaceTypes still shown on the Surface tool, which will show the Properties section again.
  5. Make a tiny yellow cylinder and weld it to the side of your part.

I’d like to convert the old JointInstances in my game to using Constraints. Is there an easy way to do that?

  • Yes, you can use this plugin I made. It automatically converts all the legacy JointInstances to WeldConstraints/HingeConstraints from a selection of parts and models. If you have scripts interfacing with your legacy joints, you will need to update your scripts.


Part SurfaceTypes have no impact on how surface joining occurs. They only change how it looks. The studio dragger will not create Rotate joints from Hinge surfaces.




Will the surface tool be removed completely at some point? If it has no real purpose anymore so I would just prefer removing it completely to make room for new tools that might be added in the future.


The tl;drtl;dr was too long; didn’t read. Here’s my tl;drtl;drtl;dr:

Hinge/Motors surfaces are gone

I hope nobody did this. Even something like a decal serves as a better alternative to mark a front face; hinges and motors always seemed like an ugly workaround for that purpose.


The surface marking is sometimes used in games to mark which way a seat faces, for example


It’s sad to see something like this go but Roblox has to move on.


“Hmmm today I will break skateboards and vehicles.”

Yeah, I’m not very ok with this change - not everyone is a dev and will be aware of what is going on.


Many were already breaking anyway due to other physics changes, rip


Yeah, but then many old games will break which is a shame.

I’d rather have cars that can occasionally blast me to the moon, rather than have one fall apart.


Existing vehicles and skateboards won’t break. Existing Rotate JointInstances are not being removed, and will continue to function as they did before this. This is mentioned in the FAQ.


What about inserted models?
Will they not be overridden once inserted?


I currently use the Surface section to see relevant part surfaces through highlighting it (I don’t mark them)… I won’t have the ability to see this anymore if my surfaces are removed without adding instances (to be honest support should exist in the new Lua draggers in my opinion).

For example, sometimes my code relys of the Front direction of a part and I use the Surface list to view faces because it nicely highlights them and isn’t a pain to access (Yes I know I can use a plug-in for this but this makes me sad and that’s not good :cry:)

If the draggers showed relative directions this would probably solve all my problems. :wink:

In the mean time I don’t think it’s worth a feature request so I’ll just use a plug-in or something else.


See Will my old toolbox models and games break?

:wink: :wink: :wink:


What about VehicleSeats?
The documentation mentions hinges, will how will this affect vehicle seats?

I know, it would be 100x better to write a custom vehicle system…


This was handled in the explicit JointIntances change as mentioned int he FAQ.

All models that were uploaded before that change will have their joints created as normal upon insertion to the Workspace. Models uploaded after that change should already have their JointInstnaces created in the model heirarchy, and won’t face any issues.


Yeah, my bad. I’m reading this quickly.


VehicleSeats will go completely unchanged afaik as this only pertains to the creation of new joints within JointsService.


This is making me have flashbacks to the time I tried programming ragdoll physics with no prior physics experience because I didn’t know that Glue joints existed or what they did or that they NOT ONLY BREAK ON IMPACTS but ALSO FUNCTION AS BALL JOINTS??? I only wonder who decided this name and why because I see no relationship to GLUE???

(Shuddering intensifies)

This is a perfect example of why this behaviour should go. Now we have… BallSocketConstraints! And they aren’t a massive pain to make! (Or break on impact…)


So what will be the future of vehicle seats now? I know pre-existing vehicle seats and the joints will be preserved, but what about later on?