Files
2026-06-01 12:46:52 +02:00

426 lines
9.1 KiB
C++

#include "stdafx.h"
#include "krenderobject.h"
#include "K3DCamera.h"
#include "KRenderDeviceDX.h"
#include "KDeviceManager.h"
#include "KResourceManager.h"
#include "KResource.h"
#include "KViewport.h"
void AxisCalculation( const K3DMatrix & mat, K3DVector & vVectorX, K3DVector & vVectorY, K3DVector & vVectorZ, float fLen /*= 0.5f*/ )
{
K3DMatrix Mat1 = mat;
K3DVector& vector = Mat1.GetPosVector();
vVectorX = Mat1.GetXVector();
vVectorX.Normalize(); vVectorX = vector + vVectorX * fLen;
vVectorY = Mat1.GetYVector();
vVectorY.Normalize(); vVectorY = vector + vVectorY * fLen;
vVectorZ = Mat1.GetZVector();
vVectorZ.Normalize(); vVectorZ = vector + vVectorZ * fLen;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KRenderObject Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
KRenderObject::KRenderObject(void)
{
m_fMasterVisibility = 1.0f;
m_bIsClip = true;
m_SkinDiffuse.r = 0;
m_SkinDiffuse.g = 0;
m_SkinDiffuse.b = 0;
m_SkinDiffuse.a = 0;
}
KRenderObject::~KRenderObject(void)
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KSeqObject Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
KSeqObject::KSeqObject()
{
m_dwTime = 0;
m_dwRealizedTime = 0xffffffff;
m_pMatParent = NULL;
m_pMatAttach = NULL;
m_bRenderFlag = TRUE;
m_bRotationLock = FALSE;
}
KSeqObject::~KSeqObject()
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KSequencer Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
KSequencer::KSequencer( bool bCreateByManager )
{
m_bCreateByMgr = bCreateByManager;
}
KSequencer::~KSequencer()
{
// m_vecSeqObjects.clear();
SAFE_DELETE_VECTOR(m_vecSeqObjects);
if ( m_bCreateByMgr )
{
KNX3Manager::GetManager()->ReleaseRes( m_strResName.c_str() );
}
}
int KSequencer::GetSeqObjectCount()
{
return static_cast<int>(m_vecSeqObjects.size());
}
KSeqObject* KSequencer::GetSeqObject( int index )
{
return m_vecSeqObjects[index];
}
void KSequencer::SetName( const char *resname )
{
m_strResName.assign(resname);
}
const char* KSequencer::GetName()
{
return m_strResName.c_str();
}
void KSequencer::AddSeqObject( KSeqObject *obj )
{
m_vecSeqObjects.push_back( obj );
obj->SetParentTransform( m_pMatParent );
m_interval.Expand( obj->GetInterval() );
}
void *KSequencer::Perform( KID id, KArg& msg )
{
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetTime( m_dwTime );
m_vecSeqObjects[i]->Perform( id, msg );
}
return (void*)1;
}
void KSequencer::SetColor( DWORD c1, DWORD c2 /* = 0 */, DWORD c3 /* = 0 */, DWORD c4 /* = 0 */, short nMode /*= 0*/ )
{
for ( unsigned int i=0 ; i< m_vecSeqObjects.size() ; ++i )
{
// Fraun texture change
//m_vecSeqObjects[i]->SetColor( c1, c2, c3, c4, nMode );
//if (!c1) c1 = 0;
//if (!c2) c2 = 0;
//if (!c3) c3 = 0;
//if (!c4) c4 = 0;
//if (!nMode) nMode = 0;
m_vecSeqObjects[i]->SetColor( c1, c2, c3, c4, nMode );
}
}
void KSequencer::SetDeform( KSeqObject * pMeshSeq )
{
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetDeform( pMeshSeq );
}
}
void KSequencer::SetAttach( int nAttachIndex, KSeqObject * pMeshSeq )
{
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetAttach( nAttachIndex, pMeshSeq );
}
}
void KSequencer::SetAttachEffectPos( int nEffectPosIndex, KSeqObject * pMeshSeq )
{
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetAttachEffectPos( nEffectPosIndex, pMeshSeq );
}
}
void KSequencer::SetAttachEffectBone( int nBoneIndex, KSeqObject * pMeshSeq )
{
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetAttachEffectBone( nBoneIndex, pMeshSeq );
}
}
void KSequencer::Process( DWORD time )
{
m_dwTime = time;
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetTime( m_dwTime );
// m_vecSeqObjects[i]->Process( m_dwTime );
}
}
void KSequencer::ClipTest( const K3DVector* pFrustrum)
{
int nSize = (int)m_vecSeqObjects.size();
bool bIsClip = true;
for ( int i=0 ; i < nSize ; ++i )
{
m_vecSeqObjects[i]->SetTime( m_dwTime );
m_vecSeqObjects[i]->SetVisibility(m_fMasterVisibility);
m_vecSeqObjects[i]->ClipTest( pFrustrum );
bIsClip = m_vecSeqObjects[i]->GetIsClip();
if( !bIsClip ) return; //보여 지는 것이 있으므로 도중에 중단
}
}
bool KSequencer::GetIsClip()
{
bool bIsClip = true;
int nSize = (int)m_vecSeqObjects.size();
for ( int i=0 ; i < nSize ; ++i )
{
//한개 라도 false 이면 보여야 된다.
bIsClip = m_vecSeqObjects[i]->GetIsClip();
if( !bIsClip ) return bIsClip; //보여야 되는 것임.
}
return bIsClip; //안 보여 지는 것임
}
void KSequencer::Reset()
{
m_dwTime = 0;
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->Reset();
}
}
void KSequencer::Render( KViewportObject *viewport, DWORD flag, const K3DMatrix * pAttachMat )
{
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetTime( m_dwTime );
m_vecSeqObjects[i]->SetVisibility(m_fMasterVisibility);
m_vecSeqObjects[i]->SetSkinDiffuse( m_SkinDiffuse );
m_vecSeqObjects[i]->Render( viewport, flag, pAttachMat );
}
}
void KSequencer::SetAlterMaterial( K3DMaterial *mat )
{
KSeqObject::SetAlterMaterial( mat );
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetAlterMaterial( mat );
}
}
void KSequencer::SetParentTransform( const K3DMatrix *pMatParent, const K3DMatrix *pMatAttach, BOOL bRotationLock )
{
KSeqObject::SetParentTransform( pMatParent, pMatAttach );
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetParentTransform( pMatParent, pMatAttach, bRotationLock );
}
}
void KSequencer::realizeTime()
{
if ( m_dwRealizedTime == m_dwTime ) return;
m_dwRealizedTime = m_dwTime;
for ( unsigned int i=0 ; i<m_vecSeqObjects.size() ; ++i )
{
m_vecSeqObjects[i]->SetTime( m_dwTime );
m_vecSeqObjects[i]->realizeTime();
}
}
KSequencer* KSequencer::CloneSequence()
{
return static_cast<KSequencer*>(Clone());
}
KSeqObject* KSequencer::Clone()
{
KSequencer *obj = new KSequencer;
for ( int i=0 ; i<GetSeqObjectCount() ; ++i )
obj->AddSeqObject( GetSeqObject(i)->Clone() );
return obj;
}
void EatWhiteSpace( std::string& str )
{
int nLen = ( int ) str.size();
for( int i = 0; i < nLen; )
{
if( str[ i ] == '\r' || str[ i ] == '\n' || str[ i ] == '\t' || str[ i ] == ' ' )
{
str.erase( i );
nLen--;
}
else
{
break;
}
}
for( int i = nLen - 1; i >= 0; )
{
if( str[ i ] == '\r' || str[ i ] == '\n' || str[ i ] == '\t' || str[ i ] == ' ' )
{
str.erase( i );
i--;
}
else
{
break;
}
}
}
void KSequencer::LoadProp( const char* szProperty )
{
int nLen = strlen( szProperty );
if( nLen == 0 )
return;
while( CreateNewProp( szProperty ) );
}
bool KSequencer::CreateNewProp( const char*& pPropStr )
{
int nLen = strlen( pPropStr );
bool bOpened = false;
std::string strPropName;
int i = 0;
KSeqProp prop;
for( ; i < nLen; i++ )
{
if( pPropStr[ i ] == '[' )
{
bOpened = true;
continue;
}
if( bOpened && pPropStr[ i ] == ']' )
{
bOpened = false;
continue;
}
if( !bOpened && !strPropName.empty() )
break;
if( bOpened )
strPropName.push_back( pPropStr[ i ] );
}
pPropStr += i;
if( bOpened )
strPropName.clear();
if( strPropName.empty() )
goto END;
EatWhiteSpace( strPropName );
prop.strName = strPropName;
while( LoadPropAttrib( prop, pPropStr ) );
m_vProps.push_back( prop );
END:
if( strlen( pPropStr ) > 0 )
return true;
else
return false;
}
bool KSequencer::LoadPropAttrib( KSeqProp& rProp, const char*& pPropStr )
{
int nLen = strlen( pPropStr );
std::string strName, strValue;
bool bMoveToValue = false;
int i = 0;
KSeqPropAttrib attrib;
for( ; i < nLen; i++ )
{
if( pPropStr[ i ] == '=' )
{
bMoveToValue = true;
continue;
}
if( pPropStr[ i ] == '\n' )
{
i++;
break;
}
if( !bMoveToValue )
strName.push_back( pPropStr[ i ] );
else
strValue.push_back( pPropStr[ i ] );
}
pPropStr += i;
if( strName.empty() || strValue.empty() )
goto END;
EatWhiteSpace( strName );
EatWhiteSpace( strValue );
attrib.strName = strName;
attrib.strValue = strValue;
rProp.vAttribs.push_back( attrib );
END:
if( strlen( pPropStr ) > 0 )
return true;
else
return false;
}
const char* KSequencer::GetAttribValue( const char* szPropName, const char* szAttribName)
{
int numProps = ( int ) m_vProps.size();
for( int i = 0; i < numProps; i++ )
{
if( strcmp( szPropName, m_vProps[ i ].strName.c_str() ) == 0 )
{
int numAttribs = ( int ) m_vProps[ i ].vAttribs.size();
for( int j = 0; j < numAttribs; j++ )
{
if( strcmp( szAttribName, m_vProps[ i ].vAttribs[ j ].strName.c_str() ) == 0 )
return m_vProps[ i ].vAttribs[ j ].strValue.c_str();
}
}
}
return NULL;
}