00001 #ifndef _GRSMOKE_H_
00002 #define _GRSMOKE_H_
00003
00004 #define SMOKE_INIT_SIZE 0.2f
00005 #define MAX_SMOKE_LIFE 120
00006 #define MAX_SMOKE_NUMBER 300
00007 #define DELTAT 0.1f
00008 #define VZ_INIT 0.05f
00009 #define VY_INIT 0.1f
00010 #define VX_INIT 0.1f
00011 #define V_EXPANSION 0.4f
00012 #define SMOKE_TYPE_TIRE 1
00013 #define SMOKE_TYPE_ENGINE 2
00014
00015 class ssgVtxTableSmoke : public ssgVtxTable
00016 {
00017 protected:
00018 virtual void copy_from ( ssgVtxTableSmoke *src, int clone_flags ) ;
00019
00020 public:
00021 double max_life;
00022 double step0_max_life;
00023 double step1_max_life;
00024 double step2_max_life;
00025 double cur_life;
00026 tdble vvx, vvy,vvz;
00027 tdble vexp;
00028 int smokeType;
00029 int smokeTypeStep;
00030 double dt;
00031 double lastTime;
00032 float sizex;
00033 float sizey;
00034 float sizez;
00035 int stype;
00036 virtual ssgBase *clone ( int clone_flags = 0 ) ;
00037 ssgVtxTableSmoke () ;
00038 ssgVtxTableSmoke (ssgVertexArray *shd_vtx , float initsize, int type);
00039
00040 void draw_geometry();
00041 virtual void drawHighlight ( sgVec4 colour ){ssgVtxTable::drawHighlight(colour);}
00042 virtual void drawHighlight ( sgVec4 colour, int i ){ssgVtxTable::drawHighlight(colour,i);}
00043
00044 virtual void pick ( int baseName ) { ssgVtxTable::pick(baseName);}
00045 virtual void transform ( const sgMat4 m ) { ssgVtxTable::transform(m);}
00046
00047 virtual void setVertices ( ssgVertexArray *vl ) { ssgVtxTable::setVertices(vl);}
00048 virtual void setNormals ( ssgNormalArray *nl ) { ssgVtxTable::setNormals(nl);}
00049 virtual void setTexCoords ( ssgTexCoordArray *tl ) { ssgVtxTable::setTexCoords(tl);}
00050 virtual void setColours ( ssgColourArray *cl ) { ssgVtxTable::setColours(cl);}
00051
00052 int getNumVertices () { return vertices -> getNum () ; }
00053 int getNumNormals () { return normals -> getNum () ; }
00054 int getNumColours () { return colours -> getNum () ; }
00055 int getNumTexCoords () { return texcoords -> getNum () ; }
00056
00057 int getNumTriangles () { return ssgVtxTable::getNumTriangles();}
00058 void getTriangle ( int n, short *v1, short *v2, short *v3 ) { ssgVtxTable::getTriangle(n,v1,v2,v3);}
00059 int getNumLines () {return ssgVtxTable::getNumLines();}
00060 void getLine ( int n, short *v1, short *v2 ) { ssgVtxTable::getLine(n,v1,v2);}
00061
00062
00063 virtual ~ssgVtxTableSmoke (void);
00064
00065 virtual const char *getTypeName(void) { return ssgVtxTable::getTypeName();}
00066
00067 virtual void print ( FILE *fd = stderr, char *indent = "", int how_much = 2) { ssgVtxTable::print(fd,indent,how_much);}
00068 virtual int load ( FILE *fd ) {return ssgVtxTable::load(fd);}
00069 virtual int save ( FILE *fd ) {return ssgVtxTable::save(fd);}
00070 };
00071
00072 typedef struct tgrSmoke_st
00073 {
00074 ssgVtxTableSmoke * smoke;
00075 tgrSmoke_st * next ;
00076 }tgrSmoke;
00077
00078 typedef struct
00079 {
00080 tgrSmoke * smokeList;
00081 int number;
00082 }tgrSmokeManager;
00083
00084
00085 extern void grInitSmoke(int index);
00086 extern void grAddSmoke(tCarElt *car, double t);
00087 extern void grUpdateSmoke(double t);
00088 extern void grShutdownSmoke ();
00089
00090 extern int grSmokeMaxNumber;
00091 extern double grSmokeDeltaT;
00092 extern double grSmokeLife;
00093
00094
00095 #endif