bool ZActor::ProcessMotion(float fDelta) { if (!m_pVMesh) return false; m_pVMesh->Frame(); rvector pos = m_Position; rvector dir = m_Direction; dir.z = 0; rmatrix world; MakeWorldMatrix(&world,rvector(0,0,0), dir,rvector(0,0,1)); rvector MeshPosition ; MeshPosition = pos; MakeWorldMatrix(&world,pos,dir,rvector(0,0,1)); m_pVMesh->SetWorldMatrix(world); UpdatePosition(fDelta); if(IsActiveModule(ZMID_LIGHTNINGDAMAGE)==false) { if (m_pVMesh->isOncePlayDone()) { m_Animation.Input(ZA_ANIM_DONE); } } return true; }
rvector ZRangeWeaponHitDice::ReturnShotDir() { MakeHitProbability(); rvector vTargetPos = m_TargetPosition; float fRandX=0.0f, fRandY=0.0f; float fRandMaxX = m_fTargetWidth+50.0f; float fRandMaxY = m_fTargetHeight+20.0f; if (RandomNumber(0.0f, 1.0f) <= m_fHitProbability) { float fHeight = m_fTargetHeight * 0.6f * 0.5f; float fWidth = m_fTargetWidth * 0.6f * 0.5f; // ИэСп fRandX = RandomNumber(-fWidth, fWidth); fRandY = RandomNumber(-fHeight, fHeight); } else { float fHeight = m_fTargetHeight * 0.8f * 0.5f; float fWidth = m_fTargetWidth * 0.8f * 0.5f; fRandX = RandomNumber(fWidth, fRandMaxX); fRandY = RandomNumber(fHeight, fRandMaxY); int dice = Dice(1, 2, 0); if (dice == 1) fRandX = -fRandX; dice = Dice(1, 2, 0); if (dice == 1) fRandY = -fRandY; } rmatrix mat; rvector modelDir = vTargetPos - m_SourcePosition; Normalize(modelDir); rvector tar(0,0,0); tar.x += fRandX; tar.y += fRandY; MakeWorldMatrix(&mat, m_TargetPosition, modelDir, rvector(0,0,1)); tar = TransformCoord(tar, mat); rvector dir = tar - m_SourcePosition; Normalize(dir); return dir; }
bool ZEffectAniMesh::Draw(unsigned long int nTime) { if(m_VMesh.m_pMesh==NULL) return false; AniFrameInfo* pInfo = m_VMesh.GetFrameInfo(ani_mode_lower); if(pInfo->m_pAniSet==NULL)// m_VMesh.m_pAniSet[0]==NULL return false; if(nTime < m_nStartTime + m_nStartAddTime) { return true; } // 그리기가 연기 된경우 지금 상태의 캐릭터 데이터를 참조.. if( m_bDelay && !m_isCheck ) { ZObject* pObj = ZGetObjectManager()->GetObject(m_uid); ZCharacterObject* pCObj = MDynamicCast(ZCharacterObject, pObj); if(pCObj) { if(!pCObj->IsRendered()) return false; rvector _vp = pCObj->GetPosition(); rvector _vdir = pCObj->m_Direction; _vdir.z = 0; Normalize(_vdir); /* int cm = g_pGame->SelectSlashEffectMotion(pObj);//남녀 칼 휘두르는 방향 if(cm==SEM_ManSlash5) { _vdir.z = 0.f; _vp += _vdir * 120.f; _vp.z -= 100.f; } else if(cm==SEM_WomanSlash5) { _vdir.z = 0.f; _vp += _vdir * 200.f; _vp.z -= 80.f; } */ m_Pos = _vp; m_Dir = _vdir; } m_isCheck = true; } DWORD dwDiff = nTime - m_nStartTime; // float fSec = (float)dwDiff/1000.0f; // float fOpacity = (SC_LIFETIME-dwDiff)/(float)SC_LIFETIME; rvector Dir; rvector Up=m_Up; if (m_nAlignType == 0) { Dir = -RCameraDirection; } else if( m_nAlignType == 1 ) { Dir = m_DirOrg; } else if( m_nAlignType == 2 ) { Dir = rvector( 0,1,0 ); Up = rvector( 0,0,1 ); } CheckCross(Dir,Up); rmatrix World; MakeWorldMatrix(&World, m_Pos, Dir, Up); rmatrix Rotation; D3DXMatrixRotationZ(&Rotation,m_fRotateAngleZ); World = Rotation * World; D3DXMatrixRotationY(&Rotation,m_fRotateAngleY); World = Rotation * World; m_VMesh.SetScale(m_Scale); m_VMesh.SetWorldMatrix(World); m_VMesh.Frame(); // 시간은 흘러 가야 한다~ if(m_bRender) { m_VMesh.Render(); m_bisRendered = m_VMesh.m_bIsRender; } else m_bisRendered = false; if( m_nAutoAddEffect != ZEffectAutoAddType_None ) { rvector vPos; RMeshNode* pNode = NULL; if(m_nAutoAddEffect == ZEffectAutoAddType_Methor ) { pNode = m_VMesh.m_pMesh->GetMeshData("methor"); vPos.x = pNode->m_mat_result._41; vPos.y = pNode->m_mat_result._42; vPos.z = pNode->m_mat_result._43; // static rmatrix _mrot = RGetRotY(180) * RGetRotX(90); static rmatrix _mrot = RGetRotX(90); vPos = vPos * _mrot; vPos += m_Pos; if(m_vBackupPos != vPos) { ZGetEffectManager()->AddTrackMethor(vPos); m_vBackupPos = vPos; } } } if( m_nLifeTime != -1 && m_bLoopType ) {// 소멸 시간이 정해져 있고..에니메이션이 루프 타잎인 경우.. if(m_VMesh.isOncePlayDone()) if(nTime > m_nStartTime + m_nLifeTime) { return false; } } else { if(m_VMesh.isOncePlayDone()) { return false; } } return true; }
////////////////////////////////////////////////////////////////////////// // CreateFromMeshNode ////////////////////////////////////////////////////////////////////////// void ZClothEmblem::CreateFromMeshNode( RMeshNode* pMeshNdoe_ , ZWorld* pWorld) { int i, nIndices; rvector vecDistance; mpMeshNode = pMeshNdoe_; m_nCntP = mpMeshNode->m_point_num; m_nCntC = mpMeshNode->m_face_num * 3 ; // Initialize m_pX = new rvector[m_nCntP]; m_pOldX = new rvector[m_nCntP]; m_pForce = new rvector[m_nCntP]; m_pHolds = new int [m_nCntP]; m_pWeights = new float [m_nCntP]; m_pNormal = new rvector[m_nCntP]; m_pConst = new sConstraint[m_nCntC]; memset( m_pForce , 0, sizeof(rvector)* m_nCntP ); memset( m_pHolds , 0, sizeof(bool) * m_nCntP ); memset( m_pWeights , 0, sizeof(float) * m_nCntP ); nIndices = pMeshNdoe_->m_face_num*3; //if( bHardwareBuffer ) //{ // SAFE_RELEASE(mIndexBuffer); // if( FAILED( RGetDevice()->CreateIndexBuffer(nIndices*sizeof(USHORT),0,D3DFMT_INDEX16,D3DPOOL_MANAGED,&mIndexBuffer))) // { // mlog( "Fail to Restore Index Buffer for Emblems..\n" ); // bHardwareBuffer = false; // } //} rmatrix World; rvector Pos = mpMeshNode->m_mat_base; rvector Dir = rvector(0,-1,0); rvector Up = rvector(0,0,1); MakeWorldMatrix(&World, Pos, Dir, Up); mWorldMat = mpMeshNode->m_mat_result * World; D3DXVECTOR4 rVec; for( i = 0 ; i < mpMeshNode->m_point_num; ++i ) { D3DXVec3Transform( &rVec, &mpMeshNode->m_point_list[i], &mWorldMat ); mpMeshNode->m_point_list[i] = (rvector)rVec; } // Copy Vertex memcpy( m_pX, mpMeshNode->m_point_list, sizeof(rvector) * m_nCntP ); memcpy( m_pOldX, mpMeshNode->m_point_list, sizeof(rvector) * m_nCntP ); // Build Constraints for( i = 0 ; i < mpMeshNode->m_face_num; ++i ) { for( int j = 0 ; j < 3; ++j ) { m_pConst[ i*3 + j ].refA = mpMeshNode->m_face_list[i].m_point_index[j]; if( j + 1 >= 3 ) { m_pConst[ i*3 + j ].refB = mpMeshNode->m_face_list[i].m_point_index[0]; } else { m_pConst[ i*3 + j ].refB = mpMeshNode->m_face_list[i].m_point_index[j+1]; } vecDistance = mpMeshNode->m_point_list[m_pConst[ i*3 + j ].refA] - mpMeshNode->m_point_list[m_pConst[ i*3 + j ].refB]; m_pConst[ i*3 + j ].restLength = D3DXVec3Length(&vecDistance); //g_index_buffer[i*3+j] = (USHORT)m_pConst[i*3+j].refA; } } // if( bHardwareBuffer ) // { // void* pIndices; // if(FAILED( mIndexBuffer->Lock(0,sizeof(USHORT)*nIndices,(VOID**)&pIndices,0))) // { // bHardwareBuffer = false; // mlog("Fail to Lock Index Buffer\n"); // } // else // { // memcpy( pIndices, g_index_buffer, sizeof(USHORT)*nIndices); // mIndexBuffer->Unlock(); // } // //// delete uIndexList; // } _ASSERT( mpMeshNode->m_point_color_num ); for( i = 0 ; i < m_nCntP; ++i ) { m_pHolds[i] = CLOTH_VALET_ONLY; // 만약 붉은색 성분이 있으면 & Exclusive with other Attribute... if( mpMeshNode->m_point_color_list[i].x != 0 ) { m_pHolds[i] = CLOTH_HOLD; } else { // 만약 파란색 성분이 있으면 : 힘! //if( mpMeshNode->m_point_color_list[i].z != 0 ) { m_pHolds[i] |= CLOTH_FORCE; } // 만약 녹색 성분이 있으면 : 충돌! if( mpMeshNode->m_point_color_list[i].y != 0 ) { m_pHolds[i] |= CLOTH_COLLISION; } } } // RLightList* pLightList = ZGetGame()->GetWorld()->GetBsp()->GetObjectLightList(); m_pWorld = pWorld; RLightList* pLightList = m_pWorld->GetBsp()->GetObjectLightList(); float minDistance = 999999; float fTemp; RLIGHT *pSelectedLight = 0; for(RLightList::iterator itor = pLightList->begin(); itor != pLightList->end(); ++itor ) { RLIGHT *pLight = *itor; fTemp = D3DXVec3Length( &(pLight->Position - m_pX[0]) ); if( fTemp < minDistance ) { minDistance = fTemp; pSelectedLight = pLight; } } mpLight = new D3DLIGHT9; memset( mpLight, 0, sizeof(D3DLIGHT9)); mpLight->Ambient.r = 0.3; mpLight->Ambient.g = 0.3; mpLight->Ambient.b = 0.3; if( pSelectedLight!=0 && minDistance < pSelectedLight->fAttnEnd ) { mpLight->Type = D3DLIGHT_POINT; mpLight->Diffuse.r = pSelectedLight->Color.x * pSelectedLight->fIntensity; mpLight->Diffuse.g = pSelectedLight->Color.y * pSelectedLight->fIntensity; mpLight->Diffuse.b = pSelectedLight->Color.z * pSelectedLight->fIntensity; mpLight->Position = pSelectedLight->Position; mpLight->Range = pSelectedLight->fAttnEnd; mpLight->Attenuation1 = 0.0001f; } else // 가까운 곳에 빛이 없으면 기본 라이팅 적용 { mpLight->Type = D3DLIGHT_DIRECTIONAL; mpLight->Diffuse.r = 0.1f; mpLight->Diffuse.g = 0.1f; mpLight->Diffuse.b = 0.1f; mpLight->Direction = rvector( 1, 1, 1 ); mpLight->Attenuation1 = 0.0f; mpLight->Attenuation0 = 0.0f; mpLight->Range = 0.0f; } //PreCalculate AABB float mostSmallX, mostSmallY, mostSmallZ; float mostBigX, mostBigY, mostBigZ; mostSmallX = mostSmallY = mostSmallZ = 9999999; mostBigX = mostBigY = mostBigZ = -9999999; rvector* pCurr; for( i = 0 ; i < m_nCntP; ++i ) { pCurr = &mpMeshNode->m_point_list[i]; mostSmallX = min( mostSmallX, pCurr->x ); mostSmallY = min( mostSmallY, pCurr->y ); mostSmallZ = min( mostSmallZ, pCurr->z ); mostBigX = max( mostBigX, pCurr->x ); mostBigY = max( mostBigY, pCurr->y ); mostBigZ = max( mostBigZ, pCurr->z ); } mAABB.vmin = rvector( mostSmallX - RESERVED_SPACE, mostSmallY - RESERVED_SPACE, mostSmallZ - RESERVED_SPACE ); mAABB.vmax = rvector( mostBigX + RESERVED_SPACE, mostBigY + RESERVED_SPACE, mostBigZ + RESERVED_SPACE ); mMyTime = 0; }