Иногда бывает так, что в сложных сценах могут появится битмапы с одинаковыми текстурами, но с разными путями к ним, соответственно 3ds max может при просчете несколько раз загружать одну и ту же текстуру, в пустую расходуя память. Чтобы этого избежать и был написан следующий скрипт.
---------------------------------------------------
(
arBMT = getclassinstances bitmapTexture
fn unicImageData w_bmp = (
arData = #()
unicAr = #()
work_bmp = openbitmap w_bmp.filename
bmp_w = work_bmp.width
bmp_h = work_bmp.height
for i = 0.1 to 0.9 by 0.1 do(
for j = 0.1 to 0.9 by 0.1 do(
p = (getpixels work_bmp [(i*bmp_w) as integer,(j*bmp_h) as integer] 1)[1]
append unicAr p
)
)
close work_bmp
join arData #(bmp_w, bmp_h, GetFileSize w_bmp.filename, unicAr, getFilenameType w_bmp.filename)
arData
)
fn CompareArrays a b = if a.count == b.count AND (for i = 1 to a.count where a[i]!=b[i] collect i).count == 0 then return true else return false
fn CompareImages bm1 bm2 =(
local a = unicImageData bm1
local b = unicImageData bm2
if a[1] ==b[1] and a[2] == b[2] and a[3] == b[3] and CompareArrays a[4] b[4] == true and a[5] == b[5] then return true else return false
)
progressstart "Search and replacement..."
num = 1
nc = arBMT.count
for i in arBMT do(
progressupdate (num*100.0/nc)
num+=1
for j in arBMT do(
if i.filename != j.filename do(
if i.filename != undefined and j.filename != undefined do(
if doesFileExist i.filename and doesFileExist j.filename do(
if CompareImages i j do (print (j.filename+" ---> "+i.filename);j.filename = i.filename;)
)
)
)
) -- for j in arBMT do
)--for i in arBMT do
progressend ()
)
---------------------------------------------------
Функция unicImageData получает информацию о текстуре в виде массива #(ширина, высота, размер текстуры, RGB 100 точек с шагом 10% , разрешение текстуры)
Функция CompareArrays просто сравнивает два массива.
Источник.
Функция CompareImages сравнивает две битмапы.
Далее, собственно, идет двойной перебор и сравнение битмапов в проекте с выводом результата в листенер.
На последнем проекте было сэкономлено не много, конечно, но около 10 мегабайт.
Скрипт можно усовершенствовать и убрать жесткое сравнение по параметрам картинки, а ввести некую погрешность для поиска одинаковых картинок разного разрешения.