ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/entity.h
(Generate patch)

Comparing libgender/entity.h (file contents):
Revision 1.1 by root, Sat Oct 2 15:54:43 2004 UTC vs.
Revision 1.36 by root, Thu Aug 11 19:28:45 2005 UTC

1#ifndef ENTITY_H 1#ifndef ENTITY_H
2#define ENTITY_H 2#define ENTITY_H
3 3
4#include <GL/gl.h>
5
6#include <vector> 4#include <vector>
7 5
6#include <iostream>
7#include "opengl.h"
8
9#include "util.h"
8#include "oct.h" 10#include "oct.h"
11#include "view.h"
12#include "material.h"
9 13
10using namespace std; 14using namespace std;
15using namespace gl;
11 16
12typedef unsigned int soffs; // 32 bit 17struct geometry
13const soffs soffs_max = 1UL << 31; 18{
19 geometry *parent;
20 box bbox;
14 21
15#define GLFLOAT_MAX 1e30 22 virtual void update ()
16#define GLFLOAT_MIN -1e30 23 {
24 if (parent)
25 parent->update ();
26 }
17 27
18struct sector { 28 virtual void draw (view &ctx) = 0;
19 soffs x, y, z; 29 geometry (geometry *parent = 0) : parent(parent) { };
30 virtual ~geometry ();
20}; 31};
21 32
22struct point { 33struct geometry_opengl : geometry
34{
35 GLuint list; // TODO: dynamic caching
36
37 geometry_opengl ();
38 ~geometry_opengl ();
39};
40
41template<GLenum type>
42struct geometry_opengl1d : geometry_opengl, vector<vertex_v3f>
43{
44 void set (const vector<vertex_v3f> &v);
45 void draw (view &ctx);
46};
47
48template<GLenum type>
49struct geometry_opengl2d : geometry_opengl
50{
51 material *m;
52
53 geometry_opengl2d () : m(0) { };
54
55 void set (const vector<vertex_t2f_n3f_v3f> &v);
56 void draw (view &ctx);
57};
58
59typedef geometry_opengl1d<GL_POINTS> geometry_points;
60typedef geometry_opengl1d<GL_LINES> geometry_lines;
61typedef geometry_opengl1d<GL_LINE_STRIP> geometry_line_strip;
62typedef geometry_opengl1d<GL_LINE_LOOP> geometry_line_loop;
63typedef geometry_opengl2d<GL_TRIANGLES> geometry_triangles;
64typedef geometry_opengl2d<GL_TRIANGLE_STRIP> geometry_triangle_strip;
65typedef geometry_opengl2d<GL_TRIANGLE_FAN> geometry_triangle_fan;
66typedef geometry_opengl2d<GL_QUADS> geometry_quads;
67typedef geometry_opengl2d<GL_QUAD_STRIP> geometry_quad_strip;
68typedef geometry_opengl2d<GL_POLYGON> geometry_polygon;
69
70struct geometry_nurbs : geometry, vector<vertex_t2f_n3f_v3f>
71{
72 GLUnurbsObj *nurb;
73 GLUtesselator *tess;
74 GLfloat ctlpoints[4][4][3];
75
76 geometry_nurbs() : tess(0), nurb(0) { }
77 virtual void draw (view &ctx);
78 void set ();
79};
80
81struct geometry_sphere : geometry
82{
83 material *m;
84 GLfloat radius;
85
86 void update ();
87 void draw (view &ctx);
88 geometry_sphere (material *m, GLfloat radius) : m(m), radius(radius) { update (); };
89};
90
91struct geometry_indexed_2d : geometry
92{
93 material *m;
94
95 GLenum type;
96
97 vertex_buffer vb;
98 index_buffer ib;
99
100 void draw (view &ctx);
101
102 template <typename vertex, typename index>
103 geometry_indexed_2d (material *m, GLenum type, const vector<vertex> &v, const vector<index> &i)
104 : m(m), type(type)
105 {
106 vb.set (v);
107 ib.set (i);
108
109 bbox.reset ();
110 for (typename vector<vertex>::const_iterator i = v.begin () ; i != v.end (); ++i)
111 bbox.add (i->v);
112 }
113
114};
115
116/////////////////////////////////////////////////////////////////////////////
117
118struct geometry_filter : geometry
119{
120protected:
121 geometry *g;
122public:
123
124 void set (geometry *g);
125
126 geometry *content () { return g; };
127
128 void update ();
129 void show ();
130 void draw (view &ctx);
131 geometry_filter (geometry *g = 0) { set (g); }
132 ~geometry_filter ();
133};
134
135struct geometry_transform : geometry_filter
136{
137protected:
138 matrix m;
139public:
140 void update ();
141
142 void show ();
143 void draw (view &ctx);
144 void set_matrix (const matrix &xfrm);
145 void update (const matrix &xfrm);
146
147 geometry_transform (geometry *g) : geometry_filter(g), m(1) { };
148 geometry_transform () : geometry_filter(0), m(1) { };
149};
150
151struct geometry_anim : geometry_transform
152{
23 GLfloat x, y, z; 153 GLfloat vx, vy, vz;
154 void draw (view &ctx);
24}; 155};
25 156
26struct colour { 157struct geometry_container : geometry, protected vector<geometry *>
27 GLfloat r, g, b; 158{
28}; 159 void update ();
29 160
30struct vect { 161 void add (geometry *g);
31 GLfloat x, y, z; 162 void draw (view &ctx);
163 ~geometry_container ();
32}; 164};
33 165
34struct texc { 166/////////////////////////////////////////////////////////////////////////////
35 GLfloat u, v;
36};
37 167
38struct box { 168struct entity_visibility : visibility_base {
169 entity *e;
170 double next; // time of next check
171 int occ_res;
172
173 void clear ()
174 {
175 next = 0.;
176 occ_res = -1;
177 }
178
179 entity_visibility (entity &e)
180 : e(&e)
181 {
182 clear ();
183 }
184};
185
186struct entity : geometry_filter, visible
187{
188 sector orig;
39 point a, b; 189 point p;
190 sector a, b; // bounding box corners
40 191
41 void reset ()
42 {
43 a.x = a.y = a.z = GLFLOAT_MAX;
44 b.x = b.y = b.z = GLFLOAT_MIN;
45 }
46
47 void add (const box &o);
48};
49
50struct entity_base {
51 struct entity_base *parent;
52 vector<octant *> o; 192 vector<octant *> o;
53 box bbox;
54 193
55 virtual void update_bbox ();
56 virtual void show (const sector &sec) { };
57 void hide ();
58 virtual void draw () = 0;
59 virtual ~entity_base ()
60 {
61 hide ();
62 };
63};
64
65struct entity_container : entity_base, protected vector<entity_base *> {
66 void update_bbox (); 194 void update ();
67 void show (const sector &sec);
68 void draw (); 195 void draw (view &ctx);
69 ~entity_container ();
70};
71 196
197 void move (const vec3 &v);
198
199 virtual void show ();
200 virtual void hide ();
201
202 visibility_base *new_visibility ();
203 void clear_visibility (visibility_base *vs);
204
205 entity (geometry *g = 0);
206 ~entity ();
207};
208
209struct entity_moveable : entity
210{
211 vec3 v;
212 entity_moveable (geometry *g = 0) : entity (g) { }
213
214 void perform_step (double t);
215};
216
72struct entity_filter : entity_base { 217struct entity_light : entity
73protected: 218{
74 entity_base *e; 219 light *lview;
75public: 220};
76 221
77 void set (entity_base *e) 222/////////////////////////////////////////////////////////////////////////////
78 { 223// not the final API(!)
79 this->e = e;
80 e->parent = this;
81 }
82 224
83 void remove () 225struct skybox
84 { 226{
85 this->e->parent = 0; 227 texture *tex[6];
86 this->e = 0;
87 }
88 228
89 entity_base *content () { return e; }; 229 skybox (
230 const char *left,
231 const char *front,
232 const char *right,
233 const char *back,
234 const char *top,
235 const char *bottom
236 );
90 237
238 ~skybox ();
239
240 void draw (view &ctx);
241};
242
243/////////////////////////////////////////////////////////////////////////////
244//
245// VERY EXPERIMENTAL HEIGHTMAP
246
247struct geometry_heightfield : geometry
248{
249 struct node;
250
251 node *tree;
252
253 GLfloat sx, sy, sm;
254
91 void update_bbox (); 255 void update ();
92 void show (const sector &sec);
93 void draw (); 256 void draw (view &ctx);
94 ~entity_filter (); 257 geometry_heightfield (GLfloat sx, GLfloat sy);
95}; 258};
96
97struct entity : entity_filter {
98 sector sec;
99
100 void show (const sector &sec);
101 void draw ();
102};
103
104struct entity_affine : entity_filter {
105 //matrix m;
106};
107
108struct vertex1d {
109 point v; // vertex
110 colour c; // colour
111};
112
113struct vertex2d {
114 point v; // vertex
115 colour c; // colour
116 vect n; // normal
117 texc t; // texture
118};
119
120template<GLenum type>
121struct entity_opengl1d : entity_base, vector<vertex1d> {
122 void update_bbox ();
123 void show (const sector &sec);
124 void draw ();
125};
126
127template<GLenum type>
128struct entity_opengl2d : entity_base, vector<vertex2d> {
129 void update_bbox ();
130 void show (const sector &sec);
131 void draw ();
132};
133
134typedef entity_opengl1d<GL_POINTS> entity_points;
135typedef entity_opengl1d<GL_LINES> entity_lines;
136typedef entity_opengl1d<GL_LINE_STRIP> entity_linestrip;
137typedef entity_opengl1d<GL_LINE_LOOP> entity_lineloop;
138typedef entity_opengl2d<GL_TRIANGLES> entity_triangles;
139typedef entity_opengl2d<GL_TRIANGLE_STRIP> entity_trianglestrip;
140typedef entity_opengl2d<GL_TRIANGLE_FAN> entity_trianglefan;
141typedef entity_opengl2d<GL_QUADS> entity_quads;
142typedef entity_opengl2d<GL_QUAD_STRIP> entity_quad_strip;
143typedef entity_opengl2d<GL_POLYGON> entity_polygon;
144 259
145#endif 260#endif
146 261
147 262
148 263

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines