Files
2025-09-29 00:52:08 +02:00

122 lines
3.4 KiB
Plaintext
Executable File

--
-- File:: pipeline/util/skinutils.ms
-- Description:: Skin modifier utilities
--
-- Author:: David Muir <david.muir@rockstarnorth.com>
-- Date:: 7 July 2009
--
-----------------------------------------------------------------------------
-- Uses
-----------------------------------------------------------------------------
filein "pipeline/util/file.ms"
-----------------------------------------------------------------------------
-- Functions
-----------------------------------------------------------------------------
--
-- utility: RsSkinUtils
-- desc: Skin modifier utilities
--
utility RsSkinUtils "RsSkinUtils"
(
--
-- name: HasSkin
-- desc: Return true if object has Skin modifier, false otherwise.
--
fn HasSkin obj = (
( obj.modifiers[#Skin] != undefined )
)
--
-- name: BakeAndSaveWeights
-- desc: Bake vertex weights and save to filename
--
fn BakeAndSaveWeights obj filename = (
local result = false
if ( HasSkin obj ) then
(
setCommandPanelTaskMode #modify
modPanel.setCurrentObject obj.modifiers[#Skin]
subobjectLevel = 1
obj.modifiers[#Skin].Filter_Vertices = true
local nSkinVerts = skinOps.getNumberVertices obj.modifiers[#Skin]
skinOps.SelectVertices obj.modifiers[#Skin] #{1..nSkinVerts}
skinOps.bakeSelectedVerts obj.modifiers[#Skin]
RsMakeSurePathExists filename
skinOps.saveEnvelope obj.modifiers[#Skin] filename
subobjectlevel = 0
result = true
)
result
)
--
-- name: SkinAndLoadWeights
-- desc: Create Skin modifier and load vertex weights from filename
--
fn SkinAndLoadWeights obj filename bone_list match_by_name:false bone_limit:4 = (
setCommandPanelTaskMode #modify
skinMod = Skin()
skinMod.bone_Limit = bone_limit
skinMod.showNoEnvelopes = true
addModifier obj skinMod
subobjectLevel = 1
modPanel.setCurrentObject obj.modifiers[#Skin]
-- Prior to loading the weights, if we are matching by name then we
-- install a handler to press the Match By Name button on the load
-- dialog.
if ( match_by_name ) then
(
DialogMonitorOPS.RegisterNotification RsSkinUtils.__LoadEnvMatchByNameCallback ID:#SkinAndLoadWeightsCallback
DialogMonitorOPS.Enabled = true
)
for b in bone_list do
try ( skinOps.addBone obj.modifiers[#Skin] b 1 ) catch ()
completeRedraw()
skinOps.loadEnvelope obj.modifiers[#Skin] filename
-- Uninstall the dialog callback.
if ( match_by_name ) then
(
DialogMonitorOPS.Enabled = false
DialogMonitorOPS.UnregisterNotification ID:#SkinAndLoadWeightsCallback
)
subobjectLevel = 0
true
)
-------------------------------------------------------------------------
-- Private (seriously, DO NOT USE)
-------------------------------------------------------------------------
--
-- name: __LoadEnvMatchByNameCallback
-- desc: dialog voodoo to press the "Match By Name" button on load env dialog.
--
fn __LoadEnvMatchByNameCallback = (
WindowHandle = DialogMonitorOPS.GetWindowHandle()
theDialogName = UIAccessor.GetWindowText WindowHandle
if theDialogName != undefined and matchpattern theDialogName pattern:"*Load Envelopes*" do
UIAccessor.PressButtonByName WindowHandle "Match by Name"
if theDialogName != undefined and matchpattern theDialogName pattern:"*Load Envelopes*" do
UIAccessor.PressButtonByName WindowHandle "OK"
true
)
)
-- pipeline/util/skinutils.ms