Untitled
public
Apr 22, 2025
Never
13
1 try(destroyDialog AlbedoChecker)catch() -- удалить, если скрипт уже загружался 2 3 rollout AlbedoChecker "Albedo Checker for Corona" 4 ( 5 group "Настройки" 6 spinner spnMin "Мин. альбедо:" range:[0,1,0.02] type:#float scale:0.01 7 spinner spnMax "Макс. альбедо:" range:[0,1,0.90] type:#float scale:0.01 8 button btnScan "Сканировать сцену" width:140 9 10 group "Результаты" 11 listbox lbResults "" width:300 height:150 12 button btnSelect "Выбрать объекты" width:140 enabled:false 13 14 -- Функция: вычисление альбедо (luminance) 15 fn getAlbedoValue clr = 16 ( 17 local r = clr.r/255.0 18 local g = clr.g/255.0 19 local b = clr.b/255.0 20 return (0.299*r + 0.587*g + 0.114*b) 21 ) 22 23 -- Рекурсивный обход материалов 24 fn collectLeafMats m = 25 ( 26 local leafs = #() 27 if isProperty m #numSubs and m.numSubs > 0 then 28 ( 29 for i = 1 to m.numSubs do 30 append leafs (collectLeafMats (getSubMtl m i)) 31 ) 32 else append leafs m 33 return leafs 34 ) 35 36 -- Основной анализ 37 on btnScan pressed do 38 ( 39 clearSelection() 40 lbResults.items = #() 41 local badMats = #() 42 local minA = spnMin.value 43 local maxA = spnMax.value 44 45 for m in scenematerials do 46 ( 47 for leaf in collectLeafMats m where leaf != undefined do 48 ( 49 -- ищем diffuse‑цвет 50 local baseClr = undefined 51 if classOf leaf == CoronaMtl then 52 baseClr = if leaf.diffuseMap == undefined then leaf.diffuseColor else leaf.diffuseMap.output.outColor 53 else if isProperty leaf #diffuse then 54 baseClr = leaf.diffuse 55 56 if baseClr != undefined then 57 ( 58 local aVal = getAlbedoValue baseClr 59 if aVal < minA or aVal > maxA then 60 ( 61 append badMats #(leaf, aVal) 62 ) 63 ) 64 ) 65 ) 66 67 if badMats.count == 0 then 68 ( 69 messageBox "Все материалы в сцене имеют корректное альбедо." title:"Готово" 70 btnSelect.enabled = false 71 return 72 ) 73 74 -- Заполняем ListBox и выводим в Listener 75 format "Найдены проблемные материалы (альбедо вне диапазона [%.2f–%.2f]):\n\n" minA maxA 76 for pair in badMats do 77 ( 78 local mat = pair[1] 79 local aVal = pair[2] 80 local name = (mat.name != undefined and mat.name != "") ? mat.name : classOf mat 81 local txt = name + " → " + formattedPrint aVal format:"%.3f" 82 lbResults.items += txt 83 format "- %: %.3f\n" name aVal 84 ) 85 86 btnSelect.enabled = true 87 -- Сохраняем результаты в rollout для кнопки Select 88 rolloutAlbedoData.badMats = badMats 89 rolloutAlbedoData.minA = minA 90 rolloutAlbedoData.maxA = maxA 91 ) 92 93 on btnSelect pressed do 94 ( 95 clearSelection() 96 for pair in rolloutAlbedoData.badMats do 97 ( 98 local mat = pair[1] 99 for obj in geometry where obj.material == mat do 100 selectMore obj 101 ) 102 messageBox "Выбраны все объекты с некорректным альбедо." title:"Готово" 103 ) 104 ) 105 106 -- Хранилище данных между событиями 107 global rolloutAlbedoData = #() 108 109 createDialog AlbedoChecker width:320 height:380