Decal Surface Displacement Plugin

This is great! But, is there a possibility for other GUI objects, like TextLabels for example in the future?

2 Likes

With the way Roblox handles SurfaceGuis it’s pretty much impossible from what I know.

1 Like

I notice that you don’t have a tool for adjusting these, which means you’re live-updating them in the workspace when bake is false. It doesn’t look like you’re using CollectionService to track which parts should be subject to processing, so since this doesn’t break when you reopen the place, you must be parsing the entirety of workspace. You might want to consider using CollectionService instead.

4 Likes

If I understood your comment properly you meant that I’m constantly looping through the workspace? What I’m doing is looping through the user’s selections whenever the selection changes and checking wether or not what they have selected is valid for deformation.

1 Like

I think Roblox should implement this as a tool for Roblox developers!

1 Like

deep breath

YESSSSSSSSSSSSSSSSSSSSSSSSSSSSS
(sorry about that)
I’ve been looking for something like this for extremely long because I have no idea how to texture so with this I can finally do it easier!

1 Like

Considering skinned meshes still have a pretty substantial impact at scale even for meshes that aren’t updating/doing anything, it’s probably not great

Unfortunately this is why I have decided against playing with it for things like trees and grass

8 Likes

One step closer to making projectors like the movie theaters, this is going to be amazing to use, amazing job!

2 Likes

NOW THIS IS AWESOME!

I always wanted something like this! Thank you so much for creating this!

2 Likes

Yeah you can only get what you can get. I’ll probably try making a system to switch between a plain plane and a plane with an armature when they’re out of view to hopefully improve the performance of these.

3 Likes

YOOOO THIS IS SO F COOL MAN

Thank for creating this is going to be one of my favourite plugin in Roblox!

2 Likes

Wow! This is really cool! Thank you for making this amazing plugin! This will help me a lot in buildings

2 Likes

I didn’t even imagine that this would be possible let alone even consider using skinned meshes for something like this, incredible work!

3 Likes

This is absolute gold. I’m definitely going to use this on my terrain heavy games.

Thanks a lot!

2 Likes

Good job, really helpful plugin.

1 Like

For those interested, I made a very simple script to improve the performance of the decals. Here’s how it looks in-game:

And here is the file for that. It’s a local script so you have to insert it inside a player.
DecalRenderingHandler.rbxm (4.2 KB)

And here is the code if you want to have a look at it here.

local RunService = game:GetService("RunService")

local LastTick = tick()

local RenderDistance = 150

local Unloaded = Instance.new("Folder")
Unloaded.Name = "Unloaded"
Unloaded.Parent = game:GetService("ReplicatedStorage")

local PlanePreset = script.LowFidelityPlane
local Planes = {}

function CheckForValidation(Plane)
	if 
		Plane:IsA("MeshPart") and
		Plane:GetAttribute("Valid") ~= true and
		Plane:GetAttribute("Bake") ~= nil and 
		Plane:GetAttribute("Offset") ~= nil and 
		Plane:GetAttribute("RayRange") ~= nil then
		
		Plane:SetAttribute("Valid",true)
		
		local PlaneTable = {
			Plane = Plane,
			Parent = Plane.Parent,
			LowFidelityModel = PlanePreset:Clone()
		}
		
		PlaneTable.LowFidelityModel.Name = Plane.Name
		PlaneTable.LowFidelityModel.Transparency = Plane.Transparency
		PlaneTable.LowFidelityModel.Parent = Unloaded
		PlaneTable.LowFidelityModel.CFrame = Plane.CFrame
		PlaneTable.LowFidelityModel.Size = Plane.Size
		PlaneTable.LowFidelityModel.Color = Plane.Color
		PlaneTable.LowFidelityModel.Material = Plane.Material
		PlaneTable.LowFidelityModel.Reflectance = Plane.Reflectance
		
		for _,v in pairs(Plane:GetChildren()) do
			if v:IsA("SurfaceAppearance") or v:IsA("Texture") or v:IsA("Decal") then
				v:Clone().Parent = PlaneTable.LowFidelityModel
			end
		end
		
		table.insert(Planes,PlaneTable)
		
	end
end

for _,Plane in pairs(workspace:GetDescendants()) do
	CheckForValidation(Plane)
end

workspace.DescendantAdded:Connect(function(Descendant)
	CheckForValidation(Descendant)
end)

RunService.Heartbeat:Connect(function()
	if tick()-LastTick >= 1 then
		LastTick = tick()
		for _,PlaneTable in pairs(Planes) do
			local Distance = (workspace.CurrentCamera.CFrame.Position-PlaneTable.Plane.Position).Magnitude
			if Distance > RenderDistance then
				PlaneTable.Plane.Parent = Unloaded
				PlaneTable.LowFidelityModel.Parent = PlaneTable.Parent
			else
				PlaneTable.Plane.Parent = PlaneTable.Parent
				PlaneTable.LowFidelityModel.Parent = Unloaded
			end
		end
	end
end)

I put this together fairly quickly so it probably has some flaws here and there. But for the most part it should help you gain better performance on larger scale levels. Feel free to modify the code as you see fit.

11 Likes

Kinda reminds me of this feature request.
This is some seriously impressive stuff. :+1:

1 Like

This is revolutionary! I’ll be getting to using this plugin right away. Thank you very much :slight_smile:

3 Likes

This is fantastic! Exactly the solution I was looking for. Totally forgot you can exploit MeshDeformation.

Stop. I can’t take this anymore. This is just too great. I don’t care if it’s laggy or not, it’s still crazy cool.