… | |
… | |
120 | { |
120 | { |
121 | renormalize (orig, p); |
121 | renormalize (orig, p); |
122 | |
122 | |
123 | glViewport (0, 0, w, h); |
123 | glViewport (0, 0, w, h); |
124 | |
124 | |
125 | glMatrixMode (GL_PROJECTION); |
|
|
126 | |
|
|
127 | GLdouble aspect = (GLdouble)w/h; |
125 | GLdouble aspect = (GLdouble)w/h; |
128 | GLdouble ftan = tanf (fov * GLfloat (.5 * M_PI / 180.)); |
126 | GLdouble ftan = tanf (fov * GLfloat (.5 * M_PI / 180.)); |
129 | GLdouble ymax = ftan; |
127 | GLdouble ymax = ftan; |
130 | GLdouble xmax = ymax * aspect; |
128 | GLdouble xmax = ymax * aspect; |
131 | |
129 | |
… | |
… | |
140 | |
138 | |
141 | glLoadMatrixf (perspective); |
139 | glLoadMatrixf (perspective); |
142 | } |
140 | } |
143 | //glFrustum (-xmax, xmax, -ymax, ymax, z_near, z_far); |
141 | //glFrustum (-xmax, xmax, -ymax, ymax, z_near, z_far); |
144 | |
142 | |
145 | glGetFloatv (GL_PROJECTION_MATRIX, perspective); |
143 | //glGetFloatv (GL_PROJECTION_MATRIX, perspective); |
146 | |
144 | |
147 | perspfact = z_near / ymax * 0.5F * h; |
145 | perspfact = z_near / ymax * 0.5F * h; |
148 | |
146 | |
149 | glMatrixMode (GL_MODELVIEW); |
147 | matrix view; |
150 | glLoadIdentity (); |
148 | { |
151 | matrix &m = projection; |
149 | matrix &m = view; |
152 | |
150 | |
153 | d = normalize (d);//D |
151 | d = normalize (d);//D |
154 | u = normalize (u);//D |
152 | u = normalize (u);//D |
155 | |
153 | |
156 | vec3 rz = -d; |
154 | vec3 rz = -d; |
157 | vec3 rx = cross (u, rz); |
155 | vec3 rx = cross (u, rz); |
158 | vec3 ry = cross (rz, rx); |
156 | vec3 ry = cross (rz, rx); |
159 | |
157 | |
160 | m(0,0) = rx.x; m(0,1) = rx.y; m(0,2) = rx.z; m(0,3) = 0; |
158 | m(0,0) = rx.x; m(0,1) = rx.y; m(0,2) = rx.z; m(0,3) = 0; |
161 | m(1,0) = ry.x; m(1,1) = ry.y; m(1,2) = ry.z; m(1,3) = 0; |
159 | m(1,0) = ry.x; m(1,1) = ry.y; m(1,2) = ry.z; m(1,3) = 0; |
162 | m(2,0) = rz.x; m(2,1) = rz.y; m(2,2) = rz.z; m(2,3) = 0; |
160 | m(2,0) = rz.x; m(2,1) = rz.y; m(2,2) = rz.z; m(2,3) = 0; |
163 | m(3,0) = 0; m(3,1) = 0; m(3,2) = 0; m(3,3) = 1.F; |
161 | m(3,0) = 0; m(3,1) = 0; m(3,2) = 0; m(3,3) = 1.F; |
164 | |
162 | |
165 | //diagfact = abs (rz.x) + abs (rz.y) + abs (rz.z); |
163 | //diagfact = abs (rz.x) + abs (rz.y) + abs (rz.z); |
166 | diagfact = sqrtf (3.F); |
164 | diagfact = sqrtf (3.F); |
|
|
165 | } |
|
|
166 | |
167 | //printf ("diagfact = %f\n", diagfact); |
167 | //printf ("diagfact = %f\n", diagfact); |
168 | //diagfact = sqrtf (3.);//D WHY??? |
168 | //diagfact = sqrtf (3.);//D WHY??? |
|
|
169 | // |
|
|
170 | view = view * matrix::translation (-p); |
169 | |
171 | |
170 | glMultMatrixf (m); |
172 | matrix projection = perspective * view; |
171 | |
173 | |
172 | glTranslatef (-p.x, -p.y, -p.z); |
|
|
173 | |
174 | { |
174 | glGetFloatv (GL_MODELVIEW_MATRIX, m); |
175 | matrix &m = projection; |
175 | |
176 | |
176 | m = perspective * m; |
|
|
177 | |
|
|
178 | frustum.l = plane ( m(3,0) + m(0,0), m(3,1) + m(0,1), m(3,2) + m(0,2), m(3,3) + m(0,3) ); |
177 | frustum.l = plane ( m(3,0) + m(0,0), m(3,1) + m(0,1), m(3,2) + m(0,2), m(3,3) + m(0,3) ); |
179 | frustum.r = plane ( m(3,0) - m(0,0), m(3,1) - m(0,1), m(3,2) - m(0,2), m(3,3) - m(0,3) ); |
178 | frustum.r = plane ( m(3,0) - m(0,0), m(3,1) - m(0,1), m(3,2) - m(0,2), m(3,3) - m(0,3) ); |
180 | frustum.b = plane ( m(3,0) + m(1,0), m(3,1) + m(1,1), m(3,2) + m(1,2), m(3,3) + m(1,3) ); |
179 | frustum.b = plane ( m(3,0) + m(1,0), m(3,1) + m(1,1), m(3,2) + m(1,2), m(3,3) + m(1,3) ); |
181 | frustum.t = plane ( m(3,0) - m(1,0), m(3,1) - m(1,1), m(3,2) - m(1,2), m(3,3) - m(1,3) ); |
180 | frustum.t = plane ( m(3,0) - m(1,0), m(3,1) - m(1,1), m(3,2) - m(1,2), m(3,3) - m(1,3) ); |
182 | frustum.n = plane ( m(3,0) + m(2,0), m(3,1) + m(2,1), m(3,2) + m(2,2), m(3,3) + m(2,3) ); |
181 | frustum.n = plane ( m(3,0) + m(2,0), m(3,1) + m(2,1), m(3,2) + m(2,2), m(3,3) + m(2,3) ); |
183 | frustum.f = plane ( m(3,0) - m(2,0), m(3,1) - m(2,1), m(3,2) - m(2,2), m(3,3) - m(2,3) ); |
182 | frustum.f = plane ( m(3,0) - m(2,0), m(3,1) - m(2,1), m(3,2) - m(2,2), m(3,3) - m(2,3) ); |
|
|
183 | } |
184 | |
184 | |
185 | #if 0 |
185 | #if 0 |
186 | { |
186 | { |
187 | GLdouble frustlen = z_far - z_near; |
187 | GLdouble frustlen = z_far - z_near; |
188 | GLdouble fheight = frustlen * ftan; |
188 | GLdouble fheight = frustlen * ftan; |
… | |
… | |
192 | |
192 | |
193 | frustum.s = sphere (p + d * (.5 * frustlen), length (corner - half)); |
193 | frustum.s = sphere (p + d * (.5 * frustlen), length (corner - half)); |
194 | } |
194 | } |
195 | #endif |
195 | #endif |
196 | |
196 | |
197 | { |
|
|
198 | GLdouble depth = h / ftan; |
197 | GLdouble depth = h / ftan; |
199 | |
|
|
200 | frustum.c = cone (p, d, atan (sqrt (GLdouble (w * w + h * h)) * ftan)); |
198 | frustum.c = cone (p, d, atan (sqrt (GLdouble (w * w + h * h)) * ftan)); |
201 | } |
199 | |
|
|
200 | glMatrixMode (GL_PROJECTION); |
|
|
201 | glLoadMatrixf (projection); |
|
|
202 | |
|
|
203 | glMatrixMode (GL_MODELVIEW); |
|
|
204 | glLoadIdentity (); |
202 | } |
205 | } |
203 | |
206 | |
204 | void view::begin () |
207 | void view::begin () |
205 | { |
208 | { |
206 | generation++; |
209 | generation++; |
… | |
… | |
326 | } |
329 | } |
327 | |
330 | |
328 | drawn.clear (); |
331 | drawn.clear (); |
329 | } |
332 | } |
330 | |
333 | |
331 | void light::enable () |
334 | void light::enable (view &ctx) |
332 | { |
335 | { |
333 | lightpos->set (p); |
336 | lightpos->set (p - ctx.orig); |
334 | } |
337 | } |
335 | |
338 | |
336 | void light::disable () |
339 | void light::disable (view &ctx) |
337 | { |
340 | { |
338 | } |
341 | } |
339 | |
|
|
340 | static shader::varying_1f camdist; |
|
|
341 | static shader::varying_3f lightvec; |
|
|
342 | |
342 | |
343 | void linear_light::vsh () |
343 | void linear_light::vsh () |
344 | { |
344 | { |
345 | using namespace shader::compile; |
345 | using namespace shader::compile; |
|
|
346 | temp_1f camdist; |
346 | |
347 | |
347 | lightvec = xyz (lightpos - model_view_matrix * vin.vertex); |
348 | lightvec = xyz (lightpos - model_view_matrix * vin.vertex); |
348 | camdist = max (1 - length (lightvec) / radius, 0); |
349 | camdist = max (1 - length (lightvec) / radius, 0); |
349 | |
350 | |
350 | fsh (); |
351 | fsh (); |