Savin Denis. С диалогом SelectByName разобрался (нашол в исходниках editablepoly)! Работает!
Нужен еще диалог для выбора фолдера (папки), и диалог для вибора файла с нужным розширением *.*:
При експорте геометрии нужно игнорить кости! Как определить исть ли нод косточкай?
Выбор папки это вроде чисто виндовый диалог ищи в msdn
Диалоги выбора графического файла для открытия или для завписи, смотри туже главу по созданию и зиписи битмапов, там они есть.
>Как определить исть ли нод косточкай ?
Нужно проверить его ClassID
Диалог для выбора файла не графического, а з любым заданым разширением (ну типа как в MaxScript ...)!
Относительно фолдеров. В MaxScript есть стандартный диалог для вибора папки getSavePath. MaxScript тоже работает с MaxAPI? Если да то можна логически предположить что этот диалог можна вызывать из под визуала. Но в SDK к максу ничего похожего нинашол!
//--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 если для тебя это проблема то найми человека который для тебя это все быстро напишет.
Или обратись в фурум по поиску, здесь форум по макс скрипту.
При конвертации текстур методом описаным выше: размер конвертируемого файла равен размеру файла результата. (Ето наводит на подозрение что на самом деле файл просто копируется с новим разширением)
Есть решенеие! Для конвертации текстур можно использовать утилитку texconv которая поставляэться вместе сновим DX9 и DX10.
texconv конвертит текстури в десяток форматов при етом можна менять розрешение, цветовую схему (например A8R8G8B8) ...
Визивать texconv можна с помошью системнай функции WinExec. Чтобы не моргала консоль у WinExec второй параметр ставим SW_HIDE.
Я в плагине использовал texconv следеющим образом:
Также проверь что выдает функция GetPlugInDir из класса IPathConfigMgr
Ну и на крайний случай всегда можно получить корневой каталог с помощью GetDir () - (Смотри MAX Directory IDs)
И добавить "\stdplugs" , т.к. путь к этой паке не меняется.
Диалог для открития файла. Правда работает несовсем правильно. Что б не передавал в 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
}
Приведенний ниже код показывает поддерживаемие версии 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( );
}
}
}
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
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Termi
Нужен еще диалог для выбора фолдера (папки), и диалог для вибора файла с нужным розширением *.*:
При експорте геометрии нужно игнорить кости! Как определить исть ли нод косточкай?
Savin Denis
Диалоги выбора графического файла для открытия или для завписи, смотри туже главу по созданию и зиписи битмапов, там они есть.
>Как определить исть ли нод косточкай ?
Нужно проверить его ClassID
Termi
Относительно фолдеров. В MaxScript есть стандартный диалог для вибора папки getSavePath. MaxScript тоже работает с MaxAPI? Если да то можна логически предположить что этот диалог можна вызывать из под визуала. Но в SDK к максу ничего похожего нинашол!
Какой ClassID в bones(ов)?
Savin Denis
//--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
FilterList filterList;
filterList.Append( _T("Max files(*.max)"😉);
filterList.Append( _T("*.max"😉);
ofn.lpstrFilter = filterList;
GetSaveFileName(&ofn);
Диалога не вижу!
Savin Denis
Termi
Savin Denis
Termi если для тебя это проблема то найми человека который для тебя это все быстро напишет.
Или обратись в фурум по поиску, здесь форум по макс скрипту.
PS
Чесное слово развели здесь детский сад.
Termi
Как в процесе конвертации очистить память.
Savin Denis
Memory Management for Image Loader/Saver Plug-ins
Memory Management for Plug-ins that Work with Bitmaps
Termi
Есть решенеие! Для конвертации текстур можно использовать утилитку 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
Также проверь что выдает функция GetPlugInDir из класса IPathConfigMgr
Ну и на крайний случай всегда можно получить корневой каталог с помощью GetDir () - (Смотри MAX Directory IDs)
И добавить "\stdplugs" , т.к. путь к этой паке не меняется.
Termi
#include <systemutilities.h>
#include <IPathConfigMgr.h>
//...
char *pcSTDPLUGS = new char[ 1024 ];
GetSpecDir( APP_STDPLUGS_DIR, "stdplugs", pcSTDPLUGS );
//...
GetSpecDir возвращает TRUE если фолдер найден, FALSE - ненайден. У pcSTDPLUGS - указатель на строку к stdplug.
Так вот работает!
Termi
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
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
Мне кажется этот код делает не то что ты думаеш,
Функция GetDXVersion используется как виртуальная для возврата минимальной требуемой версии при создании плугина хардварного шейдера.
Как корректно получить версию DirectX10 в системе нужно смотретть в сдк DirectX
Узнать какая версия выбрана в 3ds max, можно прочитать текущий файл конфигурации. в разделе [WindowState] пременная GFXDirect3DVersion