1374 lines
46 KiB
Plaintext
Executable File
1374 lines
46 KiB
Plaintext
Executable File
-- Selection Toolkit
|
|
-- Jason Hayes
|
|
-- Rockstar San Diego
|
|
-- June 2012
|
|
-- Random Function added by Allan Hayburn Sept 2012
|
|
|
|
-- Oct 2012 --Allan Hayburn Fairly major ui overhaul. no functionality changes
|
|
-- 17 Oct 2012 --Allan Hayburn Added the select collision script
|
|
-- 19 Oct 2012 --Allan Hayburn ui formatted as tabs
|
|
|
|
(
|
|
try (cui.UnRegisterDialogBar RsSelectionTools_Rollout) catch()
|
|
try (destroyDialog RsSelectionTools_Rollout) catch ()
|
|
callbacks.removeScripts id:#alpha_test_1
|
|
)
|
|
|
|
-- This line loads the custom header
|
|
if (not gRsIsOutsource) do
|
|
(
|
|
filein (RsConfigGetWildWestDir() + "script/3dsMax/_config_files/Wildwest_header.ms")
|
|
)
|
|
|
|
-- Generic selection-functions:
|
|
filein (RsConfigGetWildWestDir() + "script/3dsMax/General_tools/Selection_Funcs.ms")
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------
|
|
rollout GeometrySelection "Geometry Selection"
|
|
(
|
|
-- Local defines
|
|
local cbOnSelectionChanged = undefined
|
|
|
|
-- Icons
|
|
local selectBorderEdgeIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 1, 1, 2, 2, true )
|
|
local selectBorderVertIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 3, 3, 4, 4, true )
|
|
local randomlySelectVertIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 5, 5, 6, 6, true )
|
|
local growSelectionIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 7, 7, 8, 8, true )
|
|
local vertexAlphaSelectorIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 9, 9, 10, 10, true )
|
|
local snapBothIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 11, 11, 12, 12, true )
|
|
local snapAtoBIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 13, 13, 14, 14, true )
|
|
local snapBtoAIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 15, 15, 16, 16, true )
|
|
local selectAlphaDecalIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 17, 17, 18, 18, true )
|
|
local convertTexVertSelectionIcon = #( "rs_selectiontools_i.bmp", "rs_selectiontools_a.bmp", 20, 19, 19, 20, 20, true )
|
|
|
|
fn meshFilter obj = classOf obj == Editable_Poly
|
|
|
|
local selectAllBordersTooltip = "When enabled, will select all borders of the material id. Otherwise, it will select the material border based on the current selection. This only works if 'By Face Selection' is used."
|
|
|
|
|
|
--Controls
|
|
|
|
button btnGrowSelectionByMatId "" offset:[0,10] width:32 height:32 tooltip:"Grow face selection by material id. Requires Editable Poly." images:growSelectionIcon across:2
|
|
button btnConvertTexVertSelection "" offset:[0,10] width:32 height:32 images:convertTexVertSelectionIcon border:false tooltip:"Convert current vertex selection in the 'Unwrap UVW' modifier to geometry vertex selection."
|
|
|
|
label lbSpacer02 ""
|
|
|
|
group "Select Material Border"
|
|
(
|
|
radiobuttons rbSelectionType "" labels:#( "By Face Selection", "By Material ID" ) across:3 offset:[ 16, 0 ]
|
|
|
|
button btnSelectBorderEdges "" width:32 height:32 tooltip:"Select edges" images:selectBorderEdgeIcon offset:[ 40, 0 ]
|
|
button btnSelectBorderVerts "" width:32 height:32 tooltip:"Select verts" images:selectBorderVertIcon offset:[ 14, 0 ]
|
|
|
|
checkbox btnSelectAllBorders "Select All Borders" offset:[ -5, -2 ] tooltip:selectAllBordersTooltip
|
|
|
|
dropDownList ddlMaterialId "" range:[ 1, 9999, 1 ] type:#integer enabled:false width:64 offset:[ -5, 0 ] across:2
|
|
button btnRefreshMaterialIdList "R" width:22 height:22 offset:[ -72, -1 ] enabled:false tooltip:"Refresh material id list" border:false
|
|
)
|
|
|
|
group "Randomly Deselect Vertices"
|
|
(
|
|
spinner spRandomDeselectVertPct "Percentage:" range:[ 1, 100, 50 ] type:#integer width:110 align:#left offset:[ 0, 8 ] across:2
|
|
button btnRandomlyDeselectVert "" width:32 height:32 offset:[ -10, 0 ] images:randomlySelectVertIcon tooltip:"Deselect random vertices using percentage"
|
|
)
|
|
|
|
group "Snap Verts"
|
|
(
|
|
spinner spSnapTolerance "Tolerance:" range:[ 0.0, 100.0, 0.05 ] scale:0.01 width:150 align:#left offset:[ -2, 10 ] across:4
|
|
|
|
button btnSnapAtoB "A > B" width:32 height:32 tooltip:"Snap verts from object A to object B\n**Requires Editable Poly**" offset:[ 45, 0 ] images:snapAtoBIcon border:false
|
|
button btnSnapBtoA "B > A" width:32 height:32 tooltip:"Snap verts from object B to object A\n**Requires Editable Poly**" offset:[ 30, 0 ] images:snapBtoAIcon border:false
|
|
button btnSnapBoth "" width:32 height:32 tooltip:"Snap verts to midpoint of gap\n**Requires Editable Poly**" offset:[ 15, 0 ] images:snapBothIcon border:false
|
|
|
|
pickbutton pbObjA "Pick Object A" width:96 height:24 tooltip:"Object A\n**Requires Editable Poly**" filter:meshFilter autoDisplay:true align:#left across:2
|
|
pickbutton pbObjB "Pick Object B" width:96 height:24 tooltip:"Object B\n**Requires Editable Poly**" filter:meshFilter autoDisplay:true align:#right offset:[4,0]
|
|
)
|
|
|
|
group "Reset Vert Position"
|
|
(
|
|
button btnStoreVertPos "Store Vert Positions" width:200 height:24
|
|
button btnRestoreVertPos "Restore Vert Positions" width:200 height:24
|
|
)
|
|
|
|
group "Random Select"
|
|
(
|
|
checkbox chk_selectSpin "Select while spinning:" checked:false across:2 offset:[0,2]
|
|
spinner spr_Percent "%:" range:[0.0, 100.0, 50.0] type:#float width:65 offset:[0,2]
|
|
button btn_select "Select:" width:80 offset:[-1,0] align:#left across:2
|
|
dropdownlist lst_ObjType "" width:100 offset:[-3,0] items:#("Geometry","Vertex","Face") align:#right
|
|
)
|
|
|
|
group "Select by Face/Element Size"
|
|
(
|
|
radioButtons rdoSizeMethod "Sizing Method:" labels:#("Face Area (m^2)", "Element Box-Dimensions (m)") align:#left
|
|
|
|
button btnSelectByFaceSize "Select:" width:80 align:#left across:2 tooltip:"Selects all faces who are equal to or less than the specified size."
|
|
spinner spFaceSize "Size:" offset:[ 0, 3 ] range:[ 0.0, 9999.0, 1.0 ]
|
|
|
|
radioButtons rdoGtLtSize "" labels:#("< Size", "> Size") columns:2 align:#right offset:[0,-4]
|
|
checkbox cbFaceSizeSelectWhileSpinning "Select while spinning" align:#right offset:[0,-2]
|
|
)
|
|
|
|
group "Select duplicate faces"
|
|
(
|
|
button btnSelectDuplicateFaces "Select" width:80 align:#left across:2 tooltip:"Selects all duplicate faces within the given threshold."
|
|
spinner spDuplicateThreshold "Threshold:" offset:[ 0, 3 ] range:[ 0.0, 0.05, 0.001 ]
|
|
)
|
|
|
|
|
|
groupbox gbx1 "" width:GeometrySelection.width height:5 pos:[0,62]
|
|
-- Functions
|
|
|
|
fn setEnabledState state =
|
|
(
|
|
btnGrowSelectionByMatId.enabled = state
|
|
btnSelectBorderEdges.enabled = state
|
|
btnSelectBorderVerts.enabled = state
|
|
btnRandomlyDeselectVert.enabled = state
|
|
rbSelectionType.enabled = state
|
|
btnConvertTexVertSelection.enabled = state
|
|
)
|
|
|
|
fn refresh =
|
|
(
|
|
obj = ( selection as array )[ 1 ]
|
|
|
|
case of
|
|
(
|
|
(not isValidNode obj):
|
|
(
|
|
setEnabledState false
|
|
btnConvertTexVertSelection.enabled = false
|
|
)
|
|
(isKindOf obj PolyMeshObject):
|
|
(
|
|
btnConvertTexVertSelection.enabled = True
|
|
)
|
|
(isKindOf obj Editable_Poly):
|
|
(
|
|
btnConvertTexVertSelection.enabled = False
|
|
|
|
local matIds = gRsSelectionTools.getMaterialIds obj
|
|
|
|
if matIds != undefined then (
|
|
ddlMaterialId.items = for i in matIds collect ( i as string )
|
|
)
|
|
|
|
if ( subObjectLevel == 1 ) then (
|
|
btnGrowSelectionByMatId.enabled = false
|
|
btnSelectBorderEdges.enabled = true
|
|
btnSelectBorderVerts.enabled = true
|
|
btnRandomlyDeselectVert.enabled = true
|
|
rbSelectionType.enabled = true
|
|
|
|
) else if ( subObjectLevel == 2 ) then (
|
|
btnGrowSelectionByMatId.enabled = false
|
|
btnSelectBorderEdges.enabled = true
|
|
btnSelectBorderVerts.enabled = true
|
|
btnRandomlyDeselectVert.enabled = false
|
|
rbSelectionType.enabled = true
|
|
|
|
) else if ( subObjectLevel == 4 ) then (
|
|
btnGrowSelectionByMatId.enabled = true
|
|
btnSelectBorderEdges.enabled = true
|
|
btnSelectBorderVerts.enabled = true
|
|
btnRandomlyDeselectVert.enabled = false
|
|
rbSelectionType.enabled = true
|
|
|
|
) else (
|
|
setEnabledState false
|
|
)
|
|
|
|
)
|
|
(isKindOf obj Editable_Mesh):
|
|
(
|
|
setEnabledState false
|
|
btnConvertTexVertSelection.enabled = true
|
|
)
|
|
)
|
|
)
|
|
|
|
fn onSelectionChanged event node = (
|
|
refresh()
|
|
)
|
|
|
|
fn randomSelect thePercentage theClass =
|
|
(
|
|
local theClass = (theClass as name)
|
|
|
|
setCommandPanelTaskMode #modify
|
|
|
|
local theObj, objOp
|
|
local candidatesArray = undefined
|
|
|
|
if theClass == #Geometry then
|
|
(
|
|
-- collects all geometry objects, excluding target objects
|
|
clearselection()
|
|
candidatesArray = for o in Geometry where (not o.ishidden) and (not isKindOf o TargetObject) collect o
|
|
subobjectLevel = 0
|
|
)
|
|
else
|
|
(
|
|
if ((selection.count == 1) and ((isKindOf selection[1] Editable_Mesh) or (isKindOf selection[1] Editable_Poly))) then
|
|
(
|
|
subobjectLevel = case theClass of
|
|
(
|
|
#Vertex:1
|
|
#Face:4
|
|
default:0
|
|
)
|
|
|
|
theObj = selection[1]
|
|
|
|
objOp = (RsMeshPolyOp theObj)
|
|
local theSubLevelOp = case theClass of
|
|
(
|
|
#Vertex:objOp.getNumVerts
|
|
#Face:objOp.getNumFaces
|
|
)
|
|
|
|
candidatesArray = (for n = 1 to theObj.numVerts collect n)
|
|
)
|
|
else
|
|
(
|
|
messagebox "Object must be editable poly or editable mesh." title:"Error"
|
|
)
|
|
)
|
|
|
|
try
|
|
(
|
|
local numberToSelect = (thePercentage / 100.0 * candidatesArray.count) as integer -- Calculate the number of objects to select
|
|
local randomiserList = for item in candidatesArray collect (dataPair num:(random 0 100000) item:item)
|
|
|
|
fn listSorter v1 v2 = (v1.num - v2.num)
|
|
qsort randomiserList listSorter
|
|
|
|
local selectArray = for n = 1 to numberToSelect collect randomiserList[n].item
|
|
|
|
if theClass == #Geometry then
|
|
(
|
|
select selectArray
|
|
)
|
|
else
|
|
(
|
|
case of
|
|
(
|
|
(isKindOf theObj Editable_Poly):
|
|
(
|
|
local theSubLevelSelectionOp = case theClass of
|
|
(
|
|
#Vertex:polyOp.setVertSelection
|
|
#Face:polyOp.setFaceSelection
|
|
)
|
|
theSubLevelSelectionOp theObj (selectArray as bitarray)
|
|
)
|
|
(isKindOf theObj Editable_mesh):
|
|
(
|
|
case theSubLevel of
|
|
(
|
|
1:(theobj.selectedVerts = (selectArray as bitarray))
|
|
4:(theobj.selectedFaces = (selectArray as bitarray))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
redrawViews()
|
|
)
|
|
catch()
|
|
)
|
|
|
|
fn doSelectByFaceSizes quiet:False =
|
|
(
|
|
local elemWidth = (rdoSizeMethod.state == 2)
|
|
local inverted = (rdoGtLtSize.state == 2)
|
|
gRsSelectionTools.SelectFacesBySize Selection spFaceSize.value elements:elemWidth inverted:inverted
|
|
)
|
|
|
|
-- Event Handlers:
|
|
|
|
on rdoGtLtSize changed state do
|
|
(
|
|
doSelectByFaceSizes quiet:True
|
|
)
|
|
on btnSelectByFaceSize pressed do
|
|
(
|
|
doSelectByFaceSizes()
|
|
)
|
|
on spFaceSize changed val do
|
|
(
|
|
if cbFaceSizeSelectWhileSpinning.checked do
|
|
(
|
|
doSelectByFaceSizes quiet:True
|
|
)
|
|
)
|
|
|
|
on lst_ObjType selected val do
|
|
(
|
|
randomSelect spr_Percent.value lst_ObjType.items[val]
|
|
)
|
|
|
|
on btn_select pressed do
|
|
(
|
|
randomSelect spr_Percent.value lst_ObjType.selected
|
|
)
|
|
|
|
on spr_Percent changed val do
|
|
(
|
|
if chk_selectSpin.checked ==true then randomSelect val lst_ObjType.selected
|
|
)
|
|
|
|
on btnGrowSelectionByMatId pressed do (
|
|
undo "Grow Selection by Material Id" on (
|
|
gRsSelectionTools.growSelectionByMatId $
|
|
)
|
|
)
|
|
|
|
on btnVertexAlphaSelector pressed do (
|
|
fileIn ( ::RsConfigGetWildwestDir() + "script/max/rockstar_north/maps/vertexalphaselector.ms" )
|
|
)
|
|
|
|
on btnSelectAlphaDecal pressed do (
|
|
filein (::RsConfigGetWildwestDir() + "script/max/rockstar_north/maps/select_alphadecal.ms")
|
|
)
|
|
|
|
on btnConvertTexVertSelection pressed do (
|
|
undo "Convert Unwrap Vert Selection" on (
|
|
obj = $selection[ 1 ]
|
|
|
|
gRsSelectionTools.convertMapVertSelectionToMeshVertSelection obj
|
|
)
|
|
)
|
|
|
|
-- Reset Vert Position
|
|
on btnStoreVertPos pressed do (
|
|
obj = $selection[ 1 ]
|
|
|
|
if obj != undefined do (
|
|
gRsSelectionTools.storeVertexPositions obj
|
|
)
|
|
)
|
|
|
|
on btnRestoreVertPos pressed do (
|
|
obj = $selection[ 1 ]
|
|
|
|
if obj != undefined do (
|
|
gRsSelectionTools.restoreVertexPositions obj
|
|
)
|
|
)
|
|
|
|
-- Select Material Border
|
|
|
|
on btnRefreshMaterialIdList pressed do (
|
|
refresh()
|
|
)
|
|
|
|
on btnSelectBorderEdges pressed do (
|
|
obj = $selection[ 1 ]
|
|
|
|
if obj != undefined do (
|
|
undo "Select Border Edges" on (
|
|
if rbSelectionType.state == 1 then (
|
|
gRsSelectionTools.selectMaterialBorderFromFaceSelection obj type:#edges selectAllBorders:btnSelectAllBorders.state
|
|
|
|
) else (
|
|
gRsSelectionTools.selectMaterialBorderEdges obj ( ddlMaterialId.selected as integer ) selectAllBorders:true
|
|
)
|
|
)
|
|
)
|
|
|
|
redrawViews()
|
|
)
|
|
|
|
on btnSelectBorderVerts pressed do (
|
|
undo "Select Border Verts" on (
|
|
if rbSelectionType.state == 1 then (
|
|
gRsSelectionTools.selectMaterialBorderFromFaceSelection $ type:#verts selectAllBorders:btnSelectAllBorders.state
|
|
|
|
) else (
|
|
gRsSelectionTools.selectMaterialBorderVerts $ ( ddlMaterialId.selected as integer ) selectAllBorders:true
|
|
)
|
|
)
|
|
|
|
redrawViews()
|
|
)
|
|
|
|
on rbSelectionType changed sel do (
|
|
if sel == 1 then (
|
|
ddlMaterialId.enabled = false
|
|
btnRefreshMaterialIdList.enabled = false
|
|
btnSelectAllBorders.enabled = true
|
|
|
|
) else (
|
|
ddlMaterialId.enabled = true
|
|
btnRefreshMaterialIdList.enabled = true
|
|
btnSelectAllBorders.enabled = false
|
|
)
|
|
)
|
|
|
|
|
|
-- Randomly Deselect Vertices
|
|
|
|
on btnRandomlyDeselectVert pressed do (
|
|
undo "Randomly Deselect Verts" on (
|
|
gRsSelectionTools.randomlyDeselectVerts $ spRandomDeselectVertPct.value
|
|
)
|
|
|
|
redrawViews()
|
|
)
|
|
|
|
|
|
-- Snap Verts
|
|
|
|
on btnSnapAtoB pressed do
|
|
(
|
|
if pbObjA.object != undefined and pbObjB.object != undefined then
|
|
(
|
|
undo "Snap Verts A to B" on (
|
|
local objA = pbObjA.object
|
|
local objB = pbObjB.object
|
|
|
|
gRsSelectionTools.snapVertsToTarget objA objB tolerance:spSnapTolerance.value
|
|
)
|
|
|
|
completeRedraw()
|
|
)
|
|
)
|
|
|
|
on btnSnapBtoA pressed do
|
|
(
|
|
if pbObjA.object != undefined and pbObjB.object != undefined then
|
|
(
|
|
undo "Snap Verts B to A" on (
|
|
local objA = pbObjA.object
|
|
local objB = pbObjB.object
|
|
|
|
gRsSelectionTools.snapVertsToTarget objB objA tolerance:spSnapTolerance.value
|
|
)
|
|
|
|
completeRedraw()
|
|
)
|
|
)
|
|
|
|
on btnSnapBoth pressed do
|
|
(
|
|
if pbObjA.object != undefined and pbObjB.object != undefined then
|
|
(
|
|
undo "Snap Verts to Midpoint" on (
|
|
local objA = pbObjA.object
|
|
local objB = pbObjB.object
|
|
|
|
gRsSelectionTools.snapVertsToMidpoint objA objB tolerance:spSnapTolerance.value
|
|
)
|
|
|
|
completeRedraw()
|
|
)
|
|
)
|
|
|
|
on btnSelectDuplicateFaces pressed do
|
|
(
|
|
if( Selection.Count != 1 or ClassOf Selection[1] != Editable_Mesh ) then
|
|
(
|
|
MessageBox "Please select one editable_mesh to find duplicate faces."
|
|
return()
|
|
)
|
|
|
|
TargetMesh = Selection[1]
|
|
RSPushPrompt "Searching for duplicate faces..."
|
|
DuplicateFaceList = RSMesh_GetFaceList_Duplicated TargetMesh Threshold:spDuplicateThreshold.Value
|
|
RSPopPrompt()
|
|
setFaceSelection TargetMesh DuplicateFaceList
|
|
)
|
|
|
|
|
|
-- Rollout
|
|
|
|
on GeometrySelection open do
|
|
(
|
|
cbOnSelectionChanged = NodeEventCallback mouseUp:true selectionChanged:onSelectionChanged subObjectSelectionChanged:onSelectionChanged modelStructured:onSelectionChanged
|
|
refresh()
|
|
)
|
|
|
|
on GeometrySelection close do
|
|
(
|
|
AllVertexDataLists = #()
|
|
cbOnSelectionChanged = undefined
|
|
gc light:true
|
|
)
|
|
)
|
|
-------------------------------------------------------------------------------------------------------------------------
|
|
|
|
rollout VertexAlphaSelection "Vertex Alpha Selector"
|
|
(
|
|
group "Display"
|
|
(
|
|
Checkbox btnAlpha "A" checked:false tooltip:"display vertex Alpha" across:3
|
|
Checkbox btnColour "C" checked:false tooltip:"display vertex Color"
|
|
Checkbox btnNormal "none" checked:false tooltip:"display normal"
|
|
)
|
|
|
|
group "Selection"
|
|
(
|
|
multiListBox lbx_1
|
|
button btnSelect "Select" width:80 toolTip:"Select vertices" align:#left across:2
|
|
colorpicker cpPick "Pick:" color:[255, 255, 255] align:#right
|
|
)
|
|
|
|
group "Adjust"
|
|
(
|
|
spinner spn_1 "Value: " fieldWidth:50 range:[0.0,100.0,0.0] type:#float scale:1.0 align:#left across:2 offset:[0,15]
|
|
|
|
--button btn5 "integer" pos:[76,120] width:42 height:32 toolTip:"Integer alpha, 12.2563 --> 12.0"
|
|
|
|
dropdownList dd_1 "object : " width:90 height:15 items:#("") align:#right offset:[0,-5]
|
|
)
|
|
|
|
--##########################################################################################
|
|
fn My_alpha_select_verts item_number =
|
|
(
|
|
setwaitcursor()
|
|
max modify mode
|
|
if selection.count == 0 then
|
|
(
|
|
VertexAlphaSelection.lbx_1.items =#()
|
|
VertexAlphaSelection.dd_1.items =#(" ")
|
|
VertexAlphaSelection.dd_1.caption=""
|
|
)
|
|
else
|
|
(
|
|
|
|
current_alpha_array = #()
|
|
item_content = #()
|
|
--convertToPoly selection
|
|
for g = 1 to item_number.count do
|
|
(
|
|
if item_number[g] == true then ( append item_content (VertexAlphaSelection.lbx_1.items[g] as float) ) )
|
|
--subobjectLevel = 1
|
|
-------------------------------------------------
|
|
for nn = 1 to selection.count do
|
|
(
|
|
current_alpha_array = #()
|
|
all_vertexs = 0
|
|
|
|
case (classOf selection[nn].baseobject ) of
|
|
(
|
|
Editable_Poly:
|
|
(
|
|
polyOp.setMapSupport selection[nn] -2 true
|
|
all_vertexs=polyop.getNumMapVerts selection[nn] -2
|
|
)
|
|
|
|
Editable_mesh:
|
|
(
|
|
meshOp.setMapSupport selection[nn] -2 true
|
|
all_vertexs=meshOp.getNumMapVerts selection[nn] -2
|
|
)
|
|
)
|
|
|
|
must_select_verts = #{}
|
|
must_select_verts[all_vertexs] = false
|
|
xx = #{} --the selected verts array
|
|
|
|
for h =1 to item_content.count do
|
|
(
|
|
vv= ( item_content[h] ) * 2.55
|
|
case (classOf selection[nn].baseobject ) of
|
|
(
|
|
Editable_Poly:
|
|
(
|
|
xx+=polyop.getVertsByColor selection[nn] (color vv vv vv) 0.01 0.01 0.01 channel:-2
|
|
)
|
|
|
|
Editable_mesh:
|
|
(
|
|
--selectMapVerts = #()
|
|
--each map face
|
|
--test mapverts against colour
|
|
--pass test then find geo vert
|
|
--append to array
|
|
numMapFaces = meshOp.getNumMapFaces selection[nn] -2
|
|
for mf = 1 to numMapFaces do
|
|
(
|
|
mv = meshOp.getMapFace selection[nn] -2 mf
|
|
mv = #(mv.x as Integer, mv.y as Integer, mv.z as Integer)
|
|
--check colour
|
|
for v = 1 to mv.count do
|
|
(
|
|
col = (meshOp.getMapVert selection[nn] -2 mv[v])[1]
|
|
diff = abs (col - (0.01 * item_content[h]))
|
|
--if diff < 0.25 then format "v: % col: % item: % diff: % \n" v col (0.01 * item_content[h]) diff
|
|
if diff < 0.003921 then
|
|
(
|
|
--find its geo vert counterpart
|
|
--v is the mapvert index
|
|
face = getFace selection[nn] mf
|
|
face = #(face.x as Integer, face.y as Integer, face.z as Integer)
|
|
append xx face[v]
|
|
)
|
|
)
|
|
)
|
|
--xx+=meshop.getVertsByColor selection[nn] (color vv vv vv) 0.01 0.01 0.01 channel:-2
|
|
)
|
|
)
|
|
|
|
)
|
|
select selection[nn].verts[xx]
|
|
)--for nn
|
|
|
|
--modPanel.addModToSelection (Edit_Mesh ()) ui:on
|
|
--subobjectLevel = 1
|
|
)--else
|
|
completeRedraw()
|
|
)
|
|
|
|
fn My_alpha_test =
|
|
(
|
|
|
|
alpha_array=#()
|
|
uniqueAlphaValues = #()
|
|
--print $selection[1].name
|
|
sel = $selection
|
|
--check for no selection
|
|
if sel.count == 0 then
|
|
(
|
|
VertexAlphaSelection.lbx_1.items =#()
|
|
VertexAlphaSelection.dd_1.items =#(" ")
|
|
VertexAlphaSelection.dd_1.caption=""
|
|
)
|
|
else
|
|
(
|
|
--Add the object names to the ui dropdown
|
|
obj_name = #()
|
|
for i =1 to $selection.count do
|
|
(
|
|
obj_name[i] = selection[i].name
|
|
)
|
|
VertexAlphaSelection.dd_1.items = obj_name
|
|
VertexAlphaSelection.dd_1.caption = ($selection.count as string)+" Obj"
|
|
|
|
current_alpha_array=#()
|
|
--diffent_alpha=#()
|
|
|
|
for nn in sel do
|
|
(
|
|
current_alpha_array=#()
|
|
case (classOf nn.baseobject) of
|
|
(
|
|
Editable_Poly:
|
|
(
|
|
polyOp.setMapSupport nn -2 true
|
|
numMapVerts = polyop.getNumMapVerts nn -2
|
|
polyOp_getMapVert = polyOp.getMapVert
|
|
current_alpha_array = for i = 1 to numMapVerts collect (( polyOp_getMapVert nn -2 i)[1] * 100.0) --get the alpha as a percentag
|
|
sort current_alpha_array
|
|
)
|
|
|
|
Editable_mesh:
|
|
(
|
|
meshOp.setMapSupport nn -2 true
|
|
all_vertexs=meshop.getNumMapVerts nn -2
|
|
for i = 1 to all_vertexs do
|
|
(
|
|
current_alpha_array[i] = ( meshOp.getMapVert nn -2 i)[1] * 100.0
|
|
)
|
|
sort current_alpha_array
|
|
)
|
|
|
|
default:
|
|
(
|
|
--all_vertexs=0
|
|
current_alpha_array=#()
|
|
)
|
|
)--end case
|
|
|
|
for a in current_alpha_array do appendIfUnique uniqueAlphaValues (a as String)
|
|
--sort uniqueAlphaValues
|
|
|
|
--alpha_array += sss
|
|
)--for
|
|
|
|
VertexAlphaSelection.lbx_1.items = uniqueAlphaValues
|
|
|
|
|
|
--My_alpha_select_verts( VertexAlphaSelection.lbx_1.selection )
|
|
)--else
|
|
)
|
|
|
|
on VertexAlphaSelection open do
|
|
(
|
|
callbacks.removeScripts id:#alpha_test_1
|
|
callbacks.addScript #selectionSetChanged "VertexAlphaSelection.My_alpha_test()" id:#alpha_test_1
|
|
try (select selection)catch()
|
|
)
|
|
|
|
on VertexAlphaSelection close do
|
|
(
|
|
AllVertexDataLists = #()
|
|
callbacks.removeScripts id:#alpha_test_1
|
|
)
|
|
|
|
on btnSelect pressed do
|
|
(
|
|
|
|
-- if classOf selection[1] != Editable_poly then
|
|
-- (
|
|
-- q = queryBox "Needs to be Editable_Poly, convert?" title:"Object Type"
|
|
-- if q == true then
|
|
-- (
|
|
-- addModifier selection[1] (Edit_Poly())
|
|
-- collapseStack selection[1]
|
|
-- )
|
|
-- else if q == false then
|
|
-- (
|
|
-- return false
|
|
-- )
|
|
-- )
|
|
|
|
subobjectLevel = 1
|
|
setwaitcursor()
|
|
--set the value spinner to the current selection if one item selected
|
|
aSel = lbx_1.selection as array
|
|
items = lbx_1.items as array
|
|
|
|
if aSel.count == 1 then
|
|
(
|
|
spn_1.value = items[aSel[1]] as float
|
|
)
|
|
|
|
--do the do
|
|
My_alpha_select_verts lbx_1.selection
|
|
)
|
|
|
|
on btnAlpha changed checked do
|
|
(
|
|
btnAlpha.checked = btnColour.checked = btnNormal.checked = false
|
|
btnAlpha.checked = true
|
|
selection.vertexColorType = 2
|
|
selection.showVertexColors=on
|
|
selection.vertexColorsShaded=false
|
|
completeredraw()
|
|
)
|
|
on btnColour changed checked do
|
|
(
|
|
btnAlpha.checked = btnColour.checked = btnNormal.checked = false
|
|
-- btn3.checked = true
|
|
selection.vertexColorType = 0
|
|
selection.showVertexColors=on
|
|
selection.vertexColorsShaded=false
|
|
completeredraw()
|
|
)
|
|
on btnNormal changed checked do
|
|
(
|
|
btnAlpha.checked = btnColour.checked = btnNormal.checked = false
|
|
btn4.checked = true
|
|
selection.vertexColorType = 0
|
|
selection.showVertexColors=off
|
|
selection.vertexColorsShaded=false
|
|
completeredraw()
|
|
)
|
|
|
|
on btn5 pressed do
|
|
(
|
|
for nn=1 to selection.count do
|
|
(
|
|
for tt=1 to selection[nn].verts.count do
|
|
( alpha_integer=(polyOp.getMapVert selection[nn] -2 tt )[1]
|
|
alpha_integer=(alpha_integer * 100.0) as integer
|
|
alpha_integer=alpha_integer/100.0
|
|
polyOp.setMapVert selection[nn] -2 tt [alpha_integer,alpha_integer,alpha_integer]
|
|
)
|
|
)
|
|
select selection
|
|
-- messagebox "alpha_integer complete!!"
|
|
)
|
|
|
|
--ColorPicker Change Event
|
|
on cpPick changed arg do
|
|
(
|
|
--take first component of arg as alpha only
|
|
--find the closest match in the list
|
|
|
|
picked = arg.r as Integer
|
|
items = lbx_1.items as array
|
|
|
|
idx = findItem items picked
|
|
|
|
|
|
-- if idx != 0 then
|
|
-- (
|
|
-- lbx_1.selection = #{idx}
|
|
-- )
|
|
|
|
--find closest match
|
|
|
|
minDiff = 9999
|
|
idx = 99
|
|
for i=1 to items.count do
|
|
(
|
|
ItemInt = (items[i] as float * 2.55) as Integer
|
|
|
|
--Find the diff and check against closest
|
|
diff = abs(ItemInt - picked)
|
|
if diff < minDiff then
|
|
(
|
|
minDiff = diff
|
|
idx = i
|
|
)
|
|
)
|
|
--Now we have the closest
|
|
lbx_1.selection = #{idx}
|
|
--set the value to the selection val
|
|
spn_1.value = items[idx] as float
|
|
|
|
)
|
|
|
|
--***************************************************************************************
|
|
--apply new values
|
|
on spn_1 entered do
|
|
(
|
|
setwaitcursor()
|
|
new_alpha_value = spn_1.value * 0.01
|
|
new_alpha_value = [new_alpha_value, new_alpha_value, new_alpha_value]
|
|
for nn in selection do
|
|
(
|
|
--go through mapverts checking aginst value apply new cvalue to matches
|
|
case (classOf nn) of
|
|
(
|
|
Editable_Poly:
|
|
(
|
|
polyOp_getMapVert = polyOp.getMapVert
|
|
currentAlpha = for i = 1 to (polyop.getNumMapVerts nn -2) collect (( polyOp_getMapVert nn -2 i)[1] * 100.0)
|
|
listValuesCount = lbx_1.selection.count
|
|
listSelection = lbx_1.selection as array
|
|
|
|
for lv = 1 to listSelection.count do
|
|
(
|
|
listValue = lbx_1.items[listSelection[lv]] as Float
|
|
for v = 1 to currentAlpha.count do
|
|
(
|
|
diff = abs (currentAlpha[v] - listValue)
|
|
if diff < 0.3921 then
|
|
(
|
|
--format "listValue: % currentAlpha: % diff: %\n " listValue currentAlpha[v] diff
|
|
polyOp.setMapVert nn -2 v new_alpha_value
|
|
)
|
|
)
|
|
)
|
|
--polyOp.setVertColor nn -2 (nn.selectedVerts) new_alpha_value
|
|
)
|
|
|
|
Editable_Mesh:
|
|
(
|
|
meshOp_getMapVert = meshOp.getMapVert
|
|
currentAlpha = for i = 1 to (meshop.getNumMapVerts nn -2) collect (( meshOp_getMapVert nn -2 i)[1] * 100.0)
|
|
listValuesCount = lbx_1.selection.count
|
|
listSelection = lbx_1.selection as array
|
|
|
|
for lv = 1 to listSelection.count do
|
|
(
|
|
listValue = lbx_1.items[listSelection[lv]] as Float
|
|
for v = 1 to currentAlpha.count do
|
|
(
|
|
diff = abs (currentAlpha[v] - listValue)
|
|
if diff < 0.3921 then -- 100 / 255 = 0.3921
|
|
(
|
|
--format "listValue: % currentAlpha: % diff: %\n " listValue currentAlpha[v] diff
|
|
meshOp.setMapVert nn -2 v new_alpha_value
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
--Clear list selection
|
|
lbx_1.selection = #()
|
|
|
|
My_alpha_test()
|
|
|
|
--re-select verts of new value
|
|
idx = findItem lbx_1.items (spn_1.value as String)
|
|
lbx_1.selection = idx
|
|
ba = #{}
|
|
if idx != 0 then append ba idx
|
|
My_alpha_select_verts ba
|
|
|
|
for ii in selection do update ii
|
|
|
|
) -- on
|
|
--***************************************************************************************
|
|
on dd_1 selected i do
|
|
(
|
|
try (
|
|
select selection[i]
|
|
)
|
|
catch()
|
|
)
|
|
)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------
|
|
rollout AlphaDecalSelection "Alpha Poly Selector"
|
|
(
|
|
local mapAlphaShaderList = #(
|
|
#("alpha",true,true),
|
|
#("decal",true,true),
|
|
#("decal_amb_only",false,false),
|
|
#("decal_dirt",false,false),
|
|
#("decal_glue",false,false),
|
|
#("decal_normal_only",false,false),
|
|
#("decal_spec_only",false,false),
|
|
#("decal_tnt",false,false),
|
|
#("normal_alpha",false,false),
|
|
#("normal_decal",false,false),
|
|
#("normal_decal_tnt",false,false),
|
|
#("normal_reflect_alpha",false,false),
|
|
#("normal_reflect_decal",false,false),
|
|
#("normal_reflect_screendooralpha",false,false),
|
|
#("normal_screendooralpha",false,false),
|
|
#("normal_spec_alpha",false,false),
|
|
#("normal_spec_decal",false,false),
|
|
#("normal_spec_decal_tnt",false,false),
|
|
#("normal_spec_reflect_alpha",false,false),
|
|
#("normal_spec_reflect_decal",false,false),
|
|
#("normal_spec_reflect_emmisive_alpha",false,false),
|
|
#("normal_spec_reflect_emmisivenight_alpha",false,false),
|
|
#("normal_spec_screendooralpha",false,false),
|
|
#("reflect_alpha",false,false),
|
|
#("reflect_decal",false,false),
|
|
#("spec_alpha",false,false),
|
|
#("spec_decal",false,false),
|
|
#("spec_reflect_alpha",false,false),
|
|
#("spec_reflect_decal",false,false),
|
|
#("spec_screendooralpha",false,false),
|
|
#("water_decal",false,false)
|
|
)
|
|
|
|
-- This function will select polygons that use a chosen shader
|
|
fn findpolygons = (
|
|
-- Parse the array of shaders and look for the select ones
|
|
chosenArray = #()
|
|
|
|
for shaderindex = 1 to mapAlphaShaderList.count do
|
|
(
|
|
if mapAlphaShaderList[shaderindex][3] == true then append chosenArray shaderindex
|
|
)
|
|
|
|
-- chosenArray now holds the index of the shaders we are looking for.
|
|
|
|
-- With an object selected
|
|
foundShaderIndex=#()
|
|
theSelection = getcurrentselection()
|
|
if (theSelection.count == 1) do
|
|
(
|
|
selObj = theSelection[1]
|
|
-- Get the shader that is applied to the object
|
|
if superclassof selObj == GeometryClass then
|
|
(
|
|
appliedMaterial = selObj.material
|
|
|
|
matcount = 1
|
|
try (matcount = appliedmaterial.count) catch()
|
|
|
|
if matcount > 1 then
|
|
(
|
|
--loop through the materials and get the shader names
|
|
for submat = 1 to matcount do
|
|
(
|
|
theMat = appliedmaterial[submat]
|
|
|
|
-- Add a catch for standard materials
|
|
RageShaderType = undefined
|
|
try (
|
|
RageShaderType = RstGetShaderName theMat
|
|
RageShaderType = (filterstring RageShaderType ".")[1]
|
|
)catch()
|
|
|
|
RageShaderType = RageShaderType as string
|
|
|
|
-- Now look to see if that shader is in our list of ones we want to find.
|
|
-- We have a list of indices to search for
|
|
for shaderindex = 1 to chosenArray.count do
|
|
(
|
|
searchIndex = chosenArray[shaderindex]
|
|
if mapAlphaShaderList[searchindex][1] == RageShaderType then append foundShaderIndex submat
|
|
)
|
|
) --end subloop
|
|
)-- end material list loop
|
|
) -- end is valid geo
|
|
) -- end selection
|
|
|
|
-- foundShaderIndex now holds a list of materials IDs
|
|
-- select them on the model
|
|
if (theSelection.count == 1) do
|
|
(
|
|
max modify mode
|
|
subobjectLevel = 4
|
|
|
|
newFaceSel = #()
|
|
for f = 1 to selObj.numfaces do
|
|
(
|
|
for mat = 1 to foundShaderIndex.count do
|
|
(
|
|
if classof selObj == Editable_mesh then
|
|
(
|
|
if getFaceMatID selObj f == foundShaderIndex[mat] do append newFaceSel f
|
|
)
|
|
|
|
if classof selObj == Editable_Poly then
|
|
(
|
|
if polyop.getFaceMatID selObj f == foundShaderIndex[mat] do append newFaceSel f
|
|
)
|
|
|
|
)
|
|
)
|
|
|
|
setFaceSelection selObj newFaceSel
|
|
)
|
|
)
|
|
|
|
local ctrlOffset = [0,-2]
|
|
checkbox chk_shader_alpha "Alpha" width:180 checked:true offset:ctrlOffset
|
|
on chk_shader_alpha changed thestate do (mapAlphaShaderList[1][3] = chk_shader_alpha.checked)
|
|
checkbox chk_shader_decal "Decal" width:180 checked:true offset:ctrlOffset
|
|
on chk_shader_decal changed thestate do (mapAlphaShaderList[2][3] = chk_shader_decal.checked)
|
|
checkbox chk_shader_decal_amb_only "Decal amb only" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_decal_amb_only changed thestate do (mapAlphaShaderList[3][3] = chk_shader_decal_amb_only.checked)
|
|
checkbox chk_shader_decal_dirt "Decal dirt" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_decal_dirt changed thestate do (mapAlphaShaderList[4][3] = chk_shader_decal_dirt.checked)
|
|
checkbox chk_shader_decal_glue "Decal glue" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_decal_glue changed thestate do (mapAlphaShaderList[5][3] = chk_shader_decal_glue.checked)
|
|
checkbox chk_shader_decal_normal_only "Decal normal only" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_decal_normal_only changed thestate do (mapAlphaShaderList[6][3] = chk_shader_decal_normal_only.checked)
|
|
checkbox chk_shader_decal_spec_only "Decal spec only" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_decal_spec_only changed thestate do (mapAlphaShaderList[7][3] = chk_shader_decal_spec_only.checked)
|
|
checkbox chk_shader_decal_tnt "Decal tnt" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_decal_tnt changed thestate do (mapAlphaShaderList[8][3] = chk_shader_decal_tnt.checked)
|
|
checkbox chk_shader_normal_alpha "Normal alpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_alpha changed thestate do (mapAlphaShaderList[9][3] = chk_shader_normal_alpha.checked)
|
|
checkbox chk_shader_normal_decal "Normal decal" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_decal changed thestate do (mapAlphaShaderList[10][3] = chk_shader_normal_decal.checked)
|
|
checkbox chk_shader_normal_decal_tnt "Normal decal tnt" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_decal_tnt changed thestate do (mapAlphaShaderList[11][3] = chk_shader_normal_decal_tnt.checked)
|
|
checkbox chk_shader_normal_reflect_alpha "Normal reflect alpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_reflect_alpha changed thestate do (mapAlphaShaderList[12][3] = chk_shader_normal_reflect_alpha.checked)
|
|
checkbox chk_shader_normal_reflect_decal "Normal reflect decal" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_reflect_decal changed thestate do (mapAlphaShaderList[13][3] = chk_shader_normal_reflect_decal.checked)
|
|
checkbox chk_shader_normal_reflect_screendooralpha "Normal reflect screendooralpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_reflect_screendooralpha changed thestate do (mapAlphaShaderList[14][3] = chk_shader_normal_reflect_screendooralpha.checked)
|
|
checkbox chk_shader_normal_screendooralpha "Normal screendooralpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_screendooralpha changed thestate do (mapAlphaShaderList[15][3] = chk_shader_normal_screendooralpha.checked)
|
|
checkbox chk_shader_normal_spec_alpha "Normal spec alpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_spec_alpha changed thestate do (mapAlphaShaderList[16][3] = chk_shader_normal_spec_alpha.checked)
|
|
checkbox chk_shader_normal_spec_decal "Normal spec decal" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_spec_decal changed thestate do (mapAlphaShaderList[17][3] = chk_shader_normal_spec_decal.checked)
|
|
checkbox chk_shader_normal_spec_decal_tnt "Normal spec decal tnt" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_spec_decal_tnt changed thestate do (mapAlphaShaderList[18][3] = chk_shader_normal_spec_decal_tnt.checked)
|
|
checkbox chk_shader_normal_spec_reflect_alpha "Normal spec reflect alpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_spec_reflect_alpha changed thestate do (mapAlphaShaderList[19][3] = chk_shader_normal_spec_reflect_alpha.checked)
|
|
checkbox chk_shader_normal_spec_reflect_decal "Normal spec reflect decal" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_spec_reflect_decal changed thestate do (mapAlphaShaderList[20][3] = chk_shader_normal_spec_reflect_decal.checked)
|
|
checkbox chk_shader_normal_spec_reflect_emmisive_alpha "Normal spec reflect emmisive alpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_spec_reflect_emmisive_alpha changed thestate do (mapAlphaShaderList[21][3] = chk_shader_normal_spec_reflect_emmisive_alpha.checked)
|
|
checkbox chk_shader_normal_spec_reflect_emmisivenight_alpha "Normal spec reflect emmisivenight alpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_spec_reflect_emmisivenight_alpha changed thestate do (mapAlphaShaderList[22][3] = chk_shader_normal_spec_reflect_emmisivenight_alpha.checked)
|
|
checkbox chk_shader_normal_spec_screendooralpha "Normal spec screendooralpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_normal_spec_screendooralpha changed thestate do (mapAlphaShaderList[23][3] = chk_shader_normal_spec_screendooralpha.checked)
|
|
checkbox chk_shader_reflect_alpha "Reflect alpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_reflect_alpha changed thestate do (mapAlphaShaderList[24][3] = chk_shader_reflect_alpha.checked)
|
|
checkbox chk_shader_reflect_decal "Reflect decal" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_reflect_decal changed thestate do (mapAlphaShaderList[25][3] = chk_shader_reflect_decal.checked)
|
|
checkbox chk_shader_spec_alpha "Spec alpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_spec_alpha changed thestate do (mapAlphaShaderList[26][3] = chk_shader_spec_alpha.checked)
|
|
checkbox chk_shader_spec_decal "Spec decal" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_spec_decal changed thestate do (mapAlphaShaderList[27][3] = chk_shader_spec_decal.checked)
|
|
checkbox chk_shader_spec_reflect_alpha "Spec reflect alpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_spec_reflect_alpha changed thestate do (mapAlphaShaderList[28][3] = chk_shader_spec_reflect_alpha.checked)
|
|
checkbox chk_shader_spec_reflect_decal "Spec reflect decal" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_spec_reflect_decal changed thestate do (mapAlphaShaderList[29][3] = chk_shader_spec_reflect_decal.checked)
|
|
checkbox chk_shader_spec_screendooralpha "Spec screendooralpha" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_spec_screendooralpha changed thestate do (mapAlphaShaderList[30][3] = chk_shader_spec_screendooralpha.checked)
|
|
checkbox chk_shader_water_decal "Water decal" width:180 checked:false offset:ctrlOffset
|
|
on chk_shader_water_decal changed thestate do (mapAlphaShaderList[31][3] = chk_shader_water_decal.checked)
|
|
|
|
|
|
-- Update the UI based on the Select All checkbox
|
|
fn updateChoices togglestate mapAlphaShaderList= (
|
|
|
|
for shaderindex = 1 to mapAlphaShaderList.count do
|
|
(
|
|
if togglestate == true then
|
|
(
|
|
execute ("AlphaDecalSelection.chk_shader_" + mapAlphaShaderList[shaderindex][1] + ".state = true")
|
|
mapAlphaShaderList[shaderindex][3] = true
|
|
)
|
|
|
|
if togglestate == false then
|
|
(
|
|
execute ("AlphaDecalSelection.chk_shader_" + mapAlphaShaderList[shaderindex][1] + ".state = " + (mapAlphaShaderList[shaderindex][2] as string))
|
|
mapAlphaShaderList[shaderindex][3] = mapAlphaShaderList[shaderindex][2]
|
|
)
|
|
)
|
|
)
|
|
|
|
checkbox chk_shader_all "*Select All/Reset to Defaults*" width:180
|
|
on chk_shader_all changed thestate do (updateChoices thestate mapAlphaShaderList)
|
|
button btn_SelectPolygons "Select Polygons" width:140 height:30
|
|
on btn_SelectPolygons pressed do findpolygons()
|
|
|
|
on AlphaDecalSelection open do
|
|
(
|
|
|
|
)
|
|
)
|
|
-------------------------------------------------------------------------------------------------------------------------
|
|
rollout MaterialSelection "Material Selector"
|
|
(
|
|
---------------------------------------------------------
|
|
-- USER INTERFACE
|
|
---------------------------------------------------------
|
|
group "Select Poly by Shader Type"
|
|
(
|
|
dropdownlist ddl_shader "" width:210
|
|
button btn_shaderAddPoly "Select Polys" width:100 across:2
|
|
button btn_shaderRemovePoly "Deselect Polys" width:100
|
|
|
|
checkbox cxb_ShaderClearSelection "Clear Selected Polys First" width:210 checked:true
|
|
)
|
|
|
|
group "Mat ID Add/Remove To/From Selection"
|
|
(
|
|
Spinner spn_mapID "" width:50 across:3 offset:[-25,3] type:#integer
|
|
button btn_ID_add "Select" width:75 offset:[-10,0]
|
|
button btn_ID_remove "Deselect" width:75
|
|
|
|
checkbox cxb_IdClearSelection "Clear Selected Polys First" width:210 checked:true
|
|
|
|
button btn_GrowID "Select All Matching ID Faces" width:210
|
|
)
|
|
|
|
---------------------------------------------------------
|
|
-- FUNCTIONS
|
|
---------------------------------------------------------
|
|
fn populateShaderList =
|
|
(
|
|
local materials = #()
|
|
local items = #()
|
|
for obj in selection where ( GetAttrClass obj == "Gta Object" ) do join materials (RsGetMaterialsOnObjFaces obj)
|
|
|
|
materials = makeUniqueArray materials
|
|
for mat in materials where (ClassOf mat == Rage_Shader) do appendIfUnique items (RstGetShaderName mat)
|
|
|
|
sort items
|
|
ddl_shader.items = items
|
|
)
|
|
|
|
---------------------------------------------------------
|
|
fn selectFaceByID obj ID switch =
|
|
(
|
|
currentSel = getFaceSelection obj
|
|
newFaceSel = #()
|
|
for f = 1 to obj.numfaces do
|
|
(
|
|
if (classof obj == Editable_poly) AND (polyop.getFaceMatID obj f) == ID do append newFaceSel f
|
|
if (classof obj == Editable_mesh) AND (getFaceMatID obj f) == ID do append newFaceSel f
|
|
)
|
|
-------------------------
|
|
if (switch == #add) do newSel = (currentSel) as bitArray + (newFaceSel) as bitArray
|
|
if (switch == #remove) do newSel = (currentSel) as bitArray - (newFaceSel) as bitArray
|
|
-------------------------
|
|
setFaceSelection obj newSel
|
|
)
|
|
---------------------------------------------------------
|
|
fn addRemovePolyByID switch =
|
|
(
|
|
for obj in selection where ( GetAttrClass obj == "Gta Object" ) do
|
|
(
|
|
if (cxb_IdClearSelection.state) do setFaceSelection obj #{}
|
|
selectFaceByID obj spn_mapID.value switch
|
|
)
|
|
)
|
|
---------------------------------------------------------
|
|
fn selectPolyByMaterial switch =
|
|
(
|
|
local selObjs = for obj in selection where (GetAttrClass obj == "Gta Object") collect obj
|
|
if (selObjs.count != 0) do for obj in selObjs do
|
|
(
|
|
if (cxb_ShaderClearSelection.state) do setFaceSelection obj #{}
|
|
local mat = obj.material
|
|
if (isKindOf mat Multimaterial) then
|
|
(
|
|
local matIDArray = #()
|
|
for i=1 to mat.materialIDList.count where (isKindOf mat.materialList[i] Rage_Shader) do
|
|
(
|
|
if ((RstGetShaderName mat.materialList[i]) == ddl_shader.selected) do append matIDArray mat.materialIDList[i]
|
|
)
|
|
|
|
for ID in matIDArray do selectFaceByID obj ID switch
|
|
|
|
)
|
|
else if (isKindOf mat Rage_Shader) do
|
|
(
|
|
(rsmeshpolyop obj).setFaceSelection obj #{1..(obj.numfaces)}
|
|
)
|
|
)
|
|
)
|
|
---------------------------------------------------------
|
|
fn growMaterialID =
|
|
(
|
|
if (selection.count == 1) then
|
|
(
|
|
local uniqueSelectedFaceIDSet = #()
|
|
|
|
local obj = selection[1]
|
|
local isMesh = (classof obj == Editable_Mesh)
|
|
local isPoly = (classof obj == Editable_Poly)
|
|
|
|
local faceIndexSelectionArray = if (isMesh) then (for i in obj.selectedFaces collect i.index)
|
|
else if (isPoly) then (polyop.getFaceSelection obj as array)
|
|
|
|
for faceIndex in faceIndexSelectionArray do
|
|
(
|
|
local selectedFaceID = if (isMesh) then (getFaceMatID obj faceIndex)
|
|
else if (isPoly) then ( polyop.getFaceMatID obj faceIndex)
|
|
|
|
appendIfUnique uniqueSelectedFaceIDSet selectedFaceID
|
|
)
|
|
|
|
newFaceSel = #()
|
|
for f = 1 to obj.numfaces do
|
|
(
|
|
local faceID = if (isMesh) then (getFaceMatID obj f)
|
|
else if (isPoly) then (polyop.getFaceMatID obj f)
|
|
|
|
for toBeSelectedID in uniqueSelectedFaceIDSet where (faceID == toBeSelectedID) do append newFaceSel f
|
|
)
|
|
setFaceSelection obj newFaceSel
|
|
completeRedraw()
|
|
)
|
|
else
|
|
(
|
|
if (selection.count == 0) then messagebox "Select an object first" title:"Error"
|
|
else messagebox "Select only 1 object" title:"Error"
|
|
)
|
|
)
|
|
---------------------------------------------------------
|
|
-- EVENTS
|
|
---------------------------------------------------------
|
|
on btn_shaderAddPoly pressed do selectPolyByMaterial #add
|
|
on btn_shaderRemovePoly pressed do selectPolyByMaterial #remove
|
|
on btn_ID_add pressed do addRemovePolyByID #add
|
|
on btn_ID_remove pressed do addRemovePolyByID #remove
|
|
on btn_GrowID pressed do growMaterialID()
|
|
---------------------------------------------------------
|
|
on MaterialSelection open do
|
|
(
|
|
callbacks.addScript #selectionSetChanged "MaterialSelection.populateShaderList()" id:#MaterialSelection
|
|
populateShaderList()
|
|
)
|
|
---------------------------------------------------------
|
|
on MaterialSelection close do
|
|
(
|
|
callbacks.removeScripts id:#MaterialSelection
|
|
)
|
|
)
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------
|
|
rollout RsSelectionTools_Rollout "R* Selection Tools"
|
|
(
|
|
dotNetControl rsBannerPanel "Panel" pos:[0,0] height:32 width:(RsSelectionTools_Rollout.width)
|
|
local banner = makeRsBanner versionNum:1.11 versionName:"Wilty Pigeon" dn_Panel:rsBannerPanel
|
|
|
|
dotNetControl dn_tabs "System.Windows.Forms.TabControl" height:20 width:(RsSelectionTools_Rollout.width) align:#center pos:[-1, (RsBannerPanel.height + 2)]
|
|
subRollout theSubRollout height:750 align:#center width:(RsSelectionTools_Rollout.width) pos:[0, dn_tabs.pos.y + dn_tabs.height]
|
|
|
|
local lastClickNum
|
|
local maxAutoHeight = 900
|
|
local keepWidth
|
|
|
|
local tabRollouts =
|
|
#(
|
|
dataPair name:"Geometry" rollouts:#(GeometrySelection),
|
|
dataPair name:"Vert Alpha" rollouts:#(VertexAlphaSelection),
|
|
dataPair name:"Alpha Decal" rollouts:#(AlphaDecalSelection),
|
|
dataPair name:"Material" rollouts:#(MaterialSelection)
|
|
)
|
|
|
|
fn setSubrollSize =
|
|
(
|
|
theSubRollout.height = (RsSelectionTools_Rollout.height - theSubRollout.pos.y)
|
|
)
|
|
|
|
fn showTab clickNum =
|
|
(
|
|
if (lastClickNum != clickNum) do --do not update if the same tab clicked twice
|
|
(
|
|
lastClickNum = clickNum
|
|
|
|
for subRoll in theSubRollout.rollouts do
|
|
(
|
|
removeSubRollout theSubRollout subroll
|
|
)
|
|
|
|
local setHeight = theSubRollout.pos.y + 6
|
|
|
|
for subRoll in tabRollouts[clickNum].rollouts do
|
|
(
|
|
addSubRollout theSubRollout subRoll
|
|
setHeight += (subRoll.height + 24)
|
|
)
|
|
|
|
if (setHeight > maxAutoHeight) do
|
|
(
|
|
setHeight = maxAutoHeight
|
|
)
|
|
|
|
RsSelectionTools_Rollout.height = setHeight
|
|
setSubrollSize()
|
|
)
|
|
)
|
|
|
|
on dn_tabs Selected itm do
|
|
(
|
|
local clickNum = (itm.TabPageIndex + 1)
|
|
showTab clickNum
|
|
|
|
RsSettingWrite "RsSelectionTools" "lastTab" tabRollouts[clickNum].name
|
|
)
|
|
|
|
on RsSelectionTools_Rollout resized newSize do
|
|
(
|
|
if (newSize.x != keepWidth) and (keepWidth != undefined) do
|
|
(
|
|
RsSelectionTools_Rollout.width = keepWidth
|
|
)
|
|
|
|
setSubrollSize()
|
|
)
|
|
|
|
on RsSelectionTools_Rollout open do
|
|
(
|
|
banner.setup()
|
|
|
|
keepWidth = RsSelectionTools_Rollout.width
|
|
|
|
local savedTabName = RsSettingsReadString "RsSelectionTools" "lastTab" undefined
|
|
local savedTabNum = 1
|
|
|
|
for tabNum = 1 to tabRollouts.count do
|
|
(
|
|
local tabName = tabRollouts[tabNum].name
|
|
dn_tabs.TabPages.add tabName
|
|
|
|
if (tabName == savedTabName) do
|
|
(
|
|
savedTabNum = tabNum
|
|
)
|
|
)
|
|
|
|
dn_tabs.SelectedIndex = (savedTabNum - 1)
|
|
showTab savedTabNum
|
|
)
|
|
)
|
|
|
|
createDialog RsSelectionTools_Rollout 250 400 style:#(#style_resizing,#style_titlebar, #style_toolwindow, #style_sysmenu)
|