// BoidScene.cpp: implementation of the CBoidScene class. // ////////////////////////////////////////////////////////////////////// #include #include "BoidScene.h" #include "SceneManager.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CBoidScene::CBoidScene() { } CBoidScene::~CBoidScene() { } void CBoidScene::Create(int nBoid,int BoidObject) { srand(time(NULL)); m_nBoids=nBoid; m_pBoids=new BoidNode[nBoid]; m_BoidObject=BoidObject; m_vecGoal=vector3(0.0f,0.0f,0.0f); for(int i=0;i0.0f) { vector3 vecDiff=m_pBoids[i].m_vecLoc-m_pBoids[j].m_vecLoc; vecDiff.Normalize(); vector3 vecDelta; float fCollWeight=0.0f; if(m_pBoids[i].m_fDist[j]-m_CollisionFraction > 0.0f) fCollWeight=(m_pBoids[i].m_fDist[j]-m_CollisionFraction) *m_InvCollisionFraction; if(m_pBoids[i].m_fDist[j]-(1.0f-m_CollisionFraction) >0.0f) fCollWeight-=m_pBoids[i].m_fDist[j]*(1.0f-fCollWeight); vecDelta=fCollWeight*vecDiff; m_pBoids[i].m_vecDeltaPos+=vecDelta; m_pBoids[j].m_vecDeltaPos-=vecDelta; m_pBoids[i].m_vecDeltaDir+=m_pBoids[j].m_vecDir*m_pBoids[i].m_fDist[j]; m_pBoids[j].m_vecDeltaDir+=m_pBoids[i].m_vecDir*m_pBoids[i].m_fDist[j]; m_pBoids[i].m_DeltaCnt++; m_pBoids[j].m_DeltaCnt++; } } } for(i=0;i0.01f) { m_pBoids[i].m_fPitch+=m_AngleTweak; if(m_pBoids[i].m_fPitch > 0.8f) m_pBoids[i].m_fPitch=0.8f; } else if(vecDelta.y<-0.01f) { m_pBoids[i].m_fPitch-=m_AngleTweak; if(m_pBoids[i].m_fPitch<-0.8f) m_pBoids[i].m_fPitch=-0.8f; } else { m_pBoids[i].m_fPitch*=0.98f; } m_pBoids[i].m_fSpeed-=m_pBoids[i].m_fPitch*m_PitchToSpeedRatio; m_pBoids[i].m_fSpeed=(m_pBoids[i].m_fSpeed-m_NormalSpeed)*0.99f+m_NormalSpeed; if(m_pBoids[i].m_fSpeedm_NormalSpeed*5.0f) m_pBoids[i].m_fSpeed=m_NormalSpeed*5.0f; vecOffset=vecDelta; vecOffset.y=0.0f; vecDelta=m_pBoids[i].m_vecDir; vecOffset.Normalize(); float fDot=vecOffset*vecDelta; if(fDot>0.7f) { fDot-=0.7f; m_pBoids[i].m_fSpeed+=fDot*0.005f; } vecOffset=vecOffset^vecDelta; fDot=(1.0f-fDot)/2.0f*0.07f; if(vecOffset.y>0.05f) m_pBoids[i].m_fDYaw=(m_pBoids[i].m_fDYaw*19.0f+fDot)*0.05f; else if(vecOffset.y<-0.05f) m_pBoids[i].m_fDYaw=(m_pBoids[i].m_fDYaw*19.0f-fDot)*0.05f; else m_pBoids[i].m_fDYaw*=0.98f; m_pBoids[i].m_fYaw+=m_pBoids[i].m_fDYaw; m_pBoids[i].m_fRoll=-m_pBoids[i].m_fDYaw*20.0f; } } void CBoidScene::Render(LPDIRECT3DDEVICE8 pd3dDevice) { /* pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,TRUE); pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE,TRUE); pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); for(int i=0;iSetTransform(D3DTS_WORLD,m_pBoids[i].m_matLocal); if(cosf(m_pBoids[i].m_fAni)>0.0f) m_pBoidObject[0]->Render(pd3dDevice); else m_pBoidObject[1]->Render(pd3dDevice); } pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,FALSE); pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE,FALSE); */ } void CBoidScene::DeleteBoid() { for(int i=0;i