#ifndef ENTITY_H #define ENTITY_H #include #include #include "oct.h" using namespace std; typedef unsigned int soffs; // 32 bit const soffs soffs_max = 1UL << 31; #define GLFLOAT_MAX 1e30 #define GLFLOAT_MIN -1e30 struct sector { soffs x, y, z; }; struct point { GLfloat x, y, z; point () { }; point (GLfloat x, GLfloat y, GLfloat z) : x(x), y(y), z(z) { }; }; struct colour { GLfloat r, g, b; colour (GLfloat r = 1., GLfloat g = 1., GLfloat b = 1.) : r(r), g(g), b(b) { }; }; struct vec3 { GLfloat x, y, z; vec3 () { }; vec3 (GLfloat x, GLfloat y, GLfloat z) : x(x), y(y), z(z) { }; const vec3 operator -() const { return vec3 (-x, -y, -z); } }; const vec3 cross (const vec3 &a, const vec3 &b); GLfloat dot (const vec3 &a, const vec3 &b); struct texc { GLfloat s, t; texc () { }; texc (GLfloat s, GLfloat t) : s(s), t(t) { }; }; struct box { point a, b; void reset () { a = point (GLFLOAT_MAX, GLFLOAT_MAX, GLFLOAT_MAX); b = point (GLFLOAT_MIN, GLFLOAT_MIN, GLFLOAT_MIN); } void add (const box &o); }; struct entity_base { struct entity_base *parent; vector o; box bbox; virtual void update_bbox (); virtual void show (const sector &sec) { }; void hide (); virtual void draw () = 0; virtual ~entity_base () { hide (); }; }; struct entity_container : entity_base, protected vector { void add (entity_base *e) { push_back (e); e->parent = this; } void update_bbox (); void show (const sector &sec); void draw (); ~entity_container (); }; struct entity_filter : entity_base { protected: entity_base *e; public: void set (entity_base *e) { this->e = e; e->parent = this; } void remove () { this->e->parent = 0; this->e = 0; } entity_base *content () { return e; }; void update_bbox (); void show (const sector &sec); void draw (); ~entity_filter (); }; struct entity : entity_filter { sector sec; void show (const sector &sec); void show (); void draw (); }; struct entity_affine : entity_filter { //matrix m; }; struct vertex1d { colour c; // colour point p; // vertex }; struct vertex2d { colour c; // colour point p; // vertex vec3 n; // normal texc t; // texture vertex2d () { }; vertex2d (colour c, point p, vec3 n, texc t = texc()) : c(c), p(p), n(n), t(t) { }; }; template struct entity_opengl1d : entity_base, vector { void update_bbox (); void show (const sector &sec); void draw (); }; template struct entity_opengl2d : entity_base, vector { void update_bbox (); void show (const sector &sec); void draw (); }; typedef entity_opengl1d entity_points; typedef entity_opengl1d entity_lines; typedef entity_opengl1d entity_line_strip; typedef entity_opengl1d entity_line_loop; typedef entity_opengl2d entity_triangles; typedef entity_opengl2d entity_triangle_strip; typedef entity_opengl2d entity_triangle_fan; typedef entity_opengl2d entity_quads; typedef entity_opengl2d entity_quad_strip; typedef entity_opengl2d entity_polygon; struct light { point p; colour c; GLfloat intensity; GLfloat radius; }; struct draw_context { enum { DEPTH, AMBIENT, LIGHTED } mode; light *l; }; struct view { point p; vec3 d, u; float fov; int w, h; void draw (const draw_context &c); }; #endif