1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Конверт. мапав в другой формат.

Тема в разделе "MAXScript", создана пользователем Termi, 9 сен 2008.

Модераторы: Savin Denis
  1. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    Можна ли с помошью скрипта конвертировать мапы. Например я хочу переконвертить .TIFF в .TGA (в принцпе важен сам процес). Как ето реолизовать?
     
  2. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    В приципе можно

    Код:
    b1 = openBitMap "с:\\BARK4.tif"
    bm1=bitmap (b1.width) (b1.height) 
    copy b1 bm1
    bm1.filename = "с:\\BARK4.tga"
    Targa.setColorDepth (if b1.hasAlpha then 32 else 24)
    Targa.setCompressed True
    save bm1
    close b1
    close bm1 
    gc()
    
     
  3. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    Обясните пожалоста последнюю строчку:
    gc()
     
  4. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Чистит память, иначе через некоторое время будет просто вся замусоренна. Особенно если зациклить.
    Тут можно использовать комманду gc light:true
     
  5. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    Я переписал плуг на С++. Получил существенный прирост производимости!
    Как конвертить мапы с помощью MaxAPI?
     
  6. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Что-то я не пойму. Если ты его переписал то он уже должен конвертировать, если он ничего не делает то о каком приросте вобще речь ?
     
  7. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    Плагин преобр. геометрию под DirectX, експортит геометрию, материалы и копирует текстуры (Diffuse, Specular, Bump, Normal). Также корекно работает с X-Ref объэктами (раньше чтобы достать X-Ref объэкт я перегружал сцены).
    // Каждый учится на своих ошибках!!!
    А вот как конвертить текстуры в .tga, .dds пока незнаю. Savin Denis, помоги пожалоста с конв. текстур!
     
  8. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    Плагин преобр. геометрию под DirectX, експортит геометрию, материалы и копирует текстуры (Diffuse, Specular, Bump, Normal). Также корекно работает с X-Ref объэктами (раньше чтобы достать X-Ref объэкт я перегружал сцены).
    // Каждый учится на своих ошибках!!!
    А вот как конвертить текстуры в .tga, .dds пока незнаю. Savin Denis, помоги пожалоста с конв. текстур!
     
  9. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Все точно также , если конвертируешь одновременно с выводом сцены то даже проще.
    Из материала через BitmapTex получаешь уже готовый битмат,
    Остается только его записать с другим типом.
    Для этого создаешь новый BitmapInfo куда с помощью SetName() прописываешь
    новое имя и другое расширение.
    Открываешь битмап на запись:
    bmap->OpenOutput(&bi); //Здесь похоже считываются пользовательские настройки для каждого типа файлов.
    После чего просто записываешь битмап (Write) и закрываешь его

    PS
    Правда могут возникнуть сдложности с явным указанием формата для DDS файла так как в в SDK нет кода или .h
    для классса BitmapIO. По сути будут применены последние пользовательские настройки. Хотя наверно можно обойти если подсунуть конфигурационный файл с нужными настройками My Doc..\User\Local Settings\Application Data\Autodesk\3dsmax\2009 - 32bit\enu\plugcfg\dxdds.cfg
     
  10. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Если не секрет что такой за проект с XRef файлами ? Для движка вроде черечур
     
  11. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Если не секрет что такой за проект с XRef файлами ? Для движка вроде черечур
     
  12. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    Сцена в максе практически полностью состоит с XRef объэктов! Поетому при експорте нодов приходится обрабатывать XRef материалы (доставать нужную инфу из листа материалов).
     
  13. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    Как открыть и работать с диалогами аналог. из MaxScript:
    -selectByName
    -getSavePath
    С помощью MAXApi конешно!
    Если нужно обновить один или несколько обєктов (геометрию, материал, мапы) из сцены то будем обновлять только нужные объэкты а не сцену целяком из тисяч нодов (имеется в ввиду что некоторая сцена была заекспортена ранее)!
    Ето я уже реализовал. Только нужен лист имен нодов!
     
  14. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    getSavePath - SelectFileOutput, смотри главу "Creating, Opening, Writing and Closing Bitmaps"
    На счет -selectByName посмотри исходники editablepoly там по кнопке Attach List должен вызывать такое окно или копать SceneExplorer.

    PS Что из XRef это я и так догадался, просто интересно что за сцены ?
     
  15. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    Savin Denis...
    Итак мапы!
    Подключаем "bmmlib.h".
    Когда подключяю "bitmap.h" получаю 202 левых errors (раньше, в коде, нигде не подключал)!?
    Все текстуры которые заюзаны в "My" сцене хрянятся в vector<string> TGSMaps см. листинг:

    for (vector<string>::iterator i = TGSMaps.begin(); i != TGSMaps.end(); i++) {

    vector<string> v = FilterString((*i), "\\");
    char c[256];
    v[v.size()-1].resize(v[v.size()-1].size()-4);
    sprintf(c, "%s%stga", Folder.c_str(), v[v.size()-1].c_str());

    Msg((*i).c_str()); //message имя текстури
    Msg(c); //message новое имя текстуры

    // Open Bitmap
    char MapName[256];
    sprintf(MapName, "%s", (*i).c_str());
    BITMAPINFOHEADER *bmih = LoadBitmapFromFile(MapName);

    // Set Info Bitmap
    BitmapInfo bi((*i).c_str());
    bi.SetWidth((WORD)bmih -> biWidth);
    bi.SetHeight((WORD)bmih -> biHeight);
    bi.SetCustomFlag(MAP_HAS_ALPHA);
    bi.SetName(c);

    // Convert Bitmap
    Bitmap *bm = (Bitmap* )bmih;
    bm -> OpenOutput(&bi);
    bm -> Write(&bi, BMM_SINGLEFRAME);
    bm -> Close(&bi, BMM_CLOSE_COMPLETE);
    }

    Покрайней мере нет ошибок.
    Но!!!!!! Результата я не вижу. Мапав в фолдере нет. Что я деляю не так?
    С путями к мапам все отлично. bmih - тоже загр. без багов. Значит дело в bi, bm!

    PS: Сцены для гамезы!
     
  16. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Проветь что возврашают функции.
    И в скрипте не просто так делалась копия битмапа - openBitMap каким-то образом лочила его от записи, возможно в коде тоже самое.
    Да и в главе Creating, Opening, Writing and Closing Bitmaps советуют работать через менеджер
    про ашники не знаю смотри как в примерах сделано
     
  17. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    ...
    // Set Info Bitmap
    BitmapInfo bi;
    bi.SetWidth((WORD)bmih -> biWidth);
    bi.SetHeight((WORD)bmih -> biHeight);
    bi.SetCustomFlag(MAP_HAS_ALPHA);
    bi.SetName((*i).c_str());

    // Convert Bitmap
    Bitmap *bm;
    bm = TheManager -> Load(&bi);
    bi.SetName(c);
    bm -> OpenOutput(&bi);
    bm -> Write(&bi, BMM_SINGLEFRAME);
    bm -> Close(&bi, BMM_CLOSE_COMPLETE);
    ...
    1) Результат есть, Но заекпортеные мапы, что .bmp что .tga получаются одинакового размера, Очень подозрительно происходит ли вообще конвертация мапав или просто меняэтся разширение,
    2) Конвертятся только мапы из ,jpg и .bmp, На остальных макс вилетает в неизвестность (.tga, .tif. ...),
     
  18. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Я похож на гадалку, кто проверять будет ? Где проверки возвратов функций ? Неужели так сложно скопироватиь в один в один из хелпа.

    Вот эта билиберда здесь не нужна, размеры берутся из файла.
    bi.SetWidth((WORD)bmih -> biWidth);
    bi.SetHeight((WORD)bmih -> biHeight);
    bi.SetCustomFlag(MAP_HAS_ALPHA);

    И делаеш так:

    Код:
    
    	BitmapInfo obi, cbi;
    	Bitmap *omap, *cmap;
    	BMMRES status;
    
    	obi.SetName((*i).c_str());
    	
    	omap = TheManager->Load(&obi, &status);	
    	if(status != BMMRES_SUCCESS)
    	{
    		MessageBox(ip->GetMAXHWnd(), _T("Error loading bitmap."), 
                                   _T("Error"), MB_ICONSTOP); 		
    	}
    	
    	cbi = obi;
    	cbi.SetName(c);
    	cbi.SetType(BMM_TRUE_32);
    
    	cmap = TheManager->Create(&cbi);
    	if ( cmap == NULL )
    	{
    		MessageBox(ip->GetMAXHWnd(), _T("Error Create bitmap."), 
                                   _T("Error"), MB_ICONSTOP); 		
    	}
    
    	cmap->CopyImage(omap, COPY_IMAGE_RESIZE_HI_QUALITY, 0);	
    
    	if ( cmap->OpenOutput(&cbi) != BMMRES_SUCCESS )
    	{
    		MessageBox(ip->GetMAXHWnd(), _T("Error OpenOutput(&cbi) bitmap."), 
                                   _T("Error"), MB_ICONSTOP); 		
    	}
    
    	if ( cmap->Write(&cbi) != BMMRES_SUCCESS )
    	{
    		MessageBox(ip->GetMAXHWnd(), _T("Error Write bitmap."), 
                                   _T("Error"), MB_ICONSTOP); 		
    	}
    
    	cmap->Close(&cbi);
    	cmap->Display("The copied Bitmap");		
    
    
     
  19. Termi

    Termi Активный участник

    С нами с:
    27.10.2007
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    5
    Експортит даже *.DDS. Спасибо!!!!!!!!!
     
  20. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Ну слава богу. Куда ящики с пивом складировать знаеш. Ж-)
     
Модераторы: Savin Denis

Поделиться этой страницей