stk-code_catmod/src/static_ssg.hpp

101 lines
3.2 KiB
C++
Raw Normal View History

// $Id$
//
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2006 Joerg Henrichs
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distribhuted in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef _HEADER_STATICSSG_
#define _HEADER_STATICSSG_
#include <vector>
#include <plib/ssg.h>
#define NOINTERSECT -999999.9f
class InfoTriangle
{
public:
ssgLeaf* m_leaf;
int m_indx;
sgVec3 m_vv1,m_vv2,m_vv3;
unsigned int m_test_nr;
sgVec4 m_plane;
float m_x_min, m_x_max, m_y_min, m_y_max;
// distance to plane in case of a hit, undefined otherwise
float m_dist;
public:
InfoTriangle() {};
InfoTriangle(ssgLeaf* l,int i,sgVec3 v1,sgVec3 v2,sgVec3 v3)
{
m_leaf = l; m_indx=i;
sgCopyVec3(m_vv1,v1);
sgCopyVec3(m_vv2,v2);
sgCopyVec3(m_vv3,v3);
m_test_nr=0;
l->ref();
}
~InfoTriangle() { ssgDeRefDelete(m_leaf); }
float hot(sgVec3 p);
int collision(sgSphere *s);
}
; // InfoTriangle
// =============================================================================
typedef std::vector<InfoTriangle*> AllHits;
// =============================================================================
class StaticSSG
{
private:
/* allLeavesType is a list storing all triangles which
touch a certain hash bucket. */
typedef std::vector<InfoTriangle*> allLeavesType;
/* This is the list of buckets, each of which stores
a list of leaves at that hash value/bucket */
typedef std::vector<allLeavesType> allBucketsType;
allLeavesType m_all_leaves;
allBucketsType* m_buckets;
float m_x_min, m_x_max, m_y_min, m_y_max;
int m_n, m_m;
unsigned int m_test_number;
float m_invdx, m_invdy;
ssgEntity* m_start;
void Setup (int n);
void Distribute (ssgEntity* start, sgMat4 m);
void StoreTriangle(ssgLeaf* l, int indx, sgVec3 vv1, sgVec3 vv2, sgVec3 vv3);
int GetHash (float x, float y)
{
int m1; int n1;
GetRowCol(x,y,&m1,&n1);
return GetHash(m1, n1);
}
int GetHash (int m1, int n1 ) { return m1+n1*m_m; }
void GetRowCol(float x, float y, int *m1, int *n1)
{
*m1=(int)((x-m_x_min)*m_invdx);
*n1=(int)((y-m_y_min)*m_invdy);
}
public:
StaticSSG(ssgEntity* start, int n);
void Draw(ssgBranch* b);
float hot(sgVec3 start, sgVec3 end, ssgLeaf** l, sgVec4** nrm);
int collision(sgSphere *s, AllHits *allHits);
};
#endif