Конверт. мапав в другой формат.
- Автор темы Termi
- Дата создания
Диалог для выбора файла не графического, а з любым заданым разширением (ну типа как в MaxScript ...)!
Относительно фолдеров. В MaxScript есть стандартный диалог для вибора папки getSavePath. MaxScript тоже работает с MaxAPI? Если да то можна логически предположить что этот диалог можна вызывать из под визуала. Но в SDK к максу ничего похожего нинашол!
Какой ClassID в bones(ов)?
Относительно фолдеров. В MaxScript есть стандартный диалог для вибора папки getSavePath. MaxScript тоже работает с MaxAPI? Если да то можна логически предположить что этот диалог можна вызывать из под визуала. Но в SDK к максу ничего похожего нинашол!
Какой ClassID в bones(ов)?
- Рейтинг
- 138
Код:
//--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)
//----------------------------------------------------------------------------------
Какой ClassID в bones(ов)? заглянуть в хелп у меня нынче стоит 50$
При конвертации текстур методом описаным выше: размер конвертируемого файла равен размеру файла результата. (Ето наводит на подозрение что на самом деле файл просто копируется с новим разширением)
Есть решенеие! Для конвертации текстур можно использовать утилитку 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)?
Есть решенеие! Для конвертации текстур можно использовать утилитку 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)?
- Рейтинг
- 138
Вот здесь посмотри вроде то что нужно
Также проверь что выдает функция GetPlugInDir из класса IPathConfigMgr
Ну и на крайний случай всегда можно получить корневой каталог с помощью GetDir () - (Смотри MAX Directory IDs)
И добавить "\stdplugs" , т.к. путь к этой паке не меняется.
Код:
[b]systemutilities.h File Reference[/b]
[b]#define APP_STDPLUGS_DIR -5
GetSpecDir()
[/b]
Также проверь что выдает функция GetPlugInDir из класса IPathConfigMgr
Ну и на крайний случай всегда можно получить корневой каталог с помощью GetDir () - (Смотри MAX Directory IDs)
И добавить "\stdplugs" , т.к. путь к этой паке не меняется.
Подключаем
#include <systemutilities.h>
#include <IPathConfigMgr.h>
//...
char *pcSTDPLUGS = new char[ 1024 ];
GetSpecDir( APP_STDPLUGS_DIR, "stdplugs", pcSTDPLUGS );
//...
GetSpecDir возвращает TRUE если фолдер найден, FALSE - ненайден. У pcSTDPLUGS - указатель на строку к stdplug.
Так вот работает!
#include <systemutilities.h>
#include <IPathConfigMgr.h>
//...
char *pcSTDPLUGS = new char[ 1024 ];
GetSpecDir( APP_STDPLUGS_DIR, "stdplugs", pcSTDPLUGS );
//...
GetSpecDir возвращает TRUE если фолдер найден, FALSE - ненайден. У pcSTDPLUGS - указатель на строку к stdplug.
Так вот работает!
Диалог для открития файла. Правда работает несовсем правильно. Что б не передавал в 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, а машинай версия не поддерживается будет нихорошо. Как быть?
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( );
}
}
}
- Рейтинг
- 138
Во первых с чего ты взял что только до 9.0 ?
Мне кажется этот код делает не то что ты думаеш,
Функция GetDXVersion используется как виртуальная для возврата минимальной требуемой версии при создании плугина хардварного шейдера.
Как корректно получить версию DirectX10 в системе нужно смотретть в сдк DirectX
Узнать какая версия выбрана в 3ds max, можно прочитать текущий файл конфигурации. в разделе [WindowState] пременная GFXDirect3DVersion
Код:
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