-
Notifications
You must be signed in to change notification settings - Fork 0
/
CombDiffMapMat.ms
182 lines (156 loc) · 8.11 KB
/
CombDiffMapMat.ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
struct DiffuseMapData (
diffuseMapName,
materialID
)
fn getUniqueMaterialNamesAndIDs obj =
(
-- Создаем массив для хранения информации о DiffuseMap
diffuseMapsData = #()
convertToPoly obj
-- Проверяем, является ли объект полигональным
if (classof obj == Editable_Poly) then
(
-- Получаем количество граней на объекте
numFaces = obj.numfaces
-- Перебираем все грани на объекте
for faceIndex = 1 to numFaces do
(
-- Получаем ID материала для текущей грани
matID = polyOp.getFaceMatID obj faceIndex
-- Получаем материал по его ID
material = obj.material[matID]
-- Получаем DiffuseMap материала
diffuseMapName = ""
if isproperty material #diffuseMap do
(
diffuseMap = material.diffuseMap
if diffuseMap != undefined do
(
diffuseMapName = toLower(getFilenameFile(diffuseMap.fileName))
)
)
-- Проверяем, существует ли DiffuseMap
if diffuseMapName != "" then
(
-- Переменная, указывающая, найдена ли уже такая DiffuseMap
mapFound = false
-- Перебираем массив для проверки наличия DiffuseMap с таким же именем
for data in diffuseMapsData do
(
if (data.diffuseMapName == diffuseMapName) then
(
-- Если найдена DiffuseMap с таким же именем, устанавливаем флаг в true
mapFound = true
exit
)
)
-- Если DiffuseMap с таким же именем не найдена, добавляем её в массив
if (mapFound == false) then
(
-- Создаем экземпляр структуры с данными о DiffuseMap и её ID
mapData = DiffuseMapData diffuseMapName matID
-- Добавляем данные о DiffuseMap в массив
append diffuseMapsData mapData
)
)
)
)
return diffuseMapsData
)
fn setMaterialIDs obj diffuseNameId = (
-- Перебираем все объекты в сцене
-- Проверяем, является ли объект полигональным
if (classof obj == Editable_Poly) then
(
-- Получаем количество граней на объекте
numFaces = obj.numfaces
-- Перебираем все грани на объекте
for faceIndex = 1 to numFaces do
(
-- Получаем ID материала для текущей грани
matID = polyOp.getFaceMatID obj faceIndex
-- Получаем материал по его ID
material = obj.material[matID]
-- Получаем DiffuseMap материала
diffuseMapName = ""
if isproperty material #diffuseMap do
(
diffuseMap = material.diffuseMap
if diffuseMap != undefined do
(
diffuseMapName = toLower(getFilenameFile(diffuseMap.fileName))
)
)
-- Проверяем, существует ли DiffuseMap
if diffuseMapName != "" then
(
-- Перебираем массив для проверки наличия DiffuseMap с таким же именем
for data in diffuseNameId do
(
if (data.diffuseMapName == diffuseMapName) then
(
polyOp.setFaceMatID obj faceIndex data.materialID
)
)
)
)
)
return diffuseNameId
)
fn removeUnusedMaterials obj diffuseNameId =
(
if classof obj.material == MultiMaterial do
(
-- print ("Object:" + obj.name)
-- print ("Materials before cleaning: " + obj.material.materialList.count as string)
mmClean.fix #(obj.material) prompt:false
-- print ("Materials after cleaning: " + obj.material.materialList.count as string)
)
)
rollout combiningMaterialsOnDiffuseMaps "CombDiffMapMat"(
-- About
button btn_about "About" width:92 height:23 align:#right
groupBox grB_1 "" pos:[0, 60] width:340 height:110
label prgrs_mat "Cleaning of unused materials" pos:[15, 40]
checkbox mt_4_cb checked:true pos:[160, 40]
label label_clear "" pos:[0, 60]
label current_obj_name ""
label materials_count "Materials before: 0 | After: 0" pos:[15, 100] width:310
progressbar current_obj_pb color:green
button btnApply "Combine materials" width:150 align:#center
on btn_about pressed do (
rollout rol_meChecker_about "CombDiffMapMat - About" width:295 (
label lbl1 "CombDiffMapMat 1.1" height:17
label lbl6 "Script features:" pos:[11,33]
label lbl7 "- Support for combining materials on multiple objects" pos:[13,53]
label lbl9 "- Removing unused materials" pos:[13,73]
label lbl11 "_____________________________"
label lbl2 "\xa9 by " pos:[10,113] width:42 height:18
HyperLink Goldfish "EgasVegas" pos:[37,113] width:60 height:18 address:"https://t.me/egasvegas" color:(color 10 147 225) hovercolor:(color 94 198 255) visitedcolor:(color 10 147 225)
button btn_close "close" pos:[215,113] width:69 height:22
on btn_close pressed do DestroyDialog rol_meChecker_about
)
createDialog rol_meChecker_about modal:true
)
on btnApply pressed do (
current_obj_pb.value = 0
for obj in selection do
(
-- Сохраняем количество материалов до очистки
local materials_before = if classof obj.material == MultiMaterial then obj.material.materialList.count else 1
local diffuseNameId = getUniqueMaterialNamesAndIDs obj
diffuseNameId = setMaterialIDs obj diffuseNameId
if (mt_4_cb.checked == true) then
removeUnusedMaterials obj diffuseNameId
-- Сохраняем количество материалов после очистки
local materials_after = if classof obj.material == MultiMaterial then obj.material.materialList.count else 1
-- Обновляем текст с количеством материалов
materials_count.text = "Materials before: " + materials_before as string + " | After: " + materials_after as string
current_obj_name.text = obj.name
current_obj_pb.value += 100/selection.count + 1
)
messageBox "Done!"
)
)
-- Отображение интерфейса
createdialog combiningMaterialsOnDiffuseMaps 340 163