среда, 7 сентября 2016 г.

Поиск и замена одинаковых текстур с разными именами.

Иногда бывает так, что в сложных сценах могут появится битмапы с одинаковыми текстурами, но с разными путями к ним, соответственно 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 мегабайт.

Скрипт можно усовершенствовать и убрать жесткое сравнение по параметрам картинки, а ввести некую погрешность для поиска одинаковых картинок разного разрешения.

Комментариев нет:

Отправить комментарий