DragonNest/Client/ActorEternity/SaveSkin.cpp

197 lines
4.3 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include ".\saveskin.h"
#include "IDXMaterial.h"
#include "RTMax.h"
CSaveSkin::CSaveSkin(void)
{
}
CSaveSkin::~CSaveSkin(void)
{
}
void CSaveSkin::SaveSkin( FILE *fp, Mtl *pMtl )
{
int i;
IParamBlock2 *pParamBlock;
ParamDef Def;
SParamStruct Param;
if( CheckDirectX9ShaderClass( pMtl ) )
{
IDxMaterial3 *pDXMtl3;
m_VecParamList.clear();
pDXMtl3 = ( IDxMaterial3 * )pMtl->GetInterface( IDXMATERIAL3_INTERFACE );
pParamBlock = pMtl->GetParamBlock( 0 );
for( i = 0; i < pParamBlock->NumParams(); i++ )
{
Def = pParamBlock->GetParamDef( i );
Param.Type = PT_UNKNOWN;
strcpy( Param.szParamName, Def.int_name );
if( stricmp( Param.szParamName, "g_LightDir" ) == 0 )
{
continue;
}
if( stricmp( Param.szParamName, "g_EnvTex" ) == 0 )
{
continue;
}
switch( Def.type )
{
case TYPE_INT:
Param.Type = PT_INT;
Param.nInt = pParamBlock->GetInt( i );
break;
case TYPE_FLOAT:
Param.Type = PT_FLOAT;
Param.fFloat = pParamBlock->GetFloat( i );
break;
case TYPE_BITMAP:
case TYPE_TEXMAP:
{
Texmap *pTex = pParamBlock->GetTexmap( i );
PBBitmap *pBitmap = pParamBlock->GetBitmap( i );
Param.Type = PT_TEX;
if( pBitmap )
{
Param.szStr = ( TCHAR * )pBitmap->bi.Name();
}
else
{
Param.szStr = _T( "" );
}
break;
}
case TYPE_RGBA:
case TYPE_FRGBA:
Param.Type = PT_FLOAT4;
Param.fFloat4[0] = pParamBlock->GetAColor( i ).r;
Param.fFloat4[1] = pParamBlock->GetAColor( i ).g;
Param.fFloat4[2] = pParamBlock->GetAColor( i ).b;
Param.fFloat4[3] = pParamBlock->GetAColor( i ).a;
break;
case TYPE_POINT4:
Param.Type = PT_FLOAT4;
Param.fFloat4[0] = pParamBlock->GetPoint4( i ).x;
Param.fFloat4[1] = pParamBlock->GetPoint4( i ).y;
Param.fFloat4[2] = pParamBlock->GetPoint4( i ).z;
Param.fFloat4[3] = pParamBlock->GetPoint4( i ).w;
break;
default:
assert( 0 );
break;
}
if( Param.Type != PT_UNKNOWN )
{
m_VecParamList.push_back( Param );
}
}
}
// else // Default.fx <20><> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF>ϴ<EFBFBD>.
{
}
int nCount;
SSubSkinHeader SubSkinHeader;
char szName[ 256 ], szTemp[ 256 ], *pFindPtr;
IDxMaterial *pDXMtl;
memset( &SubSkinHeader, 0, sizeof( SSubSkinHeader ) );
SubSkinHeader.bEnableAlpha = false;
SubSkinHeader.fAlphaValue = 1.0f;
strcpy( SubSkinHeader.szMaterialName, pMtl->GetName() );
pDXMtl = ( IDxMaterial * )pMtl->GetInterface( IDXMATERIAL_INTERFACE );
if( pDXMtl )
{
strcpy( szTemp, pDXMtl->GetEffectFilename() );
}
else
{
strcpy( szTemp, "diffuse.fx" );
}
pFindPtr = strstr( szTemp, ".fxo" );
if( pFindPtr )
{
strcpy( pFindPtr, ".fx" );
}
pFindPtr = strrchr( szTemp, '\\' ); // <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD>..
if( pFindPtr )
{
strcpy( SubSkinHeader.szEffectName, pFindPtr + 1 );
}
else
{
strcpy( SubSkinHeader.szEffectName, szTemp );
}
fwrite( &SubSkinHeader, sizeof( SSubSkinHeader ), 1, fp );
nCount = m_VecParamList.size();
fwrite( &nCount, sizeof( int ), 1, fp );
for( i = 0; i < nCount; i++ )
{
WriteString( fp, m_VecParamList[ i ].szParamName );
fwrite( &m_VecParamList[ i ].Type, sizeof( ExportParamType ), 1, fp );
switch( m_VecParamList[ i ].Type )
{
case PT_INT:
fwrite( &m_VecParamList[ i ].nInt, sizeof( int ), 1, fp );
break;
case PT_FLOAT:
fwrite( &m_VecParamList[ i ].fFloat, sizeof( float ), 1, fp );
break;
case PT_FLOAT4:
fwrite( m_VecParamList[ i ].fFloat4, sizeof( float ) * 4, 1, fp );
break;
case PT_TEX:
memset( szName, 0, 256 );
pFindPtr = strrchr( m_VecParamList[ i ].szStr, '\\' );
if( pFindPtr )
{
strcpy( szName, pFindPtr + 1 );
}
else
{
strcpy( szName, m_VecParamList[ i ].szStr );
}
WriteString( fp, szName );
break;
}
}
}
bool CSaveSkin::CheckDirectX9ShaderClass( Mtl *pMtl )
{
TSTR Str;
pMtl->GetClassName( Str );
if( !( strstr( Str, "DirectX" ) && strstr( Str, "Shader" ) ) )
{
return false;
}
IDxMaterial *idxm = ( IDxMaterial * )pMtl->GetInterface( IDXMATERIAL_INTERFACE );
if( idxm == NULL )
{
return false;
}
return true;
}
void CSaveSkin::WriteString( FILE *fp, const char *pString )
{
int nLength;
char szName[ 2048 ];
nLength = strlen( pString ) + 1;
fwrite( &nLength, sizeof( int ), 1, fp );
strcpy( szName, pString );
fwrite( szName, nLength, 1, fp );
}