float DesertScenePlane::GetHeight( cGameObject* target ) { const auto& groupRepo = static_cast<cObjRenderer*>( m_owner->GetRenderer( ))->GetGroupRepo( ); BOOL collised = FALSE; float hitDist = 0.f; for ( auto* groupElem : groupRepo ) { const auto& vertices = groupElem->GetVertex( ); for ( int i = 0; i < vertices.size( ); i += 3 ) { const float rayYPos = 10000.f; D3DXVECTOR3 rayPos( target->GetPosition( ).x, rayYPos, target->GetPosition( ).z ); D3DXVECTOR3 v1; D3DXVec3TransformCoord( &v1, &vertices[i].p, &m_owner->GetWorld( )); D3DXVECTOR3 v2; D3DXVec3TransformCoord( &v2, &vertices[i+1].p, &m_owner->GetWorld( ) ); D3DXVECTOR3 v3; D3DXVec3TransformCoord( &v3, &vertices[i+2].p, &m_owner->GetWorld( ) ); collised = D3DXIntersectTri( &v1, &v2, &v3, &rayPos, &D3DXVECTOR3( 0.f, -1.f, 0.f ), nullptr, nullptr, &hitDist ); if ( collised == TRUE ) { target->GetPosition( ).y = rayYPos - hitDist; return ( rayYPos-hitDist ); } } } return 0.f; }
bool ComTerrain::GetHeight(float & height, const D3DXVECTOR3 & pos) { D3DXVECTOR3 rayPos(pos.x, pos.y + m_rayDistance, pos.z); D3DXVECTOR3 rayDir(0, -1, 0); float distance = 0.0f; for (int i = 0; i < m_vecIndices.size(); i += 3) { D3DXVECTOR3 v1 = m_vecVertices[m_vecIndices[i]].p; D3DXVECTOR3 v2 = m_vecVertices[m_vecIndices[i + 1]].p; D3DXVECTOR3 v3 = m_vecVertices[m_vecIndices[i + 2]].p; if (D3DXIntersectTri(&v1, &v2, &v3, &rayPos, &rayDir, NULL, NULL, &distance)) { height = rayPos.y - distance; return true; } } return false; }