#include "SunClientPrecompiledHeader.h" #include "ObjectEffectData.h" #include "GlobalData.h" #include #include "EventInfo.h" #include "GameFunc.h" #include "GlobalFunc.h" ObjectEffectData::ObjectEffectData() { } void ObjectEffectData::Initialize() { for( int i=0;i!=MAX_TRAIL; ++i ) { m_bTrailActivate[i] = FALSE; m_hTrailEffect[i] = INVALID_HANDLE_VALUE; ZeroMemory(&m_arTrailParam[i], sizeof(TRAIL_PARAM) ); } for ( int i = 0; i < MAX_EFFECT_BUFFER; ++i) { for (int j = 0; j < MAX_OBJECT_EFFECT; ++j) { m_EffectParam[i][j].hEffect = INVALID_HANDLE_VALUE; m_EffectParam[i][j].iBoneIndex = 0; m_EffectParam[i][j].bRotateWithBone = FALSE; m_EffectParam[i][j].bLoopEffect = FALSE; m_EffectParam[i][j].bOnlyPosition = FALSE; m_EffectParam[i][j].bRotateWithBone = FALSE; m_EffectParam[i][j].EffectID = 0; ZeroMemory(&m_EffectParam[i][j].quatRot, sizeof(WzQuaternion)); ZeroMemory(&m_EffectParam[i][j].vOffset, sizeof(WzVector)); ZeroMemory(&m_EffectParam[i][j].vScale, sizeof(WzVector)); } } } void ObjectEffectData::Release() { EndTrail(0); EndTrail(1); ReleaseAllEffect(); } void ObjectEffectData::StartTrail( int TrailIndex, const TRAIL_PARAM& TrailParam, HANDLE hEffect ) { //assert(TrailIndex >= 0 && TrailIndex < MAX_TRAIL); m_arTrailParam[TrailIndex] = TrailParam; m_hTrailEffect[TrailIndex] = hEffect; CEffectBody* pBody = g_pEffectManager->GetEffectPtrHandle( hEffect ); if( pBody == NULL ) { //! frame¿¡ µû¶ó¼­ effect¸¦ »ý¼º ¾ÈÇÒ¼öµµ ÀÖÀ½.(ÁÖ¼®Á¦°Å) //assert(!"°Ë±â ÀÌÆåÆ®¸¦ »ý¼ºÇÏÁö ¸øÇß½À´Ï´Ù"); return; } pBody->SetRenderType(AR_REFRACTION_GLASS); pBody->SetRefractionRate(1.0f); // ±¼Àý·ü.(0¿¡ °¡±î¿ö Áú¼ö·Ï Åõ¸í) pBody->SetRefractionAlpha(1.0f); // 1.0 ¿¡ °¡±î¿öÁú¼ö·Ï º» À̹ÌÁö¿¡ °¡±î¿öÁü m_bTrailActivate[TrailIndex] = TRUE; if( CEElementFlatChain* pFChain = pBody->GetFlatChainPtr() ) { pFChain->SetLifeInfo(0, 30000); pFChain->SetTailNum(TrailParam.iTailNum); pFChain->SetSplineLength(0.1f); } else { //assert(!"°Ë±â ÀÌÆåÆ®¸¦ »ý¼ºÇÏÁö ¸øÇß½À´Ï´Ù"); return; } } void ObjectEffectData::EndTrail( int TrailIndex ) { assert(TrailIndex >= 0 && TrailIndex < MAX_TRAIL); if ( m_hTrailEffect[TrailIndex] != INVALID_HANDLE_VALUE) { if (m_bTrailActivate[TrailIndex] == TRUE ) { g_pEffectManager->RemoveEffectPtr(m_hTrailEffect[TrailIndex]); m_hTrailEffect[TrailIndex] = INVALID_HANDLE_VALUE; m_bTrailActivate[TrailIndex] = FALSE; } } } int ObjectEffectData::GetTrailAttachmentIndex( int TrailIndex ) { TrailIndex = min( TrailIndex, MAX_TRAIL-1 ); TrailIndex = max( 0, TrailIndex); return m_arTrailParam[TrailIndex].iAttachmentIndex; } void ObjectEffectData::UpdateTrail( int TrailIndex, const WzVector& Position1, const WzVector& Position2 ) { HANDLE hEffect = m_hTrailEffect[TrailIndex]; if( hEffect == INVALID_HANDLE_VALUE ) return; if( CEffectBody* pBody = g_pEffectManager->GetEffectPtrHandle(hEffect) ) { if( CEElementFlatChain* pFChain = pBody->GetFlatChainPtr() ) { pFChain->SetPosition( Position1, Position2 ); } } else { m_hTrailEffect[TrailIndex] = INVALID_HANDLE_VALUE; m_bTrailActivate[TrailIndex] = FALSE; } } void ObjectEffectData::ReleaseAllEffect() { for (int i = 0; i < MAX_EFFECT_BUFFER; ++i) { for (int j = 0; j < MAX_OBJECT_EFFECT; ++j) { ReleaseEffect( j, i ); } } } void ObjectEffectData::ReleaseLoopEffect() { for (int i = 0; i < MAX_EFFECT_BUFFER; ++i) { for (int j = 0; j < MAX_OBJECT_EFFECT; ++j) { if( m_EffectParam[i][j].hEffect != INVALID_HANDLE_VALUE ) { if( CEffectBody* pBody = g_pEffectManager->GetEffectPtrHandle(m_EffectParam[i][j].hEffect) ) { if( pBody->IsLoop() == true ) { ReleaseEffect(j,i); } } } } } } void ObjectEffectData::ReleaseEffect( int Index, int BufferIndex ) { //assert(Index >= 0 && Index < MAX_OBJECT_EFFECT); if (m_EffectParam[BufferIndex][Index].hEffect != INVALID_HANDLE_VALUE) { g_pEffectManager->RemoveEffectPtr(m_EffectParam[BufferIndex][Index].hEffect); m_EffectParam[BufferIndex][Index].hEffect = INVALID_HANDLE_VALUE; m_EffectParam[BufferIndex][Index].iBoneIndex = 0; m_EffectParam[BufferIndex][Index].bRotateWithBone = FALSE; m_EffectParam[BufferIndex][Index].EffectID = 0; m_EffectParam[BufferIndex][Index].bLoopEffect = FALSE; } } void ObjectEffectData::ReleaseCurEffect(int Index) { //¶óÀÌÇÁŸÀÓÀÌ »ì¾ÆÀÖ´Â ÀÌÆåÆ®À϶§´Â ¹Ù·Î Á¦°ÅÇÏÁö¸»±¸ //¼Ò¸êÇÒ¶§±îÁö PRE_EFFECT¿¡ ÀúÀåÇÑµÚ ¼Ò¸ê½ÃŲ´Ù. if(m_EffectParam[CUR_EFFECT][Index].hEffect!=INVALID_HANDLE_VALUE) { if( CEffectBody* pBody = g_pEffectManager->GetEffectPtrHandle(m_EffectParam[CUR_EFFECT][Index].hEffect) ) { //Áߺ¹Çؼ­ ¶Ç ÀÌÆåÆ® µé¾î¿Â´Ù¸é PRE_EFFECT´Â ÇØÁ¦ÇÑ´Ù ReleaseEffect( Index, PRE_EFFECT ); //Áߺ¹ÀÌÆåÆ®´Â Á¦°ÅÇÑ´Ù. if(pBody->IsLoop()) { return; } m_EffectParam[PRE_EFFECT][Index].iBoneIndex = m_EffectParam[CUR_EFFECT][Index].iBoneIndex; m_EffectParam[PRE_EFFECT][Index].vOffset = m_EffectParam[CUR_EFFECT][Index].vOffset; m_EffectParam[PRE_EFFECT][Index].quatRot = m_EffectParam[CUR_EFFECT][Index].quatRot; m_EffectParam[PRE_EFFECT][Index].vScale = m_EffectParam[CUR_EFFECT][Index].vScale; m_EffectParam[PRE_EFFECT][Index].bRotateWithBone= m_EffectParam[CUR_EFFECT][Index].bRotateWithBone; m_EffectParam[PRE_EFFECT][Index].bOnlyPosition = m_EffectParam[CUR_EFFECT][Index].bOnlyPosition; m_EffectParam[PRE_EFFECT][Index].hEffect = m_EffectParam[CUR_EFFECT][Index].hEffect; } } } BOOL ObjectEffectData::BeginEffect( CWzUnitDraw* pUnitDraw, const WzVector& Position, const WzVector& Direction, const EffectEventInfo& EffectEventInfo, DWORD ObjectKey ) { int EffectIndex = EffectEventInfo.GetEventIndex(); EFFECT_PARAM& CurEffectParam = m_EffectParam[CUR_EFFECT][EffectIndex]; // 1. ÀÌÆåÆ® Çڵ鿡 ´ëÇÑ Ã³¸® HANDLE hEffect = INVALID_HANDLE_VALUE; if (CurEffectParam.bLoopEffect == TRUE && (CurEffectParam.EffectID == EffectEventInfo.GetEffectID())) { // ·çÇÁ ÀÌÆåÆ®À̸ç, ÇöÀç ÀÌÆåÆ®¿Í °°À¸¸é ±×´ë·Î »ç¿ë hEffect = CurEffectParam.hEffect; } else { // ÇöÀç ÁøÇàÁßÀÎ ÀÌÆåÆ®¸¦ Á¦°ÅÇÑ´Ù. ReleaseEffect( EffectIndex, CUR_EFFECT ); WzVector EffectPosition = Position; // º» À§Ä¡¸¦ »ç¿ë ÇÏ´Â °æ¿ì º»ÀÇ À§Ä¡¸¦ ±¸ÇÑ´Ù. if( EffectEventInfo.GetBoneIndex() > 0 ) { if( GameFunc::GetBonePos( pUnitDraw, EffectEventInfo.GetBoneIndex(), &EffectPosition) == FALSE ) { return FALSE; } } // ÀÌÆåÆ® »ý¼º hEffect = GlobalFunc::CreateEffectBeUpToOption( EffectEventInfo.GetEffectID(), EffectPosition, ObjectKey ); } // 2. ÇÚµé°ú À̺¥Æ®ÀÇ ¼ºÁ¤µÈ Á¤º¸¸¦ ¼³Á¤ CurEffectParam.hEffect = hEffect; CurEffectParam.iBoneIndex = EffectEventInfo.GetBoneIndex();; CurEffectParam.vOffset = EffectEventInfo.GetEffectPosition(); CurEffectParam.vScale = EffectEventInfo.GetEffectScale(); CurEffectParam.quatRot = EffectEventInfo.GetEffectQuaternion(); // 3. ¿É¼Ç¿¡ µû¸¥ Àû¿ë // 200À϶§ ȸÀüÀû¿ë¹« ¿ÀÁ÷ À§Ä¡·Î¸¸ if ( EffectEventInfo.IsLocationOnly() == true ) { CurEffectParam.bOnlyPosition = TRUE; CurEffectParam.bRotateWithBone = FALSE; } else if ( EffectEventInfo.IsRotate() == true ) { CurEffectParam.bOnlyPosition = FALSE; CurEffectParam.bRotateWithBone = TRUE; } else { CurEffectParam.bRotateWithBone = CurEffectParam.bOnlyPosition = FALSE; } // 4. ½ÇÁ¦ ÀÌÆåÆ®¿¡ Àû¿ë if( CEffectBody* effect_body = g_pEffectManager->GetEffectPtrHandle( hEffect) ) { CurEffectParam.EffectID = EffectEventInfo.GetEffectID(); // ÀÌÆåÆ®°¡ »ý¼º µÈ ÈÄ¿¡ ÀÌÆåÆ® ¾ÆÀ̵𸦠¼³Á¤ CurEffectParam.bLoopEffect = effect_body->IsLoop(); // ·çÇÁ ¿©ºÎ´Â ÀÌÆåÆ®ÀÇ ¼³Á¤¿¡¼­ °¡Á®¿È WzVector world_pos; WzMatrix mat_rot; MatrixIdentity(&mat_rot); if( CurEffectParam.iBoneIndex == -1 ) // ±âº» À§Ä¡¿¡ »ý¼ºÇÏ´Â °æ¿ì { world_pos = Position; if (CurEffectParam.bOnlyPosition) { //º» ȸÀüÀû¿ë¾ÈÇÔ MatrixIdentity(&mat_rot); } else { WzVector rotation = {0.f, 0.f, Math_GetAngleFromVector(&Direction)}; MatrixRotationZYX(&mat_rot, &rotation); // ·ÎÅ×À̼ÇÀÌ Àû¿ëµÈ Offset¸¸Å­ À̵¿ VectorTransformCoord(&rotation, &CurEffectParam.vOffset, &mat_rot); world_pos += rotation; } } else if( CurEffectParam.iBoneIndex == -2 ) // °íÁ¤µÈ À§Ä¡¿¡ »ý¼ºÇÏ´Â °æ¿ì { world_pos = Position + CurEffectParam.vOffset; CurEffectParam.bOnlyPosition = FALSE; CurEffectParam.bRotateWithBone = FALSE; WzVector rotation = {0.f, 0.f, Math_GetAngleFromVector(&Direction)}; MatrixRotationZYX(&mat_rot, &rotation); // ·ÎÅ×À̼ÇÀÌ Àû¿ëµÈ Offset¸¸Å­ À̵¿ VectorTransformCoord(&rotation, &CurEffectParam.vOffset, &mat_rot); world_pos += rotation; } else // º»À§Ä¡¸¦ ±âÁØÀ¸·Î »ý¼ºÇÏ´Â °æ¿ì { WzMatrix mat; if( GameFunc::GetBoneMatrix( pUnitDraw, EffectEventInfo.GetBoneIndex(), &mat ) == FALSE ) { return FALSE; } VectorTransformCoord(&world_pos, &CurEffectParam.vOffset, &mat ); if (CurEffectParam.bOnlyPosition) { //º» ȸÀüÀû¿ë¾ÈÇÔ MatrixIdentity(&mat_rot); } else if(CurEffectParam.bRotateWithBone) { //º» ȸÀüÀû¿ë WzMatrix tmep_mat; QuaternionToMatrix(&tmep_mat, &CurEffectParam.quatRot); MatrixMultiply( &mat_rot, &tmep_mat, &mat); mat_rot._42 =mat_rot._41 = mat_rot._43 = 0.0f; } else { // ȸÀüÀû¿ë WzVector rotation = {0.f, 0.f, Math_GetAngleFromVector(&Direction)}; MatrixRotationZYX(&mat_rot, &rotation); } } // À§Ä¡Çà·Ä WzMatrix mat_pos; MatrixTranslation( &mat_pos, world_pos.x, world_pos.y, world_pos.z ); // ½ºÄÉÀÏ WzMatrix mat_scale; MatrixScaling(&mat_scale, CurEffectParam.vScale.x, CurEffectParam.vScale.y, CurEffectParam.vScale.z); effect_body->SetResultMatrix( &mat_pos, &mat_rot, &mat_scale); return TRUE; } return FALSE; } void ObjectEffectData::UpdateEffect( CWzUnitDraw* pUnitDraw, const WzVector& Position, const WzVector& Direction ) { static const int FORCE_TRANSFROM = -2; for ( int i=0; i < GetEffectBufferCount(); ++i ) { for ( int j = 0; j < GetEffectCount(); ++j ) { EFFECT_PARAM& EffectParam = m_EffectParam[i][j]; if (EffectParam.hEffect != INVALID_HANDLE_VALUE) { if ( CEffectBody* pBody = g_pEffectManager->GetEffectPtrHandle(EffectParam.hEffect) ) { // º»Àνº°ªÀÌ °­Á¦ º¯È¯À϶§´Â °»½ÅÇÏÁö¾Ê´Â´Ù if (EffectParam.iBoneIndex == FORCE_TRANSFROM) { continue; } WzVector wvPos, wvWorldPos; WzMatrix wmPosMat, wmRotMat, wmRot, wmScale, mat; wvPos = EffectParam.vOffset; if( EffectParam.iBoneIndex == -1 ) { wvWorldPos = Position; WzVector rotation = {0.f, 0.f, Math_GetAngleFromVector(&Direction)}; MatrixRotationZYX(&wmRotMat, &rotation); // ·ÎÅ×À̼ÇÀÌ Àû¿ëµÈ Offset¸¸Å­ À̵¿ VectorTransformCoord(&rotation, &EffectParam.vOffset, &wmRotMat); wvWorldPos += rotation; } else { if( GameFunc::GetBoneMatrix( pUnitDraw, EffectParam.iBoneIndex, &mat ) == FALSE ) { continue; } VectorTransformCoord( &wvWorldPos, &wvPos, &mat ); } MatrixTranslation( &wmPosMat, wvWorldPos.x, wvWorldPos.y, wvWorldPos.z ); if(EffectParam.bOnlyPosition) { MatrixIdentity( &wmRotMat ); } else if( EffectParam.bRotateWithBone ) { QuaternionToMatrix( &wmRot, &EffectParam.quatRot ); MatrixMultiply( &wmRotMat, &wmRot, &mat ); wmRotMat._41 = 0.0f; wmRotMat._42 = 0.0f; wmRotMat._43 = 0.0f; } else { MatrixIdentity( &wmRotMat ); WzVector vPos; vPos = wvWorldPos; WzVector vDest,vTemp; vDest = vPos + Direction*10.0f; vDest = vDest - vPos; vTemp = vDest; vTemp.z = 0.0f; float fLength; if (vTemp.x == 0.0f && vTemp.y == 0.0f) { fLength = 0.0f; } else { fLength = VectorLength(&vTemp); } WzVector vRot; vRot.x = -atan2(vDest.z,fLength); vRot.z = Math_GetAngleFromVector(&vDest); vRot.y = 0.0f; MatrixRotationZYX(&wmRotMat,&vRot); } MatrixScaling( &wmScale, EffectParam.vScale.x, EffectParam.vScale.y, EffectParam.vScale.z ); pBody->SetResultMatrix( &wmPosMat, &wmRotMat, &wmScale ); } else { //ÀÚµ¿ NULL¼ÂÆÃ EffectParam.hEffect = INVALID_HANDLE_VALUE; } } } } }