Render.ru

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

Termi

Активный участник
Рейтинг
5
#1
Можна ли с помошью скрипта конвертировать мапы. Например я хочу переконвертить .TIFF в .TGA (в принцпе важен сам процес). Как ето реолизовать?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
В приципе можно

Код:
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()
 

Termi

Активный участник
Рейтинг
5
#3
В приципе можно
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()
Обясните пожалоста последнюю строчку:
gc()
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
Чистит память, иначе через некоторое время будет просто вся замусоренна. Особенно если зациклить.
Тут можно использовать комманду gc light:true
 

Termi

Активный участник
Рейтинг
5
#5
Я переписал плуг на С++. Получил существенный прирост производимости!
Как конвертить мапы с помощью MaxAPI?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#6
Что-то я не пойму. Если ты его переписал то он уже должен конвертировать, если он ничего не делает то о каком приросте вобще речь ?
 

Termi

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

Termi

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

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#9
Все точно также , если конвертируешь одновременно с выводом сцены то даже проще.
Из материала через 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
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#10
Если не секрет что такой за проект с XRef файлами ? Для движка вроде черечур
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#11
Если не секрет что такой за проект с XRef файлами ? Для движка вроде черечур
 

Termi

Активный участник
Рейтинг
5
#12
Если не секрет что такой за проект с XRef файлами ? Для движка вроде черечур
Сцена в максе практически полностью состоит с XRef объэктов! Поетому при експорте нодов приходится обрабатывать XRef материалы (доставать нужную инфу из листа материалов).
 

Termi

Активный участник
Рейтинг
5
#13
Как открыть и работать с диалогами аналог. из MaxScript:
-selectByName
-getSavePath
С помощью MAXApi конешно!
Если нужно обновить один или несколько обєктов (геометрию, материал, мапы) из сцены то будем обновлять только нужные объэкты а не сцену целяком из тисяч нодов (имеется в ввиду что некоторая сцена была заекспортена ранее)!
Ето я уже реализовал. Только нужен лист имен нодов!
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#14
getSavePath - SelectFileOutput, смотри главу "Creating, Opening, Writing and Closing Bitmaps"
На счет -selectByName посмотри исходники editablepoly там по кнопке Attach List должен вызывать такое окно или копать SceneExplorer.

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

Termi

Активный участник
Рейтинг
5
#15
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: Сцены для гамезы!
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#16
Проветь что возврашают функции.
И в скрипте не просто так делалась копия битмапа - openBitMap каким-то образом лочила его от записи, возможно в коде тоже самое.
Да и в главе Creating, Opening, Writing and Closing Bitmaps советуют работать через менеджер
про ашники не знаю смотри как в примерах сделано
 

Termi

Активный участник
Рейтинг
5
#17
...
// 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. ...),
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#18
Я похож на гадалку, кто проверять будет ? Где проверки возвратов функций ? Неужели так сложно скопироватиь в один в один из хелпа.

Вот эта билиберда здесь не нужна, размеры берутся из файла.
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");
 
Сверху