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

225 lines
6.3 KiB
Plaintext
Executable File

/*
POM toolkit
*/
struct DNStyles
(
textClr = (colorMan.getColor #windowText) * 255,
windowClr = (colorMan.getColor #window) * 255,
backgroundClr = (colorMan.getColor #background) * 255,
dnColour = dotNetClass "System.Drawing.Color",
backColor = (dotNetClass "System.Drawing.Color").FromArgb (backgroundClr[1] + 10) (backgroundClr[2] + 10) (backgroundClr[3] + 10),
foreColor = (dotNetClass "System.Drawing.Color").FromArgb textClr[1] textClr[2] textClr[3],
dnColourExecute = dnColour.FromArgb 51 181 229,
dnColourSuccess = dnColour.FromArgb 153 204 0,
dnColourError = dnColour.FromArgb 255 68 68,
dnColourDormant = dnColour.FromArgb (backgroundClr[1] - 10) (backgroundClr[2] - 10) (backgroundClr[3] - 10),
stdButtonHeight = 24,
fn setExecuteStyle ctrl =
(
ctrl.FlatAppearance.BorderColor = dnColourExecute
windows.processPostedMessages()
),
fn setSuccessStyle ctrl =
(
ctrl.FlatAppearance.BorderColor = dnColourSuccess
windows.processPostedMessages()
),
fn setErrorStyle ctrl =
(
ctrl.FlatAppearance.BorderColor = dnColourError
windows.processPostedMessages()
),
fn setDormantStyle ctrl =
(
ctrl.FlatAppearance.BorderColor = dnColourDormant
windows.processPostedMessages()
),
fn initButtonStyle ctrl =
(
ctrl.FlatStyle = (dotNetObject "Button").FlatStyle.Flat
ctrl.FlatAppearance.BorderSize = 2
ctrl.FlatAppearance.BorderColor = dnColourDormant
ctrl.backColor = backColor
ctrl.foreColor = foreColor
windows.processPostedMessages()
)
)
dnStyle = DNStyles()
filein (RsConfigGetWildWestDir() + "script/3dsmax/_config_files/wildwest_header.ms")
filein (RsConfigGetWildWestDir() + "script/3dsmax/maps/materials/POMcurvatureMasker.ms")
filein (RsConfigGetWildWestDir() + "script/3dsmax/maps/materials/pxmremoveunderip.ms")
filein (RsConfigGetWildWestDir() + "script/3dsmax/maps/materials/pxmfadeunderdecals.ms")
filein (RsConfigGetWildWestDir() + "script/3dsmax/maps/materials/pxmfadeunderfur.ms")
filein (RsConfigGetWildWestDir() + "script/3dsMax/Maps/PxmUpgradeTool.ms")
filein (RsConfigGetWildWestDir() + "script/3dsMax/Maps/PxmRevert.ms")
struct POMToolsStruct
(
fn selectObjectsWithPxmShaders =
(
local POMSelection = #()
for obj in selection where (isKindOf obj Editable_Poly) or (isKindOf obj Editable_Mesh) do
(
local ObjMats = #()
local MatFaces = #()
RsGetMaterialsOnObjFaces obj materials:ObjMats faceLists:MatFaces
local FaceCount = obj.faces.count
-- No need to mask joins if object only uses one material...
if (ObjMats.Count > 1) do
(
-- Make blank bitarrays for recording POM/non-POM faces:
local PomFaces = #{}
PomFaces.Count = FaceCount
-- Find out which materials have a POM shader, and take note of their faces:
for n = 1 to ObjMats.Count do
(
local ThisMat = ObjMats[n]
local ThisMatFaces = MatFaces[n]
local isPOM = False
-- Is this a POM shader?
if (isKindOf ThisMat Rage_Shader) do
(
local ShaderName = RstGetShaderName ThisMat
isPOM = (matchPattern ShaderName pattern:"*pxm*")
)
-- Add material face-list to relevant bitarray:
if isPOM then
(
PomFaces += ThisMatFaces
)
)
if (PomFaces.numberSet != 0) then
(
print obj.name
obj.selectedFaces = PomFaces
append POMSelection obj
)
)
)
clearSelection()
for item in POMSelection do
(
selectmore item
)
true
)
)
--/////////////////////////////////////////
-- UI
--/////////////////////////////////////////
rollout selectPOMMeshesUI "Select POM Meshes" width:400
(
timer ctrlState interval:5000 active:false
dotnetcontrol btnSelectPOMMeshes "Button" text:"Select POM Meshes" width:(selectPOMMeshesUI.width - 10) height:dnStyle.stdButtonHeight offset:[-10, 0]
--/////////////////////////////////////////
-- FUNCTIONS
--/////////////////////////////////////////
/***
Setup button look
***/
fn init =
(
btnSelectPOMMeshes.FlatStyle = (dotNetObject "Button").FlatStyle.Flat
btnSelectPOMMeshes.FlatAppearance.BorderSize = 2
btnSelectPOMMeshes.FlatAppearance.BorderColor = dnStyle.dnColourDormant
btnSelectPOMMeshes.backColor = dnStyle.backColor
btnSelectPOMMeshes.foreColor = dnStyle.foreColor
)
on btnSelectPOMMeshes click do
(
dnStyle.setExecuteStyle btnSelectPOMMeshes
local success = ::POMToolkitUI.POMTools.selectObjectsWithPxmShaders()
ctrlState.active = true
if success do dnStyle.setSuccessStyle btnSelectPOMMeshes
)
on ctrlState tick do
(
dnStyle.setDormantStyle btnSelectPOMMeshes
ctrlState.active = false
)
on selectPOMMeshesUI open do
(
init()
)
)
try(destroyDialog POMToolkitUI)catch()
rollout POMToolkitUI "POM Toolkit" width:400 height:600
(
--/////////////////////////////////////////
-- VARIABLES
--/////////////////////////////////////////
local subRolls = #(RsPOMCurvatureMaskerUI, POMUnderIP_UI, PxmFadeUnderDecalsUI, PxmFadeUnderFurUI, PXMUpgradeUI, PxmRevertUI, selectPOMMeshesUI)
local subRollHeight = 120
local POMTools = POMToolsStruct()
--/////////////////////////////////////////
-- CONTROLS
--/////////////////////////////////////////
dotNetControl rsBannerPanel "Panel" pos:[0,0] height:32 width:400
local banner = makeRsBanner dn_Panel:rsBannerPanel wiki:"POM Toolkit" versionName:"Ultra Floss" versionNum:1.1 filename:(getThisScriptFilename())
subRollout subRoll height:subRollHeight width:(POMToolkitUI.width - 10) offset:[-7, 0]
--/////////////////////////////////////////
-- FUNCTIONS
--/////////////////////////////////////////
--/////////////////////////////////////////
--
--/////////////////////////////////////////
on POMToolkitUI open do
(
banner.setup()
--clean any orphaned progress rollouts
local progRoll = windows.getChildHWND 0 "Progress..." parent:#max
if (progRoll != undefined) do UIAccessor.CloseDialog progRoll[1]
for roll in subRolls do
(
addSubRollout subRoll roll
subRollHeight += roll.height
)
subRoll.height = subRollHeight
POMToolkitUI.height = (rsBannerPanel.height + subRoll.height + 10)
)
)
createDialog POMToolkitUI style:#(#style_border, #style_titlebar, #style_sysmenu, #style_minimizebox)