DragonNest/Common/EternityEngine/EtSubMesh.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

181 lines
No EOL
3.9 KiB
C++

#include "StdAfx.h"
#include "EtSubMesh.h"
#include "EtAni.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CEtSubMesh::CEtSubMesh(void)
{
m_nParentBoneIndex = -1;
m_pPosition = NULL;
m_pIndex = NULL;
memset(&m_SubMeshHeader, 0, sizeof(m_SubMeshHeader));
}
CEtSubMesh::~CEtSubMesh(void)
{
SAFE_DELETE( m_pPosition );
SAFE_DELETE( m_pIndex );
}
void CEtSubMesh::Clear()
{
m_vecBoneName.clear();
}
void CEtSubMesh::LinkToAni( EtResourceHandle hResource )
{
if( ( m_vecLinkIndex.size() > 0 ) || ( m_nParentBoneIndex != -1 ) )
{
return;
}
int i;
EtAniHandle hAni;
hAni = hResource;
if( !m_vecBoneName.empty() )
{
m_vecLinkIndex.resize( m_vecBoneName.size() );
for( i = 0; i < ( int )m_vecBoneName.size(); i++ )
{
m_vecLinkIndex[ i ] = hAni->GetBoneIndex( m_vecBoneName[ i ].c_str() );
}
}
else
{
m_nParentBoneIndex = hAni->GetBoneIndex( m_SubMeshHeader.szParentName );
}
}
void CEtSubMesh::LoadSubMesh( CStream *pStream )
{
int i;
m_MeshStream.Clear();
pStream->Read( &m_SubMeshHeader, sizeof( SSubMeshHeader ) );
pStream->Seek( SUBMESH_HEADER_RESERVED, SEEK_CUR );
m_MeshStream.LoadIndexStream( pStream, m_SubMeshHeader.bUseStrip, m_SubMeshHeader.nFaceBufferSize );
m_MeshStream.LoadVertexStream( pStream, MST_POSITION, 0, m_SubMeshHeader.nVertexCount );
m_MeshStream.LoadVertexStream( pStream, MST_NORMAL, 0, m_SubMeshHeader.nVertexCount );
for( i = 0; i < m_SubMeshHeader.nTextureChannel; i++ )
{
m_MeshStream.LoadVertexStream( pStream, MST_TEXCOORD, i, m_SubMeshHeader.nVertexCount );
}
if( m_SubMeshHeader.bUseVertexColor )
{
m_MeshStream.LoadVertexStream( pStream, MST_COLOR, 0, m_SubMeshHeader.nVertexCount );
}
if( m_SubMeshHeader.bUsePhysique )
{
m_MeshStream.LoadVertexStream( pStream, MST_BONEINDEX, 0, m_SubMeshHeader.nVertexCount );
m_MeshStream.LoadVertexStream( pStream, MST_BONEWEIGHT, 0, m_SubMeshHeader.nVertexCount );
int nBoneCount;
char szBoneName[ 256 ];
pStream->Read( &nBoneCount, sizeof( int ) );
for( i = 0; i < nBoneCount; i++ )
{
pStream->Read( szBoneName, 256 );
m_vecBoneName.push_back( szBoneName );
}
}
}
void CEtSubMesh::Draw( int nVertexDeclIndex, int nDrawStart, int nDrawCount )
{
m_MeshStream.Draw( nVertexDeclIndex, nDrawStart, nDrawCount );
}
bool CEtSubMesh::TestLineToTriangle( EtVector3 &vPosition, EtVector3 &vDirection, EtMatrix &TransMat, float &fDist )
{
if( m_pPosition == NULL )
{
m_pPosition = new EtVector3[ m_MeshStream.GetVertexCount() ];
GetVertexStream( MST_POSITION, m_pPosition );
}
if( m_pIndex == NULL )
{
m_pIndex = new WORD[ m_MeshStream.GetIndexCount() ];
m_MeshStream.GetIndexStream( m_pIndex );
}
int i, j, nIndexCount;
bool bStrip;
bStrip = m_MeshStream.IsStrip();
nIndexCount = m_MeshStream.GetIndexCount();
for( i = 0; i < nIndexCount; )
{
EtVector3 vTransformPoint[ 3 ];
float fBary1, fBary2;
if( i > nIndexCount - 3 )
{
break;
}
if( bStrip )
{
if( m_pIndex[ i + 2 ] == 0xffff )
{
i += 3;
}
}
for( j = 0; j < 3; j++ )
{
EtVec3TransformCoord( vTransformPoint + j, m_pPosition + m_pIndex[ i + j ], &TransMat );
}
if( ::TestLineToTriangle( vPosition, vDirection, vTransformPoint[ 0 ], vTransformPoint[ 1 ], vTransformPoint[ 2 ], fDist, fBary1, fBary2 ) )
{
return true;
}
if( bStrip )
{
i++;
}
else
{
i += 3;
}
}
return false;
}
bool CEtSubMesh::IsExistStream( MeshStreamType Type, int nStreamIndex )
{
int nStride;
if( m_MeshStream.FindVertexStream( Type, nStreamIndex, nStride ) )
{
return true;
}
else
{
return false;
}
}
void CEtSubMesh::RemoveLinkInfo()
{
m_vecBoneName.clear();
m_vecLinkIndex.clear();
}
void CEtSubMesh::Assign( CEtSubMesh *pSubMesh, EtVector4 ScaleBias )
{
m_SubMeshHeader = pSubMesh->m_SubMeshHeader;
m_MeshStream.Assign( &pSubMesh->m_MeshStream, ScaleBias ) ;
m_vecBoneName = pSubMesh->m_vecBoneName;
m_vecLinkIndex = pSubMesh->m_vecLinkIndex;
m_nParentBoneIndex = pSubMesh->m_nParentBoneIndex;
}