Skip to content

Commit 1d55d54

Browse files
committed
add option to not recategorize faceposer
pac_faceposer_property_regrouping 0 = never 1 = if owner has a head bone 2 = always
1 parent e375df1 commit 1d55d54

File tree

1 file changed

+157
-126
lines changed

1 file changed

+157
-126
lines changed

lua/pac3/editor/client/panels/properties.lua

Lines changed: 157 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ local favorites_menu_expansion = CreateClientConVar("pac_favorites_try_to_build_
55
local extra_dynamic = CreateClientConVar("pac_special_property_update_dynamically", "1", true, false, "Whether proxies should refresh the properties, and some booleans may show more information.")
66
local special_property_text_color = CreateClientConVar("pac_special_property_text_color", "160 0 80", true, false, "R G B color of special property text\npac_special_property_text_color \"\" will make it not change the color\nSpecial contexts like proxies and hidden parts can show a different color to show that changes are happening in real time.")
77
local prettify_names = CreateClientConVar("pac_property_reformating", "2", true, false, "How much to reformat the names of properties.\n2 will run the full editor friendly conversion.\n1 will run the editor friendly conversion on most cases except faceposer where an option exists to show the raw flex names\n0 will show the raw keys for everything")
8+
local faceposer_regroup = CreateClientConVar("pac_faceposer_property_regrouping", "1", true, false, "Whether to regroup flexes by category as brows, eyes, look and mouth flexes")
89

910
local pins = CreateClientConVar("pac_editor_pins", 0, true)
1011
cvars.AddChangeCallback("pac_editor_pins", function(cvar, old, new)
@@ -1380,129 +1381,20 @@ do -- list
13801381
end
13811382
pace.properties.line_heights = 0
13821383
if class == "faceposer" then
1383-
local facepose_categories = {}
1384-
local mouth = {}
1385-
local eyes = {}
1386-
local look = {}
1387-
local brow = {}
1388-
local other = {}
1389-
1390-
local known_outliers_mouth = {
1391-
["A"] = true,
1392-
["Ah"] = true,
1393-
["Oh"] = true,
1394-
["O"] = true,
1395-
["E"] = true,
1396-
["Ch"] = true,
1397-
["U"] = true,
1398-
}
1399-
local known_outliers_brows = {
1400-
["Anger"] = true,
1401-
["Sadness"] = true,
1402-
["Cheer"] = true,
1403-
["Cheerful"] = true,
1404-
["Upper"] = true,
1405-
["Lower"] = true,
1406-
}
1407-
local known_outliers_look = {
1408-
["Eyes Down"] = true,
1409-
["Eyes Up"] = true,
1410-
["Eyes Left"] = true,
1411-
["Eyes Right"] = true,
1412-
["Eye Down"] = true,
1413-
["Eye Up"] = true,
1414-
["Eye Left"] = true,
1415-
["Eye Right"] = true,
1416-
}
1417-
1418-
local valve_m = {
1419-
["right_upper_raiser"] = true,
1420-
["left_upper_raiser"] = true,
1421-
["right_corner_puller"] = true,
1422-
["left_corner_puller"] = true,
1423-
["right_corner_depressor"] = true,
1424-
["left_corner_depressor"] = true,
1425-
["chin_raiser"] = true,
1426-
["smile"] = true,
1427-
["lower_lip"] = true,
1428-
1429-
["right_part"] = true,
1430-
["left_part"] = true,
1431-
["right_puckerer"] = true,
1432-
["left_puckerer"] = true,
1433-
["right_funneler"] = true,
1434-
["left_funneler"] = true,
1435-
["right_stretcher"] = true,
1436-
["left_stretcher"] = true,
1437-
["bite"] = true,
1438-
["presser"] = true,
1439-
["tightener"] = true,
1440-
["jaw_clencher"] = true,
1441-
["jaw_drop"] = true,
1442-
["right_mouth_drop"] = true,
1443-
["left_mouth_drop"] = true,
1444-
}
1445-
1446-
local valve_e = {
1447-
["right_lid_raiser"] = true,
1448-
["left_lid_raiser"] = true,
1449-
["left_lid_tightener"] = true,
1450-
["right_lid_tightener"] = true,
1451-
["left_lid_droop"] = true,
1452-
["right_lid_droop"] = true,
1453-
["left_lid_closer"] = true,
1454-
["right_lid_closer"] = true,
1455-
["half_closed"] = true,
1456-
["blink"] = true,
1457-
}
1458-
1459-
local valve_b = {
1460-
["right_inner_raiser"] = true,
1461-
["left_inner_raiser"] = true,
1462-
["right_outer_raiser"] = true,
1463-
["left_outer_raiser"] = true,
1464-
["right_lowerer"] = true,
1465-
["left_lowerer"] = true,
1466-
}
1467-
1468-
for i, data in ipairs(flat_list) do
1469-
local name = data.key
1470-
local sub_name = string.lower(name)
1471-
if data.udata.group == "flexes" then
1472-
--mouth
1473-
if valve_m[sub_name] or known_outliers_mouth[name] or string.find(sub_name, "mouth") or string.find(name, "Mouth") then
1474-
table.insert(mouth, data)
1475-
--brows
1476-
elseif valve_b[sub_name] or known_outliers_brows[name] or string.find(sub_name, "brow") or string.find(name, "Brow") then
1477-
table.insert(brow, data)
1478-
--eye look
1479-
elseif known_outliers_look[sub_name] or string.find(sub_name, "look") or string.find(name, "Look") then
1480-
table.insert(look, data)
1481-
--eyes
1482-
elseif valve_e[sub_name] or string.find(sub_name, "eye") or string.find(name, "Eye") or string.find(sub_name, "blink") or string.find(sub_name, "lid") then
1483-
table.insert(eyes, data)
1484-
--other
1485-
else
1486-
table.insert(other, data)
1384+
local grouping = false
1385+
if faceposer_regroup:GetInt() == 1 then
1386+
local ent = pace.current_part:GetOwner()
1387+
if IsValid(ent) then
1388+
--assume valvebiped head is an indicator of facial flexes
1389+
if ent:LookupBone("ValveBiped.Bip01_Head1") then
1390+
grouping = true
14871391
end
14881392
end
1489-
end
1490-
if not table.IsEmpty(mouth) then
1491-
facepose_categories.mouth = mouth
1492-
end
1493-
if not table.IsEmpty(eyes) then
1494-
facepose_categories.eyes = eyes
1495-
end
1496-
if not table.IsEmpty(look) then
1497-
facepose_categories.look = look
1498-
end
1499-
if not table.IsEmpty(brow) then
1500-
facepose_categories.brow = brow
1501-
end
1502-
if not table.IsEmpty(other) then
1503-
facepose_categories.other = other
1393+
elseif faceposer_regroup:GetInt() == 2 then
1394+
grouping = true
15041395
end
15051396

1397+
--first pass : normal properties
15061398
for _, data in ipairs(SortGroups(FlatListToGroups(flat_list))) do
15071399
if data.group == "flexes" then continue end
15081400
self:AddCollapser("generic")
@@ -1517,14 +1409,152 @@ do -- list
15171409

15181410
end
15191411
end
1520-
for name, props in SortedPairs(facepose_categories) do
1521-
local temp = {}
1522-
for i, prop in ipairs(props) do
1523-
temp[prop.key] = prop
1412+
1413+
if grouping then
1414+
local facepose_categories = {}
1415+
local mouth = {}
1416+
local eyes = {}
1417+
local look = {}
1418+
local brow = {}
1419+
local other = {}
1420+
1421+
local known_outliers_mouth = {
1422+
["A"] = true,
1423+
["Ah"] = true,
1424+
["Oh"] = true,
1425+
["O"] = true,
1426+
["E"] = true,
1427+
["Ch"] = true,
1428+
["U"] = true,
1429+
}
1430+
local known_outliers_brows = {
1431+
["Anger"] = true,
1432+
["Sadness"] = true,
1433+
["Cheer"] = true,
1434+
["Cheerful"] = true,
1435+
["Upper"] = true,
1436+
["Lower"] = true,
1437+
}
1438+
local known_outliers_look = {
1439+
["Eyes Down"] = true,
1440+
["Eyes Up"] = true,
1441+
["Eyes Left"] = true,
1442+
["Eyes Right"] = true,
1443+
["Eye Down"] = true,
1444+
["Eye Up"] = true,
1445+
["Eye Left"] = true,
1446+
["Eye Right"] = true,
1447+
}
1448+
1449+
local valve_m = {
1450+
["right_upper_raiser"] = true,
1451+
["left_upper_raiser"] = true,
1452+
["right_corner_puller"] = true,
1453+
["left_corner_puller"] = true,
1454+
["right_corner_depressor"] = true,
1455+
["left_corner_depressor"] = true,
1456+
["chin_raiser"] = true,
1457+
["smile"] = true,
1458+
["lower_lip"] = true,
1459+
1460+
["right_part"] = true,
1461+
["left_part"] = true,
1462+
["right_puckerer"] = true,
1463+
["left_puckerer"] = true,
1464+
["right_funneler"] = true,
1465+
["left_funneler"] = true,
1466+
["right_stretcher"] = true,
1467+
["left_stretcher"] = true,
1468+
["bite"] = true,
1469+
["presser"] = true,
1470+
["tightener"] = true,
1471+
["jaw_clencher"] = true,
1472+
["jaw_drop"] = true,
1473+
["right_mouth_drop"] = true,
1474+
["left_mouth_drop"] = true,
1475+
}
1476+
1477+
local valve_e = {
1478+
["right_lid_raiser"] = true,
1479+
["left_lid_raiser"] = true,
1480+
["left_lid_tightener"] = true,
1481+
["right_lid_tightener"] = true,
1482+
["left_lid_droop"] = true,
1483+
["right_lid_droop"] = true,
1484+
["left_lid_closer"] = true,
1485+
["right_lid_closer"] = true,
1486+
["half_closed"] = true,
1487+
["blink"] = true,
1488+
}
1489+
1490+
local valve_b = {
1491+
["right_inner_raiser"] = true,
1492+
["left_inner_raiser"] = true,
1493+
["right_outer_raiser"] = true,
1494+
["left_outer_raiser"] = true,
1495+
["right_lowerer"] = true,
1496+
["left_lowerer"] = true,
1497+
}
1498+
1499+
for i, data in ipairs(flat_list) do
1500+
local name = data.key
1501+
local sub_name = string.lower(name)
1502+
if data.udata.group == "flexes" then
1503+
--mouth
1504+
if valve_m[sub_name] or known_outliers_mouth[name] or string.find(sub_name, "mouth") or string.find(name, "Mouth") then
1505+
table.insert(mouth, data)
1506+
--brows
1507+
elseif valve_b[sub_name] or known_outliers_brows[name] or string.find(sub_name, "brow") or string.find(name, "Brow") then
1508+
table.insert(brow, data)
1509+
--eye look
1510+
elseif known_outliers_look[sub_name] or string.find(sub_name, "look") or string.find(name, "Look") then
1511+
table.insert(look, data)
1512+
--eyes
1513+
elseif valve_e[sub_name] or string.find(sub_name, "eye") or string.find(name, "Eye") or string.find(sub_name, "blink") or string.find(sub_name, "lid") then
1514+
table.insert(eyes, data)
1515+
--other
1516+
else
1517+
table.insert(other, data)
1518+
end
1519+
end
1520+
end
1521+
if not table.IsEmpty(mouth) then
1522+
facepose_categories.mouth = mouth
1523+
end
1524+
if not table.IsEmpty(eyes) then
1525+
facepose_categories.eyes = eyes
15241526
end
1525-
self:AddCollapser(name)
1526-
for key, prop in SortedPairs(temp) do
1527-
prop.udata.group = name
1527+
if not table.IsEmpty(look) then
1528+
facepose_categories.look = look
1529+
end
1530+
if not table.IsEmpty(brow) then
1531+
facepose_categories.brow = brow
1532+
end
1533+
if not table.IsEmpty(other) then
1534+
facepose_categories.other = other
1535+
end
1536+
--second pass : flexes
1537+
for name, props in SortedPairs(facepose_categories) do
1538+
local temp = {}
1539+
for i, prop in ipairs(props) do
1540+
temp[prop.key] = prop
1541+
end
1542+
self:AddCollapser(name)
1543+
for key, prop in SortedPairs(temp) do
1544+
prop.udata.group = name
1545+
if pins:GetBool() and pace.pinned_properties_keyed[prop.key] and not pace.CollapsedProperties["pinned"] then continue end
1546+
1547+
if prop.udata and prop.udata.hide_in_editor then
1548+
continue
1549+
end
1550+
populate(prop)
1551+
end
1552+
end
1553+
else
1554+
self:AddCollapser("flexes")
1555+
local flexes = pace.current_part:GetDynamicProperties()
1556+
--second pass : flexes (uncategorized)
1557+
for key, prop in SortedPairs(flexes) do
15281558
if pins:GetBool() and pace.pinned_properties_keyed[prop.key] and not pace.CollapsedProperties["pinned"] then continue end
15291559

15301560
if prop.udata and prop.udata.hide_in_editor then
@@ -1533,6 +1563,7 @@ do -- list
15331563
populate(prop)
15341564
end
15351565
end
1566+
15361567
return
15371568
end
15381569
for _, data in ipairs(SortGroups(FlatListToGroups(flat_list))) do

0 commit comments

Comments
 (0)