///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function Name: CheckDynamicCollisions() // Purpose: Check collisions with all dynamic objects // Original Author: Ethan Pendergraft // Creation Date: 6/13/2012 // Last Modification By: // Last Modification Date: ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CComponent_CrateCollision::CheckDynamicCollisions( CComponent_Collision* pCurCollision, CCollisionVolume* pCurVolume, float fDT ) { Box* BoxCollisionVolume = (Box*)m_pParent->GetCollidableObject(); vec2f Contact; vec2f Direction; vec2f contactpoints[4]; unsigned int numPoints; if( pCurCollision && pCurCollision != this ) { // collision checks // based on volume type switch( pCurVolume->GetVolumeType() ) { case VMT_BOX: { CComponent_Item* pThisItem = (CComponent_Item*)m_pParent->GetComponent( ECOMP_ITEM ); if( pThisItem ) { if( pThisItem->GetTarget() ) return; } CComponent_Item* pThatItem = (CComponent_Item*)pCurCollision->GetParent()->GetComponent( ECOMP_ITEM ); if( pThatItem ) { if( pThatItem->GetTarget() ) return; } if ( BoxCollisionVolume->BoxToBox( (Box*)pCurVolume, contactpoints, numPoints, Direction ) ) { // Collision reaction with other boxes in the game vec3f MoveDirection = vec3f( Direction.x, Direction.y, 0.0f ); vec3f fCross; cross_product( fCross, MoveDirection, vec3f( 0.0f, 0.0f, 1.0f ) ); float3 fProj = prjPoint2Line( m_pPhysicsBox->m_pPoints[0]->m_CurrPos, m_pPhysicsBox->m_pPoints[0]->m_PrevPos, m_pPhysicsBox->m_pPoints[0]->m_PrevPos + fCross ); float3 fPrevPush = fProj - m_pPhysicsBox->m_pPoints[0]->m_PrevPos; fPrevPush *= -0.1f; CleanOffset( Direction * 0.5f ); CleanForce( Direction * 0.1f ); Direction.negate(); pCurCollision->CleanOffset( Direction * 0.5f ); pCurCollision->CleanForce( Direction * 0.1f ); m_bCol = true; vec3f NormalizedDirection = vec3f (Direction.x, Direction.y, 0.0f).normalize(); float fDotProductUp = dot_product( NormalizedDirection, vec3f( 0.0f, 1.0f, 0.0f ) ); if( fDotProductUp > 0.5f ) { m_bCollidingGround = true; } if( fDotProductUp < -0.5f ) { pCurCollision->SetCollidingGroundAlone( true ); } } break; } } if( m_pPhysicsBox ) { BoxCollisionVolume->SetWorld( m_pPhysicsBox->GetCentroid() ); } } }