Render.ru

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

Termi

Активный участник
Рейтинг
5
#21
Savin Denis. С диалогом SelectByName разобрался (нашол в исходниках editablepoly)! Работает!
Нужен еще диалог для выбора фолдера (папки), и диалог для вибора файла с нужным розширением *.*:
При експорте геометрии нужно игнорить кости! Как определить исть ли нод косточкай?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#22
Выбор папки это вроде чисто виндовый диалог ищи в msdn
Диалоги выбора графического файла для открытия или для завписи, смотри туже главу по созданию и зиписи битмапов, там они есть.
>Как определить исть ли нод косточкай ?
Нужно проверить его ClassID
 

Termi

Активный участник
Рейтинг
5
#23
Диалог для выбора файла не графического, а з любым заданым разширением (ну типа как в MaxScript ...)!

Относительно фолдеров. В MaxScript есть стандартный диалог для вибора папки getSavePath. MaxScript тоже работает с MaxAPI? Если да то можна логически предположить что этот диалог можна вызывать из под визуала. Но в SDK к максу ничего похожего нинашол!

Какой ClassID в bones(ов)?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#24
Код:
//--FilterList----------------------------------------------------------------------
// A class whose sole purpose is for buildingup a  filter list to passing to
// GetSaveFileName and GetOpenFileName.  It automatically puts in the imbedded nulls
// and two terminating nulls.
//	 Example:
//
//	FilterList filterList;
//	filterList.Append( _T("Max files(*.max)"));
//	filterList.Append( _T("*.max"));
//	ofn.lpstrFilter  = filterList;
//	GetSaveFileName(&ofn)
//----------------------------------------------------------------------------------
Относительно фолдеров Смотри например Max File Finder из утилит Код есть

Какой ClassID в bones(ов)? заглянуть в хелп у меня нынче стоит 50$
 

Termi

Активный участник
Рейтинг
5
#25
OPENFILENAME ofn;
FilterList filterList;
filterList.Append( _T("Max files(*.max)"));
filterList.Append( _T("*.max"));
ofn.lpstrFilter = filterList;
GetSaveFileName(&ofn);

Диалога не вижу!
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#26
Это сокращенный пример, найди дествующий код в примерах и скопируй
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#28
Какие проблемы сделать поиск по примерам ?
Termi если для тебя это проблема то найми человека который для тебя это все быстро напишет.
Или обратись в фурум по поиску, здесь форум по макс скрипту.

PS
Чесное слово развели здесь детский сад.
 

Termi

Активный участник
Рейтинг
5
#29
После конвертации текстур забивается оперативная память. И чистит ее мах когда завершает роботу.
Как в процесе конвертации очистить память.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#30
Почитай главы
Memory Management for Image Loader/Saver Plug-ins
Memory Management for Plug-ins that Work with Bitmaps
 

Termi

Активный участник
Рейтинг
5
#31
При конвертации текстур методом описаным выше: размер конвертируемого файла равен размеру файла результата. (Ето наводит на подозрение что на самом деле файл просто копируется с новим разширением)

Есть решенеие! Для конвертации текстур можно использовать утилитку texconv которая поставляэться вместе сновим DX9 и DX10.

texconv конвертит текстури в десяток форматов при етом можна менять розрешение, цветовую схему (например A8R8G8B8) ...

Визивать texconv можна с помошью системнай функции WinExec. Чтобы не моргала консоль у WinExec второй параметр ставим SW_HIDE.

Я в плагине использовал texconv следеющим образом:

HRESULT TGSIGameScene::ExportMap( char *Folder, UINT Height, UINT Width ) {

int ProgressValue = 0;

if ( this->vFileTexture.size( ) > 0 )
CreateDirectory( Folder, FALSE );
else
return S_OK;

if ( this->uTypeMap == MAP_COPY ) {
this->Ip->ProgressStart("Copy Map", TRUE, fn, NULL);

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

ProgressValue += ( int ) 100 / this->vFileTexture.size( );
this->Ip->ProgressUpdate( ProgressValue, TRUE, "" );

char c[256];
sprintf(c, "%s%s", Folder, GetFileName( (*i) ).c_str( ) );

CopyFile( (*i).c_str( ), c, TRUE );
}

this->Ip->ProgressEnd( );
}
else {
this->Ip->ProgressStart("Convert Map", TRUE, fn, NULL);

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

ProgressValue += ( int )100 / this->vFileTexture.size( );
this->Ip->ProgressUpdate( ProgressValue, TRUE, "" );


char *cExt = new char[256];

// DDS
if ( this->uTypeMap == MAP_DDS )
sprintf( cExt, "DDS" );

// TGA
if ( this->uTypeMap == MAP_TGA )
sprintf( cExt, "TGA" );

// JPEG
if ( this->uTypeMap == MAP_JPEG )
sprintf( cExt, "JPG" );

char *cTexconv = new char[1024];
sprintf( cTexconv, "texconv.exe" ); // Сдесь указываем путь к texconv

string sFolder;
sFolder.append( Folder );
sFolder.resize( sFolder.size() - 1 );

char *_Command = new char[ 4096 ];

if ( this->bSetNewMapParam )
sprintf( _Command, "\"%s\" -w %d -h %d -f A8R8G8B8 -o \"%s\" -ft %s \"%s\"", cTexconv, Width, Height, sFolder.c_str(), cExt, (*i).c_str() );
else
sprintf( _Command, "\"%s\" -f A8R8G8B8 -o \"%s\" -ft %s \"%s\"", cTexconv, sFolder.c_str(), cExt, (*i).c_str() );

// Exec
WinExec( _Command, SW_HIDE );

}
this->Ip->ProgressEnd();
}

