Changes to Part Surfaces

Hello Developers!

Over the next several months we will be taking some steps to begin phasing out Part Surface Types. As you may know, all parts have six surfaces that can be set to one of the following Surface Types: Glue, Studs, Inlets, Universal, Weld, Smooth, Hinge, Motor, and SteppingMotor.

Roblox has a joining system where touching parts connect together and different types of joints are created based on the surface types of the two touching parts. Sections of this feature have been removed in the past as we moved towards the Constraint system, other parts have been left with some usability issues, and it’s continually confusing for new developers. You can control this behavior with a three-state drop-down next to the Move, Rotate, and Resize tools on the Studio Ribbon. Our initial changes focus on this dropdown and how it controls building in edit mode.

What is changing?

  • The JoinMode drop-down will become a toggle that turns surface joining on and off. Essentially flipping between the Always and None options that appear now. We are removing the Surface option, and changing the behavior of the Always option. None will continue to work as it does now.
  • When surface joining is on, all planar touching flat sides of parts will weld together, regardless of SurfaceType. (This does not affect Hinge, Motor, SteppingMotor)
    • Glue, Studs, Inlets, Universal, Weld, and Smooth surfaces will all create Weld instances.
    • Spheres will not surface-weld to anything. The rounded sides of cylinders will not surface-weld, but the flat end sides will.
    • There were certain cases where flat touching sides would still not join. THis was a bug, and now this change will guarantee that all touching flat sides will join.
  • You will never be able to surface join parts that are connected by a constraint (This is generally true now, but certain combos allow a constraint and ManualWeld).
  • Stud, Inlet, Universal, Weld, and Glue Surface textures will only appear on Plastic material parts, both in-game and in Studio. Right now these Surfaces appear on all Materials when editing in Studio, but vanish in-game.
  • Workspace.JoinToOutsiders will follow these new joining rules. Passing in Enum.JointCreationMode.All or Enum.JointCreationMode.Surface will both have the same behavior which equates to Join Always. MakeJoints will still follow old joining rules as a backup for legacy games.

What’s not changing?

  • Old games and toolbox models will not be impacted and keep their original surface joints. This only affects building new things in Studio.
  • Hinge, Motor, and SteppingMotor surfaces will continue to make their respective Rotate joints
  • Calling MakeJoints will still create legacy surface joints according to the original joining rules.
  • You can still assign surfaces to plastic parts for visual aesthetic.

Further down the road, you can expect more changes that will slowly phase out Surface Joints all together, so you should refrain from relying on them for your new games.

I’m still confused, what should I be doing instead?
In general, you should try to use WeldConstraints. The WeldConstraint tool from the Constraints section makes it easy to select groups of parts you want weld. If you prefer the surface welding behavior, then turning on Join Surfaces will still do this, and will always create a Weld regardless of SurfaceType.

If you are generating parts via script, again it is preferred that you use WeldConstraints, otherwise you should use JoinToOutsiders to create welds on surfaces. Do not use MakeJoints unless you specifically need to support legacy joint behavior.

TL;DR:
After this change, SurfaceTypes will have no absolutely no impact on building, and only exist as a visual aesthetic (with exception for Hinge and Motor). Auto-welding can still occur if turned on, but the SurfaceType will have no control on the type of joint or weld being created.

If you have more questions, please look through this thread and see if you can find your answer here, or just try it out for yourself!
Further discussion has been moved here.

197 Likes

Whoa, part surfaces, haven’t heard those in awhile.

I expected a removal of the functionality of surface joints long ago when the new WeldConstaints were added but better late than never.

Glad to see updates regardless!

23 Likes

One thing I would like to see in the future is not having to have Part.TopSurface = "Smooth" and Part.BottomSurface = "Smooth", but that will break the joints of older games that don’t set the TopSurface and BottomSurface to Studs and Inlets respectively. I haven’t used surfaces since 2013, and I have a feeling few builders use it because of their limitations to aesthetics (and working only on Plastic) as well as developers because of their lack of control. Constraints and definitely provide a lot more compared to surfaces.

26 Likes

Will this make my builds fall apart because they need surface welds to keep them from falling

10 Likes

This will not affect games before the update, also it is in beta currently so nothing to worry about yet.

If you need the surface joint functionality still you can toggle workspace.JoinToOutsiders to Enum.JointCreationMode.Surface, however I believe it should already be set to that when the update is shipped to ROBLOX.

Also, it is suggested you use the WeldConstriant instance rather than surface joints.

7 Likes

I don’t use them much but I do sometimes use motors and hinges some times the glue one but with seats working while being anchored it’s not as used.
Glad motors are staying

4 Likes

They aren’t staying for long! Please familiarize yourself with Constraints!

15 Likes

I’ll try I guess, I find them confusing so I don’t touch them much.

9 Likes

If you find them confusing, you should write Developer Hub for improved tutorials and documentation. Make sure to specify what you find the most confusing.

In addition, if you have ideas for how the tools to use constraint can be made easier, then you can post them on Studio Features.

