初步修复
This commit is contained in:
parent
8fc4357cc6
commit
e4714f3f0e
46705 changed files with 12004901 additions and 0 deletions
306
Common/EternityEngine/EtEffectDataContainer.cpp
Normal file
306
Common/EternityEngine/EtEffectDataContainer.cpp
Normal file
|
|
@ -0,0 +1,306 @@
|
|||
#include "StdAfx.h"
|
||||
#include "EtEffectDataContainer.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
||||
#endif
|
||||
|
||||
|
||||
CEtEffectColorDataValue::CEtEffectColorDataValue()
|
||||
{
|
||||
m_Value = EtVector3( 0.f, 0.f, 0.f );
|
||||
m_nType = 0;
|
||||
}
|
||||
|
||||
CEtEffectColorDataValue::CEtEffectColorDataValue( float fKey, EtVector3 vColor )
|
||||
{
|
||||
m_fKey = fKey;
|
||||
m_Value = vColor;
|
||||
m_nType = 0;
|
||||
}
|
||||
|
||||
CEtEffectAlphaDataValue::CEtEffectAlphaDataValue()
|
||||
{
|
||||
m_Value = 1.0f;
|
||||
m_nType = 1;
|
||||
}
|
||||
|
||||
CEtEffectAlphaDataValue::CEtEffectAlphaDataValue( float fKey, float fAlpha )
|
||||
{
|
||||
m_fKey = fKey;
|
||||
m_Value = fAlpha;
|
||||
m_nType = 1;
|
||||
}
|
||||
|
||||
CEtEffectScaleDataValue::CEtEffectScaleDataValue()
|
||||
{
|
||||
m_Value = 1.0f;
|
||||
m_nType = 2;
|
||||
}
|
||||
|
||||
CEtEffectScaleDataValue::CEtEffectScaleDataValue( float fKey, float fScale )
|
||||
{
|
||||
m_fKey = fKey;
|
||||
m_Value = fScale;
|
||||
m_nType = 2;
|
||||
}
|
||||
|
||||
CEtEffectPositionDataValue::CEtEffectPositionDataValue()
|
||||
{
|
||||
m_Value = EtVector3( 0, 0, 0 );
|
||||
m_nType = 3;
|
||||
}
|
||||
|
||||
CEtEffectPositionDataValue::CEtEffectPositionDataValue( float fKey, EtVector3 vPos )
|
||||
{
|
||||
m_fKey = fKey;
|
||||
m_Value = vPos;
|
||||
m_nType = 3;
|
||||
}
|
||||
|
||||
CEtEffectRotationDataValue::CEtEffectRotationDataValue()
|
||||
{
|
||||
m_Value = EtVector3( 0, 0, 0 );
|
||||
m_nType = 4;
|
||||
}
|
||||
|
||||
CEtEffectRotationDataValue::CEtEffectRotationDataValue( float fKey, EtVector3 vAxisAngle )
|
||||
{
|
||||
m_fKey = fKey;
|
||||
m_Value = vAxisAngle;
|
||||
m_nType = 4;
|
||||
}
|
||||
|
||||
CEtEffectDataContainer::CEtEffectDataContainer()
|
||||
{
|
||||
ResetData();
|
||||
}
|
||||
|
||||
CEtEffectDataContainer::~CEtEffectDataContainer()
|
||||
{
|
||||
ResetData();
|
||||
}
|
||||
|
||||
void CEtEffectDataContainer::ResetData()
|
||||
{
|
||||
m_fMinimunKeyValue = 0.f;
|
||||
m_fMaximumKeyValue = 0.f;
|
||||
SAFE_DELETE_PVEC( m_pVecDataValue );
|
||||
}
|
||||
|
||||
void CEtEffectDataContainer::AddData( IEtEffectDataValue *pValue, bool bSort )
|
||||
{
|
||||
m_pVecDataValue.push_back( pValue );
|
||||
CalcMinMax();
|
||||
if( bSort ) SortDataValue();
|
||||
}
|
||||
|
||||
void CEtEffectDataContainer::RemoveData( DWORD dwIndex )
|
||||
{
|
||||
if( dwIndex < 0 || dwIndex >= m_pVecDataValue.size() ) return;
|
||||
|
||||
delete m_pVecDataValue[dwIndex];
|
||||
m_pVecDataValue.erase( m_pVecDataValue.begin() + dwIndex );
|
||||
|
||||
CalcMinMax();
|
||||
}
|
||||
|
||||
IEtEffectDataValue *CEtEffectDataContainer::GetValueFromIndex( DWORD dwIndex )
|
||||
{
|
||||
if( dwIndex <0 || dwIndex >= m_pVecDataValue.size() ) return NULL;
|
||||
return m_pVecDataValue[dwIndex];
|
||||
}
|
||||
|
||||
void CEtEffectDataContainer::Load( CStream *pStream )
|
||||
{
|
||||
ResetData();
|
||||
DWORD dwCount;
|
||||
DWORD dwValueType;
|
||||
float fKey;
|
||||
pStream->Read( &dwCount, sizeof(DWORD) );
|
||||
|
||||
for( DWORD i=0; i<dwCount; i++ ) {
|
||||
pStream->Read( &dwValueType, sizeof(DWORD) );
|
||||
|
||||
IEtEffectDataValue *pValue = NULL;
|
||||
switch( dwValueType )
|
||||
{
|
||||
case 0: pValue = new CEtEffectColorDataValue; break;
|
||||
case 1: pValue = new CEtEffectAlphaDataValue; break;
|
||||
case 2: pValue = new CEtEffectScaleDataValue; break;
|
||||
case 3: pValue = new CEtEffectPositionDataValue; break;
|
||||
case 4: pValue = new CEtEffectRotationDataValue; break;
|
||||
}
|
||||
if( pValue ) {
|
||||
pStream->Read( &fKey, sizeof(float) );
|
||||
pStream->Read( pValue->GetValue(), pValue->GetSize() );
|
||||
|
||||
pValue->SetKey( fKey );
|
||||
m_pVecDataValue.push_back( pValue );
|
||||
}
|
||||
}
|
||||
CalcMinMax();
|
||||
}
|
||||
|
||||
void CEtEffectDataContainer::Save( CStream *pStream )
|
||||
{
|
||||
DWORD dwCount = GetDataCount();
|
||||
pStream->Write( &dwCount, sizeof(DWORD) );
|
||||
|
||||
for( DWORD i=0; i<dwCount; i++ ) {
|
||||
IEtEffectDataValue *pValue = GetValueFromIndex(i);
|
||||
int nType = pValue->GetType();
|
||||
float fKey = pValue->GetKey();
|
||||
|
||||
pStream->Write( &nType, sizeof(int) );
|
||||
pStream->Write( &fKey, sizeof(float) );
|
||||
pStream->Write( pValue->GetValue(), pValue->GetSize() );
|
||||
}
|
||||
}
|
||||
|
||||
void CEtEffectDataContainer::CalcMinMax()
|
||||
{
|
||||
m_fMinimunKeyValue = 0.f;
|
||||
m_fMaximumKeyValue = 0.f;
|
||||
for( DWORD i=0; i<m_pVecDataValue.size(); i++ )
|
||||
{
|
||||
float fKey = m_pVecDataValue[i]->GetKey();
|
||||
if( m_fMinimunKeyValue > fKey ) m_fMinimunKeyValue = fKey;
|
||||
else if( m_fMaximumKeyValue < fKey ) m_fMaximumKeyValue = fKey;
|
||||
}
|
||||
}
|
||||
|
||||
bool CompareEffectValue( IEtEffectDataValue *pObj1, IEtEffectDataValue *pObj2 )
|
||||
{
|
||||
if( pObj1->GetKey() < pObj2->GetKey() ) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void CEtEffectDataContainer::SortDataValue()
|
||||
{
|
||||
std::sort( m_pVecDataValue.begin(), m_pVecDataValue.end(), CompareEffectValue );
|
||||
}
|
||||
|
||||
float *CEtEffectDataContainer::GetInterpolationFloat( float fInterpolationKey, bool *bSuccess, bool bCurve )
|
||||
{
|
||||
float *pAlpha = (float *)GetInterpolationValue( fInterpolationKey, bSuccess, bCurve );
|
||||
return pAlpha;
|
||||
}
|
||||
|
||||
EtVector3 *CEtEffectDataContainer::GetInterpolationVector3( float fInterpolationKey, bool *bSuccess, bool bCurve )
|
||||
{
|
||||
EtVector3 *pVector = (EtVector3 *)GetInterpolationValue( fInterpolationKey, bSuccess, bCurve );
|
||||
return pVector;
|
||||
}
|
||||
|
||||
EtQuat *CEtEffectDataContainer::GetInterpolationQuat( float fInterpolationKey, bool *bSuccess, bool bCurve )
|
||||
{
|
||||
EtQuat *pQuat = (EtQuat *)GetInterpolationValue( fInterpolationKey, bSuccess, bCurve );
|
||||
return pQuat;
|
||||
}
|
||||
|
||||
void *CEtEffectDataContainer::GetInterpolationValue( float fInterpolationKey, bool *bSuccess, bool bCurve )
|
||||
{
|
||||
if( bSuccess )
|
||||
*bSuccess = false;
|
||||
|
||||
DWORD dwCount = (DWORD)m_pVecDataValue.size();
|
||||
if( dwCount == 0 ) return NULL;
|
||||
if( dwCount == 1 ) return m_pVecDataValue[0]->GetValue();
|
||||
if( fInterpolationKey < m_fMinimunKeyValue ) return m_pVecDataValue[0]->GetValue();
|
||||
if( fInterpolationKey > m_fMaximumKeyValue ) return m_pVecDataValue[dwCount-1]->GetValue();
|
||||
|
||||
static EtVector3 s_vColor;
|
||||
static float s_fAlphaScale;
|
||||
static EtQuat s_qRotation;
|
||||
|
||||
for( DWORD i=0; i<dwCount-1; i++ )
|
||||
{
|
||||
float fKey = m_pVecDataValue[i]->GetKey();
|
||||
float fKeyNext = m_pVecDataValue[i+1]->GetKey();
|
||||
|
||||
if( fInterpolationKey >= fKey && fInterpolationKey <= fKeyNext )
|
||||
{
|
||||
float fWeight = ( fInterpolationKey - fKey ) / ( fKeyNext - fKey );
|
||||
switch( m_pVecDataValue[i]->GetType() )
|
||||
{
|
||||
case 0: // Color
|
||||
{
|
||||
EtVector3 *pValue = (EtVector3 *)m_pVecDataValue[i]->GetValue();
|
||||
EtVector3 *pValueNext = (EtVector3 *)m_pVecDataValue[i+1]->GetValue();
|
||||
if( bSuccess ) *bSuccess = true;
|
||||
return EtVec3Lerp( &s_vColor, pValue, pValueNext, fWeight );
|
||||
}
|
||||
break;
|
||||
case 1: // Alpha
|
||||
case 2: // Scale
|
||||
{
|
||||
float *pValue = (float *)m_pVecDataValue[i]->GetValue();
|
||||
float *pValueNext = (float *)m_pVecDataValue[i+1]->GetValue();
|
||||
s_fAlphaScale = *pValue + ( ( *pValueNext - *pValue ) * fWeight );
|
||||
if( bSuccess ) *bSuccess = true;
|
||||
return &s_fAlphaScale;
|
||||
}
|
||||
break;
|
||||
case 3: // Pos
|
||||
{
|
||||
if( !bCurve )
|
||||
{
|
||||
EtVector3 *pValue = (EtVector3 *)m_pVecDataValue[i]->GetValue();
|
||||
EtVector3 *pValueNext = (EtVector3 *)m_pVecDataValue[i+1]->GetValue();
|
||||
if( bSuccess ) *bSuccess = true;
|
||||
return EtVec3Lerp( &s_vColor, pValue, pValueNext, fWeight );
|
||||
}
|
||||
else
|
||||
{
|
||||
EtVector3 *pValuePrev = ( i > 0 ) ? (EtVector3 *)m_pVecDataValue[i-1]->GetValue() : (EtVector3 *)m_pVecDataValue[i]->GetValue();
|
||||
EtVector3 *pValue = (EtVector3 *)m_pVecDataValue[i]->GetValue();
|
||||
EtVector3 *pValueNext = (EtVector3 *)m_pVecDataValue[i+1]->GetValue();
|
||||
EtVector3 *pValueNext2 = ( i < dwCount-2 ) ? (EtVector3 *)m_pVecDataValue[i+2]->GetValue() : (EtVector3 *)m_pVecDataValue[i+1]->GetValue();
|
||||
if( bSuccess ) *bSuccess = true;
|
||||
return EtVec3CatmullRom( &s_vColor, pValuePrev, pValue, pValueNext, pValueNext2, fWeight );
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4: // Rot
|
||||
{
|
||||
EtVector3 vTemp;
|
||||
EtVector3 *pValue = (EtVector3 *)m_pVecDataValue[i]->GetValue();
|
||||
EtVector3 *pValueNext = (EtVector3 *)m_pVecDataValue[i+1]->GetValue();
|
||||
EtVec3Lerp( &vTemp, pValue, pValueNext, fWeight );
|
||||
vTemp.x = vTemp.x / 180.f * D3DX_PI;
|
||||
vTemp.y = vTemp.y / 180.f * D3DX_PI;
|
||||
vTemp.z = vTemp.z / 180.f * D3DX_PI;
|
||||
if( bSuccess ) *bSuccess = true;
|
||||
return EtQuaternionRotationYawPitchRoll( &s_qRotation, vTemp.x, vTemp.y, vTemp.z );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void CEtEffectDataContainer::operator = ( CEtEffectDataContainer &e )
|
||||
{
|
||||
ResetData();
|
||||
for( DWORD i=0; i<e.GetDataCount(); i++ )
|
||||
{
|
||||
IEtEffectDataValue *pSorValue = e.GetValueFromIndex(i);
|
||||
ASSERT( NULL != pSorValue );
|
||||
IEtEffectDataValue *pValue = NULL;
|
||||
switch( pSorValue->GetType() )
|
||||
{
|
||||
case 0: pValue = new CEtEffectColorDataValue; break;
|
||||
case 1: pValue = new CEtEffectAlphaDataValue; break;
|
||||
case 2: pValue = new CEtEffectScaleDataValue; break;
|
||||
case 3: pValue = new CEtEffectPositionDataValue; break;
|
||||
case 4: pValue = new CEtEffectRotationDataValue; break;
|
||||
}
|
||||
ASSERT( NULL != pValue );
|
||||
pValue->SetKey( pSorValue->GetKey() );
|
||||
pValue->SetValue( pSorValue->GetValue() );
|
||||
m_pVecDataValue.push_back( pValue );
|
||||
}
|
||||
CalcMinMax();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue