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

Comparing libgender/view.h (file contents):
Revision 1.26 by root, Sun Oct 17 09:43:07 2004 UTC vs.
Revision 1.41 by root, Thu Aug 11 19:28:45 2005 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines