59 lines
1.6 KiB
Lua
59 lines
1.6 KiB
Lua
local UGCValidationService = game:GetService("UGCValidationService")
|
|
|
|
local root = script.Parent.Parent
|
|
local valueToString = require(root.util.valueToString)
|
|
|
|
local MARGIN_OF_ERROR = 0.1
|
|
|
|
local function validateHandleSize(isAsync, instance)
|
|
-- these are guaranteed to exist thanks to validateInstanceTree being called beforehand
|
|
local handle = instance.Handle
|
|
local mesh = handle:FindFirstChildOfClass("SpecialMesh")
|
|
|
|
local success, verts = pcall(function()
|
|
if isAsync then
|
|
return UGCValidationService:GetMeshVerts(mesh.MeshId)
|
|
else
|
|
return UGCValidationService:GetMeshVertsSync(mesh.MeshId)
|
|
end
|
|
end)
|
|
|
|
if not success then
|
|
return false, { "Failed to read mesh" }
|
|
end
|
|
|
|
local minX, maxX = math.huge, 0
|
|
local minY, maxY = math.huge, 0
|
|
local minZ, maxZ = math.huge, 0
|
|
|
|
for i = 1, #verts do
|
|
local vert = verts[i] * mesh.Scale
|
|
minX = math.min(minX, vert.X)
|
|
minY = math.min(minY, vert.Y)
|
|
minZ = math.min(minZ, vert.Z)
|
|
maxX = math.max(maxX, vert.X)
|
|
maxY = math.max(maxY, vert.Y)
|
|
maxZ = math.max(maxZ, vert.Z)
|
|
end
|
|
|
|
local meshSize = Vector3.new(
|
|
maxX - minX,
|
|
maxY - minY,
|
|
maxZ - minZ
|
|
)
|
|
|
|
-- allow handle.Size to be within MARGIN_OF_ERROR of meshSize or larger
|
|
-- this is necessary since we're comparing floats
|
|
-- the size only needs to be a rough equivalent for thumbnailing
|
|
if handle.Size.X + MARGIN_OF_ERROR < meshSize.X
|
|
or handle.Size.Y + MARGIN_OF_ERROR < meshSize.Y
|
|
or handle.Size.Z + MARGIN_OF_ERROR < meshSize.Z then
|
|
return false, {
|
|
string.format("Accessory Handle size should be at least the size of the mesh ( %s )", valueToString(meshSize))
|
|
}
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
return validateHandleSize |