DragonNest/Client/EtViewer/ObjectSubmesh.cpp

229 lines
7 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "ObjectSubmesh.h"
CObjectSubmesh::CObjectSubmesh()
{
m_Type = CObjectBase::SUBMESH;
m_dwVertexCount = 0;
m_nSubMeshIndex = -1;
m_nTextureCount = 0;
}
CObjectSubmesh::~CObjectSubmesh()
{
}
void CObjectSubmesh::Activate()
{
EtAniObjectHandle Handle = ((CObjectSkin*)GetParent())->GetObjectHandle();
if( !Handle ) return;
CEtSubMesh *pSubmesh = NULL;
EtMaterialHandle hMaterial;
for( int i=0; i<Handle->GetSubMeshCount(); i++ ) {
if( strcmp( Handle->GetSubMeshName( i ), m_szName ) == NULL ) {
pSubmesh = Handle->GetSubMesh( i );
hMaterial = Handle->GetMaterial( i );
m_nSubMeshIndex = i;
break;
}
}
if( pSubmesh == NULL ) return;
m_szEffectName = hMaterial->GetFileName();
m_dwVertexCount = (int)pSubmesh->GetVertexCount();
m_nTextureCount = 0;
m_VecEffectList.clear();
m_VecEffectSemanticList.clear();
for( int i=0; i<Handle->GetEffectCount( m_nSubMeshIndex ); i++ ) {
SCustomParam *pParam = Handle->GetCustomParam( m_nSubMeshIndex, i );
if( pParam->Type == EPT_MATRIX || pParam->Type == EPT_VARIABLE ) continue;
if( !pParam->hParamHandle || pParam->hParamHandle == -1) continue;
m_VecEffectList.push_back( pParam );
m_VecEffectSemanticList.push_back( hMaterial->GetSemantic( pParam->hParamHandle ) );
if( pParam->Type == EPT_TEX ) m_nTextureCount++;
}
CObjectBase::Activate();
}
void CObjectSubmesh::InitPropertyInfo()
{
SAFE_DELETE_PVEC( m_pVecPropertyList );
PropertyGridBaseDefine Default[] = {
{ "Common", "Polygon Count", CUnionValueProperty::Integer, "Polygon Count", FALSE },
{ "Material", "Effect Name", CUnionValueProperty::String_FileOpen, "Select FX Shader File|HLSL Files|*.fx;*.fxc", FALSE },
{ "Material", "Enable AlphaBlend", CUnionValueProperty::Boolean, "Enable Alpha Blend", TRUE },
{ "Material", "Alpha Value", CUnionValueProperty::Float, "Alpha Value|0.f|1.f|0.001f", TRUE },
{ "Texture", "Using Count", CUnionValueProperty::Integer, "Texture Count", FALSE },
NULL,
};
AddPropertyInfo( Default );
CUnionValueProperty *pVariable;
for( DWORD i=0; i<m_VecEffectList.size(); i++ ) {
if( m_VecEffectList[i]->Type == EPT_TEX ) {
pVariable = new CUnionValueProperty( CUnionValueProperty::String_FileOpen );
pVariable->SetCategory( "Texture" );
pVariable->SetDescription( m_VecEffectSemanticList[i] );
pVariable->SetSubDescription( "Texture File|All Texture Files|*.dds;*.jpg;*.tga;*.bmp" );
pVariable->SetDefaultEnable( TRUE );
}
else {
switch( m_VecEffectList[i]->Type ) {
case EPT_INT:
pVariable = new CUnionValueProperty( CUnionValueProperty::Integer );
break;
case EPT_VECTOR:
pVariable = new CUnionValueProperty( CUnionValueProperty::Vector4Color );
break;
case EPT_FLOAT:
pVariable = new CUnionValueProperty( CUnionValueProperty::Float );
break;
}
pVariable->SetCategory( "Shader Parameter" );
pVariable->SetDescription( m_VecEffectSemanticList[i] );
pVariable->SetSubDescription( "Shader Setting Value" );
pVariable->SetDefaultEnable( TRUE );
}
m_pVecPropertyList.push_back( pVariable );
}
}
void CObjectSubmesh::OnSetPropertyValue( DWORD dwIndex, CUnionValueProperty *pVariable )
{
switch( dwIndex ) {
case 0:
pVariable->SetVariable( (int)m_dwVertexCount );
break;
case 1:
pVariable->SetVariable( m_szEffectName.GetBuffer() );
break;
case 4:
pVariable->SetVariable( m_nTextureCount );
break;
case 2:
{
EtAniObjectHandle Handle = ((CObjectSkin*)GetParent())->GetObjectHandle();
pVariable->SetVariable( Handle->GetSkin()->IsEnableAlphaBlend( m_nSubMeshIndex ) );
}
break;
case 3:
{
EtAniObjectHandle Handle = ((CObjectSkin*)GetParent())->GetObjectHandle();
pVariable->SetVariable( Handle->GetSkin()->GetAlphaValue( m_nSubMeshIndex ) );
}
break;
}
// Texture Setting
DWORD nOffset = 5;
if( dwIndex >= nOffset && dwIndex < nOffset + m_VecEffectList.size() ) {
SCustomParam *pParam = m_VecEffectList[ dwIndex - nOffset ];
switch( pParam->Type ) {
case EPT_INT:
pVariable->SetVariable( pParam->nInt );
break;
case EPT_FLOAT:
pVariable->SetVariable( pParam->fFloat );
break;
case EPT_VECTOR:
pVariable->SetVariable( (D3DXVECTOR4)pParam->fFloat4 );
break;
case EPT_TEX:
{
if( pParam->nTextureIndex == -1 ) {
pVariable->SetVariable( (char*)"Can't Find File" );
break;
}
EtResourceHandle hResource = CEtResource::GetResource( pParam->nTextureIndex );
if( !hResource ) break;
pVariable->SetVariable( (char*)hResource->GetFileName() );
}
break;
}
}
}
void CObjectSubmesh::OnChangePropertyValue( DWORD dwIndex, CUnionValueProperty *pVariable )
{
switch( dwIndex ) {
case 1:
{
CString szFullName = pVariable->GetVariableString();
// <20><><EFBFBD><20>ٽ<EFBFBD> FX <20>о<EFBFBD><D0BE>ֱ<EFBFBD> Refresh <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
SetModify( true, "Effect <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>\n" );
// Property <20>󿡴<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
char szBuf[512] = { 0, };
_GetFullFileName( szBuf, _countof(szBuf), szFullName );
pVariable->SetVariable( szBuf );
}
break;
case 2:
{
EtAniObjectHandle Handle = ((CObjectSkin*)GetParent())->GetObjectHandle();
Handle->GetSkin()->EnableAlphaBlend( m_nSubMeshIndex, pVariable->GetVariableBool() );
SetModify( true, "Material - Alpha Flag\n" );
}
break;
case 3:
{
EtAniObjectHandle Handle = ((CObjectSkin*)GetParent())->GetObjectHandle();
Handle->GetSkin()->SetAlphaValue( m_nSubMeshIndex, pVariable->GetVariableFloat() );
SetModify( true, "Material - Alpha Value\n" );
}
break;
}
DWORD nOffset = 5;
if( dwIndex >= nOffset && dwIndex < nOffset + m_VecEffectList.size() ) {
EtAniObjectHandle Handle = ((CObjectSkin*)GetParent())->GetObjectHandle();
SCustomParam *pParam = m_VecEffectList[ dwIndex - nOffset ];
switch( pParam->Type ) {
case EPT_INT:
pParam->nInt = pVariable->GetVariableInt();
Handle->SetEffect( m_nSubMeshIndex, dwIndex - nOffset, pParam );
break;
case EPT_FLOAT:
pParam->fFloat = pVariable->GetVariableFloat();
Handle->SetEffect( m_nSubMeshIndex, dwIndex - nOffset, pParam );
break;
case EPT_VECTOR:
pParam->fFloat4[0] = pVariable->GetVariableVector4Ptr()->x;
pParam->fFloat4[1] = pVariable->GetVariableVector4Ptr()->y;
pParam->fFloat4[2] = pVariable->GetVariableVector4Ptr()->z;
pParam->fFloat4[3] = pVariable->GetVariableVector4Ptr()->w;
Handle->SetEffect( m_nSubMeshIndex, dwIndex - nOffset, pParam );
break;
case EPT_TEX:
Handle->SetTexture( m_nSubMeshIndex, dwIndex - nOffset, pVariable->GetVariableString() );
// Property <20>󿡴<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
char szBuf[512] = { 0, };
_GetFullFileName( szBuf, _countof(szBuf), pVariable->GetVariableString() );
pVariable->SetVariable( szBuf );
break;
}
CString szTemp;
szTemp.Format( "%s - <20><><EFBFBD><EFBFBD>\n", pVariable->GetDescription() );
SetModify( true, szTemp );
}
EtAniObjectHandle Handle = ((CObjectSkin*)GetParent())->GetObjectHandle();
Handle->CreateSkinInstance();
}
void CObjectSubmesh::OnSelectChangePropertyValue( DWORD dwIndex, CUnionValueProperty *pVariable )
{
}