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

155 lines
5.3 KiB
Plaintext
Executable File

--
-- File:: rockstar/helpers/shaderchange.ms
-- Description:: Shader Variable Parameter Changer
--
-----------------------------------------------------------------------------
rollout ShaderChangeRoll "Shader Attribute Changer"
(
-----------------------------------------------------------------------------------------
-- LOCALS
-----------------------------------------------------------------------------------------
local materials = #()
-----------------------------------------------------------------------------------------
-- Interface
-----------------------------------------------------------------------------------------
hyperlink lnkHelp "Help?" address:"https://devstar.rockstargames.com/wiki/index.php/Change_Shaders#Shader_Attribute_Changer" align:#right color:(color 0 0 255) hoverColor:(color 0 0 255) visitedColor:(color 0 0 255)
dropdownlist lstShader "Shader:" items:#( "All on selected Objects" )
dropdownlist lstName "Attribute Name:"
spinner spnValue "Target Value to Change:"range:[0,5000,0.01]
spinner spnTolerance "Tolerance:" range:[0,5000,0.01]
spinner spnNewValue "New Value:" range:[0,5000,100]
button btnSet "Change" across:3 width:95 align:#left offset:[-5,0]
button btnSetBelow "If Below Target" width:95 align:#left
button btnSetAbove "If Above Target" width:95 align:#left offset:[5,0]
-----------------------------------------------------------------------------------------
-- Methods
-----------------------------------------------------------------------------------------
-- POPULATE THE LIST OF ATTRIBUTE VARIBLES
fn populateVarList =
(
if (lstShader.selected == "All on selected Objects") then
(
local varArray = #()
for mat in materials where (mat!=undefined) do for n=1 to (RstGetVariableCount mat) where (RstGetVariableType mat n == "float") do appendIfUnique varArray (RstGetVariableName mat n)
lstName.items = varArray
)
else
(
local selShader = undefined
-- GET SELCTED SHADER
for mat in materials while selShader == undefined do if (RstGetShaderName mat == lstShader.selected) do selShader = mat
-- GET FLOAT VARS OFF SHADER
if (selShader != undefined) do
(
lstName.items = (for n=1 to (RstGetVariableCount selShader) where (RstGetVariableType selShader n == "float") collect RstGetVariableName selShader n)
)
)
)
-- Populate combo box from our material list
fn populateShaderList =
(
materials = #()
for obj in $selection do
(
if (GetAttrClass obj == "Gta Object") then
(
materialList = RsGetMaterialsOnObjFaces obj
join materials materialList
)
)
items = #("All on selected Objects")
materials = makeUniqueArray materials
for mat in materials do
(
if(ClassOf mat == Rage_Shader) then
(
shaderName = RstGetShaderName mat
appendIfUnique items shaderName
)
)
sort items
lstShader.items = items
-- GET VARS
populateVarList()
)
fn modifyShaderValue material valname checkvalue tolerance newvalue type =
(
if classof material == Multimaterial then
(
for submat in material.materiallist do modifyShaderValue submat valname checkvalue tolerance newvalue type
)
else if classof material == Rage_Shader then
(
-- DHM -- 2007-05-22 -- Check the shader name has been selected or "All"
local shaderName = RstGetShaderName material
local selectedShaderName = lstShader.selected
if ((1 != lstShader.selection) and (shaderName != selectedShaderName)) then return false -- Ignore submaterial
-- End
varcount = RstGetVariableCount material
for i = 1 to varcount do (
varName = RstGetVariableName material i
varType = RstGetVariableType material i
if toupper varName == toupper valname and varType == "float" then
(
currvalue = RstGetVariable material i
if (type == #tol) AND (currvalue >= (checkvalue - tolerance)) and (currvalue <= (checkvalue + tolerance)) then RstSetVariable material i newvalue
if (type == #above) AND (currvalue >= checkvalue) then RstSetVariable material i newvalue
if (type == #below) AND (currvalue <= checkvalue) then RstSetVariable material i newvalue
)
)
)
)
-- CHANGE ON SELECTION
fn setSelected type =
(
for obj in selection do
(
if classof obj == Editable_mesh or classof obj == Editable_poly do
(
modifyShaderValue obj.material lstName.selected spnValue.value spnTolerance.value spnNewValue.value type
)
)
)
-----------------------------------------------------------------------------------------
-- Events
-----------------------------------------------------------------------------------------
on btnSet pressed do setSelected #tol
on btnSetAbove pressed do setSelected #above
on btnSetBelow pressed do setSelected #below
on lstShader selected arg do populateVarList()
on ShaderChangeRoll open do
(
populateShaderList()
-- Install handler for selection updates
callbacks.addScript #selectionSetChanged "ShaderChangeRoll.populateShaderList()" id:#shaderChangeSelection
)
on ShaderChangeRoll close do
(
-- Remove handler for selection updates
callbacks.removeScripts id:#shaderChangeSelection
)
)
-- End of script