I have a module that can apply a texture to a specific point on a part, and can also bend the texture around a corner. However, when two parts are connected, to make a wall lets say, the texture will stay on the part and curve around its wall, rather than continuing onto the other part to make a seamless texture.
I'd like to be able to, if possible, find the parts that overlap in a selected texture area, see if the create a face, and then apply the texture between them.
I just don't know how atm :/
I am using the following code:
local Textures = {"417236023"}
local Texture = "http://www.roblox.com/asset/?id=333740402"--<Your image or whatever
local PicSize = 10 --How many "pixels" the image is (Always square shape)
local CanSize = 10 --10 pixels offset, unless replacing the Picture for something made of frames, not necessary to change
local DelayRemove = 0
local textureAPI = {}
function ReturnNormal(PartCF,RayNorm)
if PartCF.lookVector - RayNorm == Vector3.new(0,0,0) then
return "Front",5
elseif PartCF.lookVector + RayNorm == Vector3.new(0,0,0) then
return "Back",2
else
local x, y, z, R00, R01, R02, R10, R11, R12, R20, R21, R22 = PartCF:components()
if Vector3.new(R01,R11,R21) == RayNorm then
return"Top", 1
elseif Vector3.new(-R01,-R11,-R21) == RayNorm then
return "Bottom",4
elseif Vector3.new(-R00,-R10,-R20) == RayNorm then
return "Left",3
elseif Vector3.new(R00,R10,R20) == RayNorm then
return "Right",0
end
end
end
function SecondaryTex(OldFace,LastPos,Dir,part,pos,lastABSS,lastABSP)
local SizeWidth = part.Size.X
local SizeHeight = part.Size.Y
local Face,Val
local Offset = -SizeWidth+((part.CFrame:toObjectSpace(CFrame.new(pos))).p.Z/(SizeWidth))
if Dir == 1 then
if OldFace == "Front" then
Face,Val = "Right",0
elseif OldFace == "Right" then
Face,Val = "Back",2
elseif OldFace == "Left" then
Face,Val = "Front",5 --Bit redundant tbf
elseif OldFace == "Back" then
Face,Val = "Left",3
end
else
if OldFace == "Front" then
Face,Val = "Left",3
elseif OldFace == "Right" then
Face,Val = "Front",5
elseif OldFace == "Left" then
Face,Val = "Back",2
elseif OldFace == "Back" then
Face,Val = "Right",0
end
end
if Face == "Right" or Face == "Left" then
SizeWidth = part.Size.Z
SizeHeight = part.Size.Y
Offset = -SizeWidth+((part.CFrame:toObjectSpace(CFrame.new(pos))).p.X/(SizeWidth))
end
--print(OldFace,LastPos,Dir,part,pos)
--print(Enum.NormalId[Face])
local surface
local frame
if Face == nil then
return
end
for _,i in pairs(part:GetChildren()) do
if i:IsA("SurfaceGui") then
if i.Face == Enum.NormalId[Face] then
surface = i
frame = surface.Framey
print(surface.Face,"Found")
end
end
end
if surface == nil then
surface = Instance.new("SurfaceGui", part)
surface.CanvasSize = Vector2.new(SizeWidth*CanSize,SizeHeight*CanSize)
surface.Face = Val
print(surface.Face,"Made")
frame = Instance.new("Frame", surface)
frame.Name = "Framey"
frame.Size = UDim2.new(1,0,1,0)
frame.ClipsDescendants = true
frame.BackgroundTransparency =1
end
local Tex = Instance.new("ImageLabel",frame)
Tex.Image = Texture
Tex.Size = UDim2.new(0,PicSize,0,PicSize)
Tex.BackgroundTransparency = 1
if Dir == 0 then
Tex.Position = UDim2.new(0,Dir-(lastABSS-lastABSP),LastPos.Y.Scale,LastPos.Y.Offset)
else
Tex.Position = UDim2.new(1,(lastABSP),LastPos.Y.Scale,LastPos.Y.Offset)
end
if DelayRemove~=0 then
game.Debris:AddItem(Tex,DelayRemove)
end
return
end
function textureAPI.ApplyTo(part,pos,normal,ID,ImgSize)
if ID ~= nil then
Texture = "http://www.roblox.com/asset/?id="..ID
else
Texture = "http://www.roblox.com/asset/?id=417236023"
end
if ImgSize~= nil then
PicSize = ImgSize
end
local SizeWidth = part.Size.X
local SizeHeight = part.Size.Y
local Face,Val = ReturnNormal(part.CFrame,normal)
print(Face,Val)
if Face == nil then
return
end
if Face == "Top" or Face == "Bottom" then
SizeWidth = part.Size.Z
SizeHeight = part.Size.X
elseif Face == "Right" or Face == "Left" then
SizeWidth = part.Size.Z
SizeHeight = part.Size.Y
end
local surface
local frame
for _,i in pairs(part:GetChildren()) do
if i:IsA("SurfaceGui") then
print(i.Face,Val, i.Face==Enum.NormalId[Face])
if i.Face == Enum.NormalId[Face] then
surface = i
frame = surface.Framey
end
end
end
if surface == nil then
surface = Instance.new("SurfaceGui", part)
surface.CanvasSize = Vector2.new(SizeWidth*CanSize,SizeHeight*CanSize)
surface.Face = Val
frame = Instance.new("Frame", surface)
frame.Name = "Framey"
frame.Size = UDim2.new(1,0,1,0)
frame.ClipsDescendants = true
frame.BackgroundTransparency =1
end
local Tex = Instance.new("ImageLabel",frame)
Tex.Image = Texture
Tex.Size = UDim2.new(0,PicSize,0,PicSize)
Tex.BackgroundTransparency = 1
local Size = -(part.CFrame:toObjectSpace(CFrame.new(pos))).p
if Face == "Front" then
Tex.Position = UDim2.new(.5+(Size.X/(SizeWidth)),-PicSize/2,.5+(Size.Y/(SizeHeight)),-PicSize/2)
elseif Face == "Back" then
Tex.Position = UDim2.new(.5+(-Size.X/(SizeWidth)),-PicSize/2,.5+(Size.Y/(SizeHeight)),-PicSize/2)
elseif Face == "Right" then
Tex.Position = UDim2.new(.5+(Size.Z/(SizeWidth)),-PicSize/2,.5+(Size.Y/(SizeHeight)),-PicSize/2)
elseif Face == "Left" then
Tex.Position = UDim2.new(.5+(-Size.Z/(SizeWidth)),-PicSize/2,.5+(Size.Y/(SizeHeight)),-PicSize/2)
elseif Face == "Top" then
Tex.Position = UDim2.new(.5+(Size.Z/(SizeWidth)),-PicSize/2,.5+(-Size.X/(SizeHeight)),-PicSize/2)
elseif Face == "Bottom" then
Tex.Position = UDim2.new(.5+(Size.Z/(SizeWidth)),-PicSize/2,.5+(Size.X/(SizeHeight)),-PicSize/2)
end
if Tex.AbsolutePosition.X>(surface.AbsoluteSize.X-PicSize) then
SecondaryTex(Face,Tex.Position,0,part,pos,surface.AbsoluteSize.X,Tex.AbsolutePosition.X)
elseif Tex.AbsolutePosition.X<(PicSize/2) then
print(surface.AbsoluteSize.X,Tex.AbsolutePosition.X)
SecondaryTex(Face,Tex.Position,1,part,pos,surface.AbsoluteSize.X,Tex.AbsolutePosition.X)
end
if DelayRemove~=0 then
game.Debris:AddItem(Tex,DelayRemove)
end
end
return textureAPI
Theres likely a lot of redundant code in there, but optimizing is not overly important at the mo. If anyone has any suggestions, I'd greatly appreciate it!
