#ifndef ENTITY_H #define ENTITY_H #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 { GLfloat radius; void update (); void draw (view &ctx); geometry_sphere (GLfloat radius) : radius(radius) { update (); }; }; ///////////////////////////////////////////////////////////////////////////// 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 light : entity { point p; colour c; GLfloat intensity; GLfloat radius; }; #endif