diff options
author | Jacek Antonelli | 2009-11-19 04:19:06 -0600 |
---|---|---|
committer | Jacek Antonelli | 2009-11-19 04:19:06 -0600 |
commit | 1d443b7a94ed6f9ef1d408caef72fcbc0b1ee427 (patch) | |
tree | e09ccbc010e326a48fd91ba15b58afd7fb836b3f /linden/indra/llwindow | |
parent | Fixed minor formatting issue in MANIFESTO.txt. (diff) | |
parent | Fixed CMake setting errors (diff) | |
download | meta-impy-1d443b7a94ed6f9ef1d408caef72fcbc0b1ee427.zip meta-impy-1d443b7a94ed6f9ef1d408caef72fcbc0b1ee427.tar.gz meta-impy-1d443b7a94ed6f9ef1d408caef72fcbc0b1ee427.tar.bz2 meta-impy-1d443b7a94ed6f9ef1d408caef72fcbc0b1ee427.tar.xz |
Merge remote branch 'mccabe/1.3.0-next' into next
Conflicts:
linden/indra/cmake/00-Common.cmake
linden/indra/newview/skins/default/xui/de/floater_about.xml
linden/indra/newview/skins/default/xui/fr/floater_about.xml
linden/indra/newview/skins/default/xui/ja/floater_about.xml
linden/indra/newview/skins/default/xui/ko/floater_about.xml
linden/indra/newview/skins/default/xui/zh/floater_about.xml
linden/install.xml
Diffstat (limited to 'linden/indra/llwindow')
27 files changed, 1861 insertions, 175 deletions
diff --git a/linden/indra/llwindow/glh/glh_linear.h b/linden/indra/llwindow/glh/glh_linear.h new file mode 100755 index 0000000..04ae1bd --- /dev/null +++ b/linden/indra/llwindow/glh/glh_linear.h | |||
@@ -0,0 +1,1621 @@ | |||
1 | /* | ||
2 | glh - is a platform-indepenedent C++ OpenGL helper library | ||
3 | |||
4 | |||
5 | Copyright (c) 2000 Cass Everitt | ||
6 | Copyright (c) 2000 NVIDIA Corporation | ||
7 | All rights reserved. | ||
8 | |||
9 | Redistribution and use in source and binary forms, with or | ||
10 | without modification, are permitted provided that the following | ||
11 | conditions are met: | ||
12 | |||
13 | * Redistributions of source code must retain the above | ||
14 | copyright notice, this list of conditions and the following | ||
15 | disclaimer. | ||
16 | |||
17 | * Redistributions in binary form must reproduce the above | ||
18 | copyright notice, this list of conditions and the following | ||
19 | disclaimer in the documentation and/or other materials | ||
20 | provided with the distribution. | ||
21 | |||
22 | * The names of contributors to this software may not be used | ||
23 | to endorse or promote products derived from this software | ||
24 | without specific prior written permission. | ||
25 | |||
26 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
27 | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
28 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
29 | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
30 | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
31 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
32 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
33 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
34 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
35 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
36 | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
37 | POSSIBILITY OF SUCH DAMAGE. | ||
38 | |||
39 | |||
40 | Cass Everitt - cass@r3.nu | ||
41 | */ | ||
42 | |||
43 | /* | ||
44 | glh_linear.h | ||
45 | */ | ||
46 | |||
47 | // Author: Cass W. Everitt | ||
48 | |||
49 | #ifndef GLH_LINEAR_H | ||
50 | #define GLH_LINEAR_H | ||
51 | |||
52 | #include <memory.h> | ||
53 | #include <math.h> | ||
54 | #include <assert.h> | ||
55 | |||
56 | // only supports float for now... | ||
57 | #define GLH_REAL_IS_FLOAT | ||
58 | |||
59 | #ifdef GLH_REAL_IS_FLOAT | ||
60 | # define GLH_REAL float | ||
61 | # define GLH_REAL_NAMESPACE ns_float | ||
62 | #endif | ||
63 | |||
64 | #define GLH_QUATERNION_NORMALIZATION_THRESHOLD 64 | ||
65 | |||
66 | #define GLH_RAD_TO_DEG GLH_REAL(57.2957795130823208767981548141052) | ||
67 | #define GLH_DEG_TO_RAD GLH_REAL(0.0174532925199432957692369076848861) | ||
68 | #define GLH_ZERO GLH_REAL(0.0) | ||
69 | #define GLH_ONE GLH_REAL(1.0) | ||
70 | #define GLH_TWO GLH_REAL(2.0) | ||
71 | #define GLH_EPSILON GLH_REAL(10e-6) | ||
72 | #define GLH_PI GLH_REAL(3.1415926535897932384626433832795) | ||
73 | |||
74 | #define equivalent(a,b) (((a < b + GLH_EPSILON) && (a > b - GLH_EPSILON)) ? true : false) | ||
75 | |||
76 | namespace glh | ||
77 | { | ||
78 | |||
79 | inline GLH_REAL to_degrees(GLH_REAL radians) { return radians*GLH_RAD_TO_DEG; } | ||
80 | inline GLH_REAL to_radians(GLH_REAL degrees) { return degrees*GLH_DEG_TO_RAD; } | ||
81 | |||
82 | // forward declarations for friend template functions. | ||
83 | template <int N, class T> class vec; | ||
84 | |||
85 | // forward declarations for friend template functions. | ||
86 | template <int N, class T> | ||
87 | bool operator == ( const vec<N,T> & v1, const vec<N,T> & v2 ); | ||
88 | |||
89 | // forward declarations for friend template functions. | ||
90 | template <int N, class T> | ||
91 | bool operator != ( const vec<N,T> & v1, const vec<N,T> & v2 ); | ||
92 | |||
93 | template <int N, class T> | ||
94 | class vec | ||
95 | { | ||
96 | public: | ||
97 | int size() const { return N; } | ||
98 | |||
99 | vec(const T & t = T()) | ||
100 | { for(int i = 0; i < N; i++) v[i] = t; } | ||
101 | vec(const T * tp) | ||
102 | { for(int i = 0; i < N; i++) v[i] = tp[i]; } | ||
103 | |||
104 | const T * get_value() const | ||
105 | { return v; } | ||
106 | |||
107 | |||
108 | T dot( const vec<N,T> & rhs ) const | ||
109 | { | ||
110 | T r = 0; | ||
111 | for(int i = 0; i < N; i++) r += v[i]*rhs.v[i]; | ||
112 | return r; | ||
113 | } | ||
114 | |||
115 | T length() const | ||
116 | { | ||
117 | T r = 0; | ||
118 | for(int i = 0; i < N; i++) r += v[i]*v[i]; | ||
119 | return T(sqrt(r)); | ||
120 | } | ||
121 | |||
122 | T square_norm() const | ||
123 | { | ||
124 | T r = 0; | ||
125 | for(int i = 0; i < N; i++) r += v[i]*v[i]; | ||
126 | return r; | ||
127 | } | ||
128 | |||
129 | void negate() | ||
130 | { for(int i = 0; i < N; i++) v[i] = -v[i]; } | ||
131 | |||
132 | |||
133 | T normalize() | ||
134 | { | ||
135 | T sum(0); | ||
136 | for(int i = 0; i < N; i++) | ||
137 | sum += v[i]*v[i]; | ||
138 | sum = T(sqrt(sum)); | ||
139 | if (sum > GLH_EPSILON) | ||
140 | for(int i = 0; i < N; i++) | ||
141 | v[i] /= sum; | ||
142 | return sum; | ||
143 | } | ||
144 | |||
145 | |||
146 | vec<N,T> & set_value( const T * rhs ) | ||
147 | { for(int i = 0; i < N; i++) v[i] = rhs[i]; return *this; } | ||
148 | |||
149 | T & operator [] ( int i ) | ||
150 | { return v[i]; } | ||
151 | |||
152 | const T & operator [] ( int i ) const | ||
153 | { return v[i]; } | ||
154 | |||
155 | vec<N,T> & operator *= ( T d ) | ||
156 | { for(int i = 0; i < N; i++) v[i] *= d; return *this;} | ||
157 | |||
158 | vec<N,T> & operator *= ( const vec<N,T> & u ) | ||
159 | { for(int i = 0; i < N; i++) v[i] *= u[i]; return *this;} | ||
160 | |||
161 | vec<N,T> & operator /= ( T d ) | ||
162 | { if(d == 0) return *this; for(int i = 0; i < N; i++) v[i] /= d; return *this;} | ||
163 | |||
164 | vec<N,T> & operator += ( const vec<N,T> & u ) | ||
165 | { for(int i = 0; i < N; i++) v[i] += u.v[i]; return *this;} | ||
166 | |||
167 | vec<N,T> & operator -= ( const vec<N,T> & u ) | ||
168 | { for(int i = 0; i < N; i++) v[i] -= u.v[i]; return *this;} | ||
169 | |||
170 | |||
171 | vec<N,T> operator - () const | ||
172 | { vec<N,T> rv = v; rv.negate(); return rv; } | ||
173 | |||
174 | vec<N,T> operator + ( const vec<N,T> &v) const | ||
175 | { vec<N,T> rt(*this); return rt += v; } | ||
176 | |||
177 | vec<N,T> operator - ( const vec<N,T> &v) const | ||
178 | { vec<N,T> rt(*this); return rt -= v; } | ||
179 | |||
180 | vec<N,T> operator * ( T d) const | ||
181 | { vec<N,T> rt(*this); return rt *= d; } | ||
182 | |||
183 | friend bool operator == <> ( const vec<N,T> &v1, const vec<N,T> &v2 ); | ||
184 | friend bool operator != <> ( const vec<N,T> &v1, const vec<N,T> &v2 ); | ||
185 | |||
186 | |||
187 | //protected: | ||
188 | T v[N]; | ||
189 | }; | ||
190 | |||
191 | |||
192 | |||
193 | // vector friend operators | ||
194 | |||
195 | template <int N, class T> inline | ||
196 | vec<N,T> operator * ( const vec<N,T> & b, T d ) | ||
197 | { | ||
198 | vec<N,T> rt(b); | ||
199 | return rt *= d; | ||
200 | } | ||
201 | |||
202 | template <int N, class T> inline | ||
203 | vec<N,T> operator * ( T d, const vec<N,T> & b ) | ||
204 | { return b*d; } | ||
205 | |||
206 | template <int N, class T> inline | ||
207 | vec<N,T> operator * ( const vec<N,T> & b, const vec<N,T> & d ) | ||
208 | { | ||
209 | vec<N,T> rt(b); | ||
210 | return rt *= d; | ||
211 | } | ||
212 | |||
213 | template <int N, class T> inline | ||
214 | vec<N,T> operator / ( const vec<N,T> & b, T d ) | ||
215 | { vec<N,T> rt(b); return rt /= d; } | ||
216 | |||
217 | template <int N, class T> inline | ||
218 | vec<N,T> operator + ( const vec<N,T> & v1, const vec<N,T> & v2 ) | ||
219 | { vec<N,T> rt(v1); return rt += v2; } | ||
220 | |||
221 | template <int N, class T> inline | ||
222 | vec<N,T> operator - ( const vec<N,T> & v1, const vec<N,T> & v2 ) | ||
223 | { vec<N,T> rt(v1); return rt -= v2; } | ||
224 | |||
225 | |||
226 | template <int N, class T> inline | ||
227 | bool operator == ( const vec<N,T> & v1, const vec<N,T> & v2 ) | ||
228 | { | ||
229 | for(int i = 0; i < N; i++) | ||
230 | if(v1.v[i] != v2.v[i]) | ||
231 | return false; | ||
232 | return true; | ||
233 | } | ||
234 | |||
235 | template <int N, class T> inline | ||
236 | bool operator != ( const vec<N,T> & v1, const vec<N,T> & v2 ) | ||
237 | { return !(v1 == v2); } | ||
238 | |||
239 | |||
240 | typedef vec<3,unsigned char> vec3ub; | ||
241 | typedef vec<4,unsigned char> vec4ub; | ||
242 | |||
243 | |||
244 | |||
245 | |||
246 | |||
247 | namespace GLH_REAL_NAMESPACE | ||
248 | { | ||
249 | typedef GLH_REAL real; | ||
250 | |||
251 | class line; | ||
252 | class plane; | ||
253 | class matrix4; | ||
254 | class quaternion; | ||
255 | typedef quaternion rotation; | ||
256 | |||
257 | class vec2 : public vec<2,real> | ||
258 | { | ||
259 | public: | ||
260 | vec2(const real & t = real()) : vec<2,real>(t) | ||
261 | {} | ||
262 | vec2(const vec<2,real> & t) : vec<2,real>(t) | ||
263 | {} | ||
264 | vec2(const real * tp) : vec<2,real>(tp) | ||
265 | {} | ||
266 | |||
267 | vec2(real x, real y ) | ||
268 | { v[0] = x; v[1] = y; } | ||
269 | |||
270 | void get_value(real & x, real & y) const | ||
271 | { x = v[0]; y = v[1]; } | ||
272 | |||
273 | vec2 & set_value( const real & x, const real & y) | ||
274 | { v[0] = x; v[1] = y; return *this; } | ||
275 | |||
276 | }; | ||
277 | |||
278 | |||
279 | class vec3 : public vec<3,real> | ||
280 | { | ||
281 | public: | ||
282 | vec3(const real & t = real()) : vec<3,real>(t) | ||
283 | {} | ||
284 | vec3(const vec<3,real> & t) : vec<3,real>(t) | ||
285 | {} | ||
286 | vec3(const real * tp) : vec<3,real>(tp) | ||
287 | {} | ||
288 | |||
289 | vec3(real x, real y, real z) | ||
290 | { v[0] = x; v[1] = y; v[2] = z; } | ||
291 | |||
292 | void get_value(real & x, real & y, real & z) const | ||
293 | { x = v[0]; y = v[1]; z = v[2]; } | ||
294 | |||
295 | vec3 cross( const vec3 &rhs ) const | ||
296 | { | ||
297 | vec3 rt; | ||
298 | rt.v[0] = v[1]*rhs.v[2]-v[2]*rhs.v[1]; | ||
299 | rt.v[1] = v[2]*rhs.v[0]-v[0]*rhs.v[2]; | ||
300 | rt.v[2] = v[0]*rhs.v[1]-v[1]*rhs.v[0]; | ||
301 | return rt; | ||
302 | } | ||
303 | |||
304 | vec3 & set_value( const real & x, const real & y, const real & z) | ||
305 | { v[0] = x; v[1] = y; v[2] = z; return *this; } | ||
306 | |||
307 | }; | ||
308 | |||
309 | |||
310 | class vec4 : public vec<4,real> | ||
311 | { | ||
312 | public: | ||
313 | vec4(const real & t = real()) : vec<4,real>(t) | ||
314 | {} | ||
315 | vec4(const vec<4,real> & t) : vec<4,real>(t) | ||
316 | {} | ||
317 | |||
318 | vec4(const vec<3,real> & t, real fourth) | ||
319 | |||
320 | { v[0] = t.v[0]; v[1] = t.v[1]; v[2] = t.v[2]; v[3] = fourth; } | ||
321 | vec4(const real * tp) : vec<4,real>(tp) | ||
322 | {} | ||
323 | vec4(real x, real y, real z, real w) | ||
324 | { v[0] = x; v[1] = y; v[2] = z; v[3] = w; } | ||
325 | |||
326 | void get_value(real & x, real & y, real & z, real & w) const | ||
327 | { x = v[0]; y = v[1]; z = v[2]; w = v[3]; } | ||
328 | |||
329 | vec4 & set_value( const real & x, const real & y, const real & z, const real & w) | ||
330 | { v[0] = x; v[1] = y; v[2] = z; v[3] = w; return *this; } | ||
331 | }; | ||
332 | |||
333 | inline | ||
334 | vec3 homogenize(const vec4 & v) | ||
335 | { | ||
336 | vec3 rt; | ||
337 | assert(v.v[3] != GLH_ZERO); | ||
338 | rt.v[0] = v.v[0]/v.v[3]; | ||
339 | rt.v[1] = v.v[1]/v.v[3]; | ||
340 | rt.v[2] = v.v[2]/v.v[3]; | ||
341 | return rt; | ||
342 | } | ||
343 | |||
344 | |||
345 | |||
346 | class line | ||
347 | { | ||
348 | public: | ||
349 | |||
350 | line() | ||
351 | { set_value(vec3(0,0,0),vec3(0,0,1)); } | ||
352 | |||
353 | line( const vec3 & p0, const vec3 &p1) | ||
354 | { set_value(p0,p1); } | ||
355 | |||
356 | void set_value( const vec3 &p0, const vec3 &p1) | ||
357 | { | ||
358 | position = p0; | ||
359 | direction = p1-p0; | ||
360 | direction.normalize(); | ||
361 | } | ||
362 | |||
363 | bool get_closest_points(const line &line2, | ||
364 | vec3 &pointOnThis, | ||
365 | vec3 &pointOnThat) | ||
366 | { | ||
367 | |||
368 | // quick check to see if parallel -- if so, quit. | ||
369 | if(fabs(direction.dot(line2.direction)) == 1.0) | ||
370 | return 0; | ||
371 | line l2 = line2; | ||
372 | |||
373 | // Algorithm: Brian Jean | ||
374 | // | ||
375 | register real u; | ||
376 | register real v; | ||
377 | vec3 Vr = direction; | ||
378 | vec3 Vs = l2.direction; | ||
379 | register real Vr_Dot_Vs = Vr.dot(Vs); | ||
380 | register real detA = real(1.0 - (Vr_Dot_Vs * Vr_Dot_Vs)); | ||
381 | vec3 C = l2.position - position; | ||
382 | register real C_Dot_Vr = C.dot(Vr); | ||
383 | register real C_Dot_Vs = C.dot(Vs); | ||
384 | |||
385 | u = (C_Dot_Vr - Vr_Dot_Vs * C_Dot_Vs)/detA; | ||
386 | v = (C_Dot_Vr * Vr_Dot_Vs - C_Dot_Vs)/detA; | ||
387 | |||
388 | pointOnThis = position; | ||
389 | pointOnThis += direction * u; | ||
390 | pointOnThat = l2.position; | ||
391 | pointOnThat += l2.direction * v; | ||
392 | |||
393 | return 1; | ||
394 | } | ||
395 | |||
396 | vec3 get_closest_point(const vec3 &point) | ||
397 | { | ||
398 | vec3 np = point - position; | ||
399 | vec3 rp = direction*direction.dot(np)+position; | ||
400 | return rp; | ||
401 | } | ||
402 | |||
403 | const vec3 & get_position() const {return position;} | ||
404 | |||
405 | const vec3 & get_direction() const {return direction;} | ||
406 | |||
407 | //protected: | ||
408 | vec3 position; | ||
409 | vec3 direction; | ||
410 | }; | ||
411 | |||
412 | |||
413 | |||
414 | |||
415 | |||
416 | |||
417 | |||
418 | |||
419 | |||
420 | |||
421 | |||
422 | |||
423 | |||
424 | |||
425 | |||
426 | |||
427 | |||
428 | |||
429 | |||
430 | |||
431 | |||
432 | |||
433 | |||
434 | |||
435 | |||
436 | |||
437 | |||
438 | |||
439 | |||
440 | // matrix | ||
441 | |||
442 | |||
443 | class matrix4 | ||
444 | { | ||
445 | |||
446 | public: | ||
447 | |||
448 | matrix4() { make_identity(); } | ||
449 | |||
450 | matrix4( real r ) | ||
451 | { set_value(r); } | ||
452 | |||
453 | matrix4( real * m ) | ||
454 | { set_value(m); } | ||
455 | |||
456 | matrix4( real a00, real a01, real a02, real a03, | ||
457 | real a10, real a11, real a12, real a13, | ||
458 | real a20, real a21, real a22, real a23, | ||
459 | real a30, real a31, real a32, real a33 ) | ||
460 | { | ||
461 | element(0,0) = a00; | ||
462 | element(0,1) = a01; | ||
463 | element(0,2) = a02; | ||
464 | element(0,3) = a03; | ||
465 | |||
466 | element(1,0) = a10; | ||
467 | element(1,1) = a11; | ||
468 | element(1,2) = a12; | ||
469 | element(1,3) = a13; | ||
470 | |||
471 | element(2,0) = a20; | ||
472 | element(2,1) = a21; | ||
473 | element(2,2) = a22; | ||
474 | element(2,3) = a23; | ||
475 | |||
476 | element(3,0) = a30; | ||
477 | element(3,1) = a31; | ||
478 | element(3,2) = a32; | ||
479 | element(3,3) = a33; | ||
480 | } | ||
481 | |||
482 | |||
483 | void get_value( real * mp ) const | ||
484 | { | ||
485 | int c = 0; | ||
486 | for(int j=0; j < 4; j++) | ||
487 | for(int i=0; i < 4; i++) | ||
488 | mp[c++] = element(i,j); | ||
489 | } | ||
490 | |||
491 | |||
492 | const real * get_value() const | ||
493 | { return m; } | ||
494 | |||
495 | void set_value( real * mp) | ||
496 | { | ||
497 | int c = 0; | ||
498 | for(int j=0; j < 4; j++) | ||
499 | for(int i=0; i < 4; i++) | ||
500 | element(i,j) = mp[c++]; | ||
501 | } | ||
502 | |||
503 | void set_value( real r ) | ||
504 | { | ||
505 | for(int i=0; i < 4; i++) | ||
506 | for(int j=0; j < 4; j++) | ||
507 | element(i,j) = r; | ||
508 | } | ||
509 | |||
510 | void make_identity() | ||
511 | { | ||
512 | element(0,0) = 1.0; | ||
513 | element(0,1) = 0.0; | ||
514 | element(0,2) = 0.0; | ||
515 | element(0,3) = 0.0; | ||
516 | |||
517 | element(1,0) = 0.0; | ||
518 | element(1,1) = 1.0; | ||
519 | element(1,2) = 0.0; | ||
520 | element(1,3) = 0.0; | ||
521 | |||
522 | element(2,0) = 0.0; | ||
523 | element(2,1) = 0.0; | ||
524 | element(2,2) = 1.0; | ||
525 | element(2,3) = 0.0; | ||
526 | |||
527 | element(3,0) = 0.0; | ||
528 | element(3,1) = 0.0; | ||
529 | element(3,2) = 0.0; | ||
530 | element(3,3) = 1.0; | ||
531 | } | ||
532 | |||
533 | |||
534 | static matrix4 identity() | ||
535 | { | ||
536 | static matrix4 mident ( | ||
537 | 1.0, 0.0, 0.0, 0.0, | ||
538 | 0.0, 1.0, 0.0, 0.0, | ||
539 | 0.0, 0.0, 1.0, 0.0, | ||
540 | 0.0, 0.0, 0.0, 1.0 ); | ||
541 | return mident; | ||
542 | } | ||
543 | |||
544 | |||
545 | void set_scale( real s ) | ||
546 | { | ||
547 | element(0,0) = s; | ||
548 | element(1,1) = s; | ||
549 | element(2,2) = s; | ||
550 | } | ||
551 | |||
552 | void set_scale( const vec3 & s ) | ||
553 | { | ||
554 | element(0,0) = s.v[0]; | ||
555 | element(1,1) = s.v[1]; | ||
556 | element(2,2) = s.v[2]; | ||
557 | } | ||
558 | |||
559 | |||
560 | void set_translate( const vec3 & t ) | ||
561 | { | ||
562 | element(0,3) = t.v[0]; | ||
563 | element(1,3) = t.v[1]; | ||
564 | element(2,3) = t.v[2]; | ||
565 | } | ||
566 | |||
567 | void set_row(int r, const vec4 & t) | ||
568 | { | ||
569 | element(r,0) = t.v[0]; | ||
570 | element(r,1) = t.v[1]; | ||
571 | element(r,2) = t.v[2]; | ||
572 | element(r,3) = t.v[3]; | ||
573 | } | ||
574 | |||
575 | void set_column(int c, const vec4 & t) | ||
576 | { | ||
577 | element(0,c) = t.v[0]; | ||
578 | element(1,c) = t.v[1]; | ||
579 | element(2,c) = t.v[2]; | ||
580 | element(3,c) = t.v[3]; | ||
581 | } | ||
582 | |||
583 | |||
584 | void get_row(int r, vec4 & t) const | ||
585 | { | ||
586 | t.v[0] = element(r,0); | ||
587 | t.v[1] = element(r,1); | ||
588 | t.v[2] = element(r,2); | ||
589 | t.v[3] = element(r,3); | ||
590 | } | ||
591 | |||
592 | vec4 get_row(int r) const | ||
593 | { | ||
594 | vec4 v; get_row(r, v); | ||
595 | return v; | ||
596 | } | ||
597 | |||
598 | void get_column(int c, vec4 & t) const | ||
599 | { | ||
600 | t.v[0] = element(0,c); | ||
601 | t.v[1] = element(1,c); | ||
602 | t.v[2] = element(2,c); | ||
603 | t.v[3] = element(3,c); | ||
604 | } | ||
605 | |||
606 | vec4 get_column(int c) const | ||
607 | { | ||
608 | vec4 v; get_column(c, v); | ||
609 | return v; | ||
610 | } | ||
611 | |||
612 | matrix4 inverse() const | ||
613 | { | ||
614 | matrix4 minv; | ||
615 | |||
616 | real r1[8], r2[8], r3[8], r4[8]; | ||
617 | real *s[4], *tmprow; | ||
618 | |||
619 | s[0] = &r1[0]; | ||
620 | s[1] = &r2[0]; | ||
621 | s[2] = &r3[0]; | ||
622 | s[3] = &r4[0]; | ||
623 | |||
624 | register int i,j,p,jj; | ||
625 | for(i=0;i<4;i++) | ||
626 | { | ||
627 | for(j=0;j<4;j++) | ||
628 | { | ||
629 | s[i][j] = element(i,j); | ||
630 | if(i==j) s[i][j+4] = 1.0; | ||
631 | else s[i][j+4] = 0.0; | ||
632 | } | ||
633 | } | ||
634 | real scp[4]; | ||
635 | for(i=0;i<4;i++) | ||
636 | { | ||
637 | scp[i] = real(fabs(s[i][0])); | ||
638 | for(j=1;j<4;j++) | ||
639 | if(real(fabs(s[i][j])) > scp[i]) scp[i] = real(fabs(s[i][j])); | ||
640 | if(scp[i] == 0.0) return minv; // singular matrix! | ||
641 | } | ||
642 | |||
643 | int pivot_to; | ||
644 | real scp_max; | ||
645 | for(i=0;i<4;i++) | ||
646 | { | ||
647 | // select pivot row | ||
648 | pivot_to = i; | ||
649 | scp_max = real(fabs(s[i][i]/scp[i])); | ||
650 | // find out which row should be on top | ||
651 | for(p=i+1;p<4;p++) | ||
652 | if(real(fabs(s[p][i]/scp[p])) > scp_max) | ||
653 | { scp_max = real(fabs(s[p][i]/scp[p])); pivot_to = p; } | ||
654 | // Pivot if necessary | ||
655 | if(pivot_to != i) | ||
656 | { | ||
657 | tmprow = s[i]; | ||
658 | s[i] = s[pivot_to]; | ||
659 | s[pivot_to] = tmprow; | ||
660 | real tmpscp; | ||
661 | tmpscp = scp[i]; | ||
662 | scp[i] = scp[pivot_to]; | ||
663 | scp[pivot_to] = tmpscp; | ||
664 | } | ||
665 | |||
666 | real mji; | ||
667 | // perform gaussian elimination | ||
668 | for(j=i+1;j<4;j++) | ||
669 | { | ||
670 | mji = s[j][i]/s[i][i]; | ||
671 | s[j][i] = 0.0; | ||
672 | for(jj=i+1;jj<8;jj++) | ||
673 | s[j][jj] -= mji*s[i][jj]; | ||
674 | } | ||
675 | } | ||
676 | if(s[3][3] == 0.0) return minv; // singular matrix! | ||
677 | |||
678 | // | ||
679 | // Now we have an upper triangular matrix. | ||
680 | // | ||
681 | // x x x x | y y y y | ||
682 | // 0 x x x | y y y y | ||
683 | // 0 0 x x | y y y y | ||
684 | // 0 0 0 x | y y y y | ||
685 | // | ||
686 | // we'll back substitute to get the inverse | ||
687 | // | ||
688 | // 1 0 0 0 | z z z z | ||
689 | // 0 1 0 0 | z z z z | ||
690 | // 0 0 1 0 | z z z z | ||
691 | // 0 0 0 1 | z z z z | ||
692 | // | ||
693 | |||
694 | real mij; | ||
695 | for(i=3;i>0;i--) | ||
696 | { | ||
697 | for(j=i-1;j > -1; j--) | ||
698 | { | ||
699 | mij = s[j][i]/s[i][i]; | ||
700 | for(jj=j+1;jj<8;jj++) | ||
701 | s[j][jj] -= mij*s[i][jj]; | ||
702 | } | ||
703 | } | ||
704 | |||
705 | for(i=0;i<4;i++) | ||
706 | for(j=0;j<4;j++) | ||
707 | minv(i,j) = s[i][j+4] / s[i][i]; | ||
708 | |||
709 | return minv; | ||
710 | } | ||
711 | |||
712 | |||
713 | matrix4 transpose() const | ||
714 | { | ||
715 | matrix4 mtrans; | ||
716 | |||
717 | for(int i=0;i<4;i++) | ||
718 | for(int j=0;j<4;j++) | ||
719 | mtrans(i,j) = element(j,i); | ||
720 | return mtrans; | ||
721 | } | ||
722 | |||
723 | matrix4 & mult_right( const matrix4 & b ) | ||
724 | { | ||
725 | matrix4 mt(*this); | ||
726 | set_value(real(0)); | ||
727 | |||
728 | for(int i=0; i < 4; i++) | ||
729 | for(int j=0; j < 4; j++) | ||
730 | for(int c=0; c < 4; c++) | ||
731 | element(i,j) += mt(i,c) * b(c,j); | ||
732 | return *this; | ||
733 | } | ||
734 | |||
735 | matrix4 & mult_left( const matrix4 & b ) | ||
736 | { | ||
737 | matrix4 mt(*this); | ||
738 | set_value(real(0)); | ||
739 | |||
740 | for(int i=0; i < 4; i++) | ||
741 | for(int j=0; j < 4; j++) | ||
742 | for(int c=0; c < 4; c++) | ||
743 | element(i,j) += b(i,c) * mt(c,j); | ||
744 | return *this; | ||
745 | } | ||
746 | |||
747 | // dst = M * src | ||
748 | void mult_matrix_vec( const vec3 &src, vec3 &dst ) const | ||
749 | { | ||
750 | real w = ( | ||
751 | src.v[0] * element(3,0) + | ||
752 | src.v[1] * element(3,1) + | ||
753 | src.v[2] * element(3,2) + | ||
754 | element(3,3) ); | ||
755 | |||
756 | assert(w != GLH_ZERO); | ||
757 | |||
758 | dst.v[0] = ( | ||
759 | src.v[0] * element(0,0) + | ||
760 | src.v[1] * element(0,1) + | ||
761 | src.v[2] * element(0,2) + | ||
762 | element(0,3) ) / w; | ||
763 | dst.v[1] = ( | ||
764 | src.v[0] * element(1,0) + | ||
765 | src.v[1] * element(1,1) + | ||
766 | src.v[2] * element(1,2) + | ||
767 | element(1,3) ) / w; | ||
768 | dst.v[2] = ( | ||
769 | src.v[0] * element(2,0) + | ||
770 | src.v[1] * element(2,1) + | ||
771 | src.v[2] * element(2,2) + | ||
772 | element(2,3) ) / w; | ||
773 | } | ||
774 | |||
775 | void mult_matrix_vec( vec3 & src_and_dst) const | ||
776 | { mult_matrix_vec(vec3(src_and_dst), src_and_dst); } | ||
777 | |||
778 | |||
779 | // dst = src * M | ||
780 | void mult_vec_matrix( const vec3 &src, vec3 &dst ) const | ||
781 | { | ||
782 | real w = ( | ||
783 | src.v[0] * element(0,3) + | ||
784 | src.v[1] * element(1,3) + | ||
785 | src.v[2] * element(2,3) + | ||
786 | element(3,3) ); | ||
787 | |||
788 | assert(w != GLH_ZERO); | ||
789 | |||
790 | dst.v[0] = ( | ||
791 | src.v[0] * element(0,0) + | ||
792 | src.v[1] * element(1,0) + | ||
793 | src.v[2] * element(2,0) + | ||
794 | element(3,0) ) / w; | ||
795 | dst.v[1] = ( | ||
796 | src.v[0] * element(0,1) + | ||
797 | src.v[1] * element(1,1) + | ||
798 | src.v[2] * element(2,1) + | ||
799 | element(3,1) ) / w; | ||
800 | dst.v[2] = ( | ||
801 | src.v[0] * element(0,2) + | ||
802 | src.v[1] * element(1,2) + | ||
803 | src.v[2] * element(2,2) + | ||
804 | element(3,2) ) / w; | ||
805 | } | ||
806 | |||
807 | |||
808 | void mult_vec_matrix( vec3 & src_and_dst) const | ||
809 | { mult_vec_matrix(vec3(src_and_dst), src_and_dst); } | ||
810 | |||
811 | // dst = M * src | ||
812 | void mult_matrix_vec( const vec4 &src, vec4 &dst ) const | ||
813 | { | ||
814 | dst.v[0] = ( | ||
815 | src.v[0] * element(0,0) + | ||
816 | src.v[1] * element(0,1) + | ||
817 | src.v[2] * element(0,2) + | ||
818 | src.v[3] * element(0,3)); | ||
819 | dst.v[1] = ( | ||
820 | src.v[0] * element(1,0) + | ||
821 | src.v[1] * element(1,1) + | ||
822 | src.v[2] * element(1,2) + | ||
823 | src.v[3] * element(1,3)); | ||
824 | dst.v[2] = ( | ||
825 | src.v[0] * element(2,0) + | ||
826 | src.v[1] * element(2,1) + | ||
827 | src.v[2] * element(2,2) + | ||
828 | src.v[3] * element(2,3)); | ||
829 | dst.v[3] = ( | ||
830 | src.v[0] * element(3,0) + | ||
831 | src.v[1] * element(3,1) + | ||
832 | src.v[2] * element(3,2) + | ||
833 | src.v[3] * element(3,3)); | ||
834 | } | ||
835 | |||
836 | void mult_matrix_vec( vec4 & src_and_dst) const | ||
837 | { mult_matrix_vec(vec4(src_and_dst), src_and_dst); } | ||
838 | |||
839 | |||
840 | // dst = src * M | ||
841 | void mult_vec_matrix( const vec4 &src, vec4 &dst ) const | ||
842 | { | ||
843 | dst.v[0] = ( | ||
844 | src.v[0] * element(0,0) + | ||
845 | src.v[1] * element(1,0) + | ||
846 | src.v[2] * element(2,0) + | ||
847 | src.v[3] * element(3,0)); | ||
848 | dst.v[1] = ( | ||
849 | src.v[0] * element(0,1) + | ||
850 | src.v[1] * element(1,1) + | ||
851 | src.v[2] * element(2,1) + | ||
852 | src.v[3] * element(3,1)); | ||
853 | dst.v[2] = ( | ||
854 | src.v[0] * element(0,2) + | ||
855 | src.v[1] * element(1,2) + | ||
856 | src.v[2] * element(2,2) + | ||
857 | src.v[3] * element(3,2)); | ||
858 | dst.v[3] = ( | ||
859 | src.v[0] * element(0,3) + | ||
860 | src.v[1] * element(1,3) + | ||
861 | src.v[2] * element(2,3) + | ||
862 | src.v[3] * element(3,3)); | ||
863 | } | ||
864 | |||
865 | |||
866 | void mult_vec_matrix( vec4 & src_and_dst) const | ||
867 | { mult_vec_matrix(vec4(src_and_dst), src_and_dst); } | ||
868 | |||
869 | |||
870 | // dst = M * src | ||
871 | void mult_matrix_dir( const vec3 &src, vec3 &dst ) const | ||
872 | { | ||
873 | dst.v[0] = ( | ||
874 | src.v[0] * element(0,0) + | ||
875 | src.v[1] * element(0,1) + | ||
876 | src.v[2] * element(0,2) ) ; | ||
877 | dst.v[1] = ( | ||
878 | src.v[0] * element(1,0) + | ||
879 | src.v[1] * element(1,1) + | ||
880 | src.v[2] * element(1,2) ) ; | ||
881 | dst.v[2] = ( | ||
882 | src.v[0] * element(2,0) + | ||
883 | src.v[1] * element(2,1) + | ||
884 | src.v[2] * element(2,2) ) ; | ||
885 | } | ||
886 | |||
887 | |||
888 | void mult_matrix_dir( vec3 & src_and_dst) const | ||
889 | { mult_matrix_dir(vec3(src_and_dst), src_and_dst); } | ||
890 | |||
891 | |||
892 | // dst = src * M | ||
893 | void mult_dir_matrix( const vec3 &src, vec3 &dst ) const | ||
894 | { | ||
895 | dst.v[0] = ( | ||
896 | src.v[0] * element(0,0) + | ||
897 | src.v[1] * element(1,0) + | ||
898 | src.v[2] * element(2,0) ) ; | ||
899 | dst.v[1] = ( | ||
900 | src.v[0] * element(0,1) + | ||
901 | src.v[1] * element(1,1) + | ||
902 | src.v[2] * element(2,1) ) ; | ||
903 | dst.v[2] = ( | ||
904 | src.v[0] * element(0,2) + | ||
905 | src.v[1] * element(1,2) + | ||
906 | src.v[2] * element(2,2) ) ; | ||
907 | } | ||
908 | |||
909 | |||
910 | void mult_dir_matrix( vec3 & src_and_dst) const | ||
911 | { mult_dir_matrix(vec3(src_and_dst), src_and_dst); } | ||
912 | |||
913 | |||
914 | real & operator () (int row, int col) | ||
915 | { return element(row,col); } | ||
916 | |||
917 | const real & operator () (int row, int col) const | ||
918 | { return element(row,col); } | ||
919 | |||
920 | real & element (int row, int col) | ||
921 | { return m[row | (col<<2)]; } | ||
922 | |||
923 | const real & element (int row, int col) const | ||
924 | { return m[row | (col<<2)]; } | ||
925 | |||
926 | matrix4 & operator *= ( const matrix4 & mat ) | ||
927 | { | ||
928 | mult_right( mat ); | ||
929 | return *this; | ||
930 | } | ||
931 | |||
932 | matrix4 & operator *= ( const real & r ) | ||
933 | { | ||
934 | for (int i = 0; i < 4; ++i) | ||
935 | { | ||
936 | element(0,i) *= r; | ||
937 | element(1,i) *= r; | ||
938 | element(2,i) *= r; | ||
939 | element(3,i) *= r; | ||
940 | } | ||
941 | return *this; | ||
942 | } | ||
943 | |||
944 | matrix4 & operator += ( const matrix4 & mat ) | ||
945 | { | ||
946 | for (int i = 0; i < 4; ++i) | ||
947 | { | ||
948 | element(0,i) += mat.element(0,i); | ||
949 | element(1,i) += mat.element(1,i); | ||
950 | element(2,i) += mat.element(2,i); | ||
951 | element(3,i) += mat.element(3,i); | ||
952 | } | ||
953 | return *this; | ||
954 | } | ||
955 | |||
956 | friend matrix4 operator * ( const matrix4 & m1, const matrix4 & m2 ); | ||
957 | friend bool operator == ( const matrix4 & m1, const matrix4 & m2 ); | ||
958 | friend bool operator != ( const matrix4 & m1, const matrix4 & m2 ); | ||
959 | |||
960 | //protected: | ||
961 | real m[16]; | ||
962 | }; | ||
963 | |||
964 | inline | ||
965 | matrix4 operator * ( const matrix4 & m1, const matrix4 & m2 ) | ||
966 | { | ||
967 | matrix4 product; | ||
968 | |||
969 | product = m1; | ||
970 | product.mult_right(m2); | ||
971 | |||
972 | return product; | ||
973 | } | ||
974 | |||
975 | inline | ||
976 | bool operator ==( const matrix4 &m1, const matrix4 &m2 ) | ||
977 | { | ||
978 | return ( | ||
979 | m1(0,0) == m2(0,0) && | ||
980 | m1(0,1) == m2(0,1) && | ||
981 | m1(0,2) == m2(0,2) && | ||
982 | m1(0,3) == m2(0,3) && | ||
983 | m1(1,0) == m2(1,0) && | ||
984 | m1(1,1) == m2(1,1) && | ||
985 | m1(1,2) == m2(1,2) && | ||
986 | m1(1,3) == m2(1,3) && | ||
987 | m1(2,0) == m2(2,0) && | ||
988 | m1(2,1) == m2(2,1) && | ||
989 | m1(2,2) == m2(2,2) && | ||
990 | m1(2,3) == m2(2,3) && | ||
991 | m1(3,0) == m2(3,0) && | ||
992 | m1(3,1) == m2(3,1) && | ||
993 | m1(3,2) == m2(3,2) && | ||
994 | m1(3,3) == m2(3,3) ); | ||
995 | } | ||
996 | |||
997 | inline | ||
998 | bool operator != ( const matrix4 & m1, const matrix4 & m2 ) | ||
999 | { return !( m1 == m2 ); } | ||
1000 | |||
1001 | |||
1002 | |||
1003 | |||
1004 | |||
1005 | |||
1006 | |||
1007 | |||
1008 | |||
1009 | |||
1010 | |||
1011 | |||
1012 | |||
1013 | class quaternion | ||
1014 | { | ||
1015 | public: | ||
1016 | |||
1017 | quaternion() | ||
1018 | { | ||
1019 | *this = identity(); | ||
1020 | } | ||
1021 | |||
1022 | quaternion( const real v[4] ) | ||
1023 | { | ||
1024 | set_value( v ); | ||
1025 | } | ||
1026 | |||
1027 | |||
1028 | quaternion( real q0, real q1, real q2, real q3 ) | ||
1029 | { | ||
1030 | set_value( q0, q1, q2, q3 ); | ||
1031 | } | ||
1032 | |||
1033 | |||
1034 | quaternion( const matrix4 & m ) | ||
1035 | { | ||
1036 | set_value( m ); | ||
1037 | } | ||
1038 | |||
1039 | |||
1040 | quaternion( const vec3 &axis, real radians ) | ||
1041 | { | ||
1042 | set_value( axis, radians ); | ||
1043 | } | ||
1044 | |||
1045 | |||
1046 | quaternion( const vec3 &rotateFrom, const vec3 &rotateTo ) | ||
1047 | { | ||
1048 | set_value( rotateFrom, rotateTo ); | ||
1049 | } | ||
1050 | |||
1051 | quaternion( const vec3 & from_look, const vec3 & from_up, | ||
1052 | const vec3 & to_look, const vec3& to_up) | ||
1053 | { | ||
1054 | set_value(from_look, from_up, to_look, to_up); | ||
1055 | } | ||
1056 | |||
1057 | const real * get_value() const | ||
1058 | { | ||
1059 | return &q[0]; | ||
1060 | } | ||
1061 | |||
1062 | void get_value( real &q0, real &q1, real &q2, real &q3 ) const | ||
1063 | { | ||
1064 | q0 = q[0]; | ||
1065 | q1 = q[1]; | ||
1066 | q2 = q[2]; | ||
1067 | q3 = q[3]; | ||
1068 | } | ||
1069 | |||
1070 | quaternion & set_value( real q0, real q1, real q2, real q3 ) | ||
1071 | { | ||
1072 | q[0] = q0; | ||
1073 | q[1] = q1; | ||
1074 | q[2] = q2; | ||
1075 | q[3] = q3; | ||
1076 | counter = 0; | ||
1077 | return *this; | ||
1078 | } | ||
1079 | |||
1080 | void get_value( vec3 &axis, real &radians ) const | ||
1081 | { | ||
1082 | radians = real(acos( q[3] ) * GLH_TWO); | ||
1083 | if ( radians == GLH_ZERO ) | ||
1084 | axis = vec3( 0.0, 0.0, 1.0 ); | ||
1085 | else | ||
1086 | { | ||
1087 | axis.v[0] = q[0]; | ||
1088 | axis.v[1] = q[1]; | ||
1089 | axis.v[2] = q[2]; | ||
1090 | axis.normalize(); | ||
1091 | } | ||
1092 | } | ||
1093 | |||
1094 | void get_value( matrix4 & m ) const | ||
1095 | { | ||
1096 | real s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz; | ||
1097 | |||
1098 | real norm = q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]; | ||
1099 | |||
1100 | s = (equivalent(norm,GLH_ZERO)) ? GLH_ZERO : ( GLH_TWO / norm ); | ||
1101 | |||
1102 | xs = q[0] * s; | ||
1103 | ys = q[1] * s; | ||
1104 | zs = q[2] * s; | ||
1105 | |||
1106 | wx = q[3] * xs; | ||
1107 | wy = q[3] * ys; | ||
1108 | wz = q[3] * zs; | ||
1109 | |||
1110 | xx = q[0] * xs; | ||
1111 | xy = q[0] * ys; | ||
1112 | xz = q[0] * zs; | ||
1113 | |||
1114 | yy = q[1] * ys; | ||
1115 | yz = q[1] * zs; | ||
1116 | zz = q[2] * zs; | ||
1117 | |||
1118 | m(0,0) = real( GLH_ONE - ( yy + zz )); | ||
1119 | m(1,0) = real ( xy + wz ); | ||
1120 | m(2,0) = real ( xz - wy ); | ||
1121 | |||
1122 | m(0,1) = real ( xy - wz ); | ||
1123 | m(1,1) = real ( GLH_ONE - ( xx + zz )); | ||
1124 | m(2,1) = real ( yz + wx ); | ||
1125 | |||
1126 | m(0,2) = real ( xz + wy ); | ||
1127 | m(1,2) = real ( yz - wx ); | ||
1128 | m(2,2) = real ( GLH_ONE - ( xx + yy )); | ||
1129 | |||
1130 | m(3,0) = m(3,1) = m(3,2) = m(0,3) = m(1,3) = m(2,3) = GLH_ZERO; | ||
1131 | m(3,3) = GLH_ONE; | ||
1132 | } | ||
1133 | |||
1134 | quaternion & set_value( const real * qp ) | ||
1135 | { | ||
1136 | memcpy(q,qp,sizeof(real) * 4); | ||
1137 | |||
1138 | counter = 0; | ||
1139 | return *this; | ||
1140 | } | ||
1141 | |||
1142 | quaternion & set_value( const matrix4 & m ) | ||
1143 | { | ||
1144 | real tr, s; | ||
1145 | int i, j, k; | ||
1146 | const int nxt[3] = { 1, 2, 0 }; | ||
1147 | |||
1148 | tr = m(0,0) + m(1,1) + m(2,2); | ||
1149 | |||
1150 | if ( tr > GLH_ZERO ) | ||
1151 | { | ||
1152 | s = real(sqrt( tr + m(3,3) )); | ||
1153 | q[3] = real ( s * 0.5 ); | ||
1154 | s = real(0.5) / s; | ||
1155 | |||
1156 | q[0] = real ( ( m(1,2) - m(2,1) ) * s ); | ||
1157 | q[1] = real ( ( m(2,0) - m(0,2) ) * s ); | ||
1158 | q[2] = real ( ( m(0,1) - m(1,0) ) * s ); | ||
1159 | } | ||
1160 | else | ||
1161 | { | ||
1162 | i = 0; | ||
1163 | if ( m(1,1) > m(0,0) ) | ||
1164 | i = 1; | ||
1165 | |||
1166 | if ( m(2,2) > m(i,i) ) | ||
1167 | i = 2; | ||
1168 | |||
1169 | j = nxt[i]; | ||
1170 | k = nxt[j]; | ||
1171 | |||
1172 | s = real(sqrt( ( m(i,j) - ( m(j,j) + m(k,k) )) + GLH_ONE )); | ||
1173 | |||
1174 | q[i] = real ( s * 0.5 ); | ||
1175 | s = real(0.5 / s); | ||
1176 | |||
1177 | q[3] = real ( ( m(j,k) - m(k,j) ) * s ); | ||
1178 | q[j] = real ( ( m(i,j) + m(j,i) ) * s ); | ||
1179 | q[k] = real ( ( m(i,k) + m(k,i) ) * s ); | ||
1180 | } | ||
1181 | |||
1182 | counter = 0; | ||
1183 | return *this; | ||
1184 | } | ||
1185 | |||
1186 | quaternion & set_value( const vec3 &axis, real theta ) | ||
1187 | { | ||
1188 | real sqnorm = axis.square_norm(); | ||
1189 | |||
1190 | if (sqnorm <= GLH_EPSILON) | ||
1191 | { | ||
1192 | // axis too small. | ||
1193 | x = y = z = 0.0; | ||
1194 | w = 1.0; | ||
1195 | } | ||
1196 | else | ||
1197 | { | ||
1198 | theta *= real(0.5); | ||
1199 | real sin_theta = real(sin(theta)); | ||
1200 | |||
1201 | if (!equivalent(sqnorm,GLH_ONE)) | ||
1202 | sin_theta /= real(sqrt(sqnorm)); | ||
1203 | x = sin_theta * axis.v[0]; | ||
1204 | y = sin_theta * axis.v[1]; | ||
1205 | z = sin_theta * axis.v[2]; | ||
1206 | w = real(cos(theta)); | ||
1207 | } | ||
1208 | return *this; | ||
1209 | } | ||
1210 | |||
1211 | quaternion & set_value( const vec3 & rotateFrom, const vec3 & rotateTo ) | ||
1212 | { | ||
1213 | vec3 p1, p2; | ||
1214 | real alpha; | ||
1215 | |||
1216 | p1 = rotateFrom; | ||
1217 | p1.normalize(); | ||
1218 | p2 = rotateTo; | ||
1219 | p2.normalize(); | ||
1220 | |||
1221 | alpha = p1.dot(p2); | ||
1222 | |||
1223 | if(equivalent(alpha,GLH_ONE)) | ||
1224 | { | ||
1225 | *this = identity(); | ||
1226 | return *this; | ||
1227 | } | ||
1228 | |||
1229 | // ensures that the anti-parallel case leads to a positive dot | ||
1230 | if(equivalent(alpha,-GLH_ONE)) | ||
1231 | { | ||
1232 | vec3 v; | ||
1233 | |||
1234 | if(p1.v[0] != p1.v[1] || p1.v[0] != p1.v[2]) | ||
1235 | v = vec3(p1.v[1], p1.v[2], p1.v[0]); | ||
1236 | else | ||
1237 | v = vec3(-p1.v[0], p1.v[1], p1.v[2]); | ||
1238 | |||
1239 | v -= p1 * p1.dot(v); | ||
1240 | v.normalize(); | ||
1241 | |||
1242 | set_value(v, GLH_PI); | ||
1243 | return *this; | ||
1244 | } | ||
1245 | |||
1246 | p1 = p1.cross(p2); | ||
1247 | p1.normalize(); | ||
1248 | set_value(p1,real(acos(alpha))); | ||
1249 | |||
1250 | counter = 0; | ||
1251 | return *this; | ||
1252 | } | ||
1253 | |||
1254 | quaternion & set_value( const vec3 & from_look, const vec3 & from_up, | ||
1255 | const vec3 & to_look, const vec3 & to_up) | ||
1256 | { | ||
1257 | quaternion r_look = quaternion(from_look, to_look); | ||
1258 | |||
1259 | vec3 rotated_from_up(from_up); | ||
1260 | r_look.mult_vec(rotated_from_up); | ||
1261 | |||
1262 | quaternion r_twist = quaternion(rotated_from_up, to_up); | ||
1263 | |||
1264 | *this = r_twist; | ||
1265 | *this *= r_look; | ||
1266 | return *this; | ||
1267 | } | ||
1268 | |||
1269 | quaternion & operator *= ( const quaternion & qr ) | ||
1270 | { | ||
1271 | quaternion ql(*this); | ||
1272 | |||
1273 | w = ql.w * qr.w - ql.x * qr.x - ql.y * qr.y - ql.z * qr.z; | ||
1274 | x = ql.w * qr.x + ql.x * qr.w + ql.y * qr.z - ql.z * qr.y; | ||
1275 | y = ql.w * qr.y + ql.y * qr.w + ql.z * qr.x - ql.x * qr.z; | ||
1276 | z = ql.w * qr.z + ql.z * qr.w + ql.x * qr.y - ql.y * qr.x; | ||
1277 | |||
1278 | counter += qr.counter; | ||
1279 | counter++; | ||
1280 | counter_normalize(); | ||
1281 | return *this; | ||
1282 | } | ||
1283 | |||
1284 | void normalize() | ||
1285 | { | ||
1286 | real rnorm = GLH_ONE / real(sqrt(w * w + x * x + y * y + z * z)); | ||
1287 | if (equivalent(rnorm, GLH_ZERO)) | ||
1288 | return; | ||
1289 | x *= rnorm; | ||
1290 | y *= rnorm; | ||
1291 | z *= rnorm; | ||
1292 | w *= rnorm; | ||
1293 | counter = 0; | ||
1294 | } | ||
1295 | |||
1296 | friend bool operator == ( const quaternion & q1, const quaternion & q2 ); | ||
1297 | |||
1298 | friend bool operator != ( const quaternion & q1, const quaternion & q2 ); | ||
1299 | |||
1300 | friend quaternion operator * ( const quaternion & q1, const quaternion & q2 ); | ||
1301 | |||
1302 | bool equals( const quaternion & r, real tolerance ) const | ||
1303 | { | ||
1304 | real t; | ||
1305 | |||
1306 | t = ( | ||
1307 | (q[0]-r.q[0])*(q[0]-r.q[0]) + | ||
1308 | (q[1]-r.q[1])*(q[1]-r.q[1]) + | ||
1309 | (q[2]-r.q[2])*(q[2]-r.q[2]) + | ||
1310 | (q[3]-r.q[3])*(q[3]-r.q[3]) ); | ||
1311 | if(t > GLH_EPSILON) | ||
1312 | return false; | ||
1313 | return 1; | ||
1314 | } | ||
1315 | |||
1316 | quaternion & conjugate() | ||
1317 | { | ||
1318 | q[0] *= -GLH_ONE; | ||
1319 | q[1] *= -GLH_ONE; | ||
1320 | q[2] *= -GLH_ONE; | ||
1321 | return *this; | ||
1322 | } | ||
1323 | |||
1324 | quaternion & invert() | ||
1325 | { | ||
1326 | return conjugate(); | ||
1327 | } | ||
1328 | |||
1329 | quaternion inverse() const | ||
1330 | { | ||
1331 | quaternion r = *this; | ||
1332 | return r.invert(); | ||
1333 | } | ||
1334 | |||
1335 | // | ||
1336 | // Quaternion multiplication with cartesian vector | ||
1337 | // v' = q*v*q(star) | ||
1338 | // | ||
1339 | void mult_vec( const vec3 &src, vec3 &dst ) const | ||
1340 | { | ||
1341 | real v_coef = w * w - x * x - y * y - z * z; | ||
1342 | real u_coef = GLH_TWO * (src.v[0] * x + src.v[1] * y + src.v[2] * z); | ||
1343 | real c_coef = GLH_TWO * w; | ||
1344 | |||
1345 | dst.v[0] = v_coef * src.v[0] + u_coef * x + c_coef * (y * src.v[2] - z * src.v[1]); | ||
1346 | dst.v[1] = v_coef * src.v[1] + u_coef * y + c_coef * (z * src.v[0] - x * src.v[2]); | ||
1347 | dst.v[2] = v_coef * src.v[2] + u_coef * z + c_coef * (x * src.v[1] - y * src.v[0]); | ||
1348 | } | ||
1349 | |||
1350 | void mult_vec( vec3 & src_and_dst) const | ||
1351 | { | ||
1352 | mult_vec(vec3(src_and_dst), src_and_dst); | ||
1353 | } | ||
1354 | |||
1355 | void scale_angle( real scaleFactor ) | ||
1356 | { | ||
1357 | vec3 axis; | ||
1358 | real radians; | ||
1359 | |||
1360 | get_value(axis, radians); | ||
1361 | radians *= scaleFactor; | ||
1362 | set_value(axis, radians); | ||
1363 | } | ||
1364 | |||
1365 | static quaternion slerp( const quaternion & p, const quaternion & q, real alpha ) | ||
1366 | { | ||
1367 | quaternion r; | ||
1368 | |||
1369 | real cos_omega = p.x * q.x + p.y * q.y + p.z * q.z + p.w * q.w; | ||
1370 | // if B is on opposite hemisphere from A, use -B instead | ||
1371 | |||
1372 | int bflip; | ||
1373 | if ( ( bflip = (cos_omega < GLH_ZERO)) ) | ||
1374 | cos_omega = -cos_omega; | ||
1375 | |||
1376 | // complementary interpolation parameter | ||
1377 | real beta = GLH_ONE - alpha; | ||
1378 | |||
1379 | if(cos_omega <= GLH_ONE - GLH_EPSILON) | ||
1380 | return p; | ||
1381 | |||
1382 | real omega = real(acos(cos_omega)); | ||
1383 | real one_over_sin_omega = GLH_ONE / real(sin(omega)); | ||
1384 | |||
1385 | beta = real(sin(omega*beta) * one_over_sin_omega); | ||
1386 | alpha = real(sin(omega*alpha) * one_over_sin_omega); | ||
1387 | |||
1388 | if (bflip) | ||
1389 | alpha = -alpha; | ||
1390 | |||
1391 | r.x = beta * p.q[0]+ alpha * q.q[0]; | ||
1392 | r.y = beta * p.q[1]+ alpha * q.q[1]; | ||
1393 | r.z = beta * p.q[2]+ alpha * q.q[2]; | ||
1394 | r.w = beta * p.q[3]+ alpha * q.q[3]; | ||
1395 | return r; | ||
1396 | } | ||
1397 | |||
1398 | static quaternion identity() | ||
1399 | { | ||
1400 | static quaternion ident( vec3( 0.0, 0.0, 0.0 ), GLH_ONE ); | ||
1401 | return ident; | ||
1402 | } | ||
1403 | |||
1404 | real & operator []( int i ) | ||
1405 | { | ||
1406 | assert(i < 4); | ||
1407 | return q[i]; | ||
1408 | } | ||
1409 | |||
1410 | const real & operator []( int i ) const | ||
1411 | { | ||
1412 | assert(i < 4); | ||
1413 | return q[i]; | ||
1414 | } | ||
1415 | |||
1416 | protected: | ||
1417 | |||
1418 | void counter_normalize() | ||
1419 | { | ||
1420 | if (counter > GLH_QUATERNION_NORMALIZATION_THRESHOLD) | ||
1421 | normalize(); | ||
1422 | } | ||
1423 | |||
1424 | union | ||
1425 | { | ||
1426 | struct | ||
1427 | { | ||
1428 | real q[4]; | ||
1429 | }; | ||
1430 | struct | ||
1431 | { | ||
1432 | real x; | ||
1433 | real y; | ||
1434 | real z; | ||
1435 | real w; | ||
1436 | }; | ||
1437 | }; | ||
1438 | |||
1439 | // renormalization counter | ||
1440 | unsigned char counter; | ||
1441 | }; | ||
1442 | |||
1443 | inline | ||
1444 | bool operator == ( const quaternion & q1, const quaternion & q2 ) | ||
1445 | { | ||
1446 | return (equivalent(q1.x, q2.x) && | ||
1447 | equivalent(q1.y, q2.y) && | ||
1448 | equivalent(q1.z, q2.z) && | ||
1449 | equivalent(q1.w, q2.w) ); | ||
1450 | } | ||
1451 | |||
1452 | inline | ||
1453 | bool operator != ( const quaternion & q1, const quaternion & q2 ) | ||
1454 | { | ||
1455 | return ! ( q1 == q2 ); | ||
1456 | } | ||
1457 | |||
1458 | inline | ||
1459 | quaternion operator * ( const quaternion & q1, const quaternion & q2 ) | ||
1460 | { | ||
1461 | quaternion r(q1); | ||
1462 | r *= q2; | ||
1463 | return r; | ||
1464 | } | ||
1465 | |||
1466 | |||
1467 | |||
1468 | |||
1469 | |||
1470 | |||
1471 | |||
1472 | |||
1473 | |||
1474 | |||
1475 | class plane | ||
1476 | { | ||
1477 | public: | ||
1478 | |||
1479 | plane() | ||
1480 | { | ||
1481 | planedistance = 0.0; | ||
1482 | planenormal.set_value( 0.0, 0.0, 1.0 ); | ||
1483 | } | ||
1484 | |||
1485 | |||
1486 | plane( const vec3 &p0, const vec3 &p1, const vec3 &p2 ) | ||
1487 | { | ||
1488 | vec3 v0 = p1 - p0; | ||
1489 | vec3 v1 = p2 - p0; | ||
1490 | planenormal = v0.cross(v1); | ||
1491 | planenormal.normalize(); | ||
1492 | planedistance = p0.dot(planenormal); | ||
1493 | } | ||
1494 | |||
1495 | plane( const vec3 &normal, real distance ) | ||
1496 | { | ||
1497 | planedistance = distance; | ||
1498 | planenormal = normal; | ||
1499 | planenormal.normalize(); | ||
1500 | } | ||
1501 | |||
1502 | plane( const vec3 &normal, const vec3 &point ) | ||
1503 | { | ||
1504 | planenormal = normal; | ||
1505 | planenormal.normalize(); | ||
1506 | planedistance = point.dot(planenormal); | ||
1507 | } | ||
1508 | |||
1509 | void offset( real d ) | ||
1510 | { | ||
1511 | planedistance += d; | ||
1512 | } | ||
1513 | |||
1514 | bool intersect( const line &l, vec3 &intersection ) const | ||
1515 | { | ||
1516 | vec3 pos, dir; | ||
1517 | vec3 pn = planenormal; | ||
1518 | real pd = planedistance; | ||
1519 | |||
1520 | pos = l.get_position(); | ||
1521 | dir = l.get_direction(); | ||
1522 | |||
1523 | if(dir.dot(pn) == 0.0) return 0; | ||
1524 | pos -= pn*pd; | ||
1525 | // now we're talking about a plane passing through the origin | ||
1526 | if(pos.dot(pn) < 0.0) pn.negate(); | ||
1527 | if(dir.dot(pn) > 0.0) dir.negate(); | ||
1528 | vec3 ppos = pn * pos.dot(pn); | ||
1529 | pos = (ppos.length()/dir.dot(-pn))*dir; | ||
1530 | intersection = l.get_position(); | ||
1531 | intersection += pos; | ||
1532 | return 1; | ||
1533 | } | ||
1534 | void transform( const matrix4 &matrix ) | ||
1535 | { | ||
1536 | matrix4 invtr = matrix.inverse(); | ||
1537 | invtr = invtr.transpose(); | ||
1538 | |||
1539 | vec3 pntOnplane = planenormal * planedistance; | ||
1540 | vec3 newPntOnplane; | ||
1541 | vec3 newnormal; | ||
1542 | |||
1543 | invtr.mult_dir_matrix(planenormal, newnormal); | ||
1544 | matrix.mult_vec_matrix(pntOnplane, newPntOnplane); | ||
1545 | |||
1546 | newnormal.normalize(); | ||
1547 | planenormal = newnormal; | ||
1548 | planedistance = newPntOnplane.dot(planenormal); | ||
1549 | } | ||
1550 | |||
1551 | bool is_in_half_space( const vec3 &point ) const | ||
1552 | { | ||
1553 | |||
1554 | if(( point.dot(planenormal) - planedistance) < 0.0) | ||
1555 | return 0; | ||
1556 | return 1; | ||
1557 | } | ||
1558 | |||
1559 | |||
1560 | real distance( const vec3 & point ) const | ||
1561 | { | ||
1562 | return planenormal.dot(point - planenormal*planedistance); | ||
1563 | } | ||
1564 | |||
1565 | const vec3 &get_normal() const | ||
1566 | { | ||
1567 | return planenormal; | ||
1568 | } | ||
1569 | |||
1570 | |||
1571 | real get_distance_from_origin() const | ||
1572 | { | ||
1573 | return planedistance; | ||
1574 | } | ||
1575 | |||
1576 | |||
1577 | friend bool operator == ( const plane & p1, const plane & p2 ); | ||
1578 | |||
1579 | |||
1580 | friend bool operator != ( const plane & p1, const plane & p2 ); | ||
1581 | |||
1582 | //protected: | ||
1583 | vec3 planenormal; | ||
1584 | real planedistance; | ||
1585 | }; | ||
1586 | |||
1587 | inline | ||
1588 | bool operator == (const plane & p1, const plane & p2 ) | ||
1589 | { | ||
1590 | return ( p1.planedistance == p2.planedistance && p1.planenormal == p2.planenormal); | ||
1591 | } | ||
1592 | |||
1593 | inline | ||
1594 | bool operator != ( const plane & p1, const plane & p2 ) | ||
1595 | { return ! (p1 == p2); } | ||
1596 | |||
1597 | |||
1598 | |||
1599 | } // "ns_##GLH_REAL" | ||
1600 | |||
1601 | // make common typedefs... | ||
1602 | #ifdef GLH_REAL_IS_FLOAT | ||
1603 | typedef GLH_REAL_NAMESPACE::vec2 vec2f; | ||
1604 | typedef GLH_REAL_NAMESPACE::vec3 vec3f; | ||
1605 | typedef GLH_REAL_NAMESPACE::vec4 vec4f; | ||
1606 | typedef GLH_REAL_NAMESPACE::quaternion quaternionf; | ||
1607 | typedef GLH_REAL_NAMESPACE::quaternion rotationf; | ||
1608 | typedef GLH_REAL_NAMESPACE::line linef; | ||
1609 | typedef GLH_REAL_NAMESPACE::plane planef; | ||
1610 | typedef GLH_REAL_NAMESPACE::matrix4 matrix4f; | ||
1611 | #endif | ||
1612 | |||
1613 | |||
1614 | |||
1615 | |||
1616 | } // namespace glh | ||
1617 | |||
1618 | |||
1619 | |||
1620 | #endif | ||
1621 | |||
diff --git a/linden/indra/llwindow/lldxhardware.cpp b/linden/indra/llwindow/lldxhardware.cpp index deb7901..e0cb82d 100644 --- a/linden/indra/llwindow/lldxhardware.cpp +++ b/linden/indra/llwindow/lldxhardware.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -623,7 +624,37 @@ LLSD LLDXHardware::getDisplayInfo() | |||
623 | ret["DeviceName"] = device_name; | 624 | ret["DeviceName"] = device_name; |
624 | std::string device_driver= get_string(device_containerp, L"szDriverVersion"); | 625 | std::string device_driver= get_string(device_containerp, L"szDriverVersion"); |
625 | ret["DriverVersion"] = device_driver; | 626 | ret["DriverVersion"] = device_driver; |
626 | } | 627 | |
628 | // ATI has a slightly different version string | ||
629 | if(device_name.length() >= 4 && device_name.substr(0,4) == "ATI ") | ||
630 | { | ||
631 | // get the key | ||
632 | HKEY hKey; | ||
633 | const DWORD RV_SIZE = 100; | ||
634 | WCHAR release_version[RV_SIZE]; | ||
635 | |||
636 | // Hard coded registry entry. Using this since it's simpler for now. | ||
637 | // And using EnumDisplayDevices to get a registry key also requires | ||
638 | // a hard coded Query value. | ||
639 | if(ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\ATI Technologies\\CBT"), &hKey)) | ||
640 | { | ||
641 | // get the value | ||
642 | DWORD dwType = REG_SZ; | ||
643 | DWORD dwSize = sizeof(WCHAR) * RV_SIZE; | ||
644 | if(ERROR_SUCCESS == RegQueryValueEx(hKey, TEXT("ReleaseVersion"), | ||
645 | NULL, &dwType, (LPBYTE)release_version, &dwSize)) | ||
646 | { | ||
647 | // print the value | ||
648 | // windows doesn't guarantee to be null terminated | ||
649 | release_version[RV_SIZE - 1] = NULL; | ||
650 | ret["DriverVersion"] = utf16str_to_utf8str(release_version); | ||
651 | |||
652 | } | ||
653 | RegCloseKey(hKey); | ||
654 | } | ||
655 | } | ||
656 | } | ||
657 | |||
627 | LCleanup: | 658 | LCleanup: |
628 | SAFE_RELEASE(file_containerp); | 659 | SAFE_RELEASE(file_containerp); |
629 | SAFE_RELEASE(driver_containerp); | 660 | SAFE_RELEASE(driver_containerp); |
diff --git a/linden/indra/llwindow/lldxhardware.h b/linden/indra/llwindow/lldxhardware.h index 449a06f..0ce218b 100644 --- a/linden/indra/llwindow/lldxhardware.h +++ b/linden/indra/llwindow/lldxhardware.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llkeyboard.cpp b/linden/indra/llwindow/llkeyboard.cpp index 16c89ca..02b4ed1 100644 --- a/linden/indra/llwindow/llkeyboard.cpp +++ b/linden/indra/llwindow/llkeyboard.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llkeyboard.h b/linden/indra/llwindow/llkeyboard.h index 4556dfd..0261bcb 100644 --- a/linden/indra/llwindow/llkeyboard.h +++ b/linden/indra/llwindow/llkeyboard.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llkeyboardmacosx.cpp b/linden/indra/llwindow/llkeyboardmacosx.cpp index 4038f17..ec82032 100644 --- a/linden/indra/llwindow/llkeyboardmacosx.cpp +++ b/linden/indra/llwindow/llkeyboardmacosx.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llkeyboardmacosx.h b/linden/indra/llwindow/llkeyboardmacosx.h index 8cde53b..47159af 100644 --- a/linden/indra/llwindow/llkeyboardmacosx.h +++ b/linden/indra/llwindow/llkeyboardmacosx.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llkeyboardsdl.cpp b/linden/indra/llwindow/llkeyboardsdl.cpp index 86894b1..8a6b6d6 100644 --- a/linden/indra/llwindow/llkeyboardsdl.cpp +++ b/linden/indra/llwindow/llkeyboardsdl.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llkeyboardsdl.h b/linden/indra/llwindow/llkeyboardsdl.h index e8c6961..e597788 100644 --- a/linden/indra/llwindow/llkeyboardsdl.h +++ b/linden/indra/llwindow/llkeyboardsdl.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llkeyboardwin32.cpp b/linden/indra/llwindow/llkeyboardwin32.cpp index 8d45dcb..a06f191 100644 --- a/linden/indra/llwindow/llkeyboardwin32.cpp +++ b/linden/indra/llwindow/llkeyboardwin32.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llkeyboardwin32.h b/linden/indra/llwindow/llkeyboardwin32.h index c709f71..a213875 100644 --- a/linden/indra/llwindow/llkeyboardwin32.h +++ b/linden/indra/llwindow/llkeyboardwin32.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llmousehandler.h b/linden/indra/llwindow/llmousehandler.h index 45f837b..7bd0f2e 100644 --- a/linden/indra/llwindow/llmousehandler.h +++ b/linden/indra/llwindow/llmousehandler.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llpreeditor.h b/linden/indra/llwindow/llpreeditor.h index 2180654..370f76c 100644 --- a/linden/indra/llwindow/llpreeditor.h +++ b/linden/indra/llwindow/llpreeditor.h | |||
@@ -19,7 +19,8 @@ | |||
19 | * There are special exceptions to the terms and conditions of the GPL as | 19 | * There are special exceptions to the terms and conditions of the GPL as |
20 | * it is applied to this Source Code. View the full text of the exception | 20 | * it is applied to this Source Code. View the full text of the exception |
21 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 21 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
22 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 22 | * online at |
23 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
23 | * | 24 | * |
24 | * By copying, modifying or distributing this software, you acknowledge | 25 | * By copying, modifying or distributing this software, you acknowledge |
25 | * that you have read and understood your obligations described above, | 26 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llwindow.cpp b/linden/indra/llwindow/llwindow.cpp index b4c8ff0..53ca68d 100644 --- a/linden/indra/llwindow/llwindow.cpp +++ b/linden/indra/llwindow/llwindow.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -324,16 +325,16 @@ BOOL LLWindow::copyTextToPrimary(const LLWString &src) | |||
324 | } | 325 | } |
325 | 326 | ||
326 | // static | 327 | // static |
327 | std::string LLWindow::getFontListSans() | 328 | std::vector<std::string> LLWindow::getDynamicFallbackFontList() |
328 | { | 329 | { |
329 | #if LL_WINDOWS | 330 | #if LL_WINDOWS |
330 | return LLWindowWin32::getFontListSans(); | 331 | return LLWindowWin32::getDynamicFallbackFontList(); |
331 | #elif LL_DARWIN | 332 | #elif LL_DARWIN |
332 | return LLWindowMacOSX::getFontListSans(); | 333 | return LLWindowMacOSX::getDynamicFallbackFontList(); |
333 | #elif LL_SDL | 334 | #elif LL_SDL |
334 | return LLWindowSDL::getFontListSans(); | 335 | return LLWindowSDL::getDynamicFallbackFontList(); |
335 | #else | 336 | #else |
336 | return ""; | 337 | return std::vector<std::string>(); |
337 | #endif | 338 | #endif |
338 | } | 339 | } |
339 | 340 | ||
diff --git a/linden/indra/llwindow/llwindow.h b/linden/indra/llwindow/llwindow.h index 0004e92..a649766 100644 --- a/linden/indra/llwindow/llwindow.h +++ b/linden/indra/llwindow/llwindow.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -204,7 +205,7 @@ public: | |||
204 | virtual void spawnWebBrowser(const std::string& escaped_url) {}; | 205 | virtual void spawnWebBrowser(const std::string& escaped_url) {}; |
205 | virtual void ShellEx(const std::string& command) {}; | 206 | virtual void ShellEx(const std::string& command) {}; |
206 | 207 | ||
207 | static std::string getFontListSans(); | 208 | static std::vector<std::string> getDynamicFallbackFontList(); |
208 | 209 | ||
209 | protected: | 210 | protected: |
210 | LLWindow(BOOL fullscreen, U32 flags); | 211 | LLWindow(BOOL fullscreen, U32 flags); |
diff --git a/linden/indra/llwindow/llwindowheadless.cpp b/linden/indra/llwindow/llwindowheadless.cpp index 7f671cc..3742846 100644 --- a/linden/indra/llwindow/llwindowheadless.cpp +++ b/linden/indra/llwindow/llwindowheadless.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llwindowheadless.h b/linden/indra/llwindow/llwindowheadless.h index 8153e67..4353d15 100644 --- a/linden/indra/llwindow/llwindowheadless.h +++ b/linden/indra/llwindow/llwindowheadless.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llwindowmacosx-objc.h b/linden/indra/llwindow/llwindowmacosx-objc.h index 9a552e2..ed5d7b1 100644 --- a/linden/indra/llwindow/llwindowmacosx-objc.h +++ b/linden/indra/llwindow/llwindowmacosx-objc.h | |||
@@ -18,7 +18,8 @@ | |||
18 | * There are special exceptions to the terms and conditions of the GPL as | 18 | * There are special exceptions to the terms and conditions of the GPL as |
19 | * it is applied to this Source Code. View the full text of the exception | 19 | * it is applied to this Source Code. View the full text of the exception |
20 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 20 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
21 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 21 | * online at |
22 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
22 | * | 23 | * |
23 | * By copying, modifying or distributing this software, you acknowledge | 24 | * By copying, modifying or distributing this software, you acknowledge |
24 | * that you have read and understood your obligations described above, | 25 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llwindowmacosx-objc.mm b/linden/indra/llwindow/llwindowmacosx-objc.mm index 7315072..da01c2a 100644 --- a/linden/indra/llwindow/llwindowmacosx-objc.mm +++ b/linden/indra/llwindow/llwindowmacosx-objc.mm | |||
@@ -18,7 +18,8 @@ | |||
18 | * There are special exceptions to the terms and conditions of the GPL as | 18 | * There are special exceptions to the terms and conditions of the GPL as |
19 | * it is applied to this Source Code. View the full text of the exception | 19 | * it is applied to this Source Code. View the full text of the exception |
20 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 20 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
21 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 21 | * online at |
22 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
22 | * | 23 | * |
23 | * By copying, modifying or distributing this software, you acknowledge | 24 | * By copying, modifying or distributing this software, you acknowledge |
24 | * that you have read and understood your obligations described above, | 25 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llwindowmacosx.cpp b/linden/indra/llwindow/llwindowmacosx.cpp index 3ddf5e6..4f6df0f 100644 --- a/linden/indra/llwindow/llwindowmacosx.cpp +++ b/linden/indra/llwindow/llwindowmacosx.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -701,7 +702,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits | |||
701 | "Radeon DDR", | 702 | "Radeon DDR", |
702 | "Radeon VE", | 703 | "Radeon VE", |
703 | "GDI Generic" }; | 704 | "GDI Generic" }; |
704 | const S32 CARD_COUNT = sizeof(CARD_LIST)/sizeof(char*); | 705 | const S32 CARD_COUNT = LL_ARRAY_SIZE(CARD_LIST); |
705 | 706 | ||
706 | // Future candidates: | 707 | // Future candidates: |
707 | // ProSavage/Twister | 708 | // ProSavage/Twister |
@@ -3357,10 +3358,9 @@ void LLWindowMacOSX::interruptLanguageTextInput() | |||
3357 | } | 3358 | } |
3358 | 3359 | ||
3359 | //static | 3360 | //static |
3360 | std::string LLWindowMacOSX::getFontListSans() | 3361 | std::vector<std::string> LLWindowMacOSX::getDynamicFallbackFontList() |
3361 | { | 3362 | { |
3362 | // This is a fairly complete Japanese font that ships with Mac OS X. | 3363 | // Fonts previously in getFontListSans() have moved to fonts.xml. |
3363 | // The first filename is in UTF8, but it shows up in the font menu as "Hiragino Kaku Gothic Pro W3". | 3364 | return std::vector<std::string>(); |
3364 | // The third filename is in UTF8, but it shows up in the font menu as "STHeiti Light" | ||
3365 | return "\xE3\x83\x92\xE3\x83\xA9\xE3\x82\xAD\xE3\x82\x99\xE3\x83\x8E\xE8\xA7\x92\xE3\x82\xB3\xE3\x82\x99 Pro W3.otf;\xE3\x83\x92\xE3\x83\xA9\xE3\x82\xAD\xE3\x82\x99\xE3\x83\x8E\xE8\xA7\x92\xE3\x82\xB3\xE3\x82\x99 ProN W3.otf;AppleGothic.dfont;AppleGothic.ttf;\xe5\x8d\x8e\xe6\x96\x87\xe7\xbb\x86\xe9\xbb\x91.ttf"; | ||
3366 | } | 3365 | } |
3366 | |||
diff --git a/linden/indra/llwindow/llwindowmacosx.h b/linden/indra/llwindow/llwindowmacosx.h index 246151c..3886782 100644 --- a/linden/indra/llwindow/llwindowmacosx.h +++ b/linden/indra/llwindow/llwindowmacosx.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -112,7 +113,7 @@ public: | |||
112 | /*virtual*/ void interruptLanguageTextInput(); | 113 | /*virtual*/ void interruptLanguageTextInput(); |
113 | /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); | 114 | /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); |
114 | 115 | ||
115 | static std::string getFontListSans(); | 116 | static std::vector<std::string> getDynamicFallbackFontList(); |
116 | 117 | ||
117 | protected: | 118 | protected: |
118 | LLWindowMacOSX( | 119 | LLWindowMacOSX( |
diff --git a/linden/indra/llwindow/llwindowmesaheadless.cpp b/linden/indra/llwindow/llwindowmesaheadless.cpp index 993bd7b..c1f9d20 100644 --- a/linden/indra/llwindow/llwindowmesaheadless.cpp +++ b/linden/indra/llwindow/llwindowmesaheadless.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llwindowmesaheadless.h b/linden/indra/llwindow/llwindowmesaheadless.h index ce05216..ab562d9 100644 --- a/linden/indra/llwindow/llwindowmesaheadless.h +++ b/linden/indra/llwindow/llwindowmesaheadless.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llwindow/llwindowsdl.cpp b/linden/indra/llwindow/llwindowsdl.cpp index c3427d6..61ef01d 100644 --- a/linden/indra/llwindow/llwindowsdl.cpp +++ b/linden/indra/llwindow/llwindowsdl.cpp | |||
@@ -1,6 +1,7 @@ | |||
1 | /** | 1 | /** |
2 | * @file llwindowsdl.cpp | 2 | * @file llwindowsdl.cpp |
3 | * @brief SDL implementation of LLWindow class | 3 | * @brief SDL implementation of LLWindow class |
4 | * @author This module has many fathers, and it shows. | ||
4 | * | 5 | * |
5 | * $LicenseInfo:firstyear=2001&license=viewergpl$ | 6 | * $LicenseInfo:firstyear=2001&license=viewergpl$ |
6 | * | 7 | * |
@@ -17,7 +18,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 18 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 19 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 20 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 21 | * online at |
22 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 23 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 24 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 25 | * that you have read and understood your obligations described above, |
@@ -83,8 +85,6 @@ static bool ATIbug = false; | |||
83 | // be only one object of this class at any time. Currently this is true. | 85 | // be only one object of this class at any time. Currently this is true. |
84 | static LLWindowSDL *gWindowImplementation = NULL; | 86 | static LLWindowSDL *gWindowImplementation = NULL; |
85 | 87 | ||
86 | static BOOL was_fullscreen = FALSE; | ||
87 | |||
88 | 88 | ||
89 | void maybe_lock_display(void) | 89 | void maybe_lock_display(void) |
90 | { | 90 | { |
@@ -156,6 +156,8 @@ bool LLWindowSDL::ll_try_gtk_init(void) | |||
156 | llwarns << "- GTK COMPATIBILITY WARNING: " << | 156 | llwarns << "- GTK COMPATIBILITY WARNING: " << |
157 | gtk_warning << llendl; | 157 | gtk_warning << llendl; |
158 | gtk_is_good = FALSE; | 158 | gtk_is_good = FALSE; |
159 | } else { | ||
160 | llinfos << "- GTK version is good." << llendl; | ||
159 | } | 161 | } |
160 | 162 | ||
161 | done_gtk_diag = TRUE; | 163 | done_gtk_diag = TRUE; |
@@ -201,10 +203,6 @@ LLWindowSDL::LLWindowSDL(const std::string& title, S32 x, S32 y, S32 width, | |||
201 | 203 | ||
202 | // Ignore use_gl for now, only used for drones on PC | 204 | // Ignore use_gl for now, only used for drones on PC |
203 | mWindow = NULL; | 205 | mWindow = NULL; |
204 | mCursorDecoupled = FALSE; | ||
205 | mCursorLastEventDeltaX = 0; | ||
206 | mCursorLastEventDeltaY = 0; | ||
207 | mCursorIgnoreNextDelta = FALSE; | ||
208 | mNeedsResize = FALSE; | 206 | mNeedsResize = FALSE; |
209 | mOverrideAspectRatio = 0.f; | 207 | mOverrideAspectRatio = 0.f; |
210 | mGrabbyKeyFlags = 0; | 208 | mGrabbyKeyFlags = 0; |
@@ -273,7 +271,7 @@ static SDL_Surface *Load_BMP_Resource(const char *basename) | |||
273 | #if LL_X11 | 271 | #if LL_X11 |
274 | // This is an XFree86/XOrg-specific hack for detecting the amount of Video RAM | 272 | // This is an XFree86/XOrg-specific hack for detecting the amount of Video RAM |
275 | // on this machine. It works by searching /var/log/var/log/Xorg.?.log or | 273 | // on this machine. It works by searching /var/log/var/log/Xorg.?.log or |
276 | // /var/log/XFree86.?.log for a ': (VideoRAM|Memory): (%d+) kB' regex, where | 274 | // /var/log/XFree86.?.log for a ': (VideoRAM ?|Memory): (%d+) kB' regex, where |
277 | // '?' is the X11 display number derived from $DISPLAY | 275 | // '?' is the X11 display number derived from $DISPLAY |
278 | static int x11_detect_VRAM_kb_fp(FILE *fp, const char *prefix_str) | 276 | static int x11_detect_VRAM_kb_fp(FILE *fp, const char *prefix_str) |
279 | { | 277 | { |
@@ -287,6 +285,8 @@ static int x11_detect_VRAM_kb_fp(FILE *fp, const char *prefix_str) | |||
287 | // favourite regex implementation - libboost_regex - is | 285 | // favourite regex implementation - libboost_regex - is |
288 | // quite a heavy and troublesome dependency for the client, so | 286 | // quite a heavy and troublesome dependency for the client, so |
289 | // it seems a shame to introduce it for such a simple task. | 287 | // it seems a shame to introduce it for such a simple task. |
288 | // *FIXME: libboost_regex is a dependency now anyway, so we may | ||
289 | // as well use it instead of this hand-rolled nonsense. | ||
290 | const char *part1_template = prefix_str; | 290 | const char *part1_template = prefix_str; |
291 | const char part2_template[] = " kB"; | 291 | const char part2_template[] = " kB"; |
292 | char *part1 = strstr(line_buf, part1_template); | 292 | char *part1 = strstr(line_buf, part1_template); |
@@ -324,8 +324,7 @@ static int x11_detect_VRAM_kb_fp(FILE *fp, const char *prefix_str) | |||
324 | 324 | ||
325 | static int x11_detect_VRAM_kb() | 325 | static int x11_detect_VRAM_kb() |
326 | { | 326 | { |
327 | #if LL_SOLARIS | 327 | #if LL_SOLARIS && defined(__sparc) |
328 | #error Can this be done without an explicit architecture test, ie a test FOR xorg? Was followed by: && defined(__sparc) | ||
329 | // NOTE: there's no Xorg server on SPARC so just return 0 | 328 | // NOTE: there's no Xorg server on SPARC so just return 0 |
330 | // and allow SDL to attempt to get the amount of VRAM | 329 | // and allow SDL to attempt to get the amount of VRAM |
331 | return(0); | 330 | return(0); |
@@ -364,8 +363,17 @@ static int x11_detect_VRAM_kb() | |||
364 | fp = fopen(fname.c_str(), "r"); | 363 | fp = fopen(fname.c_str(), "r"); |
365 | if (fp) | 364 | if (fp) |
366 | { | 365 | { |
367 | rtn = x11_detect_VRAM_kb_fp(fp, ": Memory: "); | 366 | rtn = x11_detect_VRAM_kb_fp(fp, ": Video RAM: "); |
368 | fclose(fp); | 367 | fclose(fp); |
368 | if (0 == rtn) | ||
369 | { | ||
370 | fp = fopen(fname.c_str(), "r"); | ||
371 | if (fp) | ||
372 | { | ||
373 | rtn = x11_detect_VRAM_kb_fp(fp, ": Memory: "); | ||
374 | fclose(fp); | ||
375 | } | ||
376 | } | ||
369 | } | 377 | } |
370 | } | 378 | } |
371 | } | 379 | } |
@@ -421,7 +429,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B | |||
421 | if (SDL_Init(SDL_INIT_VIDEO) < 0) | 429 | if (SDL_Init(SDL_INIT_VIDEO) < 0) |
422 | { | 430 | { |
423 | llinfos << "sdl_init() failed! " << SDL_GetError() << llendl; | 431 | llinfos << "sdl_init() failed! " << SDL_GetError() << llendl; |
424 | setupFailure("window creation error", "error", OSMB_OK); | 432 | setupFailure("sdl_init() failure, window creation error", "error", OSMB_OK); |
425 | return false; | 433 | return false; |
426 | } | 434 | } |
427 | 435 | ||
@@ -442,7 +450,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B | |||
442 | if (!videoInfo) | 450 | if (!videoInfo) |
443 | { | 451 | { |
444 | llinfos << "SDL_GetVideoInfo() failed! " << SDL_GetError() << llendl; | 452 | llinfos << "SDL_GetVideoInfo() failed! " << SDL_GetError() << llendl; |
445 | setupFailure("Window creation error", "Error", OSMB_OK); | 453 | setupFailure("SDL_GetVideoInfo() failed, Window creation error", "Error", OSMB_OK); |
446 | return FALSE; | 454 | return FALSE; |
447 | } | 455 | } |
448 | 456 | ||
@@ -498,7 +506,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B | |||
498 | // *FIX: try to toggle vsync here? | 506 | // *FIX: try to toggle vsync here? |
499 | 507 | ||
500 | mFullscreen = fullscreen; | 508 | mFullscreen = fullscreen; |
501 | was_fullscreen = fullscreen; | ||
502 | 509 | ||
503 | int sdlflags = SDL_OPENGL | SDL_RESIZABLE | SDL_ANYFORMAT; | 510 | int sdlflags = SDL_OPENGL | SDL_RESIZABLE | SDL_ANYFORMAT; |
504 | 511 | ||
@@ -574,7 +581,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B | |||
574 | if (mWindow) | 581 | if (mWindow) |
575 | { | 582 | { |
576 | mFullscreen = TRUE; | 583 | mFullscreen = TRUE; |
577 | was_fullscreen = TRUE; | ||
578 | mFullscreenWidth = mWindow->w; | 584 | mFullscreenWidth = mWindow->w; |
579 | mFullscreenHeight = mWindow->h; | 585 | mFullscreenHeight = mWindow->h; |
580 | mFullscreenBits = mWindow->format->BitsPerPixel; | 586 | mFullscreenBits = mWindow->format->BitsPerPixel; |
@@ -591,7 +597,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B | |||
591 | llwarns << "createContext: fullscreen creation failure. SDL: " << SDL_GetError() << llendl; | 597 | llwarns << "createContext: fullscreen creation failure. SDL: " << SDL_GetError() << llendl; |
592 | // No fullscreen support | 598 | // No fullscreen support |
593 | mFullscreen = FALSE; | 599 | mFullscreen = FALSE; |
594 | was_fullscreen = FALSE; | ||
595 | mFullscreenWidth = -1; | 600 | mFullscreenWidth = -1; |
596 | mFullscreenHeight = -1; | 601 | mFullscreenHeight = -1; |
597 | mFullscreenBits = -1; | 602 | mFullscreenBits = -1; |
@@ -673,8 +678,8 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B | |||
673 | // fixme: actually, it's REALLY important for picking that we get at | 678 | // fixme: actually, it's REALLY important for picking that we get at |
674 | // least 8 bits each of red,green,blue. Alpha we can be a bit more | 679 | // least 8 bits each of red,green,blue. Alpha we can be a bit more |
675 | // relaxed about if we have to. | 680 | // relaxed about if we have to. |
676 | #if LL_SOLARIS | 681 | #if LL_SOLARIS && defined(__sparc) |
677 | #error && defined(__sparc) | 682 | // again the __sparc required because Xsun support, 32bit are very pricey on SPARC |
678 | if(colorBits < 24) //HACK: on SPARC allow 24-bit color | 683 | if(colorBits < 24) //HACK: on SPARC allow 24-bit color |
679 | #else | 684 | #else |
680 | if (colorBits < 32) | 685 | if (colorBits < 32) |
@@ -682,8 +687,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B | |||
682 | { | 687 | { |
683 | close(); | 688 | close(); |
684 | setupFailure( | 689 | setupFailure( |
685 | #if LL_SOLARIS | 690 | #if LL_SOLARIS && defined(__sparc) |
686 | #error && defined(__sparc) | ||
687 | "Second Life requires at least 24-bit color on SPARC to run in a window.\n" | 691 | "Second Life requires at least 24-bit color on SPARC to run in a window.\n" |
688 | "Please use fbconfig to set your default color depth to 24 bits.\n" | 692 | "Please use fbconfig to set your default color depth to 24 bits.\n" |
689 | "You may also need to adjust the X11 setting in SMF. To do so use\n" | 693 | "You may also need to adjust the X11 setting in SMF. To do so use\n" |
@@ -927,7 +931,6 @@ BOOL LLWindowSDL::getSize(LLCoordScreen *size) | |||
927 | return (TRUE); | 931 | return (TRUE); |
928 | } | 932 | } |
929 | 933 | ||
930 | llwarns << "LLWindowSDL::getPosition(): no window and not fullscreen!" << llendl; | ||
931 | return (FALSE); | 934 | return (FALSE); |
932 | } | 935 | } |
933 | 936 | ||
@@ -940,7 +943,6 @@ BOOL LLWindowSDL::getSize(LLCoordWindow *size) | |||
940 | return (TRUE); | 943 | return (TRUE); |
941 | } | 944 | } |
942 | 945 | ||
943 | llwarns << "LLWindowSDL::getPosition(): no window and not fullscreen!" << llendl; | ||
944 | return (FALSE); | 946 | return (FALSE); |
945 | } | 947 | } |
946 | 948 | ||
@@ -959,11 +961,18 @@ BOOL LLWindowSDL::setSize(const LLCoordScreen size) | |||
959 | { | 961 | { |
960 | if(mWindow) | 962 | if(mWindow) |
961 | { | 963 | { |
962 | // *FIX: (???) | 964 | // Push a resize event onto SDL's queue - we'll handle it |
963 | //SizeWindow(mWindow, size.mX, size.mY, true); | 965 | // when it comes out again. |
964 | } | 966 | SDL_Event event; |
967 | event.type = SDL_VIDEORESIZE; | ||
968 | event.resize.w = size.mX; | ||
969 | event.resize.h = size.mY; | ||
970 | SDL_PushEvent(&event); // copied into queue | ||
965 | 971 | ||
966 | return TRUE; | 972 | return TRUE; |
973 | } | ||
974 | |||
975 | return FALSE; | ||
967 | } | 976 | } |
968 | 977 | ||
969 | void LLWindowSDL::swapBuffers() | 978 | void LLWindowSDL::swapBuffers() |
@@ -1013,11 +1022,7 @@ BOOL LLWindowSDL::isCursorHidden() | |||
1013 | // Constrains the mouse to the window. | 1022 | // Constrains the mouse to the window. |
1014 | void LLWindowSDL::setMouseClipping( BOOL b ) | 1023 | void LLWindowSDL::setMouseClipping( BOOL b ) |
1015 | { | 1024 | { |
1016 | //llinfos << "LLWindowSDL::setMouseClipping " << b << llendl; | ||
1017 | // Just stash the requested state. We'll simulate this when the cursor is hidden by decoupling. | ||
1018 | mIsMouseClipping = b; | ||
1019 | //SDL_WM_GrabInput(b ? SDL_GRAB_ON : SDL_GRAB_OFF); | 1025 | //SDL_WM_GrabInput(b ? SDL_GRAB_ON : SDL_GRAB_OFF); |
1020 | adjustCursorDecouple(); | ||
1021 | } | 1026 | } |
1022 | 1027 | ||
1023 | BOOL LLWindowSDL::setCursorPosition(const LLCoordWindow position) | 1028 | BOOL LLWindowSDL::setCursorPosition(const LLCoordWindow position) |
@@ -1032,10 +1037,10 @@ BOOL LLWindowSDL::setCursorPosition(const LLCoordWindow position) | |||
1032 | 1037 | ||
1033 | //llinfos << "setCursorPosition(" << screen_pos.mX << ", " << screen_pos.mY << ")" << llendl; | 1038 | //llinfos << "setCursorPosition(" << screen_pos.mX << ", " << screen_pos.mY << ")" << llendl; |
1034 | 1039 | ||
1035 | SDL_WarpMouse(screen_pos.mX, screen_pos.mY); | 1040 | // do the actual forced cursor move. |
1036 | 1041 | SDL_WarpMouse(screen_pos.mX, screen_pos.mY); | |
1037 | // Under certain circumstances, this will trigger us to decouple the cursor. | 1042 | |
1038 | adjustCursorDecouple(true); | 1043 | //llinfos << llformat("llcw %d,%d -> scr %d,%d", position.mX, position.mY, screen_pos.mX, screen_pos.mY) << llendl; |
1039 | 1044 | ||
1040 | return result; | 1045 | return result; |
1041 | } | 1046 | } |
@@ -1055,33 +1060,6 @@ BOOL LLWindowSDL::getCursorPosition(LLCoordWindow *position) | |||
1055 | return convertCoords(screen_pos, position); | 1060 | return convertCoords(screen_pos, position); |
1056 | } | 1061 | } |
1057 | 1062 | ||
1058 | void LLWindowSDL::adjustCursorDecouple(bool warpingMouse) | ||
1059 | { | ||
1060 | if(mIsMouseClipping && mCursorHidden) | ||
1061 | { | ||
1062 | if(warpingMouse) | ||
1063 | { | ||
1064 | // The cursor should be decoupled. Make sure it is. | ||
1065 | if(!mCursorDecoupled) | ||
1066 | { | ||
1067 | // llinfos << "adjustCursorDecouple: decoupling cursor" << llendl; | ||
1068 | //CGAssociateMouseAndMouseCursorPosition(false); | ||
1069 | mCursorDecoupled = true; | ||
1070 | mCursorIgnoreNextDelta = TRUE; | ||
1071 | } | ||
1072 | } | ||
1073 | } | ||
1074 | else | ||
1075 | { | ||
1076 | // The cursor should not be decoupled. Make sure it isn't. | ||
1077 | if(mCursorDecoupled) | ||
1078 | { | ||
1079 | // llinfos << "adjustCursorDecouple: recoupling cursor" << llendl; | ||
1080 | //CGAssociateMouseAndMouseCursorPosition(true); | ||
1081 | mCursorDecoupled = false; | ||
1082 | } | ||
1083 | } | ||
1084 | } | ||
1085 | 1063 | ||
1086 | F32 LLWindowSDL::getNativeAspectRatio() | 1064 | F32 LLWindowSDL::getNativeAspectRatio() |
1087 | { | 1065 | { |
@@ -1138,24 +1116,28 @@ F32 LLWindowSDL::getPixelAspectRatio() | |||
1138 | } | 1116 | } |
1139 | 1117 | ||
1140 | 1118 | ||
1141 | // some of this stuff is to support 'temporarily windowed' mode so that | 1119 | // This is to support 'temporarily windowed' mode so that |
1142 | // dialogs are still usable in fullscreen. HOWEVER! - it's not enabled/working | 1120 | // dialogs are still usable in fullscreen. |
1143 | // yet. | ||
1144 | static LLCoordScreen old_size; | ||
1145 | static BOOL old_fullscreen; | ||
1146 | void LLWindowSDL::beforeDialog() | 1121 | void LLWindowSDL::beforeDialog() |
1147 | { | 1122 | { |
1123 | bool running_x11 = false; | ||
1124 | #if LL_X11 | ||
1125 | running_x11 = (mSDL_XWindowID != None); | ||
1126 | #endif //LL_X11 | ||
1127 | |||
1148 | llinfos << "LLWindowSDL::beforeDialog()" << llendl; | 1128 | llinfos << "LLWindowSDL::beforeDialog()" << llendl; |
1149 | 1129 | ||
1150 | if (SDLReallyCaptureInput(FALSE) // must ungrab input so popup works! | 1130 | if (SDLReallyCaptureInput(FALSE)) // must ungrab input so popup works! |
1151 | && getSize(&old_size)) | ||
1152 | { | 1131 | { |
1153 | old_fullscreen = was_fullscreen; | 1132 | if (mFullscreen) |
1154 | |||
1155 | if (old_fullscreen) | ||
1156 | { | 1133 | { |
1157 | // NOT YET WORKING | 1134 | // need to temporarily go non-fullscreen; bless SDL |
1158 | //switchContext(FALSE, old_size, TRUE); | 1135 | // for providing a SDL_WM_ToggleFullScreen() - though |
1136 | // it only works in X11 | ||
1137 | if (running_x11 && mWindow) | ||
1138 | { | ||
1139 | SDL_WM_ToggleFullScreen(mWindow); | ||
1140 | } | ||
1159 | } | 1141 | } |
1160 | } | 1142 | } |
1161 | 1143 | ||
@@ -1181,17 +1163,24 @@ void LLWindowSDL::beforeDialog() | |||
1181 | 1163 | ||
1182 | void LLWindowSDL::afterDialog() | 1164 | void LLWindowSDL::afterDialog() |
1183 | { | 1165 | { |
1166 | bool running_x11 = false; | ||
1167 | #if LL_X11 | ||
1168 | running_x11 = (mSDL_XWindowID != None); | ||
1169 | #endif //LL_X11 | ||
1170 | |||
1184 | llinfos << "LLWindowSDL::afterDialog()" << llendl; | 1171 | llinfos << "LLWindowSDL::afterDialog()" << llendl; |
1185 | 1172 | ||
1186 | maybe_unlock_display(); | 1173 | maybe_unlock_display(); |
1187 | 1174 | ||
1188 | if (old_fullscreen && !was_fullscreen) | 1175 | if (mFullscreen) |
1189 | { | 1176 | { |
1190 | // *FIX: NOT YET WORKING (see below) | 1177 | // need to restore fullscreen mode after dialog - only works |
1191 | //switchContext(TRUE, old_size, TRUE); | 1178 | // in X11 |
1179 | if (running_x11 && mWindow) | ||
1180 | { | ||
1181 | SDL_WM_ToggleFullScreen(mWindow); | ||
1182 | } | ||
1192 | } | 1183 | } |
1193 | // *FIX: we need to restore the GL context using | ||
1194 | // LLViewerWindow::restoreGL() - but how?? | ||
1195 | } | 1184 | } |
1196 | 1185 | ||
1197 | 1186 | ||
@@ -1358,7 +1347,6 @@ BOOL LLWindowSDL::copyTextToPrimary(const LLWString &s) | |||
1358 | { | 1347 | { |
1359 | return FALSE; // unsupported | 1348 | return FALSE; // unsupported |
1360 | } | 1349 | } |
1361 | |||
1362 | #endif // LL_GTK | 1350 | #endif // LL_GTK |
1363 | 1351 | ||
1364 | LLWindow::LLWindowResolution* LLWindowSDL::getSupportedResolutions(S32 &num_resolutions) | 1352 | LLWindow::LLWindowResolution* LLWindowSDL::getSupportedResolutions(S32 &num_resolutions) |
@@ -1559,7 +1547,7 @@ U32 LLWindowSDL::SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain) | |||
1559 | /* part of the fix for SL-13243: Some popular window managers like | 1547 | /* part of the fix for SL-13243: Some popular window managers like |
1560 | to totally eat alt-drag for the purposes of moving windows. We | 1548 | to totally eat alt-drag for the purposes of moving windows. We |
1561 | spoil their day by acquiring the exclusive X11 mouse lock for as | 1549 | spoil their day by acquiring the exclusive X11 mouse lock for as |
1562 | long as LALT is held down, so the window manager can't easily | 1550 | long as ALT is held down, so the window manager can't easily |
1563 | see what's happening. Tested successfully with Metacity. | 1551 | see what's happening. Tested successfully with Metacity. |
1564 | And... do the same with CTRL, for other darn WMs. We don't | 1552 | And... do the same with CTRL, for other darn WMs. We don't |
1565 | care about other metakeys as SL doesn't use them with dragging | 1553 | care about other metakeys as SL doesn't use them with dragging |
@@ -1574,10 +1562,12 @@ U32 LLWindowSDL::SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain) | |||
1574 | { | 1562 | { |
1575 | case SDLK_LALT: | 1563 | case SDLK_LALT: |
1576 | mask = 1U << 0; break; | 1564 | mask = 1U << 0; break; |
1577 | case SDLK_LCTRL: | 1565 | case SDLK_RALT: |
1578 | mask = 1U << 1; break; | 1566 | mask = 1U << 1; break; |
1579 | case SDLK_RCTRL: | 1567 | case SDLK_LCTRL: |
1580 | mask = 1U << 2; break; | 1568 | mask = 1U << 2; break; |
1569 | case SDLK_RCTRL: | ||
1570 | mask = 1U << 3; break; | ||
1581 | default: | 1571 | default: |
1582 | break; | 1572 | break; |
1583 | } | 1573 | } |
@@ -1596,7 +1586,7 @@ U32 LLWindowSDL::SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain) | |||
1596 | // virtual | 1586 | // virtual |
1597 | void LLWindowSDL::processMiscNativeEvents() | 1587 | void LLWindowSDL::processMiscNativeEvents() |
1598 | { | 1588 | { |
1599 | #if LL_GTK && (LL_LLMOZLIB_ENABLED || LL_DBUS_ENABLED) | 1589 | #if LL_GTK |
1600 | // Pump GTK events to avoid starvation for: | 1590 | // Pump GTK events to avoid starvation for: |
1601 | // * Embedded Gecko | 1591 | // * Embedded Gecko |
1602 | // * DBUS servicing | 1592 | // * DBUS servicing |
@@ -1623,7 +1613,7 @@ void LLWindowSDL::processMiscNativeEvents() | |||
1623 | 1613 | ||
1624 | setlocale(LC_ALL, saved_locale.c_str() ); | 1614 | setlocale(LC_ALL, saved_locale.c_str() ); |
1625 | } | 1615 | } |
1626 | #endif // LL_GTK && (LL_LLMOZLIB_ENABLED || LL_DBUS_ENABLED) | 1616 | #endif // LL_GTK |
1627 | } | 1617 | } |
1628 | 1618 | ||
1629 | void LLWindowSDL::gatherInput() | 1619 | void LLWindowSDL::gatherInput() |
@@ -1717,10 +1707,9 @@ void LLWindowSDL::gatherInput() | |||
1717 | mCallbacks->handleMouseDown(this, openGlCoord, mask); | 1707 | mCallbacks->handleMouseDown(this, openGlCoord, mask); |
1718 | } | 1708 | } |
1719 | 1709 | ||
1720 | else if (event.button.button == SDL_BUTTON_RIGHT) // right ... yes, it's 3, not 2, in SDL... | 1710 | else if (event.button.button == SDL_BUTTON_RIGHT) // right |
1721 | { | 1711 | { |
1722 | // right double click isn't handled right now in Second Life ... if (isDoubleClick) | 1712 | mCallbacks->handleRightMouseDown(this, openGlCoord, mask); |
1723 | mCallbacks->handleRightMouseDown(this, openGlCoord, mask); | ||
1724 | } | 1713 | } |
1725 | 1714 | ||
1726 | else if (event.button.button == SDL_BUTTON_MIDDLE) // middle | 1715 | else if (event.button.button == SDL_BUTTON_MIDDLE) // middle |
@@ -1743,13 +1732,11 @@ void LLWindowSDL::gatherInput() | |||
1743 | MASK mask = gKeyboard->currentMask(TRUE); | 1732 | MASK mask = gKeyboard->currentMask(TRUE); |
1744 | 1733 | ||
1745 | if (event.button.button == SDL_BUTTON_LEFT) // left | 1734 | if (event.button.button == SDL_BUTTON_LEFT) // left |
1746 | mCallbacks->handleMouseUp(this, openGlCoord, mask); | 1735 | mCallbacks->handleMouseUp(this, openGlCoord, mask); |
1747 | else if (event.button.button == SDL_BUTTON_RIGHT) // right ... yes, it's 3, not 2, in SDL... | 1736 | else if (event.button.button == SDL_BUTTON_RIGHT) // right |
1748 | mCallbacks->handleRightMouseUp(this, openGlCoord, mask); | 1737 | mCallbacks->handleRightMouseUp(this, openGlCoord, mask); |
1749 | else if (event.button.button == SDL_BUTTON_MIDDLE) // middle | 1738 | else if (event.button.button == SDL_BUTTON_MIDDLE) // middle |
1750 | { | ||
1751 | mCallbacks->handleMiddleMouseUp(this, openGlCoord, mask); | 1739 | mCallbacks->handleMiddleMouseUp(this, openGlCoord, mask); |
1752 | } | ||
1753 | // don't handle mousewheel here... | 1740 | // don't handle mousewheel here... |
1754 | 1741 | ||
1755 | break; | 1742 | break; |
@@ -1793,12 +1780,12 @@ void LLWindowSDL::gatherInput() | |||
1793 | // which confuses the focus code [SL-24071]. | 1780 | // which confuses the focus code [SL-24071]. |
1794 | if (event.active.gain != mHaveInputFocus) | 1781 | if (event.active.gain != mHaveInputFocus) |
1795 | { | 1782 | { |
1796 | if (event.active.gain) | 1783 | mHaveInputFocus = !!event.active.gain; |
1784 | |||
1785 | if (mHaveInputFocus) | ||
1797 | mCallbacks->handleFocus(this); | 1786 | mCallbacks->handleFocus(this); |
1798 | else | 1787 | else |
1799 | mCallbacks->handleFocusLost(this); | 1788 | mCallbacks->handleFocusLost(this); |
1800 | |||
1801 | mHaveInputFocus = !!event.active.gain; | ||
1802 | } | 1789 | } |
1803 | } | 1790 | } |
1804 | if (event.active.state & SDL_APPACTIVE) | 1791 | if (event.active.state & SDL_APPACTIVE) |
@@ -1806,10 +1793,10 @@ void LLWindowSDL::gatherInput() | |||
1806 | // Change in iconification/minimization state. | 1793 | // Change in iconification/minimization state. |
1807 | if ((!event.active.gain) != mIsMinimized) | 1794 | if ((!event.active.gain) != mIsMinimized) |
1808 | { | 1795 | { |
1809 | mCallbacks->handleActivate(this, !!event.active.gain); | ||
1810 | llinfos << "SDL deiconification state switched to " << BOOL(event.active.gain) << llendl; | ||
1811 | |||
1812 | mIsMinimized = (!event.active.gain); | 1796 | mIsMinimized = (!event.active.gain); |
1797 | |||
1798 | mCallbacks->handleActivate(this, !mIsMinimized); | ||
1799 | llinfos << "SDL deiconification state switched to " << BOOL(event.active.gain) << llendl; | ||
1813 | } | 1800 | } |
1814 | else | 1801 | else |
1815 | { | 1802 | { |
@@ -2057,8 +2044,6 @@ void LLWindowSDL::hideCursor() | |||
2057 | { | 2044 | { |
2058 | // llinfos << "hideCursor: already hidden" << llendl; | 2045 | // llinfos << "hideCursor: already hidden" << llendl; |
2059 | } | 2046 | } |
2060 | |||
2061 | adjustCursorDecouple(); | ||
2062 | } | 2047 | } |
2063 | 2048 | ||
2064 | void LLWindowSDL::showCursor() | 2049 | void LLWindowSDL::showCursor() |
@@ -2074,8 +2059,6 @@ void LLWindowSDL::showCursor() | |||
2074 | { | 2059 | { |
2075 | // llinfos << "showCursor: already visible" << llendl; | 2060 | // llinfos << "showCursor: already visible" << llendl; |
2076 | } | 2061 | } |
2077 | |||
2078 | adjustCursorDecouple(); | ||
2079 | } | 2062 | } |
2080 | 2063 | ||
2081 | void LLWindowSDL::showCursorFromMouseMove() | 2064 | void LLWindowSDL::showCursorFromMouseMove() |
@@ -2141,10 +2124,7 @@ S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 typ | |||
2141 | if(gWindowImplementation != NULL) | 2124 | if(gWindowImplementation != NULL) |
2142 | gWindowImplementation->beforeDialog(); | 2125 | gWindowImplementation->beforeDialog(); |
2143 | 2126 | ||
2144 | if (LLWindowSDL::ll_try_gtk_init() | 2127 | if (LLWindowSDL::ll_try_gtk_init()) |
2145 | // We can NOT expect to combine GTK and SDL's aggressive fullscreen | ||
2146 | && ((NULL==gWindowImplementation) || (!was_fullscreen)) | ||
2147 | ) | ||
2148 | { | 2128 | { |
2149 | GtkWidget *win = NULL; | 2129 | GtkWidget *win = NULL; |
2150 | 2130 | ||
@@ -2248,10 +2228,7 @@ BOOL LLWindowSDL::dialog_color_picker ( F32 *r, F32 *g, F32 *b) | |||
2248 | 2228 | ||
2249 | beforeDialog(); | 2229 | beforeDialog(); |
2250 | 2230 | ||
2251 | if (ll_try_gtk_init() | 2231 | if (ll_try_gtk_init()) |
2252 | // We can NOT expect to combine GTK and SDL's aggressive fullscreen | ||
2253 | && !was_fullscreen | ||
2254 | ) | ||
2255 | { | 2232 | { |
2256 | GtkWidget *win = NULL; | 2233 | GtkWidget *win = NULL; |
2257 | 2234 | ||
@@ -2435,7 +2412,7 @@ void LLWindowSDL::bringToFront() | |||
2435 | } | 2412 | } |
2436 | 2413 | ||
2437 | //static | 2414 | //static |
2438 | std::string LLWindowSDL::getFontListSans() | 2415 | std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList() |
2439 | { | 2416 | { |
2440 | // Use libfontconfig to find us a nice ordered list of fallback fonts | 2417 | // Use libfontconfig to find us a nice ordered list of fallback fonts |
2441 | // specific to this system. | 2418 | // specific to this system. |
@@ -2452,7 +2429,7 @@ std::string LLWindowSDL::getFontListSans() | |||
2452 | // renderable range if for some reason our FreeType actually fails | 2429 | // renderable range if for some reason our FreeType actually fails |
2453 | // to use some of the fonts we want it to. | 2430 | // to use some of the fonts we want it to. |
2454 | const bool elide_unicode_coverage = true; | 2431 | const bool elide_unicode_coverage = true; |
2455 | std::string rtn; | 2432 | std::vector<std::string> rtns; |
2456 | FcFontSet *fs = NULL; | 2433 | FcFontSet *fs = NULL; |
2457 | FcPattern *sortpat = NULL; | 2434 | FcPattern *sortpat = NULL; |
2458 | int font_count = 0; | 2435 | int font_count = 0; |
@@ -2486,7 +2463,8 @@ std::string LLWindowSDL::getFontListSans() | |||
2486 | if (!FcInit()) | 2463 | if (!FcInit()) |
2487 | { | 2464 | { |
2488 | llwarns << "FontConfig failed to initialize." << llendl; | 2465 | llwarns << "FontConfig failed to initialize." << llendl; |
2489 | return final_fallback; | 2466 | rtns.push_back(final_fallback); |
2467 | return rtns; | ||
2490 | } | 2468 | } |
2491 | 2469 | ||
2492 | sortpat = FcNameParse((FcChar8*) sort_order.c_str()); | 2470 | sortpat = FcNameParse((FcChar8*) sort_order.c_str()); |
@@ -2511,17 +2489,24 @@ std::string LLWindowSDL::getFontListSans() | |||
2511 | &filename) | 2489 | &filename) |
2512 | && filename) | 2490 | && filename) |
2513 | { | 2491 | { |
2514 | rtn += std::string((const char*)filename)+";"; | 2492 | rtns.push_back(std::string((const char*)filename)); |
2515 | ++font_count; | 2493 | ++font_count; |
2516 | } | 2494 | } |
2517 | } | 2495 | } |
2518 | FcFontSetDestroy (fs); | 2496 | FcFontSetDestroy (fs); |
2519 | } | 2497 | } |
2520 | 2498 | ||
2521 | lldebugs << "Using font list: " << rtn << llendl; | 2499 | lldebugs << "Using font list: " << llendl; |
2500 | for (std::vector<std::string>::iterator it = rtns.begin(); | ||
2501 | it != rtns.end(); | ||
2502 | ++it) | ||
2503 | { | ||
2504 | lldebugs << " file: " << *it << llendl; | ||
2505 | } | ||
2522 | llinfos << "Using " << font_count << " system font(s)." << llendl; | 2506 | llinfos << "Using " << font_count << " system font(s)." << llendl; |
2523 | 2507 | ||
2524 | return rtn + final_fallback; | 2508 | rtns.push_back(final_fallback); |
2509 | return rtns; | ||
2525 | } | 2510 | } |
2526 | 2511 | ||
2527 | #endif // LL_SDL | 2512 | #endif // LL_SDL |
diff --git a/linden/indra/llwindow/llwindowsdl.h b/linden/indra/llwindow/llwindowsdl.h index 54baf01..632d8fc 100644 --- a/linden/indra/llwindow/llwindowsdl.h +++ b/linden/indra/llwindow/llwindowsdl.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -124,7 +125,7 @@ public: | |||
124 | 125 | ||
125 | /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); | 126 | /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); |
126 | 127 | ||
127 | static std::string getFontListSans(); | 128 | static std::vector<std::string> getDynamicFallbackFontList(); |
128 | 129 | ||
129 | // Not great that these are public, but they have to be accessible | 130 | // Not great that these are public, but they have to be accessible |
130 | // by non-class code and it's better than making them global. | 131 | // by non-class code and it's better than making them global. |
@@ -178,7 +179,6 @@ protected: | |||
178 | BOOL createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync); | 179 | BOOL createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync); |
179 | void destroyContext(); | 180 | void destroyContext(); |
180 | void setupFailure(const std::string& text, const std::string& caption, U32 type); | 181 | void setupFailure(const std::string& text, const std::string& caption, U32 type); |
181 | void adjustCursorDecouple(bool warpingMouse = false); | ||
182 | void fixWindowSize(void); | 182 | void fixWindowSize(void); |
183 | U32 SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain); | 183 | U32 SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain); |
184 | BOOL SDLReallyCaptureInput(BOOL capture); | 184 | BOOL SDLReallyCaptureInput(BOOL capture); |
@@ -191,10 +191,6 @@ protected: | |||
191 | SDL_Surface * mWindow; | 191 | SDL_Surface * mWindow; |
192 | std::string mWindowTitle; | 192 | std::string mWindowTitle; |
193 | double mOriginalAspectRatio; | 193 | double mOriginalAspectRatio; |
194 | BOOL mCursorDecoupled; | ||
195 | S32 mCursorLastEventDeltaX; | ||
196 | S32 mCursorLastEventDeltaY; | ||
197 | BOOL mCursorIgnoreNextDelta; | ||
198 | BOOL mNeedsResize; // Constructor figured out the window is too big, it needs a resize. | 194 | BOOL mNeedsResize; // Constructor figured out the window is too big, it needs a resize. |
199 | LLCoordScreen mNeedsResizeSize; | 195 | LLCoordScreen mNeedsResizeSize; |
200 | F32 mOverrideAspectRatio; | 196 | F32 mOverrideAspectRatio; |
diff --git a/linden/indra/llwindow/llwindowwin32.cpp b/linden/indra/llwindow/llwindowwin32.cpp index a9c7758..b2826c8 100644 --- a/linden/indra/llwindow/llwindowwin32.cpp +++ b/linden/indra/llwindow/llwindowwin32.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -372,6 +373,8 @@ LLWindowWin32::LLWindowWin32(const std::string& title, const std::string& name, | |||
372 | mMousePositionModified = FALSE; | 373 | mMousePositionModified = FALSE; |
373 | mInputProcessingPaused = FALSE; | 374 | mInputProcessingPaused = FALSE; |
374 | mPreeditor = NULL; | 375 | mPreeditor = NULL; |
376 | mhDC = NULL; | ||
377 | mhRC = NULL; | ||
375 | 378 | ||
376 | // Initialize the keyboard | 379 | // Initialize the keyboard |
377 | gKeyboard = new LLKeyboardWin32(); | 380 | gKeyboard = new LLKeyboardWin32(); |
@@ -417,7 +420,7 @@ LLWindowWin32::LLWindowWin32(const std::string& title, const std::string& name, | |||
417 | mhInstance = GetModuleHandle(NULL); | 420 | mhInstance = GetModuleHandle(NULL); |
418 | mWndProc = NULL; | 421 | mWndProc = NULL; |
419 | 422 | ||
420 | mSwapMethod = SWAP_METHOD_EXCHANGE; | 423 | mSwapMethod = SWAP_METHOD_UNDEFINED; |
421 | 424 | ||
422 | // No WPARAM yet. | 425 | // No WPARAM yet. |
423 | mLastSizeWParam = 0; | 426 | mLastSizeWParam = 0; |
@@ -843,8 +846,13 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO | |||
843 | RECT window_rect; | 846 | RECT window_rect; |
844 | S32 width = size.mX; | 847 | S32 width = size.mX; |
845 | S32 height = size.mY; | 848 | S32 height = size.mY; |
849 | BOOL auto_show = FALSE; | ||
846 | 850 | ||
847 | resetDisplayResolution(); | 851 | if (mhRC) |
852 | { | ||
853 | auto_show = TRUE; | ||
854 | resetDisplayResolution(); | ||
855 | } | ||
848 | 856 | ||
849 | if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode)) | 857 | if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode)) |
850 | { | 858 | { |
@@ -1182,8 +1190,28 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO | |||
1182 | LL_INFOS("Window") << "Choosing pixel formats: " << num_formats << " pixel formats returned" << LL_ENDL; | 1190 | LL_INFOS("Window") << "Choosing pixel formats: " << num_formats << " pixel formats returned" << LL_ENDL; |
1183 | } | 1191 | } |
1184 | 1192 | ||
1185 | pixel_format = pixel_formats[0]; | 1193 | |
1194 | |||
1195 | S32 swap_method = 0; | ||
1196 | S32 cur_format = num_formats-1; | ||
1197 | GLint swap_query = WGL_SWAP_METHOD_ARB; | ||
1198 | |||
1199 | BOOL found_format = FALSE; | ||
1186 | 1200 | ||
1201 | while (!found_format && wglGetPixelFormatAttribivARB(mhDC, pixel_format, 0, 1, &swap_query, &swap_method)) | ||
1202 | { | ||
1203 | if (swap_method == WGL_SWAP_UNDEFINED_ARB || cur_format <= 0) | ||
1204 | { | ||
1205 | found_format = TRUE; | ||
1206 | } | ||
1207 | else | ||
1208 | { | ||
1209 | --cur_format; | ||
1210 | } | ||
1211 | } | ||
1212 | |||
1213 | pixel_format = pixel_formats[cur_format]; | ||
1214 | |||
1187 | if (mhDC != 0) // Does The Window Have A Device Context? | 1215 | if (mhDC != 0) // Does The Window Have A Device Context? |
1188 | { | 1216 | { |
1189 | wglMakeCurrent(mhDC, 0); // Set The Current Active Rendering Context To Zero | 1217 | wglMakeCurrent(mhDC, 0); // Set The Current Active Rendering Context To Zero |
@@ -1226,9 +1254,6 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO | |||
1226 | return FALSE; | 1254 | return FALSE; |
1227 | } | 1255 | } |
1228 | 1256 | ||
1229 | int swap_method = 0; | ||
1230 | GLint swap_query = WGL_SWAP_METHOD_ARB; | ||
1231 | |||
1232 | if (wglGetPixelFormatAttribivARB(mhDC, pixel_format, 0, 1, &swap_query, &swap_method)) | 1257 | if (wglGetPixelFormatAttribivARB(mhDC, pixel_format, 0, 1, &swap_query, &swap_method)) |
1233 | { | 1258 | { |
1234 | switch (swap_method) | 1259 | switch (swap_method) |
@@ -1341,13 +1366,21 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO | |||
1341 | } | 1366 | } |
1342 | 1367 | ||
1343 | SetWindowLong(mWindowHandle, GWL_USERDATA, (U32)this); | 1368 | SetWindowLong(mWindowHandle, GWL_USERDATA, (U32)this); |
1344 | show(); | 1369 | |
1345 | |||
1346 | //register joystick timer callback | 1370 | //register joystick timer callback |
1347 | SetTimer( mWindowHandle, 0, 1000 / 30, NULL ); // 30 fps timer | 1371 | SetTimer( mWindowHandle, 0, 1000 / 30, NULL ); // 30 fps timer |
1348 | 1372 | ||
1349 | // ok to post quit messages now | 1373 | // ok to post quit messages now |
1350 | mPostQuit = TRUE; | 1374 | mPostQuit = TRUE; |
1375 | |||
1376 | if (auto_show) | ||
1377 | { | ||
1378 | show(); | ||
1379 | glClearColor(0.0f, 0.0f, 0.0f, 0.f); | ||
1380 | glClear(GL_COLOR_BUFFER_BIT); | ||
1381 | swapBuffers(); | ||
1382 | } | ||
1383 | |||
1351 | return TRUE; | 1384 | return TRUE; |
1352 | } | 1385 | } |
1353 | 1386 | ||
@@ -2942,7 +2975,7 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url ) | |||
2942 | /* | 2975 | /* |
2943 | std::string reg_path_str = gURLProtocolWhitelistHandler[i] + "\\shell\\open\\command"; | 2976 | std::string reg_path_str = gURLProtocolWhitelistHandler[i] + "\\shell\\open\\command"; |
2944 | WCHAR reg_path_wstr[256]; | 2977 | WCHAR reg_path_wstr[256]; |
2945 | mbstowcs(reg_path_wstr, reg_path_str.c_str(), sizeof(reg_path_wstr)/sizeof(reg_path_wstr[0])); | 2978 | mbstowcs( reg_path_wstr, reg_path_str.c_str(), LL_ARRAY_SIZE(reg_path_wstr) ); |
2946 | 2979 | ||
2947 | HKEY key; | 2980 | HKEY key; |
2948 | WCHAR browser_open_wstr[1024]; | 2981 | WCHAR browser_open_wstr[1024]; |
@@ -3633,11 +3666,10 @@ BOOL LLWindowWin32::handleImeRequests(U32 request, U32 param, LRESULT *result) | |||
3633 | } | 3666 | } |
3634 | 3667 | ||
3635 | //static | 3668 | //static |
3636 | std::string LLWindowWin32::getFontListSans() | 3669 | std::vector<std::string> LLWindowWin32::getDynamicFallbackFontList() |
3637 | { | 3670 | { |
3638 | // Lists Japanese, Korean, and Chinese sanserif fonts available in | 3671 | // Fonts previously in getFontListSans() have moved to fonts.xml. |
3639 | // Windows XP and Vista, as well as "Arial Unicode MS". | 3672 | return std::vector<std::string>(); |
3640 | return "MSGOTHIC.TTC;gulim.ttc;simhei.ttf;ArialUni.ttf"; | ||
3641 | } | 3673 | } |
3642 | 3674 | ||
3643 | 3675 | ||
diff --git a/linden/indra/llwindow/llwindowwin32.h b/linden/indra/llwindow/llwindowwin32.h index bea55c6..d3ae325 100644 --- a/linden/indra/llwindow/llwindowwin32.h +++ b/linden/indra/llwindow/llwindowwin32.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -112,7 +113,7 @@ public: | |||
112 | /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); | 113 | /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); |
113 | /*virtual*/ void ShellEx(const std::string& command); | 114 | /*virtual*/ void ShellEx(const std::string& command); |
114 | 115 | ||
115 | static std::string getFontListSans(); | 116 | static std::vector<std::string> getDynamicFallbackFontList(); |
116 | 117 | ||
117 | protected: | 118 | protected: |
118 | LLWindowWin32( | 119 | LLWindowWin32( |