aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/llwindow
diff options
context:
space:
mode:
authorJacek Antonelli2009-11-19 04:19:06 -0600
committerJacek Antonelli2009-11-19 04:19:06 -0600
commit1d443b7a94ed6f9ef1d408caef72fcbc0b1ee427 (patch)
treee09ccbc010e326a48fd91ba15b58afd7fb836b3f /linden/indra/llwindow
parentFixed minor formatting issue in MANIFESTO.txt. (diff)
parentFixed CMake setting errors (diff)
downloadmeta-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')
-rwxr-xr-xlinden/indra/llwindow/glh/glh_linear.h1621
-rw-r--r--linden/indra/llwindow/lldxhardware.cpp35
-rw-r--r--linden/indra/llwindow/lldxhardware.h3
-rw-r--r--linden/indra/llwindow/llkeyboard.cpp3
-rw-r--r--linden/indra/llwindow/llkeyboard.h3
-rw-r--r--linden/indra/llwindow/llkeyboardmacosx.cpp3
-rw-r--r--linden/indra/llwindow/llkeyboardmacosx.h3
-rw-r--r--linden/indra/llwindow/llkeyboardsdl.cpp3
-rw-r--r--linden/indra/llwindow/llkeyboardsdl.h3
-rw-r--r--linden/indra/llwindow/llkeyboardwin32.cpp3
-rw-r--r--linden/indra/llwindow/llkeyboardwin32.h3
-rw-r--r--linden/indra/llwindow/llmousehandler.h3
-rw-r--r--linden/indra/llwindow/llpreeditor.h3
-rw-r--r--linden/indra/llwindow/llwindow.cpp13
-rw-r--r--linden/indra/llwindow/llwindow.h5
-rw-r--r--linden/indra/llwindow/llwindowheadless.cpp3
-rw-r--r--linden/indra/llwindow/llwindowheadless.h3
-rw-r--r--linden/indra/llwindow/llwindowmacosx-objc.h3
-rw-r--r--linden/indra/llwindow/llwindowmacosx-objc.mm3
-rw-r--r--linden/indra/llwindow/llwindowmacosx.cpp14
-rw-r--r--linden/indra/llwindow/llwindowmacosx.h5
-rw-r--r--linden/indra/llwindow/llwindowmesaheadless.cpp3
-rw-r--r--linden/indra/llwindow/llwindowmesaheadless.h3
-rw-r--r--linden/indra/llwindow/llwindowsdl.cpp217
-rw-r--r--linden/indra/llwindow/llwindowsdl.h10
-rw-r--r--linden/indra/llwindow/llwindowwin32.cpp60
-rw-r--r--linden/indra/llwindow/llwindowwin32.h5
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/*
44glh_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
76namespace 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
627LCleanup: 658LCleanup:
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
327std::string LLWindow::getFontListSans() 328std::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
209protected: 210protected:
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
3360std::string LLWindowMacOSX::getFontListSans() 3361std::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
117protected: 118protected:
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.
84static LLWindowSDL *gWindowImplementation = NULL; 86static LLWindowSDL *gWindowImplementation = NULL;
85 87
86static BOOL was_fullscreen = FALSE;
87
88 88
89void maybe_lock_display(void) 89void 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
278static int x11_detect_VRAM_kb_fp(FILE *fp, const char *prefix_str) 276static 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
325static int x11_detect_VRAM_kb() 325static 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
969void LLWindowSDL::swapBuffers() 978void LLWindowSDL::swapBuffers()
@@ -1013,11 +1022,7 @@ BOOL LLWindowSDL::isCursorHidden()
1013// Constrains the mouse to the window. 1022// Constrains the mouse to the window.
1014void LLWindowSDL::setMouseClipping( BOOL b ) 1023void 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
1023BOOL LLWindowSDL::setCursorPosition(const LLCoordWindow position) 1028BOOL 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
1058void 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
1086F32 LLWindowSDL::getNativeAspectRatio() 1064F32 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.
1144static LLCoordScreen old_size;
1145static BOOL old_fullscreen;
1146void LLWindowSDL::beforeDialog() 1121void 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
1182void LLWindowSDL::afterDialog() 1164void 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
1364LLWindow::LLWindowResolution* LLWindowSDL::getSupportedResolutions(S32 &num_resolutions) 1352LLWindow::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
1597void LLWindowSDL::processMiscNativeEvents() 1587void 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
1629void LLWindowSDL::gatherInput() 1619void 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
2064void LLWindowSDL::showCursor() 2049void 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
2081void LLWindowSDL::showCursorFromMouseMove() 2064void 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
2438std::string LLWindowSDL::getFontListSans() 2415std::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
3636std::string LLWindowWin32::getFontListSans() 3669std::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
117protected: 118protected:
118 LLWindowWin32( 119 LLWindowWin32(