Roblox engineers are looking to continue to make constraints easier to use and less confusing, but they need to know where people are having the most trouble when it comes to constraint.

15 Likes

I believe this change is for the best. This was some old, unpredictable and potentially difficult behaviour to maintain, that may even cause some confusion amongst newer developers.

I will certainly remember making Helicopters with 2x stud thick blades swiveling on a motor, but I am glad these are being removed.

Onto an important question, considering part surfaces will eventually be removed, what will be of VehicleSeat instances and auto-built vehicles? Should we consider phasing out VehicleSeat usage in favour of our custom creations, or will we be keeping these, considering a lot of custom vehicle systems use them?

11 Likes

Around 8 years of Studio and I had no clue how to use any of these or what they meant. All I know is that I wanted them gone and I wanted gone the instant I placed down a brick.

I can’t think of many developers who legitimately use this feature and if they do, why they haven’t changed to constraints. Constraints are a very powerful system and with enough fiddling around, you can make something pretty cool. I mean, you can even make gelatin-like assemblies with them.

Out of curiosity, is there any plans to change welds in accordance with surface changes as well? As far as I’m aware, you can do everything with constraints that you can with SurfaceTypes. Exception to Motor6D and C0/C1 properties of Welds (shiver). :cold_face:

8 Likes

For some of my builds for destruction games, I still use the surface welds so that when all the support to the structure is blown up, it will fall down. Not sure how to replicate this behaviour with weld constraints.

9 Likes

WeldConstraints break near explosions.

All you should need to do is weld parts near each other.

explosion

9 Likes

Gosh I remember my first build was joined together with surface welds in my first game.
image
Other than that it was great to see all the Roblox technology evolving and getting better over time. From surface welds in 2017 to weld constraints in late 2018 to late 2019. Welds were (and are still) too confusing to manage for me back then, and WeldConstraints have the most convenience for me and were literally a million times much more easier to work with. Just attach a Part0 and Part1. No C0 or C1 properties either to waste time scripting up. And the best thing is, weld constraints don’t break upon manual movement through scripts! This was extremely handy when i needed to make some sort of custom clothing “morph” to attach to players’ body parts, and allowed me to make better looking Tools!

6 Likes

wait, Part surfaces?

I haven’t used those in a while, makes sense they are testing removing them now, because I have used WeldConstraints for moving parts and anchors for non moving parts for so long that I have had no use for those for a long time.

4 Likes

I still like the old surface behaviors. I also like using weld surfaces, as WeldConstraints are hard to use to build destructible structures and the all-or-nothing surface behavior makes it hard to avoid making unintended welds. This can get annoying when building moving things next to static things.

Is it possible to preserve the old surface behaviors when they are phased out?

Also, how does Roblox plan to full remove the legacy joints system? It looks like to do so, you’ll need to either break old games, or leave some APIs to maintain compatibility, which likely includes leaving the surface types on Parts for use by MakeJoints.

It seems likely Roblox will choose the latter, so why not leave the legacy joints system as-is? It would be better if the legacy system was functional and not left in a messed-up state from being part-way removed.

13 Likes

I still use the surface welds so that when all the support to the structure is blown up, not sure how to replicate this behaviour with weld constraints.

2 Likes

This all seems like it’s for the best. I always felt like the surface parameter APIs under the BasePart class were bloated.

With that said, it isn’t easy to detect when surfaces are adjacent to each other or where their contact points are. If surfaces aren’t part of the future, it would be nice if we could emulate the existing behavior practically from Lua so it doesn’t have to be built in.


I’m currently utilizing JointsService:ShowPermissibleJoints in Welcome to Roblox Building to visualize where two surfaces meet so its easier to see how the model will weld. I use JoinToOutsiders, so surface types shouldn’t be an issue here.

My concern here has more to do with the JointsService’s deprecation, I’m not 100% sure if I should expect these surface outlines to continue working in the future. They already crash Roblox on rare occasions, and there’s no practical way to emulate this behavior in Lua without a lot of annoying work.

(I haven’t been able to reproduce this crash consistently, feel free to check any crash dumps from PlaceId 2897155393)


As for Super Nostalgia Zone, the change being made to JoinToOutsiders will likely mess up some of the mechanisms in the game that are relying upon legacy hinges and motors. I can definitely work around it though, I’ve had to redo plenty of legacy things from scratch using modern components already.

28 Likes

Yes! Setting SurfaceTypes to smooth when creating parts is tedious and hurts performance (slightly).

SurfaceTypes are building tools that bloat the API, just like what FormFactor once was. I’d be okay with SurfaceTypes being completely removed from the client long-term, even though it might harmlessly affect house wall data on one of my old projects.

I’d like to hear from an engineer how removing SurfaceTypes might affect client memory and performance. :thinking:

Related: Instance.new("Part")/Studio->Insert Part Inconsistencies

5 Likes

Just use the anchor tool.

If the welds play an important role in your builds I’m sure the people in the Development Support subforum would be glad to help you.

2 Likes