int CSfx::SetSfx( LPDIRECT3DDEVICE9 pd3dDevice, int nIndex, D3DXVECTOR3& vPosSrc, OBJID idSrc, D3DXVECTOR3& vPosDest, OBJID idDest, int nSec ) { m_idSrc = idSrc; m_idDest = idDest; m_vPosDest = vPosDest; m_nSec = nSec; vPosSrc.y += 0.01f; // 지면에서 약간 띄워주자. 안그러면 밑에 뭍혀서 지글거림. SetPos( vPosSrc ); if( nIndex >= 0 ) { #ifndef __WORLDSERVER SetTypeIndex( pd3dDevice, OT_SFX, nIndex,TRUE); m_pSfxObj = (CSfxModel*)m_pModel; #endif // __WORLDSERVER return 1; } UpdateLocalMatrix(); if( m_pSfxObj ) return 1; return 0; }
Matrix4 TransformComponent::GetLocalMatrix() { if (m_LocalMatrixChanged == true) { UpdateLocalMatrix(); } return m_LocalMatrix; }
void CShipLoop::Process() { D3DXMatrixInverse( GetInvTM(), NULL, &m_matWorld ); // 좌표변환이 이뤄지기전 매트릭스로 역행렬을 구해놔야 한다. D3DXVECTOR3 vPos = GetPos(); D3DXVECTOR3 vDeltaAccu; FLOAT fAng = GetAngle(); vDeltaAccu = D3DXVECTOR3(0, 0, 0); // 누적 벡터는 항상 초기화 해줘야 한다. m_fDeltaAng = 0.07f; #ifdef __X15 int i; for( i = 0; i < 4; i ++ ) #endif { fAng += m_fDeltaAng; // 왼쪽으로 계속 회전 AngleToVectorXZ( &m_vAcc, fAng, 0.05f ); // fAng방향으로 추진력발생. vDeltaAccu += m_vAcc; // 서버 15프레임에서만 사용되는 것으로 4번을 누적함. } m_vDelta = vDeltaAccu; vPos += m_vDelta; SetPos( vPos ); SetAngle( fAng ); #ifdef __WORLDSERVER if( (m_nCount & 127) == 0 ) { OBJID idCtrl = NULL_ID; g_UserMng.AddSetPosAngle( this, GetPos(), GetAngle() ); // 먼저 this(Ship)의 위치를 sync시킴. // 링크되어 있는 모든 ctrl의 위치를 다시 sync시킴. for( i = 0; i < MAX_LINKCTRL; i ++ ) { if( m_LinkCtrl[i] == 0 ) continue; idCtrl = m_LinkCtrl[i]; CCtrl *pCtrl = prj.GetCtrl( idCtrl ); if( IsValidObj( pCtrl ) ) { if( pCtrl->GetIAObjLink() == this ) g_UserMng.AddSetPosAngle( pCtrl, pCtrl->GetPos(), pCtrl->GetAngle() ); // this(Ship)의 위치를 sync시킴. else RemoveCtrl( pCtrl->GetId() ); } } } #endif // IA오브젝트는 다른 오브젝트를 태우고 다녀야 하므로 // 실시간으로 매트릭스가 갱신되어야 한다. UpdateLocalMatrix(); m_nCount ++; }
void Transform3DComponent::UpdateWorldMatrix() { UpdateLocalMatrix(); if (m_pParentTransform != nullptr) { m_WorldMatrix = m_LocalMatrix * m_pParentTransform->GetWorldMatrix(); } else { m_WorldMatrix = m_LocalMatrix; } }
BOOL CSfx::SetIndex( LPDIRECT3DDEVICE9 pd3dDevice, DWORD dwIndex, BOOL bInitProp ) { BOOL bResult = FALSE; m_idSrc = NULL_ID; m_idDest = NULL_ID; m_vPosDest = D3DXVECTOR3( 0, 0, 0); if( dwIndex >= 0 ) { #ifndef __WORLDSERVER bResult = SetTypeIndex( pd3dDevice, OT_SFX, dwIndex, bInitProp ); m_pSfxObj = (CSfxModel*)m_pModel; #endif // __WORLDSERVER } UpdateLocalMatrix(); return bResult; }
void CShip::Process() { D3DXMatrixInverse( GetInvTM(), NULL, &m_matWorld ); // 좌표변환이 이뤄지기전 매트릭스로 역행렬을 구해놔야 한다. D3DXVECTOR3 vPos = GetPos(); D3DXVECTOR3 vDeltaAccu; vDeltaAccu = D3DXVECTOR3(0, 0, 0); // 누적 벡터는 항상 초기화 해줘야 한다. #ifdef __X15 int i; for( i = 0; i < 4; i ++ ) #endif { m_Act.Process(); // 오브젝트의 현재움직임 상태를 수행. m_vDeltaUnit += m_vAcc; // 현재 속도에 새로운 힘을 더함. m_vDeltaUnit *= (1.0f - FRIC_AIR); vDeltaAccu += m_vDeltaUnit; // 서버 15프레임에서만 사용되는 것으로 4번을 누적함. } #ifdef __CLIENT FLOAT fLenSq = D3DXVec3Length( &m_vDelta ); // 1/60 sec 속도 extern int g_nFlySpeed; if( m_pMover->IsActiveMover() ) { g_nFlySpeed = (int)( (fLenSq * 60.0f) * 60.0f * 60.0f ); g_nFlySpeed = (int)( g_nFlySpeed / 200.0f ); } #endif m_vDelta = vDeltaAccu; // 이번프레임의 this 이동량이된다. 항상 m_vDelta에 최종 이동량이 들어가게 하자. vPos += m_vDelta; SetPos( vPos ); m_fDeltaAng = m_fAccAng; // IA오브젝트는 다른 오브젝트를 태우고 다녀야 하므로 // 실시간으로 매트릭스가 갱신되어야 한다. UpdateLocalMatrix(); }