ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/entity.h
Revision: 1.32
Committed: Sat Nov 6 00:44:50 2004 UTC (19 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.31: +26 -0 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #ifndef ENTITY_H
2 #define ENTITY_H
3
4 #include <vector>
5
6 #include <iostream>
7 #include "opengl.h"
8
9 #include "util.h"
10 #include "oct.h"
11 #include "view.h"
12 #include "material.h"
13
14 using namespace std;
15 using namespace gl;
16
17 struct geometry
18 {
19 geometry *parent;
20 box bbox;
21
22 virtual void update ()
23 {
24 if (parent)
25 parent->update ();
26 }
27
28 virtual void draw (view &ctx) = 0;
29 geometry (geometry *parent = 0) : parent(parent) { };
30 virtual ~geometry ();
31 };
32
33 struct geometry_opengl : geometry
34 {
35 GLuint list; // TODO: dynamic caching
36
37 geometry_opengl ();
38 ~geometry_opengl ();
39 };
40
41 template<GLenum type>
42 struct geometry_opengl1d : geometry_opengl, vector<vertex_v3f>
43 {
44 void set (const vector<vertex_v3f> &v);
45 void draw (view &ctx);
46 };
47
48 template<GLenum type>
49 struct 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
59 typedef geometry_opengl1d<GL_POINTS> geometry_points;
60 typedef geometry_opengl1d<GL_LINES> geometry_lines;
61 typedef geometry_opengl1d<GL_LINE_STRIP> geometry_line_strip;
62 typedef geometry_opengl1d<GL_LINE_LOOP> geometry_line_loop;
63 typedef geometry_opengl2d<GL_TRIANGLES> geometry_triangles;
64 typedef geometry_opengl2d<GL_TRIANGLE_STRIP> geometry_triangle_strip;
65 typedef geometry_opengl2d<GL_TRIANGLE_FAN> geometry_triangle_fan;
66 typedef geometry_opengl2d<GL_QUADS> geometry_quads;
67 typedef geometry_opengl2d<GL_QUAD_STRIP> geometry_quad_strip;
68 typedef geometry_opengl2d<GL_POLYGON> geometry_polygon;
69
70 struct 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
81 struct 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
91 struct 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)
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
118 struct geometry_filter : geometry
119 {
120 protected:
121 geometry *g;
122 public:
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
135 struct geometry_transform : geometry_filter
136 {
137 protected:
138 matrix m;
139 public:
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
151 struct geometry_anim : geometry_transform
152 {
153 GLfloat vx, vy, vz;
154 void draw (view &ctx);
155 };
156
157 struct geometry_container : geometry, protected vector<geometry *>
158 {
159 void update ();
160
161 void add (geometry *g);
162 void draw (view &ctx);
163 ~geometry_container ();
164 };
165
166 /////////////////////////////////////////////////////////////////////////////
167
168 struct entity : geometry_filter
169 {
170 sector orig;
171 point p;
172 sector a, b; // bounding box corners
173
174 vector<octant *> o;
175
176 void update ();
177 void draw (view &ctx);
178
179 void move (const vec3 &v);
180
181 virtual void show ();
182 virtual void hide ();
183
184 entity (geometry *g = 0);
185 ~entity ();
186 };
187
188 struct entity_light : entity
189 {
190 light *lview;
191 };
192
193 /////////////////////////////////////////////////////////////////////////////
194 //
195 // VERY EXPERIMENTAL HEIGHTMAP
196
197 struct geometry_heightfield : geometry
198 {
199 struct node;
200
201 node *tree;
202
203 GLfloat sx, sy, sm;
204
205 void update ();
206 void draw (view &ctx);
207 geometry_heightfield (GLfloat sx, GLfloat sy);
208 };
209
210 #endif
211
212
213