return S_OK;
}

Если кто знает, подскажите как получить путь к папке stdplug (из MAX SDK)?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#32
Вот здесь посмотри вроде то что нужно
Код:
[b]systemutilities.h File Reference[/b]


[b]#define APP_STDPLUGS_DIR   -5  

GetSpecDir()
[/b]

Также проверь что выдает функция GetPlugInDir из класса IPathConfigMgr

Ну и на крайний случай всегда можно получить корневой каталог с помощью GetDir () - (Смотри MAX Directory IDs)
И добавить "\stdplugs" , т.к. путь к этой паке не меняется.


 

Termi

Активный участник
Рейтинг
5
#33
Подключаем
#include <systemutilities.h>
#include <IPathConfigMgr.h>

//...
char *pcSTDPLUGS = new char[ 1024 ];
GetSpecDir( APP_STDPLUGS_DIR, "stdplugs", pcSTDPLUGS );
//...

GetSpecDir возвращает TRUE если фолдер найден, FALSE - ненайден. У pcSTDPLUGS - указатель на строку к stdplug.

Так вот работает!
 

Termi

Активный участник
Рейтинг
5
#34
Диалог для открития файла. Правда работает несовсем правильно. Что б не передавал в lpstrInitialDir диалог запукается с последнего откритого фолдера. Остальное нормально.
Код:
TSTR DoOpenFileDialog( HWND hWnd ) {

	TSTR fileName;
    OPENFILENAME    ofn;
    TCHAR           szFilter[]=__TEXT("text (*.txt)\0*.txt\0\0");     
    TCHAR           fname[512];
	
    _tcscpy(fname,fileName);
    
    // set up that OPENFILENAME struct
    ::memset( &ofn, 0, sizeof( ofn ) );
    ofn.lStructSize      = sizeof( OPENFILENAME );  // No OFN_ENABLEHOOK
    ofn.hwndOwner        = hWnd;
    ofn.nFilterIndex     = 1L;
    ofn.lpstrFilter      = szFilter;
    ofn.lpstrCustomFilter = ( LPTSTR )NULL;
    ofn.lpstrFile        = fname;
    ofn.nMaxFile         = sizeof( fname ) / sizeof( TCHAR );
    ofn.lpstrFileTitle   = NULL;
    ofn.nMaxFileTitle    = 0;
	ofn.lpstrInitialDir  = ( LPCSTR )"c:\\";
    ofn.lpstrTitle       = NULL;
  
	ofn.FlagsEx          = OFN_EX_NOPLACESBAR;
    ofn.lpstrDefExt      = _TEXT( "txt" );
	
    
        if (GetOpenFileName(&ofn)) {
			
            // NOTE: More error checking needs to be done for this
            // to be practical -- e.g. we shouldn't allow the user to
            // select the currently open file.  
			
            
            return TSTR( ofn.lpstrFile ); // success
			
        } else {
            // user canceled
            return "";
        }
		
    return ""; // failure
}
 

Termi

Активный участник
Рейтинг
5
#35
Приведенний ниже код показывает поддерживаемие версии DirectX до 9 версии. Как узнать инфу про DirectX10?
IDX10DataBridge в 2009 MaxSDK нет. Выход конешно есть. Можно при старте експорта спросить у юзера. Но если он виберет DirectX10, а машинай версия не поддерживается будет нихорошо. Как быть?
Код:
	float fDXv;
	SubClassList* scList = GetCOREInterface( )->GetDllDir( ).ClassDir( ).GetClassList( REF_TARGET_CLASS_ID );
	for ( long i = 0; i < scList->Count( ACC_ALL ); ++i ) {
		if ( ( *scList )[ i ].IsPublic( ) ) {
			ClassDesc* pClassD = ( *scList )[ i ].FullCD( );
			ReferenceTarget * effect = ( ReferenceTarget* )pClassD->Create( TRUE );
			IDX9DataBridge * DXDB = ( IDX9DataBridge* )effect->GetInterface( VIEWPORT_SHADER9_CLIENT_INTERFACE );
			if ( DXDB ) {
				fDXv = DXDB->GetDXVersion( );
			}
		}
	}
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#36
Во первых с чего ты взял что только до 9.0 ?
Код:
virtual float IDX9DataBridge::GetDXVersion  (    )  [pure virtual] 
 
   Versioning. 

The system uses this to determine whether the effect is compatible to the current GFX loaded on MAX 

Returns:
8.1 or 9.0 etc...
Мне кажется этот код делает не то что ты думаеш,
Функция GetDXVersion используется как виртуальная для возврата минимальной требуемой версии при создании плугина хардварного шейдера.
Как корректно получить версию DirectX10 в системе нужно смотретть в сдк DirectX
Узнать какая версия выбрана в 3ds max, можно прочитать текущий файл конфигурации. в разделе [WindowState] пременная GFXDirect3DVersion
 
Сверху