G

Untitled

public
Guest Apr 22, 2025 Never 13
Clone
Plaintext paste1.txt 109 lines (96 loc) | 3.83 KB
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