177 lines
4.8 KiB
Lua
177 lines
4.8 KiB
Lua
-- Head v1.2.0
|
|
|
|
local assetUrl, fileExtension, x, y, baseUrl, mannequinId = ...
|
|
|
|
local ThumbnailGenerator = game:GetService("ThumbnailGenerator")
|
|
ThumbnailGenerator:AddProfilingCheckpoint("ThumbnailScriptStarted")
|
|
|
|
local DFFlagHeadThumbnailMannequins = settings():GetFFlag("HeadThumbnailMannequins")
|
|
local FFlagMeshPartHeadOption = settings():GetFFlag("MeshPartHeadOption")
|
|
|
|
-- Modules
|
|
local CreateExtentsMinMax
|
|
local MannequinUtility
|
|
local ScaleUtility
|
|
|
|
if DFFlagHeadThumbnailMannequins or FFlagMeshPartHeadOption then
|
|
CreateExtentsMinMax = require(ThumbnailGenerator:GetThumbnailModule("CreateExtentsMinMax"))
|
|
MannequinUtility = require(ThumbnailGenerator:GetThumbnailModule("MannequinUtility"))
|
|
ScaleUtility = require(ThumbnailGenerator:GetThumbnailModule("ScaleUtility"))
|
|
end
|
|
|
|
pcall(function() game:GetService("ContentProvider"):SetBaseUrl(baseUrl) end)
|
|
game:GetService("ScriptContext").ScriptsDisabled = true
|
|
|
|
local objects = {}
|
|
local headScaleType
|
|
local mannequin
|
|
|
|
if FFlagMeshPartHeadOption then
|
|
local HeadMannequin = MannequinUtility.LoadMannequinForScaleType("Classic")
|
|
HeadMannequin.Parent = workspace
|
|
local mcd = HeadMannequin.Humanoid:GetAppliedDescription()
|
|
|
|
if mcd then
|
|
local HeadId = assetUrl:match("*?id=(%d+)")
|
|
mcd.Head = HeadId
|
|
|
|
local gray = BrickColor.Gray()
|
|
mcd.HeadColor = Color3.new(gray.r, gray.g, gray.b)
|
|
HeadMannequin.Humanoid:ApplyDescriptionBlocking(mcd)
|
|
if HeadMannequin.Head:IsA("MeshPart") then
|
|
objects[1] = HeadMannequin.Head
|
|
else
|
|
objects[1] = HeadMannequin.Head.Mesh
|
|
end
|
|
end
|
|
HeadMannequin.Parent = nil
|
|
else
|
|
objects = game:GetObjects(assetUrl)
|
|
end
|
|
|
|
ThumbnailGenerator:AddProfilingCheckpoint("ObjectsLoaded")
|
|
|
|
if DFFlagHeadThumbnailMannequins then
|
|
headScaleType = ScaleUtility.GetObjectsScaleType(objects)
|
|
mannequin = MannequinUtility.LoadMannequinForScaleType(headScaleType)
|
|
else
|
|
mannequin = game:GetObjects(baseUrl.. "asset/?id=" .. tostring(mannequinId))[1]
|
|
mannequin.Humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
|
|
mannequin.Parent = workspace
|
|
end
|
|
|
|
ThumbnailGenerator:AddProfilingCheckpoint("MannequinLoaded")
|
|
|
|
local function addFaceDecal(head)
|
|
if head:FindFirstChild("face") then
|
|
return
|
|
end
|
|
|
|
local face = Instance.new("Decal")
|
|
face.Name = "face"
|
|
face.Texture = "rbxasset://textures/face.png"
|
|
face.Parent = head
|
|
end
|
|
|
|
local function replaceMannequinMeshPartHead(meshPartHead, meshHead)
|
|
local newHead = Instance.new("Part")
|
|
newHead.Size = meshPartHead.Size
|
|
newHead.CFrame = meshPartHead.CFrame
|
|
newHead.Color = meshPartHead.Color
|
|
newHead.Name = "Head"
|
|
|
|
addFaceDecal(newHead)
|
|
|
|
local copiedAttachments = false
|
|
for _, child in pairs(meshHead:GetChildren()) do
|
|
if child:IsA("Vector3Value") and string.find(child.Name, "Attachment") then
|
|
copiedAttachments = true
|
|
|
|
local newAttachment = Instance.new("Attachment")
|
|
newAttachment.Name = child.Name
|
|
newAttachment.Position = child.Value
|
|
newAttachment.Parent = newHead
|
|
end
|
|
end
|
|
|
|
if not copiedAttachments then
|
|
for _, child in pairs(meshPartHead:GetChildren()) do
|
|
child.Parent = newHead
|
|
end
|
|
end
|
|
|
|
meshPartHead:Destroy()
|
|
newHead.Parent = mannequin
|
|
end
|
|
|
|
local function replaceMannequinHeadWithMeshHead()
|
|
for _, obj in pairs(objects) do
|
|
if obj:IsA("Folder") and obj.Name == "R15ArtistIntent" then
|
|
local head = obj.Head
|
|
addFaceDecal(head)
|
|
mannequin.Head:Destroy()
|
|
head.Parent = mannequin
|
|
end
|
|
end
|
|
end
|
|
|
|
local headObject = objects[1]
|
|
|
|
if headObject:IsA("Folder") then
|
|
replaceMannequinHeadWithMeshHead()
|
|
else
|
|
if DFFlagHeadThumbnailMannequins then
|
|
if mannequin.Head:IsA("MeshPart") then
|
|
replaceMannequinMeshPartHead(mannequin.Head, headObject)
|
|
end
|
|
else
|
|
if headObject:IsA("MeshPart") then
|
|
replaceMannequinMeshPartHead(mannequin.Head, headObject)
|
|
else
|
|
mannequin.Head.BrickColor = BrickColor.Gray()
|
|
end
|
|
end
|
|
|
|
if not headObject:IsA("MeshPart") then
|
|
if mannequin.Head:FindFirstChild("Mesh") then
|
|
mannequin.Head.Mesh:Destroy()
|
|
end
|
|
headObject.Parent = mannequin.Head
|
|
else
|
|
addFaceDecal(headObject)
|
|
mannequin.Head:Destroy()
|
|
headObject.Parent = mannequin
|
|
end
|
|
end
|
|
|
|
if DFFlagHeadThumbnailMannequins then
|
|
-- Scale mannequin based on the scale type of the Head
|
|
local humanoid = mannequin:FindFirstChild("Humanoid")
|
|
if humanoid then
|
|
ScaleUtility.CreateProportionScaleValues(humanoid, headScaleType)
|
|
humanoid:BuildRigFromAttachments()
|
|
end
|
|
else
|
|
for _, child in pairs(mannequin:GetChildren()) do
|
|
if child:IsA("BasePart") and child.Name ~= "Head" then
|
|
child:Destroy()
|
|
end
|
|
end
|
|
end
|
|
|
|
local shouldCrop = false
|
|
local extentsMinMax
|
|
|
|
if DFFlagHeadThumbnailMannequins then
|
|
local focusParts = {
|
|
mannequin:FindFirstChild("Head")
|
|
}
|
|
|
|
shouldCrop = #focusParts > 0
|
|
extentsMinMax = CreateExtentsMinMax(focusParts)
|
|
end
|
|
|
|
local result, requestedUrls = ThumbnailGenerator:Click(fileExtension, x, y, --[[hideSky = ]] true, shouldCrop, extentsMinMax)
|
|
ThumbnailGenerator:AddProfilingCheckpoint("ThumbnailGenerated")
|
|
|
|
return result, requestedUrls |