Back to index

supertuxkart  0.5+dfsg1
isect.cpp
Go to the documentation of this file.
00001 //  $Id: isect.cpp 2111 2008-05-31 07:04:30Z cosmosninja $
00002 //
00003 //  SuperTuxKart - a fun racing game with go-kart
00004 //  Copyright (C) 2004 Steve Baker <sjbaker1@airmail.net>
00005 //
00006 //  This program is free software; you can redistribute it and/or
00007 //  modify it under the terms of the GNU General Public License
00008 //  as published by the Free Software Foundation; either version 2
00009 //  of the License, or (at your option) any later version.
00010 //
00011 //  This program is distributed in the hope that it will be useful,
00012 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //  GNU General Public License for more details.
00015 //
00016 //  You should have received a copy of the GNU General Public License
00017 //  along with this program; if not, write to the Free Software
00018 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00019 
00020 #include <plib/ssg.h>
00021 #include "isect.hpp"
00022 
00023 float getHeightAndNormal(ssgBranch* branch, sgVec3 my_position, sgVec3 normal)
00024 {
00025     /* Look for the nearest polygon *beneath* my_position */
00026 
00027     ssgHit *results ;
00028 
00029     float hot ;        /* H.O.T == Height Of Terrain */
00030     sgVec3 HOTvec ;
00031 
00032     sgMat4 invmat ;
00033     sgMakeIdentMat4 ( invmat ) ;
00034     invmat[3][0] = - my_position [0] ;
00035     invmat[3][1] = - my_position [1] ;
00036     invmat[3][2] = 0.0 ;
00037 
00038     sgSetVec3 ( HOTvec, 0.0f, 0.0f, my_position [ 2 ] ) ;
00039 
00040     const int NUM_HITS = ssgHOT (branch, HOTvec, invmat, &results ) ;
00041 
00042     hot = - FLT_MAX ;
00043 
00044     for ( int i = 0 ; i < NUM_HITS ; i++ )
00045     {
00046         ssgHit *h = &results [ i ] ;
00047 
00048         float hgt = - h->plane[3] / h->plane[2] ;
00049 
00050         if ( hgt >= hot )
00051         {
00052             hot = hgt ;
00053 
00054             if ( normal != NULL )
00055                 sgCopyVec3 ( normal, h->plane ) ;
00056         }
00057     }
00058 
00059     return hot ;
00060 }
00061