@@ -5,6 +5,7 @@ local favorites_menu_expansion = CreateClientConVar("pac_favorites_try_to_build_
55local extra_dynamic = CreateClientConVar (" pac_special_property_update_dynamically" , " 1" , true , false , " Whether proxies should refresh the properties, and some booleans may show more information." )
66local special_property_text_color = CreateClientConVar (" pac_special_property_text_color" , " 160 0 80" , true , false , " R G B color of special property text\n pac_special_property_text_color \"\" will make it not change the color\n Special contexts like proxies and hidden parts can show a different color to show that changes are happening in real time." )
77local prettify_names = CreateClientConVar (" pac_property_reformating" , " 2" , true , false , " How much to reformat the names of properties.\n 2 will run the full editor friendly conversion.\n 1 will run the editor friendly conversion on most cases except faceposer where an option exists to show the raw flex names\n 0 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
910local pins = CreateClientConVar (" pac_editor_pins" , 0 , true )
1011cvars .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