ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/libgender/view.h
Revision: 1.33
Committed: Sat Nov 6 00:06:33 2004 UTC (21 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.32: +9 -3 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #ifndef VIEW_H
2     #define VIEW_H
3    
4     #include <set>
5 root 1.4 #include <map>
6 root 1.17 #include <utility>
7 root 1.1
8     using namespace std;
9    
10     #include "util.h"
11 root 1.17 #include "event.h"
12 root 1.32 #include "shader.h"
13 root 1.1
14 root 1.22 struct visibility_base
15 root 1.20 {
16 root 1.22 unsigned int generation; // freshness check
17     };
18 root 1.12
19 root 1.22 struct visible {
20     visibility_base *get_visibility (view &ctx);
21     virtual visibility_base *new_visibility () = 0;
22     virtual void clear_visibility (visibility_base *vs) = 0;
23 root 1.12 };
24    
25 root 1.20 struct occ_query
26     {
27 root 1.26 struct view &ctx;
28 root 1.22 void *id;
29 root 1.26 GLuint count;
30 root 1.17
31 root 1.26 occ_query (view &ctx, void *id, GLuint count) : ctx(ctx), id(id), count(count) { };
32 root 1.17 };
33    
34     typedef event_receiver<void, occ_query> recv_occ_query;
35    
36 root 1.31 struct pass
37     {
38     struct light *l;
39    
40 root 1.32 typedef map<struct material *, shader::program_object> matmap_t;
41     matmap_t matmap;
42    
43 root 1.31 pass (light *l) : l(l) { }
44     };
45    
46 root 1.32 extern pass pass_depth; // the standard depth pass
47 root 1.31
48 root 1.20 struct view
49     {
50 root 1.2 sector orig;
51     point p;
52     vec3 d, u;
53 root 1.13 GLfloat fov;
54 root 1.19 GLfloat z_near, z_far, c_far;
55 root 1.2 int w, h;
56 root 1.21 GLfloat pixfact; // how many pixels on screen are drawn by a unit length line, *roughly*
57 root 1.30 sector eorig; // orig of currently-rendered entity in relation to the camera
58 root 1.2
59 root 1.13 GLfloat gamma;
60 root 1.4
61 root 1.17 // only to be used by friends: TODO
62 root 1.5
63 root 1.28 GLfloat nz_far, nz_near, nc_far;
64 root 1.17 GLfloat diagfact; // bounding box border to depth factor
65 root 1.21 GLfloat perspfact; // perspfact * (1/depth)=> pixels
66 root 1.13
67 root 1.25 gl::matrix projection;
68 root 1.9
69 root 1.5 struct {
70     plane l, r, t, b, n, f;
71 root 1.27 cone c;
72     sphere s;
73 root 1.5 } frustum;
74 root 1.14
75 root 1.26 // the passes
76 root 1.31 enum pass_type {
77 root 1.26 DEPTH, // mandatory, render depth only
78     POSTDEPTH, // mandatory, occ tests or ignored
79     LIGHTED, // optional, render faces in full glory
80 root 1.31 } pass_type;
81    
82     pass *pass_data;
83 root 1.26
84     set<const entity *> drawn; // TODO: put drawn info and octant+entity visibility info into vismap!
85 root 1.4
86     unsigned int generation;
87 root 1.22 typedef map<visible *, visibility_base *> visibility_map;
88     visibility_map vismap;
89 root 1.17
90 root 1.24 vector<octant *> vislist; // octants that want to be drawn
91 root 1.17
92 root 1.22 struct oq_data {
93     recv_occ_query *recv;
94     GLint id;
95     void *data;
96    
97     oq_data (recv_occ_query *recv, GLint id, void *data) : recv(recv), id(id), data(data) { };
98     };
99 root 1.17 vector<oq_data> occ_queries;
100 root 1.22 void begin_occ_query (recv_occ_query &recv, void *id = 0);
101 root 1.17 void end_occ_query ();
102 root 1.13
103     void reset_projection ();
104    
105     // public
106    
107     void begin ();
108 root 1.31 void render (enum pass_type p, pass &data);
109 root 1.13 void end ();
110 root 1.1
111 root 1.15 bool may_draw (const entity *e);
112 root 1.1
113 root 1.12 view ();
114     ~view ();
115 root 1.31 };
116    
117     struct light : view
118     {
119 root 1.33 // the following variables are valid in the fragment shader as well as in the vertex shader
120     bool has_lightvec; // is a light vector available?
121     shader::temp_3f sh_lightvec; // not defined unless has_lightvec is true
122     shader::temp_3f sh_colour; // always available for any light
123 root 1.32
124     // vertex shader
125     virtual void vsh () = 0;
126     // fragment shader
127 root 1.33 virtual void fsh () = 0;
128 root 1.32
129     virtual void enable ();
130     virtual void disable ();
131 root 1.33
132     protected:
133     shader::uniform_3f lightpos; // or direction
134 root 1.32 };
135    
136     struct linear_light : light
137     {
138 root 1.31 colour c;
139     GLfloat intensity;
140     GLfloat radius;
141 root 1.32
142     void vsh ();
143 root 1.33 void fsh ();
144 root 1.1 };
145 root 1.7
146 root 1.1 #endif
147