I haven’t read much on this, but you could potentially combine this with UserInputService as well to detect when a player clicks to check its target surface
Just to mention @JackscarIitt’s comment is a much simpler way of doing that.
You can use Ray-Casting and do:
function module:CreatePartAtPosition(vectorPos, normalVector) -- // vectorPos is rayCastResult.Position and normalVector is rayCastResult.Normal
local part = Instance.new("Part", workspace.Decals)
part.Transparency = 1
part.Anchored = true
part.CanCollide = not part.CanCollide
part.CFrame = CFrame.new(vectorPos, vectorPos + normalVector)
Note: This is a part of a code I made for a spray tool.
Sup, maybe this post has answers and further, detailed explanations of problem you are facing. (Too long for me to read and pull out the juicy info for you xd)