///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function Name: CheckStaticCollisions() // Purpose: Check collisions with all static objects // Original Author: Ethan Pendergraft // Creation Date: 6/13/2012 // Last Modification By: // Last Modification Date: ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CComponent_CrateCollision::CheckStaticCollisions( CComponent_Collision* pCurCollision, CCollisionVolume* pCurVolume, float fDT ) { Box* BoxCollisionVolume = (Box*)m_pParent->GetCollidableObject(); vec2f Contact; vec2f Direction; switch( pCurVolume->GetVolumeType() ) { case VMT_AABB: { // handle crate collision // with world AABB if ( BoxCollisionVolume->BoxToAABBWorld( *(AABB*)pCurVolume, Contact, Direction ) ) { // Create an offset vector. vec3f MoveDirection = vec3f (Direction.x, Direction.y, 0.0f); //Save the last offset for use elsewhere. m_fLastOffset = vec3f( Direction.x, Direction.y, 0.0f ); // If it has a physics Box. //if(!m_bPlayed && !m_bCollideSoundCap) //{ // if(m_nCollisionCount < 5) // { // m_pSoundComponent->PlaySound(SFX_CRATE_CRASH); // m_bPlayed = true; // ++m_nCollisionCount; // } // else // { // m_bCollideSoundCap = true; // } //} ////////// FRICTION 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; ////////// vec3f NormalizedDirection = vec3f (Direction.x, Direction.y, 0.0f).normalize(); float fDotProductUp = dot_product( NormalizedDirection, vec3f( 0.0f, 1.0f, 0.0f ) ); float fDotProductSide = dot_product( NormalizedDirection, vec3f( 1.0f, 0.0f, 0.0f ) ); if( fDotProductUp > 0.5f ) { m_bCollidingGround = true; } if( abs( fDotProductSide ) > 0.5f ) { fPrevPush = vec3f( 0.0f, 0.0f, 0.0f ); } CleanOffset( vec2f( MoveDirection.x, MoveDirection.y ) ); CleanForce( vec2f( fPrevPush.x, fPrevPush.y ) + vec2f( MoveDirection.x, MoveDirection.y ) * 0.1f ); m_bCol = true; } break; } default: break; } }