#ifndef ENTITY_H #define ENTITY_H #include #include #include "opengl.h" #include "util.h" #include "oct.h" #include "view.h" #include "material.h" using namespace std; using namespace gl; struct geometry { geometry *parent; box bbox; virtual void update () { if (parent) parent->update (); } virtual void draw (view &ctx) = 0; geometry (geometry *parent = 0) : parent(parent) { }; virtual ~geometry (); }; struct geometry_opengl : geometry { GLuint list; // TODO: dynamic caching geometry_opengl (); ~geometry_opengl (); }; template struct geometry_opengl1d : geometry_opengl, vector { void set (const vector &v); void draw (view &ctx); }; template struct geometry_opengl2d : geometry_opengl { material *m; geometry_opengl2d () : m(0) { }; void set (const vector &v); void draw (view &ctx); }; typedef geometry_opengl1d geometry_points; typedef geometry_opengl1d geometry_lines; typedef geometry_opengl1d geometry_line_strip; typedef geometry_opengl1d geometry_line_loop; typedef geometry_opengl2d geometry_triangles; typedef geometry_opengl2d geometry_triangle_strip; typedef geometry_opengl2d geometry_triangle_fan; typedef geometry_opengl2d geometry_quads; typedef geometry_opengl2d geometry_quad_strip; typedef geometry_opengl2d geometry_polygon; struct geometry_nurbs : geometry, vector { GLUnurbsObj *nurb; GLUtesselator *tess; GLfloat ctlpoints[4][4][3]; geometry_nurbs() : tess(0), nurb(0) { } virtual void draw (view &ctx); void set (); }; struct geometry_sphere : geometry { material *m; GLfloat radius; void update (); void draw (view &ctx); geometry_sphere (material *m, GLfloat radius) : m(m), radius(radius) { update (); }; }; struct geometry_indexed_2d : geometry { material *m; GLenum type; vertex_buffer vb; index_buffer ib; void draw (view &ctx); template geometry_indexed_2d (material *m, GLenum type, const vector &v, const vector &i) : m(m) { vb.set (v); //ib.set (i); //bbox.reset (); //for (typename vector::const_iterator i = v.begin () ; i != v.end (); ++i) // bbox.add (i->v); } }; ///////////////////////////////////////////////////////////////////////////// struct geometry_filter : geometry { protected: geometry *g; public: void set (geometry *g); geometry *content () { return g; }; void update (); void show (); void draw (view &ctx); geometry_filter (geometry *g = 0) { set (g); } ~geometry_filter (); }; struct geometry_transform : geometry_filter { protected: matrix m; public: void update (); void show (); void draw (view &ctx); void set_matrix (const matrix &xfrm); void update (const matrix &xfrm); geometry_transform (geometry *g) : geometry_filter(g), m(1) { }; geometry_transform () : geometry_filter(0), m(1) { }; }; struct geometry_anim : geometry_transform { GLfloat vx, vy, vz; void draw (view &ctx); }; struct geometry_container : geometry, protected vector { void update (); void add (geometry *g); void draw (view &ctx); ~geometry_container (); }; ///////////////////////////////////////////////////////////////////////////// struct entity : geometry_filter { sector orig; point p; sector a, b; // bounding box corners vector o; void update (); void draw (view &ctx); void move (const vec3 &v); virtual void show (); virtual void hide (); entity (geometry *g = 0); ~entity (); }; struct entity_light : entity { light *lview; }; ///////////////////////////////////////////////////////////////////////////// // // VERY EXPERIMENTAL HEIGHTMAP struct geometry_heightfield : geometry { struct node; node *tree; GLfloat sx, sy, sm; void update (); void draw (view &ctx); geometry_heightfield (GLfloat sx, GLfloat sy); }; #endif