aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--avatar_lad.xml11454
-rw-r--r--linden/etc/message.xml20
-rw-r--r--linden/indra/llaudio/llaudioengine.cpp79
-rw-r--r--linden/indra/llaudio/llaudioengine.h21
-rw-r--r--linden/indra/llaudio/llstreamingaudio.h3
-rw-r--r--linden/indra/llcharacter/llcharacter.cpp4
-rw-r--r--linden/indra/llcharacter/llcharacter.h14
-rw-r--r--linden/indra/llcharacter/llvisualparam.cpp4
-rw-r--r--linden/indra/llcharacter/llvisualparam.h7
-rw-r--r--linden/indra/llcommon/CMakeLists.txt2
-rw-r--r--linden/indra/llcommon/llavatarname.cpp150
-rw-r--r--linden/indra/llcommon/llavatarname.h105
-rw-r--r--linden/indra/llmessage/CMakeLists.txt2
-rw-r--r--linden/indra/llmessage/llavatarnamecache.cpp859
-rw-r--r--linden/indra/llmessage/llavatarnamecache.h105
-rw-r--r--linden/indra/llmessage/llcachename.h2
-rw-r--r--linden/indra/llmessage/llpartdata.cpp90
-rw-r--r--linden/indra/llmessage/llpartdata.h3
-rw-r--r--linden/indra/newview/CMakeLists.txt6
-rw-r--r--linden/indra/newview/app_settings/cloud.xml88
-rw-r--r--linden/indra/newview/app_settings/settings.xml47
-rw-r--r--linden/indra/newview/chatbar_as_cmdline.cpp4
-rw-r--r--linden/indra/newview/kokuastreamingaudio.cpp129
-rw-r--r--linden/indra/newview/kokuastreamingaudio.h71
-rw-r--r--linden/indra/newview/llagent.cpp2
-rw-r--r--linden/indra/newview/llappviewer.cpp154
-rw-r--r--linden/indra/newview/llappviewer.h1
-rw-r--r--linden/indra/newview/llcallingcard.cpp50
-rw-r--r--linden/indra/newview/llcallingcard.h3
-rw-r--r--linden/indra/newview/llfirstuse.cpp28
-rw-r--r--linden/indra/newview/llfirstuse.h3
-rw-r--r--linden/indra/newview/llfloateractivespeakers.cpp7
-rw-r--r--linden/indra/newview/llfloateractivespeakers.h3
-rw-r--r--linden/indra/newview/llfloateravatarinfo.cpp10
-rw-r--r--linden/indra/newview/llfloateravatarinfo.h4
-rw-r--r--linden/indra/newview/llfloaterchatterbox.cpp3
-rw-r--r--linden/indra/newview/llfloatercustomize.cpp8
-rw-r--r--linden/indra/newview/llfloaterdirectory.cpp4
-rw-r--r--linden/indra/newview/llfloaterdisplayname.cpp224
-rw-r--r--linden/indra/newview/llfloaterdisplayname.h48
-rw-r--r--linden/indra/newview/llfloaterfriends.cpp75
-rw-r--r--linden/indra/newview/llfloaternewim.cpp20
-rw-r--r--linden/indra/newview/llfloatertools.cpp4
-rw-r--r--linden/indra/newview/llhoverview.cpp21
-rw-r--r--linden/indra/newview/llimpanel.cpp66
-rw-r--r--linden/indra/newview/llimpanel.h6
-rw-r--r--linden/indra/newview/llnamelistctrl.cpp46
-rw-r--r--linden/indra/newview/llnamelistctrl.h5
-rw-r--r--linden/indra/newview/llnetmap.cpp25
-rw-r--r--linden/indra/newview/lloverlaybar.cpp13
-rw-r--r--linden/indra/newview/llpanelavatar.cpp53
-rw-r--r--linden/indra/newview/llpanelavatar.h8
-rw-r--r--linden/indra/newview/llpaneldirfind.cpp8
-rw-r--r--linden/indra/newview/llpanelgeneral.cpp5
-rw-r--r--linden/indra/newview/llpanelgeneral.h3
-rw-r--r--linden/indra/newview/llstartup.cpp75
-rw-r--r--linden/indra/newview/llstartup.h4
-rw-r--r--linden/indra/newview/lltexlayer.cpp24
-rw-r--r--linden/indra/newview/llvieweraudio.cpp125
-rw-r--r--linden/indra/newview/llviewercontrol.cpp38
-rw-r--r--linden/indra/newview/llviewerdisplayname.cpp208
-rw-r--r--linden/indra/newview/llviewerdisplayname.h53
-rw-r--r--linden/indra/newview/llviewermedia_streamingaudio.cpp7
-rw-r--r--linden/indra/newview/llviewermedia_streamingaudio.h2
-rw-r--r--linden/indra/newview/llviewermenu.cpp32
-rwxr-xr-xlinden/indra/newview/llviewermessage.cpp27
-rw-r--r--linden/indra/newview/llviewerobject.cpp2
-rw-r--r--linden/indra/newview/llviewerparcelmgr.cpp18
-rw-r--r--linden/indra/newview/llviewerregion.cpp17
-rw-r--r--linden/indra/newview/llviewerregion.h6
-rw-r--r--linden/indra/newview/llvoavatar.cpp186
-rw-r--r--linden/indra/newview/llvoavatar.h7
-rw-r--r--linden/indra/newview/llwearable.cpp14
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_customize.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_display_name.xml42
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml5
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml12
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/notifications.xml104
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml5
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml147
-rwxr-xr-xlinden/install.xml7
82 files changed, 14923 insertions, 433 deletions
diff --git a/avatar_lad.xml b/avatar_lad.xml
new file mode 100644
index 0000000..245b393
--- /dev/null
+++ b/avatar_lad.xml
@@ -0,0 +1,11454 @@
1<?xml version="1.0" encoding="us-ascii" standalone="yes"?>
2<linden_avatar
3 version="1.0"
4 wearable_definition_version="22">
5 <!-- The wearable_definition_version is checked during asset upload. -->
6 <!-- If you increment it, check indra/lib/python/indra/assetutil.py. -->
7 <skeleton
8 file_name="avatar_skeleton.xml">
9 <attachment_point
10 id="1"
11 group="6"
12 pie_slice="2"
13 name="Chest"
14 joint="mChest"
15 position="0.15 0 -0.1"
16 rotation="0 90 90"
17 visible_in_first_person="true" />
18
19 <attachment_point
20 id="2"
21 group="2"
22 pie_slice="2"
23 name="Skull"
24 joint="mHead"
25 position="0 0 0.15"
26 rotation="0 0 90"
27 visible_in_first_person="false" />
28
29 <attachment_point
30 id="3"
31 group="3"
32 pie_slice="3"
33 name="Left Shoulder"
34 joint="mCollarLeft"
35 position="0 0 0.08"
36 rotation="0 0 0"
37 visible_in_first_person="true" />
38
39 <attachment_point
40 id="4"
41 group="1"
42 pie_slice="1"
43 name="Right Shoulder"
44 joint="mCollarRight"
45 position="0 0 0.08"
46 rotation="0 0 0"
47 visible_in_first_person="true"/>
48
49 <attachment_point
50 id="5"
51 group="4"
52 name="Left Hand"
53 joint="mWristLeft"
54 position="0 0.08 -0.02"
55 rotation="0 0 0"
56 visible_in_first_person="true"
57 max_attachment_offset="1.5" />
58
59 <attachment_point
60 id="6"
61 group="0"
62 name="Right Hand"
63 joint="mWristRight"
64 position="0 -0.08 -0.02"
65 rotation="0 0 0"
66 visible_in_first_person="true"
67 max_attachment_offset="1.5" />
68
69 <attachment_point
70 id="7"
71 group="5"
72 pie_slice="6"
73 name="Left Foot"
74 joint="mFootLeft"
75 position="0 0.0 0.0"
76 rotation="0 0 0"
77 visible_in_first_person="true"/>
78
79 <attachment_point
80 id="8"
81 group="7"
82 pie_slice="6"
83 name="Right Foot"
84 joint="mFootRight"
85 position="0 0.0 0.0"
86 rotation="0 0 0"
87 visible_in_first_person="true"/>
88
89 <attachment_point
90 id="9"
91 group="6"
92 pie_slice="7"
93 name="Spine"
94 joint="mChest"
95 position="-0.15 0 -0.1"
96 rotation="0 -90 90"
97 visible_in_first_person="true" />
98
99 <attachment_point
100 id="10"
101 group="6"
102 pie_slice="6"
103 name="Pelvis"
104 joint="mPelvis"
105 position="0 0 -0.15"
106 rotation="0 0 0"
107 visible_in_first_person="true" />
108
109 <attachment_point
110 id="11"
111 group="2"
112 pie_slice="6"
113 name="Mouth"
114 joint="mHead"
115 position="0.12 0 0.001"
116 rotation="0 0 0"
117 visible_in_first_person="false"/>
118
119 <attachment_point
120 id="12"
121 group="2"
122 pie_slice="7"
123 name="Chin"
124 joint="mHead"
125 position="0.12 0 -0.04"
126 rotation="0 0 0"
127 visible_in_first_person="false" />
128
129 <attachment_point
130 id="13"
131 group="2"
132 pie_slice="4"
133 name="Left Ear"
134 joint="mHead"
135 position="0.015 0.08 0.017"
136 rotation="0 0 0"
137 visible_in_first_person="false" />
138
139 <attachment_point
140 id="14"
141 group="2"
142 pie_slice="0"
143 name="Right Ear"
144 joint="mHead"
145 position="0.015 -0.08 0.017"
146 rotation="0 0 0"
147 visible_in_first_person="false" />
148
149 <attachment_point
150 id="15"
151 group="2"
152 pie_slice="3"
153 name="Left Eyeball"
154 joint="mEyeLeft"
155 position="0 0 0"
156 rotation="0 0 0"
157 visible_in_first_person="false"/>
158
159 <attachment_point
160 id="16"
161 group="2"
162 pie_slice="1"
163 name="Right Eyeball"
164 joint="mEyeRight"
165 position="0 0 0"
166 rotation="0 0 0"
167 visible_in_first_person="false" />
168
169 <attachment_point
170 id="17"
171 group="2"
172 pie_slice="5"
173 name="Nose"
174 joint="mHead"
175 position="0.1 0 0.05"
176 rotation="0 0 0"
177 visible_in_first_person="false"/>
178
179 <attachment_point
180 id="18"
181 group="1"
182 pie_slice="0"
183 name="R Upper Arm"
184 joint="mShoulderRight"
185 position="0.01 -0.13 0.01"
186 rotation="0 0 0"
187 visible_in_first_person="true" />
188
189 <attachment_point
190 id="19"
191 group="1"
192 pie_slice="7"
193 name="R Forearm"
194 joint="mElbowRight"
195 position="0 -0.12 0"
196 rotation="0 0 0"
197 visible_in_first_person="true"/>
198
199 <attachment_point
200 id="20"
201 group="3"
202 pie_slice="4"
203 name="L Upper Arm"
204 joint="mShoulderLeft"
205 position="0.01 0.15 -0.01"
206 rotation="0 0 0"
207 visible_in_first_person="true" />
208
209 <attachment_point
210 id="21"
211 group="3"
212 pie_slice="5"
213 name="L Forearm"
214 joint="mElbowLeft"
215 position="0 0.113 0"
216 rotation="0 0 0"
217 visible_in_first_person="true" />
218
219 <attachment_point
220 id="22"
221 group="7"
222 pie_slice="1"
223 name="Right Hip"
224 joint="mHipRight"
225 position="0 0 0"
226 rotation="0 0 0"
227 visible_in_first_person="true" />
228
229 <attachment_point
230 id="23"
231 group="7"
232 pie_slice="0"
233 name="R Upper Leg"
234 joint="mHipRight"
235 position="-0.017 0.041 -0.310"
236 rotation="0 0 0"
237 visible_in_first_person="true" />
238
239 <attachment_point
240 id="24"
241 group="7"
242 pie_slice="7"
243 name="R Lower Leg"
244 joint="mKneeRight"
245 position="-0.044 -0.007 -0.262"
246 rotation="0 0 0"
247 visible_in_first_person="true" />
248
249 <attachment_point
250 id="25"
251 group="5"
252 pie_slice="3"
253 name="Left Hip"
254 joint="mHipLeft"
255 position="0 0 0"
256 rotation="0 0 0"
257 visible_in_first_person="true" />
258
259 <attachment_point
260 id="26"
261 group="5"
262 pie_slice="4"
263 name="L Upper Leg"
264 joint="mHipLeft"
265 position="-0.019 -0.034 -0.310"
266 rotation="0 0 0"
267 visible_in_first_person="true"/>
268
269 <attachment_point
270 id="27"
271 group="5"
272 pie_slice="5"
273 name="L Lower Leg"
274 joint="mKneeLeft"
275 position="-0.044 -0.007 -0.261"
276 rotation="0 0 0"
277 visible_in_first_person="true" />
278
279 <attachment_point
280 id="28"
281 group="6"
282 pie_slice="5"
283 name="Stomach"
284 joint="mPelvis"
285 position="0.092 0.0 0.088"
286 rotation="0 0 0"
287 visible_in_first_person="true" />
288
289 <attachment_point
290 id="29"
291 group="6"
292 pie_slice="3"
293 name="Left Pec"
294 joint="mTorso"
295 position="0.104 0.082 0.247"
296 rotation="0 0 0"
297 visible_in_first_person="true" />
298
299 <attachment_point
300 id="30"
301 group="6"
302 pie_slice="1"
303 name="Right Pec"
304 joint="mTorso"
305 position="0.104 -0.082 0.247"
306 rotation="0 0 0"
307 visible_in_first_person="true" />
308
309 <attachment_point
310 id="31"
311 group="8"
312 name="Center 2"
313 joint="mScreen"
314 position="0 0 0"
315 rotation="0 0 0"
316 hud="true"
317 max_attachment_offset="2.0"
318 visible_in_first_person="true" />
319
320 <attachment_point
321 id="32"
322 group="8"
323 name="Top Right"
324 joint="mScreen"
325 position="0 -0.5 0.5"
326 rotation="0 0 0"
327 hud="true"
328 max_attachment_offset="2.0"
329 visible_in_first_person="true" />
330
331 <attachment_point
332 id="33"
333 group="8"
334 name="Top"
335 joint="mScreen"
336 position="0 0 0.5"
337 rotation="0 0 0"
338 hud="true"
339 max_attachment_offset="2.0"
340 visible_in_first_person="true" />
341
342 <attachment_point
343 id="34"
344 group="8"
345 name="Top Left"
346 joint="mScreen"
347 position="0 0.5 0.5"
348 rotation="0 0 0"
349 hud="true"
350 max_attachment_offset="2.0"
351 visible_in_first_person="true" />
352
353 <attachment_point
354 id="35"
355 group="8"
356 name="Center"
357 joint="mScreen"
358 position="0 0 0"
359 rotation="0 0 0"
360 hud="true"
361 max_attachment_offset="2.0"
362 visible_in_first_person="true" />
363
364 <attachment_point
365 id="36"
366 group="8"
367 name="Bottom Left"
368 joint="mScreen"
369 position="0 0.5 -0.5"
370 rotation="0 0 0"
371 hud="true"
372 max_attachment_offset="2.0"
373 visible_in_first_person="true" />
374
375 <attachment_point
376 id="37"
377 group="8"
378 name="Bottom"
379 joint="mScreen"
380 position="0 0 -0.5"
381 rotation="0 0 0"
382 hud="true"
383 max_attachment_offset="2.0"
384 visible_in_first_person="true" />
385
386 <attachment_point
387 id="38"
388 group="8"
389 name="Bottom Right"
390 joint="mScreen"
391 position="0 -0.5 -0.5"
392 rotation="0 0 0"
393 hud="true"
394 max_attachment_offset="2.0"
395 visible_in_first_person="true" />
396
397 <attachment_point
398 id="39"
399 group="6"
400 pie_slice="2"
401 name="Chest 2"
402 joint="mChest"
403 position="0.15 0 -0.1"
404 rotation="0 90 90"
405 visible_in_first_person="true" />
406
407 <attachment_point
408 id="40"
409 group="2"
410 pie_slice="2"
411 name="Skull 2"
412 joint="mHead"
413 position="0 0 0.15"
414 rotation="0 0 90"
415 visible_in_first_person="false" />
416
417 <attachment_point
418 id="41"
419 group="3"
420 pie_slice="3"
421 name="Left Shoulder 2"
422 joint="mCollarLeft"
423 position="0 0 0.08"
424 rotation="0 0 0"
425 visible_in_first_person="true" />
426
427 <attachment_point
428 id="42"
429 group="1"
430 pie_slice="1"
431 name="Right Shoulder 2"
432 joint="mCollarRight"
433 position="0 0 0.08"
434 rotation="0 0 0"
435 visible_in_first_person="true"/>
436
437 <attachment_point
438 id="43"
439 group="4"
440 name="Left Hand 2"
441 joint="mWristLeft"
442 position="0 0.08 -0.02"
443 rotation="0 0 0"
444 visible_in_first_person="true"
445 max_attachment_offset="1.5" />
446
447 <attachment_point
448 id="44"
449 group="0"
450 name="Right Hand 2"
451 joint="mWristRight"
452 position="0 -0.08 -0.02"
453 rotation="0 0 0"
454 visible_in_first_person="true"
455 max_attachment_offset="1.5" />
456
457 <attachment_point
458 id="45"
459 group="5"
460 pie_slice="6"
461 name="Left Foot 2"
462 joint="mFootLeft"
463 position="0 0.0 0.0"
464 rotation="0 0 0"
465 visible_in_first_person="true"/>
466
467 <attachment_point
468 id="46"
469 group="7"
470 pie_slice="6"
471 name="Right Foot 2"
472 joint="mFootRight"
473 position="0 0.0 0.0"
474 rotation="0 0 0"
475 visible_in_first_person="true"/>
476
477 <attachment_point
478 id="47"
479 group="6"
480 pie_slice="7"
481 name="Spine 2"
482 joint="mChest"
483 position="-0.15 0 -0.1"
484 rotation="0 -90 90"
485 visible_in_first_person="true" />
486
487 <attachment_point
488 id="48"
489 group="6"
490 pie_slice="6"
491 name="Pelvis 2"
492 joint="mPelvis"
493 position="0 0 -0.15"
494 rotation="0 0 0"
495 visible_in_first_person="true" />
496
497 <attachment_point
498 id="49"
499 group="2"
500 pie_slice="6"
501 name="Mouth 2"
502 joint="mHead"
503 position="0.12 0 0.001"
504 rotation="0 0 0"
505 visible_in_first_person="false"/>
506
507 <attachment_point
508 id="50"
509 group="2"
510 pie_slice="7"
511 name="Chin 2"
512 joint="mHead"
513 position="0.12 0 -0.04"
514 rotation="0 0 0"
515 visible_in_first_person="false" />
516
517 <attachment_point
518 id="51"
519 group="2"
520 pie_slice="4"
521 name="Left Ear 2"
522 joint="mHead"
523 position="0.015 0.08 0.017"
524 rotation="0 0 0"
525 visible_in_first_person="false" />
526
527 <attachment_point
528 id="52"
529 group="2"
530 pie_slice="0"
531 name="Right Ear 2"
532 joint="mHead"
533 position="0.015 -0.08 0.017"
534 rotation="0 0 0"
535 visible_in_first_person="false" />
536
537 <attachment_point
538 id="53"
539 group="2"
540 pie_slice="3"
541 name="Left Eyeball 2"
542 joint="mEyeLeft"
543 position="0 0 0"
544 rotation="0 0 0"
545 visible_in_first_person="false"/>
546
547 <attachment_point
548 id="54"
549 group="2"
550 pie_slice="1"
551 name="Right Eyeball 2"
552 joint="mEyeRight"
553 position="0 0 0"
554 rotation="0 0 0"
555 visible_in_first_person="false" />
556
557 <attachment_point
558 id="55"
559 group="2"
560 pie_slice="5"
561 name="Nose 2"
562 joint="mHead"
563 position="0.1 0 0.05"
564 rotation="0 0 0"
565 visible_in_first_person="false"/>
566
567 <attachment_point
568 id="56"
569 group="1"
570 pie_slice="0"
571 name="R Upper Arm 2"
572 joint="mShoulderRight"
573 position="0.01 -0.13 0.01"
574 rotation="0 0 0"
575 visible_in_first_person="true" />
576
577 <attachment_point
578 id="57"
579 group="1"
580 pie_slice="7"
581 name="R Forearm 2"
582 joint="mElbowRight"
583 position="0 -0.12 0"
584 rotation="0 0 0"
585 visible_in_first_person="true"/>
586
587 <attachment_point
588 id="58"
589 group="3"
590 pie_slice="4"
591 name="L Upper Arm 2"
592 joint="mShoulderLeft"
593 position="0.01 0.15 -0.01"
594 rotation="0 0 0"
595 visible_in_first_person="true" />
596
597 <attachment_point
598 id="59"
599 group="3"
600 pie_slice="5"
601 name="L Forearm 2"
602 joint="mElbowLeft"
603 position="0 0.113 0"
604 rotation="0 0 0"
605 visible_in_first_person="true" />
606
607 <attachment_point
608 id="60"
609 group="7"
610 pie_slice="1"
611 name="Right Hip 2"
612 joint="mHipRight"
613 position="0 0 0"
614 rotation="0 0 0"
615 visible_in_first_person="true" />
616
617 <attachment_point
618 id="61"
619 group="7"
620 pie_slice="0"
621 name="R Upper Leg 2"
622 joint="mHipRight"
623 position="-0.017 0.041 -0.310"
624 rotation="0 0 0"
625 visible_in_first_person="true" />
626
627 <attachment_point
628 id="62"
629 group="7"
630 pie_slice="7"
631 name="R Lower Leg 2"
632 joint="mKneeRight"
633 position="-0.044 -0.007 -0.262"
634 rotation="0 0 0"
635 visible_in_first_person="true" />
636
637 <attachment_point
638 id="63"
639 group="5"
640 pie_slice="3"
641 name="Left Hip 2"
642 joint="mHipLeft"
643 position="0 0 0"
644 rotation="0 0 0"
645 visible_in_first_person="true" />
646
647 <attachment_point
648 id="64"
649 group="5"
650 pie_slice="4"
651 name="L Upper Leg 2"
652 joint="mHipLeft"
653 position="-0.019 -0.034 -0.310"
654 rotation="0 0 0"
655 visible_in_first_person="true"/>
656
657 <attachment_point
658 id="65"
659 group="5"
660 pie_slice="5"
661 name="L Lower Leg 2"
662 joint="mKneeLeft"
663 position="-0.044 -0.007 -0.261"
664 rotation="0 0 0"
665 visible_in_first_person="true" />
666
667 <attachment_point
668 id="66"
669 group="6"
670 pie_slice="5"
671 name="Stomach 2"
672 joint="mPelvis"
673 position="0.092 0.0 0.088"
674 rotation="0 0 0"
675 visible_in_first_person="true" />
676
677 <attachment_point
678 id="67"
679 group="6"
680 pie_slice="3"
681 name="Left Pec 2"
682 joint="mTorso"
683 position="0.104 0.082 0.247"
684 rotation="0 0 0"
685 visible_in_first_person="true" />
686
687 <attachment_point
688 id="68"
689 group="6"
690 pie_slice="1"
691 name="Right Pec 2"
692 joint="mTorso"
693 position="0.104 -0.082 0.247"
694 rotation="0 0 0"
695 visible_in_first_person="true" />
696
697 <param
698 id="32"
699 group="1"
700 wearable="shape"
701 name="Male_Skeleton"
702 label_min="Female"
703 label_max="Male"
704 value_min="0"
705 value_max="1">
706 <param_skeleton>
707 <bone name="mNeck" scale="0 0 .2" />
708 <bone name="mCollarLeft" scale="0 .4 0" />
709 <bone name="mCollarRight" scale="0 .4 0" />
710 <bone name="mShoulderLeft" scale="0 .35 0" />
711 <bone name="mShoulderRight" scale="0 .35 0" />
712 <bone name="mElbowLeft" scale="0 .1 0" />
713 <bone name="mElbowRight" scale="0 .1 0" />
714 <bone name="mChest" scale=".05 .05 .05" />
715 <bone name="mTorso" scale="0 0 .05" />
716 <bone name="mPelvis" scale="0 0 0" />
717 <bone name="mHipLeft" scale=".05 .05 0" />
718 <bone name="mHipRight" scale=".05 .05 0" />
719 <bone name="mKneeLeft" scale=".05 .05 .1" />
720 <bone name="mKneeRight" scale=".05 .05 .1" />
721 </param_skeleton>
722 </param>
723
724 <param
725 id="33"
726 group="0"
727 name="Height"
728 label="Height"
729 wearable="shape"
730 edit_group="shape_body"
731 edit_group_order="1"
732 label_min="Short"
733 label_max="Tall"
734 show_simple="true"
735 value_min="-2.3"
736 value_max="2"
737 camera_distance="2.2">
738 <param_skeleton>
739 <bone name="mNeck" scale="0 0 .02" />
740 <bone name="mCollarLeft" scale="0 0 0" />
741 <bone name="mCollarRight" scale="0 0 0" />
742 <bone name="mShoulderLeft" scale="0 0.08 0" />
743 <bone name="mShoulderRight" scale="0 0.08 0" />
744 <bone name="mElbowLeft" scale="0 0.06 0" />
745 <bone name="mElbowRight" scale="0 0.06 0" />
746 <bone name="mChest" scale="0 0 0.05" />
747 <bone name="mTorso" scale="0 0 0.05" />
748 <bone name="mPelvis" scale="0 0 0" />
749 <bone name="mHipLeft" scale="0 0 0.1" />
750 <bone name="mHipRight" scale="0 0 0.1" />
751 <bone name="mKneeLeft" scale="0 0 0.1" />
752 <bone name="mKneeRight" scale="0 0 0.1" />
753 </param_skeleton>
754 </param>
755
756 <param
757 id="34"
758 group="0"
759 name="Thickness"
760 label="Body Thickness"
761 wearable="shape"
762 edit_group="shape_body"
763 edit_group_order="2"
764 label_min="Body Thin"
765 label_max="Body Thick"
766 show_simple="true"
767 value_min="-0.7"
768 value_max="1.5"
769 camera_distance="1.8">
770 <param_skeleton>
771 <bone name="mNeck" scale="0.1 0.1 0" />
772 <bone name="mCollarLeft" scale="0 0.2 0" />
773 <bone name="mCollarRight" scale="0 0.2 0" />
774 <bone name="mShoulderLeft" scale="0.1 0 0.1" />
775 <bone name="mShoulderRight" scale="0.1 0 0.1" />
776 <bone name="mElbowLeft" scale="0.1 0 0.1" />
777 <bone name="mElbowRight" scale="0.1 0 0.1" />
778 <bone name="mChest" scale="0.1 0.1 0" />
779 <bone name="mTorso" scale="0.1 0.1 0" />
780 <bone name="mPelvis" scale="0.1 0.1 0" />
781 <bone name="mHipLeft" scale="0.13 0.13 0" />
782 <bone name="mHipRight" scale="0.13 0.13 0" />
783 <bone name="mKneeLeft" scale="0.12 0.12 0" />
784 <bone name="mKneeRight" scale="0.12 0.12 0" />
785 </param_skeleton>
786 </param>
787
788 <param
789 id="36"
790 group="0"
791 name="Shoulders"
792 label="Shoulders"
793 wearable="shape"
794 edit_group="shape_torso"
795 edit_group_order="4"
796 label_min="Narrow"
797 label_max="Broad"
798 show_simple="true"
799 value_min="-1.8"
800 value_max="1.4"
801 value_default="-0.5"
802 camera_elevation=".1"
803 camera_distance="1.2"
804 camera_angle="0">
805 <param_skeleton>
806 <bone name="mNeck" scale="0.01 0.03 0" />
807 <bone name="mCollarLeft" scale="0 0 0" offset="0 .02 0" />
808 <bone name="mCollarRight" scale="0 0 0" offset="0 -.02 0" />
809 <bone name="mChest" scale="0.02 0.08 0" />
810 </param_skeleton>
811 </param>
812
813 <param
814 id="37"
815 group="0"
816 name="Hip Width"
817 label="Hip Width"
818 wearable="shape"
819 edit_group="shape_legs"
820 edit_group_order="3"
821 label_min="Narrow"
822 label_max="Wide"
823 show_simple="true"
824 value_min="-3.2"
825 value_max="2.8"
826 camera_distance="1.8">
827 <param_skeleton>
828 <bone name="mPelvis" scale="0 0.1 0" />
829 <bone name="mHipLeft" scale="0 0 0" offset="0 .004 0" />
830 <bone name="mHipRight" scale="0 0 0" offset="0 -.004 0" />
831 </param_skeleton>
832 </param>
833
834 <param
835 id="842"
836 group="0"
837 name="Hip Length"
838 wearable="shape"
839 edit_group="shape_legs"
840 edit_group_order="3.2"
841 label_min="Short hips"
842 label_max="Long Hips"
843 value_min="-1"
844 value_max="1"
845 camera_distance="1.8">
846 <param_skeleton>
847 <bone name="mPelvis" scale="0 0 0.3" />
848 </param_skeleton>
849 </param>
850
851 <param
852 id="38"
853 group="0"
854 name="Torso Length"
855 wearable="shape"
856 edit_group="shape_torso"
857 edit_group_order="11"
858 label_min="Short Torso"
859 label_max="Long Torso"
860 value_min="-1"
861 value_max="1"
862 camera_distance="1.8">
863 <param_skeleton>
864 <bone name="mTorso" scale="0 0 .3" />
865 <bone name="mPelvis" scale="0 0 .1" />
866 <bone name="mHipLeft" scale="0 0 -.1" />
867 <bone name="mHipRight" scale="0 0 -.1" />
868 <bone name="mKneeRight" scale="0 0 -.05" />
869 <bone name="mKneeLeft" scale="0 0 -.05" />
870 </param_skeleton>
871 </param>
872
873 <param
874 id="195"
875 group="1"
876 name="EyeBone_Spread"
877 wearable="shape"
878 edit_group="shape_eyes"
879 label_min="Eyes Together"
880 label_max="Eyes Spread"
881 value_min="-1"
882 value_max="1">
883 <param_skeleton>
884 <bone name="mEyeLeft" scale="0 0 0" offset="0 .009 0" />
885 <bone name="mEyeRight" scale="0 0 0" offset="0 -.009 0" />
886 </param_skeleton>
887 </param>
888
889 <param
890 id="661"
891 group="1"
892 name="EyeBone_Head_Shear"
893 wearable="shape"
894 edit_group="shape_eyes"
895 label_min="Eyes Shear Left Up"
896 label_max="Eyes Shear Right Up"
897 value_min="-2"
898 value_max="2">
899 <param_skeleton>
900 <bone name="mEyeLeft" scale="0 0 0" offset="0 0 .004" />
901 <bone name="mEyeRight" scale="0 0 0" offset="0 0 -.004" />
902 </param_skeleton>
903 </param>
904
905 <param
906 id="772"
907 group="1"
908 name="EyeBone_Head_Elongate"
909 wearable="shape"
910 edit_group="shape_eyes"
911 label_min="Eyes Short Head"
912 label_max="Eyes Long Head"
913 value_min="-1"
914 value_max="1">
915 <param_skeleton>
916 <bone name="mEyeLeft" scale="0 0 0" offset=".016 0 0" />
917 <bone name="mEyeRight" scale="0 0 0" offset=".016 0 0" />
918 </param_skeleton>
919 </param>
920
921 <param
922 id="768"
923 group="1"
924 name="EyeBone_Bug"
925 wearable="shape"
926 edit_group="shape_eyes"
927 label_min="Eyes Sunken"
928 label_max="Eyes Bugged"
929 value_min="-2"
930 value_max="2">
931 <param_skeleton>
932 <bone name="mEyeLeft" scale="0 0 0" offset=".005 0 0" />
933 <bone name="mEyeRight" scale="0 0 0" offset=".005 0 0" />
934 </param_skeleton>
935 </param>
936
937 <param
938 id="655"
939 group="1"
940 name="Head Size"
941 label="Head Size"
942 wearable="shape"
943 edit_group="shape_head"
944 label_min="Small Head"
945 label_max="Big Head"
946 show_simple="true"
947 value_min="-.25"
948 value_max=".10">
949 <param_skeleton>
950 <bone name="mSkull" scale="1 1 1" offset="0 0 0.1" />
951 <bone name="mHead" scale="1 1 1" offset="0 0 0" />
952 <bone name="mEyeLeft" scale="1 1 1" offset="0 0 0" />
953 <bone name="mEyeRight" scale="1 1 1" offset="0 0 0" />
954 </param_skeleton>
955 </param>
956
957 <param
958 id="197"
959 group="1"
960 wearable="shoes"
961 name="Shoe_Heels"
962 edit_group="shoes"
963 label_min="No Heels"
964 label_max="High Heels"
965 value_min="0"
966 value_max="1">
967 <param_skeleton>
968 <bone name="mFootRight" scale="0 0 0" offset="0 0 -.08" />
969 <bone name="mFootLeft" scale="0 0 0" offset="0 0 -.08" />
970 </param_skeleton>
971 </param>
972
973 <param
974 id="502"
975 group="1"
976 wearable="shoes"
977 name="Shoe_Platform"
978 edit_group="shoes"
979 label_min="No Heels"
980 label_max="High Heels"
981 value_min="0"
982 value_max="1">
983 <param_skeleton>
984 <bone name="mFootRight" scale="0 0 0" offset="0 0 -.07" />
985 <bone name="mFootLeft" scale="0 0 0" offset="0 0 -.07" />
986 </param_skeleton>
987 </param>
988
989 <param
990 id="675"
991 group="0"
992 name="Hand Size"
993 wearable="shape"
994 edit_group="shape_torso"
995 edit_group_order="10"
996 label_min="Small Hands"
997 label_max="Large Hands"
998 value_min="-.3"
999 value_max=".3"
1000 camera_elevation=".1"
1001 camera_distance="1.4"
1002 camera_angle="0">
1003 <param_skeleton>
1004 <bone name="mWristRight" scale="1 1 1" offset="0 0 0" />
1005 <bone name="mWristLeft" scale="1 1 1" offset="0 0 0" />
1006 </param_skeleton>
1007 </param>
1008
1009 <param
1010 id="683"
1011 group="0"
1012 name="Neck Thickness"
1013 wearable="shape"
1014 edit_group="shape_torso"
1015 edit_group_order="2"
1016 label_min="Skinny Neck"
1017 label_max="Thick Neck"
1018 value_min="-.4"
1019 value_max=".2"
1020 value_default="-.15"
1021 camera_elevation=".3"
1022 camera_distance=".8"
1023 camera_angle="15">
1024 <param_skeleton>
1025 <bone name="mNeck" scale="1 1 0" offset="0 0 0" />
1026 </param_skeleton>
1027 </param>
1028
1029 <param
1030 id="689"
1031 group="1"
1032 wearable="shape"
1033 name="EyeBone_Big_Eyes"
1034 edit_group="shape_eyes"
1035 label_min="Eyes Back"
1036 label_max="Eyes Forward"
1037 value_min="-1"
1038 value_max="1">
1039 <param_skeleton>
1040 <bone name="mEyeLeft" scale="0 0 0" offset="-.005 0 0" />
1041 <bone name="mEyeRight" scale="0 0 0" offset="-.005 0 0" />
1042 </param_skeleton>
1043 </param>
1044
1045 <param
1046 id="692"
1047 group="0"
1048 name="Leg Length"
1049 wearable="shape"
1050 edit_group="shape_legs"
1051 edit_group_order="2"
1052 label_min="Short Legs"
1053 label_max="Long Legs"
1054 value_min="-1"
1055 value_max="1"
1056 camera_distance="2.5">
1057 <param_skeleton>
1058 <bone name="mHipLeft" scale="0 0 .2" />
1059 <bone name="mHipRight" scale="0 0 .2" />
1060 <bone name="mKneeRight" scale="0 0 .2" />
1061 <bone name="mKneeLeft" scale="0 0 .2" />
1062 </param_skeleton>
1063 </param>
1064
1065 <param
1066 id="693"
1067 group="0"
1068 name="Arm Length"
1069 wearable="shape"
1070 edit_group="shape_torso"
1071 edit_group_order="9"
1072 label_min="Short Arms"
1073 label_max="Long arms"
1074 value_min="-1"
1075 value_max="1"
1076 value_default=".6"
1077 camera_distance="1.5">
1078 <param_skeleton>
1079 <bone name="mShoulderLeft" scale="0 .2 0" />
1080 <bone name="mShoulderRight" scale="0 .2 0" />
1081 <bone name="mElbowRight" scale="0 .3 0" />
1082 <bone name="mElbowLeft" scale="0 .3 0" />
1083 </param_skeleton>
1084 </param>
1085
1086 <param
1087 id="756"
1088 group="0"
1089 name="Neck Length"
1090 wearable="shape"
1091 edit_group="shape_torso"
1092 edit_group_order="3"
1093 label_min="Short Neck"
1094 label_max="Long Neck"
1095 value_min="-1"
1096 value_max="1"
1097 value_default="0"
1098 camera_elevation=".3"
1099 camera_distance=".8"
1100 camera_angle="15">
1101 <param_skeleton>
1102 <bone name="mNeck" scale="0 0 .5" />
1103 </param_skeleton>
1104 </param>
1105 </skeleton>
1106
1107 <mesh
1108 type="hairMesh"
1109 lod="0"
1110 file_name="avatar_hair.llm"
1111 min_pixel_width="320">
1112<!-- begin morph targets -->
1113 <param
1114 id="180"
1115 group="1"
1116 name="Hair_Volume"
1117 label="Hair Volume"
1118 show_simple="true"
1119 wearable="hair"
1120 clothing_morph="true"
1121 edit_group="hair_style"
1122 label_min="Less"
1123 label_max="More"
1124 value_min="0"
1125 value_max="1.3"
1126 camera_elevation=".1"
1127 camera_distance=".5"
1128 camera_angle="20">
1129 <param_morph />
1130 </param>
1131
1132 <param
1133 id="761"
1134 group="1"
1135 name="Hair_Volume_Small"
1136 label="Hair Volume"
1137 show_simple="true"
1138 wearable="hair"
1139 edit_group="hair_style"
1140 label_min="Less"
1141 label_max="More"
1142 value_min="0"
1143 value_max="1.3"
1144 camera_elevation=".1"
1145 camera_distance=".5"
1146 camera_angle="20">
1147 <param_morph />
1148 </param>
1149
1150 <param
1151 id="181"
1152 group="0"
1153 name="Hair_Big_Front"
1154 label="Big Hair Front"
1155 wearable="hair"
1156 edit_group="hair_style"
1157 edit_group_order="5"
1158 label_min="Less"
1159 label_max="More"
1160 value_min="-1"
1161 value_max="1"
1162 value_default="0.14"
1163 camera_elevation=".1"
1164 camera_distance=".5"
1165 camera_angle="90">
1166 <param_morph />
1167 </param>
1168
1169 <param
1170 id="182"
1171 group="0"
1172 name="Hair_Big_Top"
1173 label="Big Hair Top"
1174 wearable="hair"
1175 edit_group="hair_style"
1176 edit_group_order="6"
1177 label_min="Less"
1178 label_max="More"
1179 value_min="-1"
1180 value_max="1"
1181 value_default=".7"
1182 camera_elevation=".1"
1183 camera_distance=".5"
1184 camera_angle="90">
1185 <param_morph />
1186 </param>
1187
1188 <param
1189 id="183"
1190 group="0"
1191 name="Hair_Big_Back"
1192 clothing_morph="true"
1193 label="Big Hair Back"
1194 wearable="hair"
1195 edit_group="hair_style"
1196 edit_group_order="7"
1197 label_min="Less"
1198 label_max="More"
1199 value_min="-1"
1200 value_max="1"
1201 value_default="0.05"
1202 camera_elevation=".1"
1203 camera_distance=".7"
1204 camera_angle="90">
1205 <param_morph />
1206 </param>
1207
1208 <param
1209 id="184"
1210 group="0"
1211 name="Hair_Spiked"
1212 label="Spiked Hair"
1213 show_simple="true"
1214 wearable="hair"
1215 clothing_morph="true"
1216 edit_group="hair_style"
1217 edit_group_order="15"
1218 label_min="No Spikes"
1219 label_max="Big Spikes"
1220 value_min="0"
1221 value_max="1"
1222 camera_elevation=".1"
1223 camera_distance=".5"
1224 camera_angle="20">
1225 <param_morph />
1226 </param>
1227
1228 <param
1229 id="140"
1230 group="0"
1231 name="Hair_Part_Middle"
1232 label="Middle Part"
1233 wearable="hair"
1234 edit_group="hair_style"
1235 edit_group_order="17"
1236 label_min="No Part"
1237 label_max="Part"
1238 value_min="0"
1239 value_max="2"
1240 camera_elevation=".1"
1241 camera_distance=".5"
1242 camera_angle="0">
1243 <param_morph />
1244 </param>
1245
1246 <param
1247 id="141"
1248 group="0"
1249 name="Hair_Part_Right"
1250 label="Right Part"
1251 wearable="hair"
1252 edit_group="hair_style"
1253 edit_group_order="18"
1254 label_min="No Part"
1255 label_max="Part"
1256 value_min="0"
1257 value_max="2"
1258 camera_elevation=".1"
1259 camera_distance=".5"
1260 camera_angle="0">
1261 <param_morph />
1262 </param>
1263
1264 <param
1265 id="142"
1266 group="0"
1267 name="Hair_Part_Left"
1268 label="Left Part"
1269 wearable="hair"
1270 edit_group="hair_style"
1271 edit_group_order="19"
1272 label_min="No Part"
1273 label_max="Part"
1274 value_min="0"
1275 value_max="2"
1276 camera_elevation=".1"
1277 camera_distance=".5"
1278 camera_angle="0">
1279 <param_morph />
1280 </param>
1281
1282 <param
1283 id="143"
1284 group="0"
1285 name="Hair_Sides_Full"
1286 label="Full Hair Sides"
1287 show_simple="true"
1288 wearable="hair"
1289 edit_group="hair_style"
1290 edit_group_order="11"
1291 label_min="Mowhawk"
1292 label_max="Full Sides"
1293 value_min="-4"
1294 value_max="1.5"
1295 value_default="0.125"
1296 camera_elevation=".1"
1297 camera_distance=".5"
1298 camera_angle="20">
1299 <param_morph />
1300 </param>
1301
1302 <param
1303 id="144"
1304 group="1"
1305 name="Bangs_Front_Up"
1306 label="Front Bangs Up"
1307 wearable="hair"
1308 edit_group="hair_style"
1309 label_min="Bangs"
1310 label_max="Bangs Up"
1311 value_min="0"
1312 value_max="1"
1313 camera_elevation=".1"
1314 camera_distance=".5"
1315 camera_angle="20">
1316 <param_morph />
1317 </param>
1318
1319 <param
1320 id="145"
1321 group="1"
1322 clothing_morph="true"
1323 name="Bangs_Front_Down"
1324 label="Front Bangs Down"
1325 wearable="hair"
1326 edit_group="hair_style"
1327 label_min="Bangs"
1328 label_max="Bangs Down"
1329 value_min="0"
1330 value_max="5"
1331 camera_elevation=".1"
1332 camera_distance=".5"
1333 camera_angle="20">
1334 <param_morph />
1335 </param>
1336
1337 <param
1338 id="146"
1339 group="1"
1340 name="Bangs_Sides_Up"
1341 label="Side Bangs Up"
1342 wearable="hair"
1343 edit_group="hair_style"
1344 label_min="Side Bangs"
1345 label_max="Side Bangs Up"
1346 value_min="0"
1347 value_max="1"
1348 camera_elevation=".1"
1349 camera_distance=".5"
1350 camera_angle="20">
1351 <param_morph />
1352 </param>
1353
1354 <param
1355 id="147"
1356 group="1"
1357 clothing_morph="true"
1358 name="Bangs_Sides_Down"
1359 label="Side Bangs Down"
1360 wearable="hair"
1361 edit_group="hair_style"
1362 label_min="Side Bangs"
1363 label_max="Side Bangs Down"
1364 value_min="0"
1365 value_max="2"
1366 camera_elevation=".1"
1367 camera_distance=".5"
1368 camera_angle="20">
1369 <param_morph />
1370 </param>
1371
1372 <param
1373 id="148"
1374 group="1"
1375 name="Bangs_Back_Up"
1376 label="Back Bangs Up"
1377 wearable="hair"
1378 edit_group="hair_style"
1379 label_min="Back Bangs"
1380 label_max="Back Bangs Up"
1381 value_min="0"
1382 value_max="1"
1383 camera_elevation=".1"
1384 camera_distance=".5"
1385 camera_angle="150">
1386 <param_morph />
1387 </param>
1388
1389 <param
1390 id="149"
1391 group="1"
1392 name="Bangs_Back_Down"
1393 label="Back Bangs Down"
1394 clothing_morph="true"
1395 wearable="hair"
1396 edit_group="hair_style"
1397 label_min="Back Bangs"
1398 label_max="Back Bangs Down"
1399 value_min="0"
1400 value_max="2"
1401 camera_elevation=".1"
1402 camera_distance=".5"
1403 camera_angle="150">
1404 <param_morph />
1405 </param>
1406
1407 <param
1408 id="171"
1409 group="1"
1410 name="Hair_Front_Down"
1411 label="Front Hair Down"
1412 wearable="hair"
1413 edit_group="hair_style"
1414 label_min="Front Hair"
1415 label_max="Front Hair Down"
1416 value_min="0"
1417 value_max="1"
1418 camera_elevation=".1"
1419 camera_distance=".5"
1420 camera_angle="20">
1421 <param_morph />
1422 </param>
1423
1424 <param
1425 id="172"
1426 group="1"
1427 name="Hair_Front_Up"
1428 label="Front Hair Up"
1429 wearable="hair"
1430 edit_group="hair_style"
1431 label_min="Front Hair"
1432 label_max="Front Hair Up"
1433 value_min="0"
1434 value_max="1"
1435 camera_elevation=".1"
1436 camera_distance=".5"
1437 camera_angle="20">
1438 <param_morph />
1439 </param>
1440
1441 <param
1442 id="173"
1443 group="1"
1444 name="Hair_Sides_Down"
1445 label="Sides Hair Down"
1446 wearable="hair"
1447 edit_group="hair_style"
1448 label_min="Sides Hair"
1449 label_max="Sides Hair Down"
1450 value_min="0"
1451 value_max="1"
1452 camera_elevation=".1"
1453 camera_distance=".5"
1454 camera_angle="20">
1455 <param_morph />
1456 </param>
1457
1458 <param
1459 id="174"
1460 group="1"
1461 name="Hair_Sides_Up"
1462 label="Sides Hair Up"
1463 wearable="hair"
1464 edit_group="hair_style"
1465 label_min="Sides Hair"
1466 label_max="Sides Hair Up"
1467 value_min="0"
1468 value_max="1"
1469 camera_elevation=".1"
1470 camera_distance=".5"
1471 camera_angle="20">
1472 <param_morph />
1473 </param>
1474
1475 <param
1476 id="175"
1477 group="1"
1478 name="Hair_Back_Down"
1479 label="Back Hair Down"
1480 clothing_morph="true"
1481 wearable="hair"
1482 edit_group="hair_style"
1483 label_min="Back Hair"
1484 label_max="Back Hair Down"
1485 value_min="0"
1486 value_max="3"
1487 camera_elevation=".1"
1488 camera_distance=".5"
1489 camera_angle="150">
1490 <param_morph />
1491 </param>
1492
1493 <param
1494 id="176"
1495 group="1"
1496 name="Hair_Back_Up"
1497 label="Back Hair Up"
1498 wearable="hair"
1499 edit_group="hair_style"
1500 label_min="Back Hair"
1501 label_max="Back Hair Up"
1502 value_min="0"
1503 value_max="1"
1504 camera_elevation=".1"
1505 camera_distance=".5"
1506 camera_angle="150">
1507 <param_morph />
1508 </param>
1509
1510 <param
1511 id="177"
1512 group="0"
1513 name="Hair_Rumpled"
1514 label="Rumpled Hair"
1515 show_simple="true"
1516 wearable="hair"
1517 clothing_morph="true"
1518 edit_group="hair_style"
1519 edit_group_order="14.5"
1520 label_min="Smooth Hair"
1521 label_max="Rumpled Hair"
1522 value_min="0"
1523 value_max="1"
1524 camera_elevation=".1"
1525 camera_distance=".5"
1526 camera_angle="20">
1527 <param_morph />
1528 </param>
1529
1530 <param
1531 id="178"
1532 group="1"
1533 name="Hair_Swept_Back"
1534 label="Swept Back Hair"
1535 wearable="hair"
1536 edit_group="hair_style"
1537 label_min="NotHair"
1538 label_max="Swept Back"
1539 value_min="0"
1540 value_max="1"
1541 camera_elevation=".1"
1542 camera_distance=".5"
1543 camera_angle="90">
1544 <param_morph />
1545 </param>
1546
1547 <param
1548 id="179"
1549 group="1"
1550 name="Hair_Swept_Forward"
1551 label="Swept Forward Hair"
1552 wearable="hair"
1553 edit_group="hair_style"
1554 label_min="Hair"
1555 label_max="Swept Forward"
1556 value_min="0"
1557 value_max="1"
1558 camera_elevation=".1"
1559 camera_distance=".5"
1560 camera_angle="90">
1561 <param_morph />
1562 </param>
1563
1564 <param
1565 id="190"
1566 group="1"
1567 name="Hair_Tilt_Right"
1568 label="Hair Tilted Right"
1569 wearable="hair"
1570 edit_group="hair_style"
1571 label_min="Hair"
1572 label_max="Tilt Right"
1573 value_min="0"
1574 value_max="1"
1575 camera_elevation=".1"
1576 camera_distance=".5"
1577 camera_angle="0">
1578 <param_morph />
1579 </param>
1580
1581 <param
1582 id="191"
1583 group="1"
1584 name="Hair_Tilt_Left"
1585 label="Hair Tilted Left"
1586 wearable="hair"
1587 edit_group="hair_style"
1588 label_min="Hair"
1589 label_max="Tilt Left"
1590 value_min="0"
1591 value_max="1"
1592 camera_elevation=".1"
1593 camera_distance=".5"
1594 camera_angle="0">
1595 <param_morph />
1596 </param>
1597
1598 <param
1599 id="192"
1600 group="0"
1601 name="Bangs_Part_Middle"
1602 label="Part Bangs"
1603 wearable="hair"
1604 edit_group="hair_style"
1605 edit_group_order="20"
1606 label_min="No Part"
1607 label_max="Part Bangs"
1608 value_min="0"
1609 value_max="1"
1610 camera_elevation=".1"
1611 camera_distance=".5"
1612 camera_angle="0">
1613 <param_morph />
1614 </param>
1615
1616 <param
1617 id="640"
1618 group="1"
1619 name="Hair_Egg_Head"
1620 wearable="hair"
1621 edit_group="hair_style"
1622 value_min="-1.3"
1623 value_max="1">
1624 <param_morph />
1625 </param>
1626
1627 <param
1628 id="641"
1629 group="1"
1630 name="Hair_Squash_Stretch_Head"
1631 wearable="hair"
1632 edit_group="hair_style"
1633 value_min="-.5"
1634 value_max="1">
1635 <param_morph />
1636 </param>
1637
1638 <param
1639 id="642"
1640 group="1"
1641 name="Hair_Square_Head"
1642 wearable="hair"
1643 edit_group="hair_style"
1644 value_min="0"
1645 value_max="1">
1646 <param_morph />
1647 </param>
1648
1649 <param
1650 id="643"
1651 group="1"
1652 name="Hair_Round_Head"
1653 wearable="hair"
1654 edit_group="hair_style"
1655 value_min="0"
1656 value_max="1">
1657 <param_morph />
1658 </param>
1659
1660 <param
1661 id="644"
1662 group="1"
1663 name="Hair_Forehead_Round"
1664 wearable="hair"
1665 edit_group="hair_style"
1666 value_min="0"
1667 value_max="1">
1668 <param_morph />
1669 </param>
1670
1671 <param
1672 id="645"
1673 group="1"
1674 name="Hair_Forehead_Slant"
1675 wearable="hair"
1676 edit_group="hair_style"
1677 value_min="0"
1678 value_max="1">
1679 <param_morph />
1680 </param>
1681
1682 <param
1683 id="774"
1684 group="1"
1685 name="Shear_Head_Hair"
1686 wearable="hair"
1687 edit_group="hair_style"
1688 value_min="-2"
1689 value_max="2">
1690 <param_morph />
1691 </param>
1692
1693 <param
1694 id="771"
1695 group="1"
1696 name="Elongate_Head_Hair"
1697 wearable="hair"
1698 edit_group="hair_style"
1699 value_min="-1"
1700 value_max="1">
1701 <param_morph />
1702 </param>
1703
1704 <param
1705 id="674"
1706 group="0"
1707 name="Hair_Shear_Back"
1708 wearable="hair"
1709 edit_group="hair_style"
1710 edit_group_order="12"
1711 label="Shear Back"
1712 label_min="Full Back"
1713 label_max="Sheared Back"
1714 value_min="-1"
1715 value_max="2"
1716 value_default="-0.3"
1717 camera_elevation=".1"
1718 camera_distance=".5"
1719 camera_angle="100">
1720 <param_morph />
1721 </param>
1722
1723 <param
1724 id="762"
1725 group="0"
1726 name="Hair_Shear_Front"
1727 wearable="hair"
1728 edit_group="hair_style"
1729 edit_group_order="11.8"
1730 label="Shear Front"
1731 show_simple="true"
1732 label_min="Full Front"
1733 label_max="Sheared Front"
1734 value_min="0"
1735 value_max="3"
1736 camera_elevation=".1"
1737 camera_distance=".5"
1738 camera_angle="30">
1739 <param_morph />
1740 </param>
1741
1742 <param
1743 id="754"
1744 group="0"
1745 name="Hair_Taper_Back"
1746 wearable="hair"
1747 edit_group="hair_style"
1748 edit_group_order="14"
1749 label="Taper Back"
1750 label_min="Wide Back"
1751 label_max="Narrow Back"
1752 value_min="-1"
1753 value_max="2"
1754 value_default="0"
1755 camera_elevation=".1"
1756 camera_distance=".5"
1757 camera_angle="160">
1758 <param_morph />
1759 </param>
1760
1761 <param
1762 id="755"
1763 group="0"
1764 name="Hair_Taper_Front"
1765 wearable="hair"
1766 edit_group="hair_style"
1767 edit_group_order="13"
1768 label="Taper Front"
1769 label_min="Wide Front"
1770 label_max="Narrow Front"
1771 value_min="-1.5"
1772 value_max="1.5"
1773 value_default="0.05"
1774 camera_elevation=".1"
1775 camera_distance=".5"
1776 camera_angle="20">
1777 <param_morph />
1778 </param>
1779
1780 <param
1781 id="782"
1782 group="1"
1783 clothing_morph="true"
1784 name="Hair_Pigtails_Short"
1785 wearable="hair"
1786 edit_group="hair_style"
1787 value_min="0"
1788 value_max="1">
1789 <param_morph />
1790 </param>
1791
1792 <param
1793 id="783"
1794 group="1"
1795 clothing_morph="true"
1796 name="Hair_Pigtails_Med"
1797 wearable="hair"
1798 edit_group="hair_style"
1799 value_min="0"
1800 value_max="1">
1801 <param_morph />
1802 </param>
1803
1804 <param
1805 id="790"
1806 group="1"
1807 clothing_morph="true"
1808 name="Hair_Pigtails_Medlong"
1809 wearable="hair"
1810 edit_group="hair_style"
1811 value_min="0"
1812 value_max="1">
1813 <param_morph />
1814 </param>
1815
1816 <param
1817 id="784"
1818 group="1"
1819 clothing_morph="true"
1820 name="Hair_Pigtails_Long"
1821 wearable="hair"
1822 edit_group="hair_style"
1823 value_min="0"
1824 value_max="1">
1825 <param_morph />
1826 </param>
1827
1828 <param
1829 id="786"
1830 group="1"
1831 name="Hair_Ponytail_Short"
1832 wearable="hair"
1833 edit_group="hair_style"
1834 value_min="0"
1835 value_max="1">
1836 <param_morph />
1837 </param>
1838
1839 <param
1840 id="787"
1841 group="1"
1842 name="Hair_Ponytail_Med"
1843 wearable="hair"
1844 edit_group="hair_style"
1845 value_min="0"
1846 value_max="1">
1847 <param_morph />
1848 </param>
1849
1850 <param
1851 id="788"
1852 group="1"
1853 name="Hair_Ponytail_Long"
1854 clothing_morph="true"
1855 wearable="hair"
1856 edit_group="hair_style"
1857 value_min="0"
1858 value_max="1">
1859 <param_morph />
1860 </param>
1861
1862<!-- #end morph targets -->
1863 </mesh>
1864
1865 <mesh
1866 type="hairMesh"
1867 lod="1"
1868 file_name="avatar_hair_1.llm"
1869 min_pixel_width="160"
1870 reference="avatar_hair.llm">
1871 </mesh>
1872
1873 <mesh
1874 type="hairMesh"
1875 lod="2"
1876 file_name="avatar_hair_2.llm"
1877 min_pixel_width="80"
1878 reference="avatar_hair.llm">
1879 </mesh>
1880
1881 <mesh
1882 type="hairMesh"
1883 lod="3"
1884 file_name="avatar_hair_3.llm"
1885 min_pixel_width="40"
1886 reference="avatar_hair.llm">
1887 </mesh>
1888
1889 <mesh
1890 type="hairMesh"
1891 lod="4"
1892 file_name="avatar_hair_4.llm"
1893 min_pixel_width="20"
1894 reference="avatar_hair.llm">
1895 </mesh>
1896
1897 <mesh
1898 type="hairMesh"
1899 lod="5"
1900 file_name="avatar_hair_5.llm"
1901 min_pixel_width="0"
1902 reference="avatar_hair.llm">
1903 </mesh>
1904
1905 <mesh
1906 type="headMesh"
1907 lod="0"
1908 file_name="avatar_head.llm"
1909 min_pixel_width="320">
1910<!--
1911 begin morph targets
1912 #############
1913 tweakable morphs
1914 #############
1915 -->
1916 <param
1917 id="1"
1918 group="0"
1919 name="Big_Brow"
1920 label="Brow Size"
1921 wearable="shape"
1922 edit_group="shape_head"
1923 edit_group_order="7"
1924 label_min="Small"
1925 label_max="Large"
1926 value_min="-.3"
1927 value_max="2"
1928 camera_elevation=".1"
1929 camera_distance=".4"
1930 camera_angle="45">
1931 <param_morph />
1932 </param>
1933
1934 <param
1935 id="2"
1936 group="0"
1937 name="Nose_Big_Out"
1938 label="Nose Size"
1939 wearable="shape"
1940 edit_group="shape_nose"
1941 edit_group_order="1"
1942 label_min="Small"
1943 label_max="Large"
1944 show_simple="true"
1945 value_min="-0.8"
1946 value_max="2.5"
1947 camera_elevation=".1"
1948 camera_distance=".35"
1949 camera_angle="50">
1950 <param_morph />
1951 </param>
1952
1953 <param
1954 id="4"
1955 group="0"
1956 name="Broad_Nostrils"
1957 label="Nostril Width"
1958 wearable="shape"
1959 edit_group="shape_nose"
1960 edit_group_order="3"
1961 label_min="Narrow"
1962 label_max="Broad"
1963 value_min="-.5"
1964 value_max="1"
1965 camera_elevation=".1"
1966 camera_distance=".3"
1967 camera_angle="-20">
1968 <param_morph />
1969 </param>
1970
1971 <param
1972 id="759"
1973 group="0"
1974 name="Low_Septum_Nose"
1975 label="Nostril Division"
1976 wearable="shape"
1977 edit_group="shape_nose"
1978 edit_group_order="3.5"
1979 label_min="High"
1980 label_max="Low"
1981 value_min="-1"
1982 value_max="1.5"
1983 value_default="0.5"
1984 camera_elevation=".1"
1985 camera_distance=".3"
1986 camera_angle="-20">
1987 <param_morph />
1988 </param>
1989
1990 <param
1991 id="517"
1992 group="0"
1993 name="Wide_Nose"
1994 label="Nose Width"
1995 wearable="shape"
1996 edit_group="shape_nose"
1997 edit_group_order="2"
1998 label_min="Narrow"
1999 label_max="Wide"
2000 show_simple="true"
2001 value_min="-.5"
2002 value_max="1"
2003 camera_elevation=".1"
2004 camera_distance=".3"
2005 camera_angle="-20">
2006 <param_morph />
2007 </param>
2008
2009 <param
2010 id="5"
2011 group="0"
2012 name="Cleft_Chin"
2013 label="Chin Cleft"
2014 wearable="shape"
2015 edit_group="shape_chin"
2016 edit_group_order="6"
2017 label_min="Round"
2018 label_max="Cleft"
2019 value_min="-.1"
2020 value_max="1"
2021 camera_elevation="0"
2022 camera_distance=".28"
2023 camera_angle="-20">
2024 <param_morph />
2025 </param>
2026
2027 <param
2028 id="6"
2029 group="0"
2030 name="Bulbous_Nose_Tip"
2031 label="Nose Tip Shape"
2032 wearable="shape"
2033 edit_group="shape_nose"
2034 edit_group_order="8"
2035 label_min="Pointy"
2036 label_max="Bulbous"
2037 value_min="-.3"
2038 value_max="1"
2039 camera_elevation=".1"
2040 camera_distance=".35"
2041 camera_angle="15">
2042 <param_morph />
2043 </param>
2044
2045 <param
2046 id="7"
2047 group="0"
2048 name="Weak_Chin"
2049 label="Chin Angle"
2050 wearable="shape"
2051 edit_group="shape_chin"
2052 edit_group_order="1"
2053 label_min="Chin Out"
2054 label_max="Chin In"
2055 value_min="-.5"
2056 value_max=".5"
2057 camera_elevation=".1"
2058 camera_distance=".4"
2059 camera_angle="45">
2060 <param_morph />
2061 </param>
2062
2063 <param
2064 id="8"
2065 group="0"
2066 name="Double_Chin"
2067 label="Chin-Neck"
2068 wearable="shape"
2069 edit_group="shape_chin"
2070 edit_group_order="8"
2071 label_min="Tight Chin"
2072 label_max="Double Chin"
2073 value_min="-.5"
2074 value_max="1.5"
2075 camera_elevation="-.1"
2076 camera_distance=".3"
2077 camera_angle="60">
2078 <param_morph />
2079 </param>
2080
2081 <param
2082 id="10"
2083 group="0"
2084 name="Sunken_Cheeks"
2085 label="Lower Cheeks"
2086 wearable="shape"
2087 edit_group="shape_head"
2088 edit_group_order="9"
2089 label_min="Well-Fed"
2090 label_max="Sunken"
2091 show_simple="true"
2092 value_min="-1.5"
2093 value_max="3"
2094 camera_elevation=".1"
2095 camera_distance=".4"
2096 camera_angle="5">
2097 <param_morph />
2098 </param>
2099
2100 <param
2101 id="11"
2102 group="0"
2103 name="Noble_Nose_Bridge"
2104 label="Upper Bridge"
2105 wearable="shape"
2106 edit_group="shape_nose"
2107 edit_group_order="5"
2108 label_min="Low"
2109 label_max="High"
2110 value_min="-.5"
2111 value_max="1.5"
2112 camera_elevation=".1"
2113 camera_distance=".35"
2114 camera_angle="70">
2115 <param_morph />
2116 </param>
2117
2118 <param
2119 id="758"
2120 group="0"
2121 name="Lower_Bridge_Nose"
2122 label="Lower Bridge"
2123 wearable="shape"
2124 edit_group="shape_nose"
2125 edit_group_order="5.5"
2126 label_min="Low"
2127 label_max="High"
2128 value_min="-1.5"
2129 value_max="1.5"
2130 camera_elevation=".1"
2131 camera_distance=".35"
2132 camera_angle="70">
2133 <param_morph />
2134 </param>
2135
2136 <param
2137 id="12"
2138 group="0"
2139 name="Jowls"
2140 wearable="shape"
2141 edit_group="shape_chin"
2142 edit_group_order="5"
2143 label_min="Less"
2144 label_max="More"
2145 value_min="-.5"
2146 value_max="2.5"
2147 camera_elevation=".1"
2148 camera_distance=".4"
2149 camera_angle="0">
2150 <param_morph />
2151 </param>
2152
2153 <param
2154 id="13"
2155 group="0"
2156 name="Cleft_Chin_Upper"
2157 label="Upper Chin Cleft"
2158 wearable="shape"
2159 edit_group="shape_chin"
2160 edit_group_order="7"
2161 label_min="Round"
2162 label_max="Cleft"
2163 value_min="0"
2164 value_max="1.5"
2165 camera_elevation="0"
2166 camera_distance=".28"
2167 camera_angle="-20">
2168 <param_morph />
2169 </param>
2170
2171 <param
2172 id="14"
2173 group="0"
2174 name="High_Cheek_Bones"
2175 label="Cheek Bones"
2176 wearable="shape"
2177 edit_group="shape_head"
2178 edit_group_order="10"
2179 label_min="Low"
2180 label_max="High"
2181 value_min="-.5"
2182 value_max="1"
2183 camera_elevation=".1"
2184 camera_distance=".3"
2185 camera_angle="-20">
2186 <param_morph />
2187 </param>
2188
2189 <param
2190 id="15"
2191 group="0"
2192 name="Ears_Out"
2193 label="Ear Angle"
2194 wearable="shape"
2195 edit_group="shape_ears"
2196 edit_group_order="2"
2197 label_min="In"
2198 label_max="Out"
2199 value_min="-.5"
2200 value_max="1.5"
2201 camera_elevation=".1"
2202 camera_distance=".3"
2203 camera_angle="-20">
2204 <param_morph />
2205 </param>
2206
2207<!--Pointy eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
2208 <param
2209 id="870"
2210 group="1"
2211 name="Pointy_Eyebrows"
2212 label="Eyebrow Points"
2213 wearable="hair"
2214 edit_group="hair_eyebrows"
2215 edit_group_order="4"
2216 label_min="Smooth"
2217 label_max="Pointy"
2218 value_min="-.5"
2219 value_max="1"
2220 camera_elevation=".1"
2221 camera_distance=".3">
2222 <param_morph />
2223 </param>
2224
2225 <param
2226 id="17"
2227 group="0"
2228 name="Square_Jaw"
2229 label="Jaw Shape"
2230 wearable="shape"
2231 edit_group="shape_chin"
2232 edit_group_order="2"
2233 label_min="Pointy"
2234 label_max="Square"
2235 value_min="-.5"
2236 value_max="1"
2237 camera_distance=".3"
2238 camera_elevation=".04"
2239 camera_angle="-20">
2240 <param_morph />
2241 </param>
2242
2243 <param
2244 id="18"
2245 group="0"
2246 name="Puffy_Upper_Cheeks"
2247 label="Upper Cheeks"
2248 wearable="shape"
2249 edit_group="shape_head"
2250 edit_group_order="8"
2251 label_min="Thin"
2252 label_max="Puffy"
2253 value_min="-1.5"
2254 value_max="2.5"
2255 camera_elevation=".1"
2256 camera_distance=".3"
2257 camera_angle="-20">
2258 <param_morph />
2259 </param>
2260
2261 <param
2262 id="19"
2263 group="0"
2264 name="Upturned_Nose_Tip"
2265 label="Nose Tip Angle"
2266 wearable="shape"
2267 edit_group="shape_nose"
2268 edit_group_order="7"
2269 label_min="Downturned"
2270 label_max="Upturned"
2271 value_min="-1.5"
2272 value_max="1"
2273 camera_elevation=".1"
2274 camera_distance=".35"
2275 camera_angle="15">
2276 <param_morph />
2277 </param>
2278
2279 <param
2280 id="20"
2281 group="0"
2282 name="Bulbous_Nose"
2283 label="Nose Thickness"
2284 wearable="shape"
2285 edit_group="shape_nose"
2286 edit_group_order="4"
2287 label_min="Thin Nose"
2288 label_max="Bulbous Nose"
2289 show_simple="true"
2290 value_min="-.5"
2291 value_max="1.5"
2292 camera_elevation=".1"
2293 camera_distance=".3">
2294 <param_morph />
2295 </param>
2296
2297 <param
2298 id="21"
2299 group="0"
2300 name="Upper_Eyelid_Fold"
2301 label="Upper Eyelid Fold"
2302 wearable="shape"
2303 edit_group="shape_eyes"
2304 edit_group_order="5"
2305 label_min="Uncreased"
2306 label_max="Creased"
2307 value_min="-0.2"
2308 value_max="1.3"
2309 camera_elevation=".1"
2310 camera_distance=".35">
2311 <param_morph />
2312 </param>
2313
2314 <param
2315 id="22"
2316 group="0"
2317 name="Attached_Earlobes"
2318 label="Attached Earlobes"
2319 wearable="shape"
2320 edit_group="shape_ears"
2321 edit_group_order="3"
2322 label_min="Unattached"
2323 label_max="Attached"
2324 value_min="0"
2325 value_max="1"
2326 camera_elevation=".1"
2327 camera_distance=".3"
2328 camera_angle="45">
2329 <param_morph />
2330 </param>
2331
2332 <param
2333 id="23"
2334 group="0"
2335 name="Baggy_Eyes"
2336 label="Eye Bags"
2337 wearable="shape"
2338 edit_group="shape_eyes"
2339 edit_group_order="6"
2340 label_min="Smooth"
2341 label_max="Baggy"
2342 value_min="-.5"
2343 value_max="1.5"
2344 camera_elevation=".1"
2345 camera_distance=".35">
2346 <param_morph />
2347 </param>
2348
2349 <param
2350 id="765"
2351 group="0"
2352 name="Puffy_Lower_Lids"
2353 label="Puffy Eyelids"
2354 wearable="shape"
2355 edit_group="shape_eyes"
2356 edit_group_order="6.1"
2357 label_min="Flat"
2358 label_max="Puffy"
2359 value_min="-.3"
2360 value_max="2.5"
2361 camera_elevation=".1"
2362 camera_distance=".35">
2363 <param_morph />
2364 </param>
2365
2366 <param
2367 id="24"
2368 group="0"
2369 name="Wide_Eyes"
2370 label="Eye Opening"
2371 wearable="shape"
2372 edit_group="shape_eyes"
2373 edit_group_order="1.1"
2374 label_min="Narrow"
2375 label_max="Wide"
2376 value_min="-1.5"
2377 value_max="2"
2378 show_simple="true"
2379 camera_elevation=".1"
2380 camera_distance=".35">
2381 <param_morph />
2382 </param>
2383
2384 <param
2385 id="25"
2386 group="0"
2387 name="Wide_Lip_Cleft"
2388 label="Lip Cleft"
2389 wearable="shape"
2390 edit_group="shape_mouth"
2391 edit_group_order="6"
2392 label_min="Narrow"
2393 label_max="Wide"
2394 value_min="-.8"
2395 value_max="1.5"
2396 camera_elevation="0"
2397 camera_distance=".28">
2398 <param_morph />
2399 </param>
2400
2401 <param
2402 id="764"
2403 group="0"
2404 name="Lip_Cleft_Deep"
2405 label="Lip Cleft Depth"
2406 wearable="shape"
2407 edit_group="shape_mouth"
2408 edit_group_order="5.8"
2409 label_min="Shallow"
2410 label_max="Deep"
2411 value_min="-.5"
2412 value_max="1.2"
2413 camera_elevation="0"
2414 camera_distance=".28">
2415 <param_morph />
2416 </param>
2417
2418 <param
2419 id="26"
2420 group="1"
2421 wearable="shape"
2422 name="Lips_Thin"
2423 edit_group="driven"
2424 value_min="0"
2425 value_max=".7">
2426 <param_morph />
2427 </param>
2428
2429 <param
2430 id="27"
2431 group="0"
2432 name="Wide_Nose_Bridge"
2433 label="Bridge Width"
2434 wearable="shape"
2435 edit_group="shape_nose"
2436 edit_group_order="6"
2437 label_min="Narrow"
2438 label_max="Wide"
2439 value_min="-1.3"
2440 value_max="1.2"
2441 camera_elevation=".1"
2442 camera_distance=".3"
2443 camera_angle="-20">
2444 <param_morph />
2445 </param>
2446
2447 <param
2448 id="28"
2449 group="1"
2450 name="Lips_Fat"
2451 wearable="shape"
2452 edit_group="driven"
2453 value_min="0"
2454 value_max="2">
2455 <param_morph />
2456 </param>
2457
2458 <param
2459 id="29"
2460 group="1"
2461 name="Wide_Upper_Lip"
2462 wearable="shape"
2463 edit_group="driven"
2464 value_min="-.7"
2465 value_max="1.3">
2466 <param_morph />
2467 </param>
2468
2469 <param
2470 id="30"
2471 group="1"
2472 name="Wide_Lower_Lip"
2473 wearable="shape"
2474 edit_group="driven"
2475 value_min="-.7"
2476 value_max="1.3">
2477 <param_morph />
2478 </param>
2479
2480<!--Arced eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
2481 <param
2482 id="872"
2483 group="1"
2484 name="Arced_Eyebrows"
2485 label="Eyebrow Arc"
2486 wearable="hair"
2487 edit_group="hair_eyebrows"
2488 edit_group_order="3"
2489 label_min="Flat"
2490 label_max="Arced"
2491 value_min="0"
2492 value_max="1">
2493 <param_morph />
2494 </param>
2495
2496<!--Lower eyebrows became a driver/driven param with new min value for backwards compatibility between 1.0 and 1.1-->
2497 <param
2498 id="871"
2499 group="1"
2500 name="Lower_Eyebrows"
2501 label="Eyebrow Height"
2502 show_simple="true"
2503 wearable="hair"
2504 edit_group="hair_eyebrows"
2505 edit_group_order="2.5"
2506 label_min="Higher"
2507 label_max="Lower"
2508 value_min="-2"
2509 value_max="2">
2510 <param_morph />
2511 </param>
2512
2513 <param
2514 id="35"
2515 group="0"
2516 name="Big_Ears"
2517 label="Ear Size"
2518 wearable="shape"
2519 edit_group="shape_ears"
2520 edit_group_order="1"
2521 label_min="Small"
2522 label_max="Large"
2523 value_min="-1"
2524 value_max="2"
2525 camera_elevation=".1"
2526 camera_distance=".3"
2527 camera_angle="45">
2528 <param_morph />
2529 </param>
2530
2531 <param
2532 id="796"
2533 group="0"
2534 name="Pointy_Ears"
2535 label="Ear Tips"
2536 wearable="shape"
2537 edit_group="shape_ears"
2538 edit_group_order="4"
2539 label_min="Flat"
2540 label_max="Pointy"
2541 value_min="-.4"
2542 value_max="3"
2543 camera_elevation=".1"
2544 camera_distance=".3"
2545 camera_angle="45">
2546 <param_morph />
2547 </param>
2548
2549 <param
2550 id="185"
2551 group="0"
2552 name="Deep_Chin"
2553 label="Chin Depth"
2554 wearable="shape"
2555 edit_group="shape_chin"
2556 edit_group_order="3"
2557 label_min="Shallow"
2558 label_max="Deep"
2559 value_min="-1"
2560 value_max="1"
2561 camera_elevation=".1"
2562 camera_distance=".4"
2563 camera_angle="30">
2564 <param_morph />
2565 </param>
2566
2567 <param
2568 id="186"
2569 group="1"
2570 name="Egg_Head"
2571 label="Egg Head"
2572 wearable="shape"
2573 edit_group="shape_head"
2574 label_min="Chin Heavy"
2575 label_max="Forehead Heavy"
2576 value_min="-1.3"
2577 value_max="1"
2578 camera_elevation=".1"
2579 camera_distance=".5"
2580 camera_angle="20">
2581 <param_morph />
2582 </param>
2583
2584 <param
2585 id="187"
2586 group="1"
2587 name="Squash_Stretch_Head"
2588 label="Squash/Stretch Head"
2589 wearable="shape"
2590 edit_group="shape_head"
2591 label_min="Squash Head"
2592 label_max="Stretch Head"
2593 value_min="-.5"
2594 value_max="1"
2595 camera_elevation=".1"
2596 camera_distance=".5"
2597 camera_angle="20">
2598 <param_morph>
2599 <volume_morph
2600 name="HEAD"
2601 scale="-0.008 -0.006 0.015"/>
2602 </param_morph>
2603 </param>
2604
2605 <param
2606 id="188"
2607 group="1"
2608 name="Square_Head"
2609 wearable="shape"
2610 label_min="Less Square"
2611 label_max="More Square"
2612 value_min="0"
2613 value_max=".7"
2614 camera_elevation=".1"
2615 camera_distance=".5"
2616 camera_angle="20">
2617 <param_morph />
2618 </param>
2619
2620 <param
2621 id="189"
2622 group="1"
2623 wearable="shape"
2624 name="Round_Head"
2625 label_min="Less Round"
2626 label_max="More Round"
2627 value_min="0"
2628 value_max="1"
2629 camera_elevation=".1"
2630 camera_distance=".5"
2631 camera_angle="20">
2632 <param_morph />
2633 </param>
2634
2635 <param
2636 id="194"
2637 group="1"
2638 name="Eye_Spread"
2639 wearable="shape"
2640 edit_group="shape_eyes"
2641 label_min="Eyes Together"
2642 label_max="Eyes Spread"
2643 value_min="-2"
2644 value_max="2">
2645 <param_morph />
2646 </param>
2647
2648 <param
2649 id="400"
2650 sex="male"
2651 group="1"
2652 name="Displace_Hair_Facial"
2653 label="Hair Thickess"
2654 wearable="hair"
2655 edit_group="hair_facial"
2656 label_min="Cropped Hair"
2657 label_max="Bushy Hair"
2658 value_min="0"
2659 value_max="2">
2660 <param_morph />
2661 </param>
2662
2663 <param
2664 id="506"
2665 group="0"
2666 name="Mouth_Height"
2667 wearable="shape"
2668 label="Mouth Position"
2669 show_simple="true"
2670 edit_group="shape_mouth"
2671 edit_group_order="4"
2672 label_min="High"
2673 label_max="Low"
2674 value_min="-2"
2675 value_max="2"
2676 camera_distance=".3"
2677 camera_elevation=".04">
2678 <param_morph />
2679 </param>
2680
2681 <param
2682 id="633"
2683 group="1"
2684 name="Fat_Head"
2685 label="Fat Head"
2686 wearable="shape"
2687 edit_group="shape_body"
2688 label_min="Skinny"
2689 label_max="Fat"
2690 value_min="0"
2691 value_max="1"
2692 camera_elevation=".3">
2693 <param_morph/>
2694 </param>
2695
2696 <param
2697 id="630"
2698 group="1"
2699 name="Forehead_Round"
2700 label="Round Forehead"
2701 wearable="shape"
2702 label_min="Less"
2703 label_max="More"
2704 value_min="0"
2705 value_max="1">
2706 <param_morph />
2707 </param>
2708
2709 <param
2710 id="631"
2711 group="1"
2712 name="Forehead_Slant"
2713 label="Slanted Forehead"
2714 wearable="shape"
2715 label_min="Less"
2716 label_max="More"
2717 value_min="0"
2718 value_max="1">
2719 <param_morph />
2720 </param>
2721
2722 <param
2723 id="650"
2724 group="0"
2725 name="Eyelid_Corner_Up"
2726 label="Outer Eye Corner"
2727 wearable="shape"
2728 edit_group="shape_eyes"
2729 edit_group_order="4"
2730 label_min="Corner Down"
2731 label_max="Corner Up"
2732 value_min="-1.3"
2733 value_max="1.2"
2734 camera_elevation=".1"
2735 camera_distance=".30">
2736 <param_morph />
2737 </param>
2738
2739 <param
2740 id="880"
2741 group="0"
2742 name="Eyelid_Inner_Corner_Up"
2743 label="Inner Eye Corner"
2744 wearable="shape"
2745 edit_group="shape_eyes"
2746 edit_group_order="4.2"
2747 label_min="Corner Down"
2748 label_max="Corner Up"
2749 value_min="-1.3"
2750 value_max="1.2"
2751 camera_elevation=".1"
2752 camera_distance=".30">
2753 <param_morph />
2754 </param>
2755
2756 <param
2757 id="653"
2758 group="0"
2759 name="Tall_Lips"
2760 wearable="shape"
2761 label="Lip Fullness"
2762 show_simple="true"
2763 edit_group="shape_mouth"
2764 edit_group_order="2"
2765 label_min="Less Full"
2766 label_max="More Full"
2767 value_min="-1"
2768 value_max="2"
2769 camera_distance=".3"
2770 camera_elevation=".04">
2771 <param_morph />
2772 </param>
2773
2774 <param
2775 id="656"
2776 group="0"
2777 name="Crooked_Nose"
2778 wearable="shape"
2779 label="Crooked Nose"
2780 edit_group="shape_nose"
2781 edit_group_order="9"
2782 label_min="Nose Left"
2783 label_max="Nose Right"
2784 value_min="-2"
2785 value_max="2"
2786 camera_distance=".3"
2787 camera_elevation=".04"
2788 camera_angle="-20">
2789 <param_morph />
2790 </param>
2791
2792 <param
2793 id="657"
2794 group="1"
2795 name="Smile_Mouth"
2796 wearable="shape"
2797 label="Mouth Corner"
2798 edit_group="shape_mouth"
2799 label_min="Corner Normal"
2800 label_max="Corner Up"
2801 value_min="0"
2802 value_max="1.4"
2803 camera_distance=".3"
2804 camera_elevation=".04">
2805 <param_morph />
2806 </param>
2807
2808 <param
2809 id="658"
2810 group="1"
2811 name="Frown_Mouth"
2812 wearable="shape"
2813 label="Mouth Corner"
2814 edit_group="shape_mouth"
2815 label_min="Corner Normal"
2816 label_max="Corner Down"
2817 value_min="0"
2818 value_max="1.2"
2819 camera_distance=".3"
2820 camera_elevation=".04">
2821 <param_morph />
2822 </param>
2823
2824 <param
2825 id="797"
2826 group="1"
2827 name="Fat_Upper_Lip"
2828 wearable="shape"
2829 label="Fat Upper Lip"
2830 edit_group="shape_mouth"
2831 label_min="Normal Upper"
2832 label_max="Fat Upper"
2833 value_min="0"
2834 value_max="1.5"
2835 camera_distance=".3"
2836 camera_elevation=".04">
2837 <param_morph />
2838 </param>
2839
2840 <param
2841 id="798"
2842 group="1"
2843 name="Fat_Lower_Lip"
2844 wearable="shape"
2845 label="Fat Lower Lip"
2846 edit_group="shape_mouth"
2847 label_min="Normal Lower"
2848 label_max="Fat Lower"
2849 value_min="0"
2850 value_max="1.5"
2851 camera_distance=".3"
2852 camera_elevation=".04">
2853 <param_morph />
2854 </param>
2855
2856 <param
2857 id="660"
2858 group="1"
2859 name="Shear_Head"
2860 wearable="shape"
2861 label="Shear Face"
2862 edit_group="shape_head"
2863 label_min="Shear Left"
2864 label_max="Shear Right"
2865 value_min="-2"
2866 value_max="2"
2867 value_default="0"
2868 camera_distance=".5"
2869 camera_elevation=".04">
2870 <param_morph />
2871 </param>
2872
2873 <param
2874 id="770"
2875 group="1"
2876 name="Elongate_Head"
2877 wearable="shape"
2878 label="Shear Face"
2879 edit_group="shape_head"
2880 label_min="Flat Head"
2881 label_max="Long Head"
2882 value_min="-1"
2883 value_max="1"
2884 value_default="0"
2885 camera_distance=".5"
2886 camera_elevation=".04">
2887 <param_morph>
2888 <volume_morph
2889 name="HEAD"
2890 scale="0.02 0.0 0.0"/>
2891 </param_morph>
2892 </param>
2893
2894 <param
2895 id="663"
2896 group="0"
2897 name="Shift_Mouth"
2898 wearable="shape"
2899 label="Shift Mouth"
2900 edit_group="shape_mouth"
2901 edit_group_order="7"
2902 label_min="Shift Left"
2903 label_max="Shift Right"
2904 value_min="-2"
2905 value_max="2"
2906 value_default="0"
2907 camera_distance=".35"
2908 camera_elevation=".04"
2909 camera_angle="-20">
2910 <param_morph />
2911 </param>
2912
2913 <param
2914 id="664"
2915 group="0"
2916 name="Pop_Eye"
2917 wearable="shape"
2918 label="Eye Pop"
2919 edit_group="shape_eyes"
2920 edit_group_order="8"
2921 label_min="Pop Right Eye"
2922 label_max="Pop Left Eye"
2923 value_min="-1.3"
2924 value_max="1.3"
2925 value_default="0"
2926 camera_elevation=".1"
2927 camera_distance=".35">
2928 <param_morph />
2929 </param>
2930
2931 <param
2932 id="760"
2933 group="0"
2934 name="Jaw_Angle"
2935 wearable="shape"
2936 label="Jaw Angle"
2937 edit_group="shape_chin"
2938 edit_group_order="3.5"
2939 label_min="Low Jaw"
2940 label_max="High Jaw"
2941 value_min="-1.2"
2942 value_max="2"
2943 value_default="0"
2944 camera_distance=".5"
2945 camera_elevation=".04"
2946 camera_angle="70">
2947 <param_morph />
2948 </param>
2949
2950 <param
2951 id="665"
2952 group="0"
2953 name="Jaw_Jut"
2954 wearable="shape"
2955 label="Jaw Jut"
2956 edit_group="shape_chin"
2957 edit_group_order="4"
2958 label_min="Overbite"
2959 label_max="Underbite"
2960 value_min="-2"
2961 value_max="2"
2962 value_default="0"
2963 camera_distance=".5"
2964 camera_elevation=".04"
2965 camera_angle="70">
2966 <param_morph />
2967 </param>
2968
2969 <param
2970 id="686"
2971 group="1"
2972 name="Head_Eyes_Big"
2973 wearable="shape"
2974 label="Eye Size"
2975 edit_group="shape_eyes"
2976 label_min="Beady Eyes"
2977 label_max="Anime Eyes"
2978 show_simple="true"
2979 value_min="-2"
2980 value_max="2"
2981 value_default="0">
2982 <param_morph />
2983 </param>
2984
2985 <param
2986 id="767"
2987 group="1"
2988 name="Bug_Eyed_Head"
2989 wearable="shape"
2990 label="Eye Depth"
2991 edit_group="shape_eyes"
2992 edit_group_order="4.5"
2993 label_min="Sunken Eyes"
2994 label_max="Bug Eyes"
2995 value_min="-2"
2996 value_max="2"
2997 value_default="0">
2998 <param_morph />
2999 </param>
3000
3001<!--
3002 #Fat_Lips = Fat_Lips 34 1 0 1
3003 #Wide_Lips = Wide_Lips 35 1 0 1
3004 #Wide_Nose = Wide_Nose 36 1 0 1
3005 -->
3006<!--
3007 ##############
3008 # Facial Expression morphs
3009 ##############
3010 -->
3011 <param
3012 id="300"
3013 group="1"
3014 name="Express_Closed_Mouth"
3015 value_default="1"
3016 value_min="0"
3017 value_max="1">
3018 <param_morph />
3019 </param>
3020
3021 <param
3022 id="301"
3023 group="1"
3024 name="Express_Tongue_Out"
3025 value_min="0"
3026 value_max="1">
3027 <param_morph />
3028 </param>
3029
3030 <param
3031 id="302"
3032 group="1"
3033 name="Express_Surprise_Emote"
3034 value_min="0"
3035 value_max="1">
3036 <param_morph />
3037 </param>
3038
3039 <param
3040 id="303"
3041 group="1"
3042 name="Express_Wink_Emote"
3043 value_min="0"
3044 value_max="1">
3045 <param_morph />
3046 </param>
3047
3048 <param
3049 id="304"
3050 group="1"
3051 name="Express_Embarrassed_Emote"
3052 value_min="0"
3053 value_max="1">
3054 <param_morph />
3055 </param>
3056
3057 <param
3058 id="305"
3059 group="1"
3060 name="Express_Shrug_Emote"
3061 value_min="0"
3062 value_max="1">
3063 <param_morph />
3064 </param>
3065
3066 <param
3067 id="306"
3068 group="1"
3069 name="Express_Kiss"
3070 value_min="0"
3071 value_max="1">
3072 <param_morph />
3073 </param>
3074
3075 <param
3076 id="307"
3077 group="1"
3078 name="Express_Bored_Emote"
3079 value_min="0"
3080 value_max="1">
3081 <param_morph />
3082 </param>
3083
3084 <param
3085 id="308"
3086 group="1"
3087 name="Express_Repulsed_Emote"
3088 value_min="0"
3089 value_max="1">
3090 <param_morph />
3091 </param>
3092
3093 <param
3094 id="309"
3095 group="1"
3096 name="Express_Disdain"
3097 value_min="0"
3098 value_max="1">
3099 <param_morph />
3100 </param>
3101
3102 <param
3103 id="310"
3104 group="1"
3105 name="Express_Afraid_Emote"
3106 value_min="0"
3107 value_max="1">
3108 <param_morph />
3109 </param>
3110
3111 <param
3112 id="311"
3113 group="1"
3114 name="Express_Worry_Emote"
3115 value_min="0"
3116 value_max="1">
3117 <param_morph />
3118 </param>
3119
3120 <param
3121 id="312"
3122 group="1"
3123 name="Express_Cry_Emote"
3124 value_min="0"
3125 value_max="1">
3126 <param_morph />
3127 </param>
3128
3129 <param
3130 id="313"
3131 group="1"
3132 name="Express_Sad_Emote"
3133 value_min="0"
3134 value_max="1">
3135 <param_morph />
3136 </param>
3137
3138 <param
3139 id="314"
3140 group="1"
3141 name="Express_Anger_Emote"
3142 value_min="0"
3143 value_max="1">
3144 <param_morph />
3145 </param>
3146
3147 <param
3148 id="315"
3149 group="1"
3150 name="Express_Frown"
3151 value_min="0"
3152 value_max="1">
3153 <param_morph />
3154 </param>
3155
3156 <param
3157 id="316"
3158 group="1"
3159 name="Express_Laugh_Emote"
3160 value_min="0"
3161 value_max="1">
3162 <param_morph />
3163 </param>
3164
3165 <param
3166 id="317"
3167 group="1"
3168 name="Express_Toothsmile"
3169 value_min="0"
3170 value_max="1">
3171 <param_morph />
3172 </param>
3173
3174 <param
3175 id="318"
3176 group="1"
3177 name="Express_Smile"
3178 value_min="0"
3179 value_max="1">
3180 <param_morph />
3181 </param>
3182
3183 <param
3184 id="632"
3185 group="1"
3186 name="Express_Open_Mouth"
3187 value_min="0"
3188 value_max="1">
3189 <param_morph />
3190 </param>
3191
3192<!--
3193 ##############
3194 # Lipsync morphs
3195 ##############
3196 -->
3197
3198 <param
3199 id="70"
3200 group="1"
3201 name="Lipsync_Aah"
3202 value_min="0"
3203 value_max="1">
3204 <param_morph />
3205 </param>
3206
3207 <param
3208 id="71"
3209 group="1"
3210 name="Lipsync_Ooh"
3211 value_min="0"
3212 value_max="1">
3213 <param_morph />
3214 </param>
3215
3216<!--
3217 ##############
3218 # other morphs (not user controlled)
3219 ##############
3220 -->
3221 <param
3222 id="40"
3223 group="1"
3224 name="Male_Head"
3225 value_min="0"
3226 value_max="1">
3227 <param_morph />
3228 </param>
3229
3230 <param
3231 id="41"
3232 group="1"
3233 name="Old"
3234 value_min="0"
3235 value_max="1">
3236 <param_morph />
3237 </param>
3238
3239<!--
3240 ##############
3241 # animatable morphs
3242 ##############
3243 -->
3244 <param
3245 id="51"
3246 group="1"
3247 name="Furrowed_Eyebrows"
3248 value_min="0"
3249 value_max="1">
3250 <param_morph />
3251 </param>
3252
3253 <param
3254 id="53"
3255 group="1"
3256 name="Surprised_Eyebrows"
3257 value_min="0"
3258 value_max="1">
3259 <param_morph />
3260 </param>
3261
3262 <param
3263 id="54"
3264 group="1"
3265 name="Worried_Eyebrows"
3266 value_min="0"
3267 value_max="1">
3268 <param_morph />
3269 </param>
3270
3271 <param
3272 id="55"
3273 group="1"
3274 name="Frown_Mouth"
3275 value_min="0"
3276 value_max="1">
3277 <param_morph />
3278 </param>
3279
3280 <param
3281 id="57"
3282 group="1"
3283 name="Smile_Mouth"
3284 value_min="0"
3285 value_max="1">
3286 <param_morph />
3287 </param>
3288
3289 <param
3290 id="58"
3291 group="1"
3292 name="Blink_Left"
3293 value_min="0"
3294 value_max="1">
3295 <param_morph />
3296 </param>
3297
3298 <param
3299 id="59"
3300 group="1"
3301 name="Blink_Right"
3302 value_min="0"
3303 value_max="1">
3304 <param_morph />
3305 </param>
3306
3307<!--
3308 #end morph targets
3309 -->
3310 </mesh>
3311
3312 <mesh
3313 type="headMesh"
3314 lod="1"
3315 file_name="avatar_head_1.llm"
3316 min_pixel_width="160"
3317 reference="avatar_head.llm">
3318 </mesh>
3319
3320 <mesh
3321 type="headMesh"
3322 lod="2"
3323 file_name="avatar_head_2.llm"
3324 min_pixel_width="80"
3325 reference="avatar_head.llm">
3326 </mesh>
3327
3328 <mesh
3329 type="headMesh"
3330 lod="3"
3331 file_name="avatar_head_3.llm"
3332 min_pixel_width="40"
3333 reference="avatar_head.llm">
3334 </mesh>
3335
3336 <mesh
3337 type="headMesh"
3338 lod="4"
3339 file_name="avatar_head_4.llm"
3340 min_pixel_width="0"
3341 reference="avatar_head.llm">
3342 </mesh>
3343
3344 <mesh
3345 type="eyelashMesh"
3346 lod="0"
3347 file_name="avatar_eyelashes.llm"
3348 min_pixel_width="320">
3349 <param
3350 shared="1"
3351 id="660"
3352 group="1"
3353 name="Shear_Head"
3354 wearable="shape"
3355 label="Shear Face"
3356 edit_group="shape_head"
3357 label_min="Shear Left"
3358 label_max="Shear Right"
3359 value_min="-2"
3360 value_max="2"
3361 value_default="0"
3362 camera_distance=".5"
3363 camera_elevation=".04">
3364 <param_morph />
3365 </param>
3366
3367 <param
3368 shared="1"
3369 id="770"
3370 group="1"
3371 name="Elongate_Head"
3372 wearable="shape"
3373 label="Shear Face"
3374 edit_group="shape_head"
3375 label_min="Flat Head"
3376 label_max="Long Head"
3377 value_min="-1"
3378 value_max="1"
3379 value_default="0"
3380 camera_distance=".5"
3381 camera_elevation=".04">
3382 <param_morph />
3383 </param>
3384
3385 <param
3386 shared="1"
3387 id="664"
3388 group="0"
3389 name="Pop_Eye"
3390 wearable="shape"
3391 label="Eye Pop"
3392 edit_group="shape_eyes"
3393 edit_group_order="8"
3394 label_min="Pop Right Eye"
3395 label_max="Pop Left Eye"
3396 value_min="-2"
3397 value_max="2"
3398 value_default="0"
3399 camera_distance=".5"
3400 camera_elevation=".04"
3401 camera_angle="-20">
3402 <param_morph />
3403 </param>
3404
3405 <param
3406 shared="1"
3407 id="21"
3408 group="0"
3409 name="Upper_Eyelid_Fold"
3410 label="Upper Eyelid Fold"
3411 wearable="shape"
3412 edit_group="shape_eyes"
3413 label_min="Uncreased"
3414 label_max="Creased"
3415 value_min="-0.2"
3416 value_max="1.3"
3417 camera_elevation=".1"
3418 camera_distance=".35">
3419 <param_morph />
3420 </param>
3421
3422 <param
3423 shared="1"
3424 id="24"
3425 group="0"
3426 name="Wide_Eyes"
3427 label="Eye Opening"
3428 wearable="shape"
3429 edit_group="shape_eyes"
3430 label_min="Narrow"
3431 label_max="Wide"
3432 show_simple="true"
3433 value_min="-1.5"
3434 value_max="2"
3435 camera_elevation=".1"
3436 camera_distance=".3">
3437 <param_morph />
3438 </param>
3439
3440 <param
3441 shared="1"
3442 id="186"
3443 group="1"
3444 name="Egg_Head"
3445 label="Egg Head"
3446 wearable="shape"
3447 edit_group="shape_head"
3448 label_min="Chin Heavy"
3449 label_max="Forehead Heavy"
3450 value_min="-1.3"
3451 value_max="1"
3452 camera_elevation=".1"
3453 camera_distance=".5"
3454 camera_angle="20">
3455 <param_morph />
3456 </param>
3457
3458 <param
3459 shared="1"
3460 id="187"
3461 group="1"
3462 name="Squash_Stretch_Head"
3463 label="Squash/Stretch Head"
3464 wearable="shape"
3465 edit_group="shape_head"
3466 label_min="Squash Head"
3467 label_max="Stretch Head"
3468 value_min="-.5"
3469 value_max="1"
3470 camera_elevation=".1"
3471 camera_distance=".5"
3472 camera_angle="20">
3473 <param_morph />
3474 </param>
3475
3476 <param
3477 shared="1"
3478 id="194"
3479 group="1"
3480 name="Eye_Spread"
3481 edit_group="shape_eyes"
3482 label_min="Eyes Together"
3483 label_max="Eyes Spread"
3484 value_min="-2"
3485 value_max="2">
3486 <param_morph />
3487 </param>
3488
3489 <param
3490 id="518"
3491 group="0"
3492 name="Eyelashes_Long"
3493 wearable="shape"
3494 label="Eyelash Length"
3495 edit_group="shape_eyes"
3496 edit_group_order="7"
3497 label_min="Short"
3498 label_max="Long"
3499 value_min="-.3"
3500 value_max="1.5"
3501 camera_elevation=".1"
3502 camera_distance=".30"
3503 camera_angle="-20">
3504 <param_morph />
3505 </param>
3506
3507 <param
3508 shared="1"
3509 id="650"
3510 group="0"
3511 name="Eyelid_Corner_Up"
3512 label="Outer Eye Corner"
3513 wearable="shape"
3514 edit_group="shape_eyes"
3515 label_min="Corner Down"
3516 label_max="Corner Up"
3517 value_min="-1.3"
3518 value_max="1.2"
3519 camera_elevation=".1"
3520 camera_distance=".3">
3521 <param_morph />
3522 </param>
3523
3524 <param
3525 shared="1"
3526 id="880"
3527 group="0"
3528 name="Eyelid_Inner_Corner_Up"
3529 label="Inner Eye Corner"
3530 wearable="shape"
3531 edit_group="shape_eyes"
3532 label_min="Corner Down"
3533 label_max="Corner Up"
3534 value_min="-1.3"
3535 value_max="1.2"
3536 camera_elevation=".1"
3537 camera_distance=".3">
3538 <param_morph />
3539 </param>
3540
3541 <param
3542 shared="1"
3543 id="686"
3544 group="1"
3545 name="Head_Eyes_Big"
3546 wearable="shape"
3547 label="Eye Size"
3548 edit_group="shape_eyes"
3549 label_min="Beady Eyes"
3550 label_max="Anime Eyes"
3551 value_min="-2"
3552 value_max="2"
3553 show_simple="true"
3554 value_default="0">
3555 <param_morph />
3556 </param>
3557
3558 <param
3559 shared="1"
3560 id="767"
3561 group="1"
3562 name="Bug_Eyed_Head"
3563 wearable="shape"
3564 label="Eye Depth"
3565 edit_group="shape_eyes"
3566 edit_group_order="4.5"
3567 label_min="Sunken Eyes"
3568 label_max="Bug Eyes"
3569 value_min="-2"
3570 value_max="2"
3571 value_default="0">
3572 <param_morph />
3573 </param>
3574
3575<!--
3576 ##############
3577 # Facial Expression morphs
3578 ##############
3579 -->
3580 <param
3581 shared="1"
3582 id="301"
3583 group="1"
3584 name="Express_Tongue_Out"
3585 value_min="0"
3586 value_max="1">
3587 <param_morph />
3588 </param>
3589
3590 <param
3591 shared="1"
3592 id="302"
3593 group="1"
3594 name="Express_Surprise_Emote"
3595 value_min="0"
3596 value_max="1">
3597 <param_morph />
3598 </param>
3599
3600 <param
3601 shared="1"
3602 id="303"
3603 group="1"
3604 name="Express_Wink_Emote"
3605 value_min="0"
3606 value_max="1">
3607 <param_morph />
3608 </param>
3609
3610 <param
3611 shared="1"
3612 id="304"
3613 group="1"
3614 name="Express_Embarrassed_Emote"
3615 value_min="0"
3616 value_max="1">
3617 <param_morph />
3618 </param>
3619
3620 <param
3621 shared="1"
3622 id="305"
3623 group="1"
3624 name="Express_Shrug_Emote"
3625 value_min="0"
3626 value_max="1">
3627 <param_morph />
3628 </param>
3629
3630 <param
3631 shared="1"
3632 id="306"
3633 group="1"
3634 name="Express_Kiss"
3635 value_min="0"
3636 value_max="1">
3637 <param_morph />
3638 </param>
3639
3640 <param
3641 shared="1"
3642 id="307"
3643 group="1"
3644 name="Express_Bored_Emote"
3645 value_min="0"
3646 value_max="1">
3647 <param_morph />
3648 </param>
3649
3650 <param
3651 shared="1"
3652 id="308"
3653 group="1"
3654 name="Express_Repulsed_Emote"
3655 value_min="0"
3656 value_max="1">
3657 <param_morph />
3658 </param>
3659
3660 <param
3661 shared="1"
3662 id="309"
3663 group="1"
3664 name="Express_Disdain"
3665 value_min="0"
3666 value_max="1">
3667 <param_morph />
3668 </param>
3669
3670 <param
3671 shared="1"
3672 id="310"
3673 group="1"
3674 name="Express_Afraid_Emote"
3675 value_min="0"
3676 value_max="1">
3677 <param_morph />
3678 </param>
3679
3680 <param
3681 shared="1"
3682 id="312"
3683 group="1"
3684 name="Express_Cry_Emote"
3685 value_min="0"
3686 value_max="1">
3687 <param_morph />
3688 </param>
3689
3690 <param
3691 shared="1"
3692 id="313"
3693 group="1"
3694 name="Express_Sad_Emote"
3695 value_min="0"
3696 value_max="1">
3697 <param_morph />
3698 </param>
3699
3700 <param
3701 shared="1"
3702 id="314"
3703 group="1"
3704 name="Express_Anger_Emote"
3705 value_min="0"
3706 value_max="1">
3707 <param_morph />
3708 </param>
3709
3710 <param
3711 shared="1"
3712 id="315"
3713 group="1"
3714 name="Express_Frown"
3715 value_min="0"
3716 value_max="1">
3717 <param_morph />
3718 </param>
3719
3720 <param
3721 shared="1"
3722 id="316"
3723 group="1"
3724 name="Express_Laugh_Emote"
3725 value_min="0"
3726 value_max="1">
3727 <param_morph />
3728 </param>
3729
3730 <param
3731 shared="1"
3732 id="317"
3733 group="1"
3734 name="Express_Toothsmile"
3735 value_min="0"
3736 value_max="1">
3737 <param_morph />
3738 </param>
3739
3740 <param
3741 shared="1"
3742 id="318"
3743 group="1"
3744 name="Express_Smile"
3745 value_min="0"
3746 value_max="1">
3747 <param_morph />
3748 </param>
3749
3750<!--
3751 ##############
3752 # other morphs (not user controlled)
3753 ##############
3754 -->
3755 <param
3756 shared="1"
3757 id="41"
3758 group="1"
3759 name="Old"
3760 value_min="0"
3761 value_max="1">
3762 <param_morph />
3763 </param>
3764
3765<!--
3766 ##############
3767 # animatable morphs
3768 ##############
3769 -->
3770 <param
3771 shared="1"
3772 id="58"
3773 group="1"
3774 name="Blink_Left"
3775 value_min="0"
3776 value_max="1">
3777 <param_morph />
3778 </param>
3779
3780 <param
3781 shared="1"
3782 id="59"
3783 group="1"
3784 name="Blink_Right"
3785 value_min="0"
3786 value_max="1">
3787 <param_morph />
3788 </param>
3789 </mesh>
3790
3791<!--
3792 #headMesh2 =
3793 #headMesh3 =
3794 -->
3795 <mesh
3796 type="upperBodyMesh"
3797 lod="0"
3798 file_name="avatar_upper_body.llm"
3799 min_pixel_width="320">
3800<!--
3801 #begin morph targets
3802 #############
3803 # tweakable morphs
3804 #############
3805 -->
3806 <param
3807 id="104"
3808 group="1"
3809 name="Big_Belly_Torso"
3810 value_min="0"
3811 value_max="1">
3812 <param_morph>
3813 <volume_morph
3814 name="BELLY"
3815 scale="0.075 0.04 0.03"
3816 pos="0.07 0 -0.07"/>
3817 </param_morph>
3818 </param>
3819
3820 <param
3821 id="626"
3822 sex="female"
3823 group="1"
3824 name="Big_Chest"
3825 label="Chest Size"
3826 wearable="shape"
3827 edit_group="shape_torso"
3828 label_min="Small"
3829 label_max="Large"
3830 value_min="0"
3831 value_max="1"
3832 camera_elevation=".1"
3833 camera_distance="1"
3834 camera_angle="15">
3835 <param_morph />
3836 </param>
3837
3838 <param
3839 id="627"
3840 sex="female"
3841 group="1"
3842 name="Small_Chest"
3843 label="Chest Size"
3844 wearable="shape"
3845 edit_group="shape_torso"
3846 label_min="Large"
3847 label_max="Small"
3848 value_min="0"
3849 value_max="1"
3850 camera_elevation="0"
3851 camera_distance=".28">
3852 <param_morph />
3853 </param>
3854
3855 <param
3856 id="843"
3857 sex="female"
3858 group="1"
3859 name="No_Chest"
3860 label="Chest Size"
3861 wearable="shape"
3862 edit_group="shape_torso"
3863 label_min="Some"
3864 label_max="None"
3865 value_min="0"
3866 value_max="1"
3867 camera_elevation="0"
3868 camera_distance=".28">
3869 <param_morph />
3870 </param>
3871
3872 <param
3873 id="106"
3874 group="1"
3875 name="Muscular_Torso"
3876 label="Torso Muscles"
3877 show_simple="true"
3878 wearable="shape"
3879 edit_group="shape_torso"
3880 label_min="Regular"
3881 label_max="Muscular"
3882 value_min="0"
3883 value_max="1.4"
3884 camera_elevation=".3"
3885 camera_distance="1.2">
3886 <param_morph>
3887 <volume_morph
3888 name="L_CLAVICLE"
3889 scale="0.02 0.0 0.005"
3890 pos="0.0 0 0.005"/>
3891 <volume_morph
3892 name="L_UPPER_ARM"
3893 scale="0.015 0.0 0.005"
3894 pos="0.015 0 0"/>
3895 <volume_morph
3896 name="L_LOWER_ARM"
3897 scale="0.005 0.0 0.005"
3898 pos="0.005 0 0"/>
3899 <volume_morph
3900 name="R_CLAVICLE"
3901 scale="0.02 0.0 0.005"
3902 pos="0.0 0 0.005"/>
3903 <volume_morph
3904 name="R_UPPER_ARM"
3905 scale="0.015 0.0 0.005"
3906 pos="0.015 0 0"/>
3907 <volume_morph
3908 name="R_LOWER_ARM"
3909 scale="0.005 0.0 0.005"
3910 pos="0.005 0 0"/>
3911 </param_morph>
3912 </param>
3913
3914 <param
3915 id="648"
3916 group="1"
3917 sex="female"
3918 name="Scrawny_Torso"
3919 label="Torso Muscles"
3920 show_simple="true"
3921 wearable="shape"
3922 edit_group="shape_torso"
3923 label_min="Regular"
3924 label_max="Scrawny"
3925 value_min="0"
3926 value_max="1.3"
3927 camera_elevation=".3"
3928 camera_distance="1.2">
3929 <param_morph>
3930 <volume_morph
3931 name="BELLY"
3932 scale="0.0 -0.01 0.0"
3933 pos="0.0 0.0 0"/>
3934 <volume_morph
3935 name="CHEST"
3936 scale="-0.01 -0.01 0.0"
3937 pos="0.01 0.0 0"/>
3938 <volume_morph
3939 name="L_CLAVICLE"
3940 scale="0.0 -0.03 -0.005"
3941 pos="0.0 0 -0.005"/>
3942 <volume_morph
3943 name="L_UPPER_ARM"
3944 scale="-0.01 -0.01 -0.02"
3945 pos="0 0 0"/>
3946 <volume_morph
3947 name="L_LOWER_ARM"
3948 scale="-0.005 0.0 -0.01"
3949 pos="-0.005 0 0"/>
3950 <volume_morph
3951 name="R_CLAVICLE"
3952 scale="0.0 -0.03 -0.005"
3953 pos="0.0 0 -0.005"/>
3954 <volume_morph
3955 name="R_UPPER_ARM"
3956 scale="-0.01 -0.01 -0.02"
3957 pos="0 0 0"/>
3958 <volume_morph
3959 name="R_LOWER_ARM"
3960 scale="-0.005 0.0 -0.01"
3961 pos="-0.005 0 0"/>
3962 </param_morph>
3963 </param>
3964
3965 <param
3966 id="677"
3967 group="1"
3968 sex="male"
3969 name="Scrawny_Torso_Male"
3970 label="Torso Scrawny"
3971 wearable="shape"
3972 edit_group="shape_torso"
3973 label_min="Regular"
3974 label_max="Scrawny"
3975 value_min="0"
3976 value_max="1.3"
3977 camera_elevation=".3"
3978 camera_distance="1.2">
3979 <param_morph>
3980 <volume_morph
3981 name="BELLY"
3982 scale="-0.01 -0.01 0.0"
3983 pos="0.01 0.0 0"/>
3984 <volume_morph
3985 name="CHEST"
3986 scale="-0.02 -0.02 0.0"
3987 pos="0.01 0.0 0"/>
3988 <volume_morph
3989 name="L_CLAVICLE"
3990 scale="0.0 -0.03 -0.005"
3991 pos="0.0 0 -0.005"/>
3992 <volume_morph
3993 name="L_UPPER_ARM"
3994 scale="-0.01 -0.01 -0.02"
3995 pos="0 0 0"/>
3996 <volume_morph
3997 name="L_LOWER_ARM"
3998 scale="-0.005 0.0 -0.01"
3999 pos="-0.005 0 0"/>
4000 <volume_morph
4001 name="R_CLAVICLE"
4002 scale="0.0 -0.03 -0.005"
4003 pos="0.0 0 -0.005"/>
4004 <volume_morph
4005 name="R_UPPER_ARM"
4006 scale="-0.01 -0.01 -0.02"
4007 pos="0 0 0"/>
4008 <volume_morph
4009 name="R_LOWER_ARM"
4010 scale="-0.005 0.0 -0.01"
4011 pos="-0.005 0 0"/>
4012 </param_morph>
4013 </param>
4014
4015 <param
4016 id="634"
4017 group="1"
4018 name="Fat_Torso"
4019 label="Fat Torso"
4020 wearable="shape"
4021 edit_group="shape_body"
4022 label_min="skinny"
4023 label_max="fat"
4024 value_min="0"
4025 value_max="1"
4026 camera_elevation=".3">
4027 <param_morph>
4028 <volume_morph
4029 name="CHEST"
4030 scale="0.02 0.03 0.03"
4031 pos="0 0 -0.03"/>
4032 <volume_morph
4033 name="BELLY"
4034 scale="0.09 0.08 0.07"
4035 pos="0 0 -0.05"/>
4036 <volume_morph
4037 name="L_CLAVICLE"
4038 scale="0.0 0.0 0.015"/>
4039 <volume_morph
4040 name="L_UPPER_ARM"
4041 scale="0.02 0.0 0.02"
4042 pos="0.0 0.0 -0.02"/>
4043 <volume_morph
4044 name="L_LOWER_ARM"
4045 scale="0.01 0.0 0.01"
4046 pos="0.0 0.0 -0.01"/>
4047 <volume_morph
4048 name="R_CLAVICLE"
4049 scale="0.0 0.0 0.015"/>
4050 <volume_morph
4051 name="R_UPPER_ARM"
4052 scale="0.02 0.0 0.02"
4053 pos="0.0 0.0 -0.02"/>
4054 <volume_morph
4055 name="R_LOWER_ARM"
4056 scale="0.01 0.0 0.01"
4057 pos="0.0 0.0 -0.01"/>
4058 <volume_morph
4059 name="NECK"
4060 scale="0.015 0.01 0.0"/>
4061 <volume_morph
4062 name="HEAD"
4063 scale="0.0 0.0 0.01"
4064 pos="0 0 -0.01"/>
4065 </param_morph>
4066
4067 </param>
4068
4069 <param
4070 id="507"
4071 group="0"
4072 sex="female"
4073 name="Breast_Gravity"
4074 label="Breast Buoyancy"
4075 wearable="shape"
4076 edit_group="shape_torso"
4077 edit_group_order="7"
4078 label_min="Less Gravity"
4079 label_max="More Gravity"
4080 value_default="0"
4081 value_min="-1.5"
4082 value_max="2"
4083 camera_elevation=".3"
4084 camera_distance=".8">
4085 <param_morph />
4086 </param>
4087
4088 <param
4089 id="628"
4090 group="1"
4091 name="Displace_Loose_Upperbody"
4092 label="Shirt Fit"
4093 wearable="shirt"
4094 edit_group="driven"
4095 clothing_morph="true"
4096 value_min="0"
4097 value_max="1"
4098 value_default="0">
4099 <param_morph />
4100 </param>
4101
4102 <param
4103 id="840"
4104 group="0"
4105 name="Shirtsleeve_flair"
4106 label="Sleeve Looseness"
4107 show_simple="true"
4108 wearable="shirt"
4109 edit_group="shirt"
4110 edit_group_order="6"
4111 clothing_morph="true"
4112 label_min="Tight Sleeves"
4113 label_max="Loose Sleeves"
4114 value_min="0"
4115 value_max="1.5"
4116 camera_distance="1.8"
4117 camera_angle="30"
4118 camera_elevation="-.3">
4119 <param_morph />
4120 </param>
4121
4122 <param
4123 id="855"
4124 group="1"
4125 name="Love_Handles"
4126 value_default="0"
4127 value_min="-1"
4128 value_max="2">
4129 <param_morph>
4130 <volume_morph
4131 name="BELLY"
4132 scale="0.0 0.02 0.0"/>
4133 </param_morph>
4134 </param>
4135
4136 <param
4137 id="684"
4138 group="0"
4139 sex="female"
4140 name="Breast_Female_Cleavage"
4141 label="Breast Cleavage"
4142 wearable="shape"
4143 edit_group="shape_torso"
4144 edit_group_order="8"
4145 label_min="Separate"
4146 label_max="Join"
4147 value_default="0"
4148 value_min="-.3"
4149 value_max="1.3"
4150 camera_elevation=".3"
4151 camera_distance=".8">
4152 <param_morph />
4153 </param>
4154
4155 <param
4156 id="685"
4157 group="0"
4158 sex="male"
4159 name="Chest_Male_No_Pecs"
4160 label="Pectorals"
4161 wearable="shape"
4162 edit_group="shape_torso"
4163 edit_group_order="5"
4164 label_min="Big Pectorals"
4165 label_max="Sunken Chest"
4166 value_default="0"
4167 value_min="-.5"
4168 value_max="1.1"
4169 camera_elevation=".3"
4170 camera_distance="1.2">
4171 <param_morph />
4172 </param>
4173
4174<!-- ############# #
4175 other morphs (not user controlled)
4176 ############# -->
4177 <param
4178 id="100"
4179 group="1"
4180 name="Male_Torso"
4181 label_min="Male_Torso"
4182 value_min="0"
4183 value_max="1">
4184 <param_morph>
4185 <volume_morph
4186 name="CHEST"
4187 scale="0.03 0.04 0.02"
4188 pos="-0.03 0 -0.01"/>
4189 <volume_morph
4190 name="BELLY"
4191 scale="0.03 0.03 0.0"
4192 pos="-0.03 0 0.02"/>
4193 <volume_morph
4194 name="L_CLAVICLE"
4195 scale="0.02 0.0 0.01"
4196 pos="-0.02 0 0"/>
4197 <volume_morph
4198 name="L_UPPER_ARM"
4199 scale="0.01 0.0 0.01"
4200 pos="0.0 0.0 -0.01"/>
4201 <volume_morph
4202 name="L_LOWER_ARM"
4203 scale="0.005 0.0 0.005"
4204 pos="0.0 0.0 -0.005"/>
4205 <volume_morph
4206 name="R_CLAVICLE"
4207 scale="0.02 0.0 0.01"
4208 pos="-0.02 0 0"/>
4209 <volume_morph
4210 name="R_UPPER_ARM"
4211 scale="0.01 0.0 0.01"
4212 pos="0.0 0.0 -0.01"/>
4213 <volume_morph
4214 name="R_LOWER_ARM"
4215 scale="0.005 0.0 0.005"
4216 pos="0.0 0.0 -0.005"/>
4217 <volume_morph
4218 name="NECK"
4219 scale="0.015 0.01 0.0"/>
4220 <volume_morph
4221 name="HEAD"
4222 scale="0.0 0.0 0.01"
4223 pos="0 0 -0.01"/>
4224 </param_morph>
4225 </param>
4226
4227<!--
4228 ##############
4229 # animatable morphs
4230 ##############
4231 -->
4232 <param
4233 id="101"
4234 group="1"
4235 name="Hands_Relaxed"
4236 value_min="0"
4237 value_max="1">
4238 <param_morph />
4239 </param>
4240
4241 <param
4242 id="102"
4243 group="1"
4244 name="Hands_Point"
4245 value_min="0"
4246 value_max="1">
4247 <param_morph />
4248 </param>
4249
4250 <param
4251 id="103"
4252 group="1"
4253 name="Hands_Fist"
4254 value_min="0"
4255 value_max="1">
4256 <param_morph />
4257 </param>
4258
4259 <param
4260 id="666"
4261 group="1"
4262 name="Hands_Relaxed_L"
4263 value_min="0"
4264 value_max="1">
4265 <param_morph />
4266 </param>
4267
4268 <param
4269 id="667"
4270 group="1"
4271 name="Hands_Point_L"
4272 value_min="0"
4273 value_max="1">
4274 <param_morph />
4275 </param>
4276
4277 <param
4278 id="668"
4279 group="1"
4280 name="Hands_Fist_L"
4281 value_min="0"
4282 value_max="1">
4283 <param_morph />
4284 </param>
4285
4286 <param
4287 id="669"
4288 group="1"
4289 name="Hands_Relaxed_R"
4290 value_min="0"
4291 value_max="1">
4292 <param_morph />
4293 </param>
4294
4295 <param
4296 id="670"
4297 group="1"
4298 name="Hands_Point_R"
4299 value_min="0"
4300 value_max="1">
4301 <param_morph />
4302 </param>
4303
4304 <param
4305 id="671"
4306 group="1"
4307 name="Hands_Fist_R"
4308 value_min="0"
4309 value_max="1">
4310 <param_morph />
4311 </param>
4312
4313 <param
4314 id="672"
4315 group="1"
4316 name="Hands_Typing"
4317 value_min="0"
4318 value_max="1">
4319 <param_morph />
4320 </param>
4321
4322 <param
4323 id="766"
4324 group="1"
4325 name="Hands_Salute_R"
4326 value_min="0"
4327 value_max="1">
4328 <param_morph />
4329 </param>
4330
4331 <param
4332 id="791"
4333 group="1"
4334 name="Hands_Peace_R"
4335 value_min="0"
4336 value_max="1">
4337 <param_morph />
4338 </param>
4339
4340 <param
4341 id="792"
4342 group="1"
4343 name="Hands_Spread_R"
4344 value_min="0"
4345 value_max="1">
4346 <param_morph />
4347 </param>
4348
4349<!--
4350 #end morph targets
4351 -->
4352 </mesh>
4353
4354 <mesh
4355 type="upperBodyMesh"
4356 lod="1"
4357 file_name="avatar_upper_body_1.llm"
4358 min_pixel_width="160"
4359 reference="avatar_upper_body.llm">
4360 </mesh>
4361
4362 <mesh
4363 type="upperBodyMesh"
4364 lod="2"
4365 file_name="avatar_upper_body_2.llm"
4366 min_pixel_width="80"
4367 reference="avatar_upper_body.llm">
4368 </mesh>
4369
4370 <mesh
4371 type="upperBodyMesh"
4372 lod="3"
4373 file_name="avatar_upper_body_3.llm"
4374 min_pixel_width="40"
4375 reference="avatar_upper_body.llm">
4376 </mesh>
4377
4378 <mesh
4379 type="upperBodyMesh"
4380 lod="4"
4381 file_name="avatar_upper_body_4.llm"
4382 min_pixel_width="0"
4383 reference="avatar_upper_body.llm">
4384 </mesh>
4385
4386<!--
4387 #upperBodyMesh2 =
4388 #upperBodyMesh3 =
4389 -->
4390 <mesh
4391 type="lowerBodyMesh"
4392 lod="0"
4393 file_name="avatar_lower_body.llm"
4394 min_pixel_width="320">
4395<!--
4396 #begin morph targets
4397 #############
4398 # tweakable morphs
4399 #############
4400 -->
4401 <param
4402 id="156"
4403 group="1"
4404 name="Big_Belly_Legs"
4405 value_min="0"
4406 value_max="1">
4407 <param_morph />
4408 </param>
4409
4410 <param
4411 id="151"
4412 group="1"
4413 name="Big_Butt_Legs"
4414 label="Butt Size"
4415 wearable="shape"
4416 edit_group="shape_legs"
4417 label_min="Regular"
4418 label_max="Large"
4419 value_min="0"
4420 value_max="1">
4421 <param_morph>
4422 <volume_morph
4423 name="PELVIS"
4424 scale="0.03 0.0 0.02"
4425 pos="-0.03 0 -0.025"/>
4426 </param_morph>
4427 </param>
4428
4429 <param
4430 id="794"
4431 group="1"
4432 name="Small_Butt"
4433 label="Butt Size"
4434 wearable="shape"
4435 edit_group="shape_legs"
4436 label_min="Regular"
4437 label_max="Small"
4438 value_min="0"
4439 value_max="1">
4440 <param_morph>
4441 <volume_morph
4442 name="PELVIS"
4443 scale="-0.01 0.0 0.0"
4444 pos="0.01 0 0.0"/>
4445 </param_morph>
4446 </param>
4447
4448 <param
4449 id="152"
4450 group="1"
4451 name="Muscular_Legs"
4452 label="Leg Muscles"
4453 show_simple="true"
4454 wearable="shape"
4455 edit_group="shape_legs"
4456 label_min="Regular Muscles"
4457 label_max="More Muscles"
4458 value_min="0"
4459 value_max="1.5"
4460 camera_distance="1.3"
4461 camera_elevation="-.5">
4462 <param_morph>
4463 <volume_morph
4464 name="L_UPPER_LEG"
4465 scale="0.015 0.015 0.0"
4466 pos="0.0 0 0.0"/>
4467 <volume_morph
4468 name="L_LOWER_LEG"
4469 scale="0.01 0.01 0.0"
4470 pos="0.0 0 0.0"/>
4471 <volume_morph
4472 name="R_UPPER_LEG"
4473 scale="0.015 0.015 0.0"
4474 pos="0.0 0 0.0"/>
4475 <volume_morph
4476 name="R_LOWER_LEG"
4477 scale="0.01 0.01 0.0"
4478 pos="0.0 0 0.0"/>
4479 </param_morph>
4480 </param>
4481
4482 <param
4483 id="651"
4484 group="1"
4485 name="Scrawny_Legs"
4486 label="Scrawny Leg"
4487 wearable="shape"
4488 edit_group="shape_legs"
4489 label_min="Regular Muscles"
4490 label_max="Less Muscles"
4491 value_min="0"
4492 value_max="1.5"
4493 camera_distance="1.3"
4494 camera_elevation="-.5">
4495 <param_morph>
4496 <volume_morph
4497 name="L_UPPER_LEG"
4498 scale="-0.03 -0.03 0.0"
4499 pos="0.0 0 0.0"/>
4500 <volume_morph
4501 name="L_LOWER_LEG"
4502 scale="-0.015 -0.015 0.0"
4503 pos="0.0 0 0.0"/>
4504 <volume_morph
4505 name="R_UPPER_LEG"
4506 scale="-0.03 -0.03 0.0"
4507 pos="0.0 0 0.0"/>
4508 <volume_morph
4509 name="R_LOWER_LEG"
4510 scale="-0.015 -0.015 0.0"
4511 pos="0.0 0 0.0"/>
4512 </param_morph>
4513 </param>
4514
4515 <param
4516 id="853"
4517 group="1"
4518 name="Bowed_Legs"
4519 label="Knee Angle"
4520 wearable="shape"
4521 value_min="-1"
4522 value_max="1">
4523 <param_morph>
4524 <volume_morph
4525 name="L_UPPER_LEG"
4526 pos="0.0 0.03 0.0"/>
4527 <volume_morph
4528 name="L_LOWER_LEG"
4529 pos="0.0 0.03 0.0"/>
4530 <volume_morph
4531 name="R_UPPER_LEG"
4532 pos="0.0 -0.03 0.0"/>
4533 <volume_morph
4534 name="R_LOWER_LEG"
4535 pos="0.0 -0.03 0.0"/>
4536 </param_morph>
4537 </param>
4538
4539 <param
4540 id="500"
4541 group="1"
4542 name="Shoe_Heel_Height"
4543 label="Heel Height"
4544 wearable="shoes"
4545 edit_group="shoes"
4546 label_min="Low Heels"
4547 label_max="High Heels"
4548 value_min="0"
4549 value_max="1"
4550 camera_distance="1.5"
4551 camera_elevation="-.5">
4552 <param_morph />
4553 </param>
4554
4555 <param
4556 id="501"
4557 group="1"
4558 name="Shoe_Platform_Height"
4559 label="Platform Height"
4560 wearable="shoes"
4561 edit_group="shoes"
4562 label_min="Low Platforms"
4563 label_max="High Platforms"
4564 value_min="0"
4565 value_max="1"
4566 camera_distance="1.5"
4567 camera_elevation="-.5">
4568 <param_morph />
4569 </param>
4570
4571 <param
4572 id="508"
4573 group="0"
4574 name="Shoe_Platform_Width"
4575 label="Platform Width"
4576 wearable="shoes"
4577 edit_group="shoes"
4578 edit_group_order="7"
4579 label_min="Narrow"
4580 label_max="Wide"
4581 value_min="-1"
4582 value_max="2"
4583 camera_angle="15"
4584 camera_distance="1.5"
4585 camera_elevation="-1">
4586 <param_morph />
4587 </param>
4588
4589 <param
4590 id="509"
4591 group="1"
4592 name="Shoe_Heel_Point"
4593 label="Heel Shape"
4594 wearable="shoes"
4595 edit_group="shoes"
4596 label_min="Default Heels"
4597 label_max="Pointy Heels"
4598 value_min="0"
4599 value_max="1"
4600 camera_distance="1.3"
4601 camera_elevation="-.5">
4602 <param_morph />
4603 </param>
4604
4605 <param
4606 id="510"
4607 group="1"
4608 name="Shoe_Heel_Thick"
4609 label="Heel Shape"
4610 wearable="shoes"
4611 edit_group="shoes"
4612 label_min="default Heels"
4613 label_max="Thick Heels"
4614 value_min="0"
4615 value_max="1"
4616 camera_distance="1.3"
4617 camera_elevation="-.5">
4618 <param_morph />
4619 </param>
4620
4621 <param
4622 id="511"
4623 group="1"
4624 name="Shoe_Toe_Point"
4625 label="Toe Shape"
4626 wearable="shoes"
4627 edit_group="shoes"
4628 label_min="Default Toe"
4629 label_max="Pointy Toe"
4630 value_min="0"
4631 value_max="1"
4632 camera_distance="1.3"
4633 camera_elevation="-.5">
4634 <param_morph />
4635 </param>
4636
4637 <param
4638 id="512"
4639 group="1"
4640 name="Shoe_Toe_Square"
4641 label="Toe Shape"
4642 wearable="shoes"
4643 edit_group="shoes"
4644 label_min="Default Toe"
4645 label_max="Square Toe"
4646 value_min="0"
4647 value_max="1"
4648 camera_distance="1.5"
4649 camera_elevation="-.5">
4650 <param_morph />
4651 </param>
4652
4653 <param
4654 id="654"
4655 group="0"
4656 name="Shoe_Toe_Thick"
4657 label="Toe Thickness"
4658 wearable="shoes"
4659 edit_group="shoes"
4660 edit_group_order="5"
4661 label_min="Flat Toe"
4662 label_max="Thick Toe"
4663 value_min="0"
4664 value_max="2"
4665 camera_angle="15"
4666 camera_distance="1.5"
4667 camera_elevation="-1">
4668 <param_morph />
4669 </param>
4670
4671 <param
4672 id="515"
4673 group="0"
4674 name="Foot_Size"
4675 label="Foot Size"
4676 wearable="shape"
4677 edit_group="shape_legs"
4678 edit_group_order="6"
4679 label_min="Small"
4680 label_max="Big"
4681 value_min="-1"
4682 value_max="3"
4683 camera_angle="45"
4684 camera_distance="1.1"
4685 camera_elevation="-1">
4686 <param_morph>
4687 <volume_morph
4688 name="L_FOOT"
4689 scale="0.02 0.01 0.0"
4690 pos="0.01 0 0"/>
4691 <volume_morph
4692 name="R_FOOT"
4693 scale="0.02 0.01 0.0"
4694 pos="0.01 0 0"/>
4695 </param_morph>
4696 </param>
4697
4698 <param
4699 id="516"
4700 group="1"
4701 name="Displace_Loose_Lowerbody"
4702 label="Pants Fit"
4703 wearable="pants"
4704 edit_group="driven"
4705 clothing_morph="true"
4706 value_min="0"
4707 value_max="1"
4708 value_default="0">
4709 <param_morph />
4710 </param>
4711
4712 <param
4713 id="625"
4714 group="0"
4715 name="Leg_Pantflair"
4716 label="Cuff Flare"
4717 show_simple="true"
4718 wearable="pants"
4719 edit_group="pants"
4720 edit_group_order="3"
4721 clothing_morph="true"
4722 label_min="Tight Cuffs"
4723 label_max="Flared Cuffs"
4724 value_min="0"
4725 value_max="1.5"
4726 camera_distance="1.8"
4727 camera_angle="30"
4728 camera_elevation="-.3">
4729 <param_morph />
4730 </param>
4731
4732 <param
4733 id="793"
4734 group="1"
4735 name="Leg_Longcuffs"
4736 label="Longcuffs"
4737 wearable="pants"
4738 edit_group="driven"
4739 clothing_morph="true"
4740 value_min="0"
4741 value_max="3"
4742 value_default="0">
4743 <param_morph />
4744 </param>
4745
4746 <param
4747 id="638"
4748 group="0"
4749 name="Low_Crotch"
4750 label="Pants Crotch"
4751 wearable="pants"
4752 clothing_morph="true"
4753 edit_group="pants"
4754 edit_group_order="4"
4755 label_min="High and Tight"
4756 label_max="Low and Loose"
4757 value_min="0"
4758 value_max="1.3"
4759 camera_distance="1.2"
4760 camera_angle="-20"
4761 camera_elevation="-.3">
4762 <param_morph />
4763 </param>
4764
4765 <param
4766 id="635"
4767 group="1"
4768 name="Fat_Legs"
4769 label="Fat Torso"
4770 wearable="shape"
4771 edit_group="shape_body"
4772 label_min="skinny"
4773 label_max="fat"
4774 value_min="0"
4775 value_max="1">
4776 <param_morph>
4777 <volume_morph
4778 name="PELVIS"
4779 scale="0.03 0.06 0.0"/>
4780 <volume_morph
4781 name="R_UPPER_LEG"
4782 scale="0.02 0.02 0.0"
4783 pos="0.0 -0.02 0.0"/>
4784 <volume_morph
4785 name="R_LOWER_LEG"
4786 scale="0.01 0.01 0.0"/>
4787 <volume_morph
4788 name="L_UPPER_LEG"
4789 scale="0.02 0.02 0.0"
4790 pos="0.0 0.02 0.0"/>
4791 <volume_morph
4792 name="L_LOWER_LEG"
4793 scale="0.01 0.01 0.0"/>
4794 </param_morph>
4795 </param>
4796
4797 <param
4798 id="854"
4799 group="1"
4800 name="Saddlebags"
4801 value_min="-.5"
4802 value_max="3">
4803 <param_morph>
4804 <volume_morph
4805 name="PELVIS"
4806 scale="0.0 0.025 0.0"/>
4807 </param_morph>
4808
4809 </param>
4810
4811 <param
4812 id="879"
4813 group="0"
4814 sex="male"
4815 name="Male_Package"
4816 label="Package"
4817 wearable="shape"
4818 edit_group="shape_legs"
4819 edit_group_order="4.6"
4820 label_min="Coin Purse"
4821 label_max="Duffle Bag"
4822 value_default="0"
4823 value_min="-.5"
4824 value_max="2"
4825 camera_angle="60"
4826 camera_distance=".6">
4827 <param_morph />
4828 </param>
4829
4830<!--
4831 #############
4832 # other morphs (not user controlled)
4833 #############
4834 -->
4835 <param
4836 id="153"
4837 group="1"
4838 name="Male_Legs"
4839 value_min="0"
4840 value_max="1">
4841 <param_morph />
4842 </param>
4843
4844<!--
4845 #end morph targets
4846 -->
4847 </mesh>
4848
4849 <mesh
4850 type="lowerBodyMesh"
4851 lod="1"
4852 file_name="avatar_lower_body_1.llm"
4853 min_pixel_width="160"
4854 reference="avatar_lower_body.llm">
4855 </mesh>
4856
4857 <mesh
4858 type="lowerBodyMesh"
4859 lod="2"
4860 file_name="avatar_lower_body_2.llm"
4861 min_pixel_width="80"
4862 reference="avatar_lower_body.llm">
4863 </mesh>
4864
4865 <mesh
4866 type="lowerBodyMesh"
4867 lod="3"
4868 file_name="avatar_lower_body_3.llm"
4869 min_pixel_width="40"
4870 reference="avatar_lower_body.llm">
4871 </mesh>
4872
4873 <mesh
4874 type="lowerBodyMesh"
4875 lod="4"
4876 file_name="avatar_lower_body_4.llm"
4877 min_pixel_width="0"
4878 reference="avatar_lower_body.llm">
4879 </mesh>
4880
4881<!--
4882 #lowerBodyMesh2 =
4883 #lowerBodyMesh3 =
4884 -->
4885<!--
4886 #eyeLidLeftMesh =
4887 -->
4888 <mesh
4889 type="eyeBallLeftMesh"
4890 lod="0"
4891 file_name="avatar_eye.llm"
4892 min_pixel_width="320">
4893<!-- begin morph_params -->
4894 <param
4895 id="679"
4896 group="1"
4897 name="Eyeball_Size"
4898 label="Eyeball Size"
4899 wearable="shape"
4900 edit_group="shape_eyes"
4901 label_min="small eye"
4902 label_max="big eye"
4903 value_min="-.25"
4904 value_max=".10">
4905 <param_morph />
4906 </param>
4907
4908 <param
4909 id="687"
4910 group="1"
4911 name="Eyeball_Size"
4912 label="Big Eyeball"
4913 wearable="shape"
4914 edit_group="shape_eyes"
4915 label_min="small eye"
4916 label_max="big eye"
4917 value_min="-.25"
4918 value_max=".25">
4919 <param_morph />
4920 </param>
4921 </mesh>
4922
4923 <mesh
4924 type="eyeBallLeftMesh"
4925 lod="1"
4926 file_name="avatar_eye_1.llm"
4927 min_pixel_width="80">
4928<!-- begin morph_params -->
4929 <param
4930 id="694"
4931 group="1"
4932 name="Eyeball_Size"
4933 label="Eyeball Size"
4934 wearable="shape"
4935 edit_group="shape_eyes"
4936 label_min="small eye"
4937 label_max="big eye"
4938 value_min="-.25"
4939 value_max=".10">
4940 <param_morph />
4941 </param>
4942
4943 <param
4944 id="695"
4945 group="1"
4946 name="Eyeball_Size"
4947 label="Big Eyeball"
4948 wearable="shape"
4949 edit_group="shape_eyes"
4950 label_min="small eye"
4951 label_max="big eye"
4952 value_min="-.25"
4953 value_max=".25">
4954 <param_morph />
4955 </param>
4956 </mesh>
4957
4958<!--
4959 #eyeLidRightMesh =
4960 -->
4961 <mesh
4962 type="eyeBallRightMesh"
4963 lod="0"
4964 file_name="avatar_eye.llm"
4965 min_pixel_width="320">
4966<!-- begin morph_params -->
4967 <param
4968 id="680"
4969 group="1"
4970 name="Eyeball_Size"
4971 label="Eyeball Size"
4972 wearable="shape"
4973 label_min="small eye"
4974 label_max="big eye"
4975 value_min="-.25"
4976 value_max=".10">
4977 <param_morph />
4978 </param>
4979
4980 <param
4981 id="688"
4982 group="1"
4983 name="Eyeball_Size"
4984 label="Big Eyeball"
4985 wearable="shape"
4986 label_min="small eye"
4987 label_max="big eye"
4988 value_min="-.25"
4989 value_max=".25">
4990 <param_morph />
4991 </param>
4992 </mesh>
4993
4994 <mesh
4995 type="eyeBallRightMesh"
4996 lod="1"
4997 file_name="avatar_eye_1.llm"
4998 min_pixel_width="80">
4999<!-- begin morph_params -->
5000 <param
5001 id="681"
5002 group="1"
5003 name="Eyeball_Size"
5004 label="Eyeball Size"
5005 wearable="shape"
5006 edit_group="shape_eyes"
5007 label_min="small eye"
5008 label_max="big eye"
5009 value_min="-.25"
5010 value_max=".10">
5011 <param_morph />
5012 </param>
5013
5014 <param
5015 id="691"
5016 group="1"
5017 name="Eyeball_Size"
5018 label="Big Eyeball"
5019 wearable="shape"
5020 edit_group="shape_eyes"
5021 label_min="small eye"
5022 label_max="big eye"
5023 value_min="-.25"
5024 value_max=".25">
5025 <param_morph />
5026 </param>
5027 </mesh>
5028
5029 <mesh
5030 type="skirtMesh"
5031 lod="0"
5032 file_name="avatar_skirt.llm"
5033 min_pixel_width="320">
5034 <param
5035 id="845"
5036 group="1"
5037 name="skirt_poofy"
5038 label="poofy skirt"
5039 clothing_morph="true"
5040 wearable="skirt"
5041 edit_group="skirt"
5042 label_min="less poofy"
5043 label_max="more poofy"
5044 value_min="0"
5045 value_max="1.5">
5046 <param_morph />
5047 </param>
5048
5049 <param
5050 id="846"
5051 group="1"
5052 name="skirt_loose"
5053 label="loose skirt"
5054 clothing_morph="true"
5055 wearable="skirt"
5056 edit_group="skirt"
5057 label_min="form fitting"
5058 label_max="loose"
5059 value_min="0"
5060 value_max="1">
5061 <param_morph />
5062 </param>
5063
5064 <param
5065 id="866"
5066 group="1"
5067 name="skirt_tight"
5068 label="tight skirt"
5069 clothing_morph="true"
5070 wearable="skirt"
5071 edit_group="skirt"
5072 label_min="form fitting"
5073 label_max="loose"
5074 value_min="0"
5075 value_max="1">
5076 <param_morph />
5077 </param>
5078
5079 <param
5080 id="867"
5081 group="1"
5082 name="skirt_smallbutt"
5083 label="tight skirt"
5084 clothing_morph="false"
5085 wearable="skirt"
5086 edit_group="skirt"
5087 label_min="form fitting"
5088 label_max="loose"
5089 value_min="0"
5090 value_max="1">
5091 <param_morph />
5092 </param>
5093
5094 <param
5095 id="848"
5096 group="0"
5097 name="skirt_bustle"
5098 label="bustle skirt"
5099 clothing_morph="true"
5100 wearable="skirt"
5101 edit_group_order="3"
5102 edit_group="skirt"
5103 label_min="no bustle"
5104 label_max="more bustle"
5105 value_min="0"
5106 value_max="2"
5107 value_default=".2"
5108 camera_angle="100"
5109 camera_distance="1.3"
5110 camera_elevation="-.5">
5111 <param_morph />
5112 </param>
5113
5114 <param
5115 id="847"
5116 group="1"
5117 name="skirt_bowlegs"
5118 label="legs skirt"
5119 wearable="skirt"
5120 value_min="-1"
5121 value_max="1"
5122 value_default="0">
5123 <param_morph />
5124 </param>
5125
5126 <param
5127 id="852"
5128 group="1"
5129 name="skirt_bigbutt"
5130 label="bigbutt skirt"
5131 label_min="less"
5132 label_max="more"
5133 value_min="0"
5134 value_max="1">
5135 <param_morph />
5136 </param>
5137
5138 <param
5139 id="849"
5140 group="1"
5141 name="skirt_belly"
5142 label="big belly skirt"
5143 value_min="0"
5144 value_max="1">
5145 <param_morph />
5146 </param>
5147
5148 <param
5149 id="850"
5150 group="1"
5151 name="skirt_saddlebags"
5152 value_min="-.5"
5153 value_max="3">
5154 <param_morph />
5155 </param>
5156
5157 <param
5158 id="851"
5159 group="1"
5160 name="skirt_chubby"
5161 label_min="less"
5162 label_max="more"
5163 value_min="0"
5164 value_max="1"
5165 value_default="0">
5166 <param_morph />
5167 </param>
5168
5169 <param
5170 id="856"
5171 group="1"
5172 name="skirt_lovehandles"
5173 label_min="less"
5174 label_max="more"
5175 value_min="-1"
5176 value_max="2"
5177 value_default="0">
5178 <param_morph />
5179 </param>
5180
5181<!--
5182 #############
5183 # other morphs (not user controlled)
5184 #############
5185 -->
5186 <param
5187 id="857"
5188 group="1"
5189 name="skirt_male"
5190 value_min="0"
5191 value_max="1">
5192 <param_morph />
5193 </param>
5194 </mesh>
5195
5196 <mesh
5197 type="skirtMesh"
5198 lod="1"
5199 file_name="avatar_skirt_1.llm"
5200 min_pixel_width="160"
5201 reference="avatar_skirt.llm">
5202 </mesh>
5203
5204 <mesh
5205 type="skirtMesh"
5206 lod="2"
5207 file_name="avatar_skirt_2.llm"
5208 min_pixel_width="80"
5209 reference="avatar_skirt.llm">
5210 </mesh>
5211
5212 <mesh
5213 type="skirtMesh"
5214 lod="3"
5215 file_name="avatar_skirt_3.llm"
5216 min_pixel_width="40"
5217 reference="avatar_skirt.llm">
5218 </mesh>
5219
5220 <mesh
5221 type="skirtMesh"
5222 lod="4"
5223 file_name="avatar_skirt_4.llm"
5224 min_pixel_width="0"
5225 reference="avatar_skirt.llm">
5226 </mesh>
5227
5228<!-- =========================================================== -->
5229 <global_color
5230 name="skin_color">
5231 <param
5232 id="111"
5233 group="0"
5234 wearable="skin"
5235 edit_group="skin_color"
5236 edit_group_order="1"
5237 name="Pigment"
5238 show_simple="true"
5239 label_min="Light"
5240 label_max="Dark"
5241 value_min="0"
5242 value_max="1"
5243 value_default=".5">
5244 <param_color>
5245 <value
5246 color="252, 215, 200, 255" />
5247
5248 <value
5249 color="240, 177, 112, 255" />
5250
5251 <value
5252 color="90, 40, 16, 255" />
5253
5254 <value
5255 color="29, 9, 6, 255" />
5256 </param_color>
5257 </param>
5258
5259 <param
5260 id="110"
5261 group="0"
5262 wearable="skin"
5263 edit_group="skin_color"
5264 edit_group_order="2"
5265 name="Red Skin"
5266 label="Ruddiness"
5267 label_min="Pale"
5268 label_max="Ruddy"
5269 value_min="0"
5270 value_max="0.1">
5271 <param_color
5272 operation="blend">
5273 <value
5274 color="218, 41, 37, 255" />
5275 </param_color>
5276 </param>
5277
5278 <param
5279 id="108"
5280 group="0"
5281 wearable="skin"
5282 edit_group="skin_color"
5283 edit_group_order="3"
5284 name="Rainbow Color"
5285 show_simple="true"
5286 label_min="None"
5287 label_max="Wild"
5288 value_min="0"
5289 value_max="1"
5290 camera_elevation=".1"
5291 camera_distance=".5">
5292 <param_color>
5293 <value
5294 color=" 0, 0, 0, 255" />
5295
5296 <value
5297 color="255, 0, 255, 255" />
5298
5299 <value
5300 color="255, 0, 0, 255" />
5301
5302 <value
5303 color="255, 255, 0, 255" />
5304
5305 <value
5306 color=" 0, 255, 0, 255" />
5307
5308 <value
5309 color=" 0, 255, 255, 255" />
5310
5311 <value
5312 color=" 0, 0, 255, 255" />
5313
5314 <value
5315 color="255, 0, 255, 255" />
5316 </param_color>
5317 </param>
5318 </global_color>
5319
5320<!-- =========================================================== -->
5321 <global_color
5322 name="hair_color">
5323 <param
5324 id="114"
5325 group="0"
5326 wearable="hair"
5327 edit_group="hair_color"
5328 edit_group_order="3"
5329 name="Blonde Hair"
5330 show_simple="true"
5331 label_min="Black"
5332 label_max="Blonde"
5333 value_min="0"
5334 value_max="1"
5335 value_default=".5"
5336 camera_elevation=".1"
5337 camera_distance=".5">
5338 <param_color>
5339 <value
5340 color="0, 0, 0, 255" />
5341
5342 <value
5343 color="22, 6, 6, 255" />
5344
5345 <value
5346 color="29, 9, 6, 255" />
5347
5348 <value
5349 color="45, 21, 11, 255" />
5350
5351 <value
5352 color="78, 39, 11, 255" />
5353
5354 <value
5355 color="90, 53, 16, 255" />
5356
5357 <value
5358 color="136, 92, 21, 255" />
5359
5360 <value
5361 color="150, 106, 33, 255" />
5362
5363 <value
5364 color="198, 156, 74, 255" />
5365
5366 <value
5367 color="233, 192, 103, 255" />
5368
5369 <value
5370 color="238, 205, 136, 255" />
5371 </param_color>
5372 </param>
5373
5374 <param
5375 id="113"
5376 group="0"
5377 wearable="hair"
5378 edit_group="hair_color"
5379 edit_group_order="4"
5380 name="Red Hair"
5381 show_simple="true"
5382 label_min="No Red"
5383 label_max="Very Red"
5384 value_min="0"
5385 value_max="1"
5386 camera_elevation=".1"
5387 camera_distance=".5">
5388 <param_color>
5389 <value
5390 color="0, 0, 0, 255" />
5391
5392 <value
5393 color="118, 47, 19, 255" />
5394 </param_color>
5395 </param>
5396
5397 <param
5398 id="115"
5399 group="0"
5400 wearable="hair"
5401 edit_group="hair_color"
5402 edit_group_order="1"
5403 name="White Hair"
5404 show_simple="true"
5405 label_min="No White"
5406 label_max="All White"
5407 value_min="0"
5408 value_max="1"
5409 camera_elevation=".1"
5410 camera_distance=".5">
5411 <param_color>
5412 <value
5413 color="0, 0, 0, 255" />
5414
5415 <value
5416 color="255, 255, 255, 255" />
5417 </param_color>
5418 </param>
5419
5420 <param
5421 id="112"
5422 group="0"
5423 wearable="hair"
5424 edit_group="hair_color"
5425 edit_group_order="2"
5426 name="Rainbow Color"
5427 show_simple="true"
5428 label_min="None"
5429 label_max="Wild"
5430 value_min="0"
5431 value_max="1"
5432 camera_elevation=".1"
5433 camera_distance=".5">
5434 <param_color>
5435 <value
5436 color=" 0, 0, 0, 255" />
5437
5438 <value
5439 color="255, 0, 255, 255" />
5440
5441 <value
5442 color="255, 0, 0, 255" />
5443
5444 <value
5445 color="255, 255, 0, 255" />
5446
5447 <value
5448 color=" 0, 255, 0, 255" />
5449
5450 <value
5451 color=" 0, 255, 255, 255" />
5452
5453 <value
5454 color=" 0, 0, 255, 255" />
5455
5456 <value
5457 color="255, 0, 255, 255" />
5458 </param_color>
5459 </param>
5460 </global_color>
5461
5462<!-- =========================================================== -->
5463 <global_color
5464 name="eye_color">
5465 <param
5466 id="99"
5467 group="0"
5468 wearable="eyes"
5469 edit_group="eyes"
5470 edit_group_order="1"
5471 name="Eye Color"
5472 show_simple="true"
5473 label_min="Natural"
5474 label_max="Unnatural"
5475 value_min="0"
5476 value_max="1"
5477 value_default="0"
5478 camera_elevation=".1"
5479 camera_distance=".3">
5480<!-- default to natural brown eyes-->
5481 <param_color>
5482 <value
5483 color="50, 25, 5, 255" />
5484
5485<!-- natural dark brown eyes-->
5486 <value
5487 color="109, 55, 15, 255" />
5488
5489<!-- natural brown eyes-->
5490 <value
5491 color="150, 93, 49, 255" />
5492
5493<!-- natural light brown eyes-->
5494 <value
5495 color="152, 118, 25, 255" />
5496
5497<!--natural hazel eyes-->
5498 <value
5499 color="95, 179, 107, 255" />
5500
5501<!--natural green eyes-->
5502 <value
5503 color="87, 192, 191, 255" />
5504
5505<!--natural aqua eyes-->
5506 <value
5507 color="95, 172, 179, 255" />
5508
5509<!--natural blue eyes-->
5510 <value
5511 color="128, 128, 128, 255" />
5512
5513<!--natural grey eyes-->
5514 <value
5515 color="0, 0, 0, 255" />
5516
5517<!--black eyes-->
5518 <value
5519 color="255, 255, 0, 255" />
5520
5521<!--bright yellow eyes-->
5522 <value
5523 color=" 0, 255, 0, 255" />
5524
5525<!-- bright green eyes-->
5526 <value
5527 color=" 0, 255, 255, 255" />
5528
5529<!-- bright cyan eyes-->
5530 <value
5531 color=" 0, 0, 255, 255" />
5532
5533<!--bright blue eyes-->
5534 <value
5535 color="255, 0, 255, 255" />
5536
5537<!-- bright violet eyes-->
5538 <value
5539 color="255, 0, 0, 255" />
5540
5541<!--bright red eyes-->
5542 </param_color>
5543 </param>
5544
5545 <param
5546 id="98"
5547 group="0"
5548 wearable="eyes"
5549 edit_group="eyes"
5550 edit_group_order="2"
5551 name="Eye Lightness"
5552 show_simple="true"
5553 label_min="Darker"
5554 label_max="Lighter"
5555 value_min="0"
5556 value_max="1"
5557 camera_elevation=".1"
5558 camera_distance=".3">
5559 <param_color>
5560 <value
5561 color="0, 0, 0, 0" />
5562
5563 <value
5564 color="255, 255, 255, 255" />
5565 </param_color>
5566 </param>
5567 </global_color>
5568
5569<!-- =========================================================== -->
5570 <layer_set
5571 body_region="hair"
5572 width="512"
5573 height="512"
5574 clear_alpha="false">
5575 <layer
5576 name="base"
5577 global_color="hair_color"
5578 write_all_channels="true">
5579 <texture
5580 local_texture="hair_grain" />
5581 </layer>
5582
5583 <layer
5584 name="hair texture alpha layer"
5585 visibility_mask="TRUE">
5586 <texture
5587 local_texture="hair_grain" />
5588 </layer>
5589
5590 <layer
5591 name="hair alpha"
5592 visibility_mask="TRUE">
5593 <texture
5594 local_texture="hair_alpha" />
5595 </layer>
5596 </layer_set>
5597 <!-- =========================================================== -->
5598
5599 <layer_set
5600 body_region="head"
5601 width="512"
5602 height="512">
5603 <layer
5604 name="head bump base"
5605 fixed_color = "128,128,128,255"
5606 render_pass="bump">
5607 </layer>
5608
5609 <layer
5610 name="head bump definition"
5611 render_pass="bump">
5612
5613 <texture
5614 tga_file="bump_head_base.tga"
5615 file_is_mask="FALSE"/>
5616
5617 <param
5618 id="873"
5619 group="1"
5620 wearable="skin"
5621 edit_group="driven"
5622 edit_group_order="12"
5623 name="Bump base"
5624 value_min="0"
5625 value_max="1">
5626 <param_alpha
5627 domain="0" />
5628 </param>
5629 </layer>
5630
5631 <layer
5632 name="base"
5633 global_color="skin_color">
5634 <texture
5635 tga_file="head_skingrain.tga" />
5636 </layer>
5637
5638 <layer
5639 name="headcolor">
5640 <texture
5641 tga_file="head_color.tga" />
5642 </layer>
5643
5644 <layer
5645 name="shadow">
5646 <texture
5647 tga_file="head_shading_alpha.tga"
5648 file_is_mask="TRUE" />
5649
5650 <param
5651 id="158"
5652 group="1"
5653 wearable="skin"
5654 name="Shading"
5655 value_min="0"
5656 value_max="1">
5657 <param_color>
5658 <value
5659 color="0, 0, 0, 0" />
5660
5661 <value
5662 color="0, 0, 0, 128" />
5663 </param_color>
5664 </param>
5665 </layer>
5666
5667 <layer
5668 name="highlight">
5669 <texture
5670 tga_file="head_highlights_alpha.tga"
5671 file_is_mask="TRUE" />
5672
5673
5674 <param
5675 id="159"
5676 group="1"
5677 name="Shading"
5678 wearable="skin"
5679 value_min="0"
5680 value_max="1">
5681 <param_color>
5682 <value
5683 color="255, 255, 255, 0" />
5684
5685
5686 <value
5687 color="255, 255, 255, 64" />
5688 </param_color>
5689 </param>
5690 </layer>
5691 <layer
5692 name="rosyface">
5693 <texture
5694 tga_file="rosyface_alpha.tga"
5695 file_is_mask="true" />
5696
5697 <param
5698 id="116"
5699 group="0"
5700 wearable="skin"
5701 edit_group="skin_facedetail"
5702 edit_group_order="4"
5703 name="Rosy Complexion"
5704 label_min="Less Rosy"
5705 label_max="More Rosy"
5706 value_min="0"
5707 value_max="1"
5708 camera_distance=".3"
5709 camera_elevation=".07">
5710 <param_color>
5711 <value
5712 color="198, 71, 71, 0" />
5713
5714 <value
5715 color="198, 71, 71, 255" />
5716 </param_color>
5717 </param>
5718 </layer>
5719
5720 <layer
5721 name="lips">
5722 <texture
5723 tga_file="lips_mask.tga"
5724 file_is_mask="true" />
5725
5726 <param
5727 id="117"
5728 group="0"
5729 wearable="skin"
5730 edit_group="skin_facedetail"
5731 edit_group_order="5"
5732 name="Lip Pinkness"
5733 label_min="Darker"
5734 label_max="Pinker"
5735 value_min="0"
5736 value_max="1"
5737 camera_distance=".25">
5738 <param_color>
5739 <value
5740 color="220, 115, 115, 0" />
5741
5742 <value
5743 color="220, 115, 115, 128" />
5744 </param_color>
5745 </param>
5746 </layer>
5747
5748 <layer
5749 name="wrinkles_shading"
5750 render_pass="bump"
5751 fixed_color="0,0,0,100">
5752 <param
5753 id="118"
5754 group="1"
5755 wearable="skin"
5756 name="Wrinkles"
5757 value_min="0"
5758 value_max="1">
5759 <param_alpha
5760 tga_file="bump_face_wrinkles.tga"
5761 skip_if_zero="true"
5762 domain="0.3" />
5763 </param>
5764 </layer>
5765
5766<!--<layer
5767 name="wrinkles_highlights"
5768 fixed_color="255,255,255,64">
5769 <param
5770 id="128"
5771 group="1"
5772 name="Wrinkles"
5773 value_min="0"
5774 value_max="1">
5775 <param_alpha
5776 tga_file="head_wrinkles_highlights_alpha.tga"
5777 skip_if_zero="true"
5778 domain="0.3" />
5779 </param>
5780 </layer>-->
5781 <layer
5782 name="freckles"
5783 fixed_color="120,47,20,128">
5784 <param
5785 id="165"
5786 group="0"
5787 wearable="skin"
5788 edit_group="skin_facedetail"
5789 edit_group_order="2"
5790 name="Freckles"
5791 label_min="Less"
5792 label_max="More"
5793 value_min="0"
5794 value_max="1"
5795 camera_distance=".3"
5796 camera_elevation=".07">
5797 <param_alpha
5798 tga_file="freckles_alpha.tga"
5799 skip_if_zero="true"
5800 domain="0.5" />
5801 </param>
5802 </layer>
5803 <layer
5804 name="eyebrowsbump"
5805 render_pass="bump">
5806 <texture
5807 tga_file="head_hair.tga"
5808 file_is_mask="false" />
5809
5810 <param
5811 id="1000"
5812 group="1"
5813 wearable="hair"
5814 edit_group="driven"
5815 name="Eyebrow Size Bump"
5816 value_min="0"
5817 value_max="1">
5818 <param_alpha
5819 tga_file="eyebrows_alpha.tga"
5820 domain="0.1" />
5821 </param>
5822
5823 <param
5824 id="1002"
5825 group="1"
5826 wearable="hair"
5827 edit_group="driven"
5828 name="Eyebrow Density Bump"
5829 value_min="0"
5830 value_max="1">
5831 <param_color>
5832 <value
5833 color="255,255,255,0" />
5834
5835 <value
5836 color="255,255,255,255" />
5837 </param_color>
5838 </param>
5839 </layer>
5840
5841 <layer
5842 name="eyebrows"
5843 global_color="hair_color">
5844 <texture
5845 tga_file="head_hair.tga"
5846 file_is_mask="false" />
5847
5848 <param
5849 id="1001"
5850 group="1"
5851 wearable="hair"
5852 edit_group="hair_eyebrows"
5853 name="Eyebrow Size"
5854 show_simple="true"
5855 value_min="0"
5856 value_max="1"
5857 value_default="0.5">
5858 <param_alpha
5859 tga_file="eyebrows_alpha.tga"
5860 domain="0.1" />
5861 </param>
5862
5863 <param
5864 id="1003"
5865 group="1"
5866 edit_group="driven"
5867 name="Eyebrow Density"
5868 value_min="0"
5869 value_max="1">
5870 <param_color
5871 operation="multiply">
5872 <value
5873 color="255,255,255,0" />
5874
5875 <value
5876 color="255,255,255,255" />
5877 </param_color>
5878 </param>
5879 </layer>
5880
5881 <layer
5882 name="lipstick">
5883 <param
5884 id="700"
5885 group="0"
5886 wearable="skin"
5887 edit_group="skin_makeup"
5888 edit_group_order="2"
5889 name="Lipstick Color"
5890 label_min="Pink"
5891 label_max="Black"
5892 value_min="0"
5893 value_max="1"
5894 value_default=".25"
5895 camera_distance=".25">
5896 <param_color>
5897 <value
5898 color="245,161,177,200" />
5899
5900 <value
5901 color="216,37,67,200" />
5902
5903 <value
5904 color="178,48,76,200" />
5905
5906 <value
5907 color="68,0,11,200" />
5908
5909 <value
5910 color="252,207,184,200" />
5911
5912 <value
5913 color="241,136,106,200" />
5914
5915 <value
5916 color="208,110,85,200" />
5917
5918 <value
5919 color="106,28,18,200" />
5920
5921 <value
5922 color="58,26,49,200" />
5923
5924 <value
5925 color="14,14,14,200" />
5926 </param_color>
5927 </param>
5928
5929 <param
5930 id="701"
5931 group="0"
5932 wearable="skin"
5933 edit_group="skin_makeup"
5934 edit_group_order="1"
5935 name="Lipstick"
5936 label_min="No Lipstick"
5937 label_max="More Lipstick"
5938 value_min="0"
5939 value_max=".9"
5940 value_default="0.0"
5941 camera_distance=".25">
5942 <param_alpha
5943 tga_file="lipstick_alpha.tga"
5944 skip_if_zero="true"
5945 domain="0.05" />
5946 </param>
5947 </layer>
5948
5949 <layer
5950 name="lipgloss"
5951 fixed_color="255,255,255,190">
5952 <param
5953 id="702"
5954 name="Lipgloss"
5955 label_min="No Lipgloss"
5956 label_max="Glossy"
5957 wearable="skin"
5958 edit_group="skin_makeup"
5959 edit_group_order="3"
5960 group="0"
5961 value_min="0"
5962 value_max="1"
5963 camera_distance=".25">
5964 <param_alpha
5965 tga_file="lipgloss_alpha.tga"
5966 skip_if_zero="true"
5967 domain="0.2" />
5968 </param>
5969 </layer>
5970
5971 <layer
5972 name="blush">
5973 <param
5974 id="704"
5975 group="0"
5976 wearable="skin"
5977 edit_group="skin_makeup"
5978 edit_group_order="4"
5979 name="Blush"
5980 label_min="No Blush"
5981 label_max="More Blush"
5982 value_min="0"
5983 value_max=".9"
5984 value_default="0"
5985 camera_distance=".3"
5986 camera_elevation=".07"
5987 camera_angle="20">
5988 <param_alpha
5989 tga_file="blush_alpha.tga"
5990 skip_if_zero="true"
5991 domain="0.3" />
5992 </param>
5993
5994 <param
5995 id="705"
5996 group="0"
5997 wearable="skin"
5998 edit_group="skin_makeup"
5999 edit_group_order="5"
6000 name="Blush Color"
6001 label_min="Pink"
6002 label_max="Orange"
6003 value_min="0"
6004 value_max="1"
6005 value_default=".5"
6006 camera_distance=".3"
6007 camera_elevation=".07"
6008 camera_angle="20">
6009 <param_color>
6010 <value
6011 color="253,162,193,200" />
6012
6013 <value
6014 color="247,131,152,200" />
6015
6016 <value
6017 color="213,122,140,200" />
6018
6019 <value
6020 color="253,152,144,200" />
6021
6022 <value
6023 color="236,138,103,200" />
6024
6025 <value
6026 color="195,128,122,200" />
6027
6028 <value
6029 color="148,103,100,200" />
6030
6031 <value
6032 color="168,95,62,200" />
6033 </param_color>
6034 </param>
6035
6036 <param
6037 id="711"
6038 group="0"
6039 wearable="skin"
6040 edit_group="skin_makeup"
6041 edit_group_order="6"
6042 name="Blush Opacity"
6043 label_min="Clear"
6044 label_max="Opaque"
6045 value_min="0"
6046 value_max="1"
6047 value_default=".5"
6048 camera_distance=".3"
6049 camera_elevation=".07"
6050 camera_angle="20">
6051 <param_color
6052 operation="multiply">
6053 <value
6054 color="255,255,255,0" />
6055
6056 <value
6057 color="255,255,255,255" />
6058 </param_color>
6059 </param>
6060 </layer>
6061
6062 <layer
6063 name="Outer Eye Shadow">
6064 <param
6065 id="708"
6066 group="0"
6067 wearable="skin"
6068 edit_group="skin_makeup"
6069 edit_group_order="11"
6070 name="Out Shdw Color"
6071 label_min="Light"
6072 label_max="Dark"
6073 value_min="0"
6074 value_max="1"
6075 camera_distance=".3"
6076 camera_elevation=".14">
6077 <param_color>
6078 <value
6079 color="252,247,246,255" />
6080
6081 <value
6082 color="255,206,206,255" />
6083
6084 <value
6085 color="233,135,149,255" />
6086
6087 <value
6088 color="220,168,192,255" />
6089
6090 <value
6091 color="228,203,232,255" />
6092
6093 <value
6094 color="255,234,195,255" />
6095
6096 <value
6097 color="230,157,101,255" />
6098
6099 <value
6100 color="255,147,86,255" />
6101
6102 <value
6103 color="228,110,89,255" />
6104
6105 <value
6106 color="228,150,120,255" />
6107
6108 <value
6109 color="223,227,213,255" />
6110
6111 <value
6112 color="96,116,87,255" />
6113
6114 <value
6115 color="88,143,107,255" />
6116
6117 <value
6118 color="194,231,223,255" />
6119
6120 <value
6121 color="207,227,234,255" />
6122
6123 <value
6124 color="41,171,212,255" />
6125
6126 <value
6127 color="180,137,130,255" />
6128
6129 <value
6130 color="173,125,105,255" />
6131
6132 <value
6133 color="144,95,98,255" />
6134
6135 <value
6136 color="115,70,77,255" />
6137
6138 <value
6139 color="155,78,47,255" />
6140
6141 <value
6142 color="239,239,239,255" />
6143
6144 <value
6145 color="194,194,194,255" />
6146
6147 <value
6148 color="120,120,120,255" />
6149
6150 <value
6151 color="10,10,10,255" />
6152 </param_color>
6153 </param>
6154
6155 <param
6156 id="706"
6157 group="0"
6158 wearable="skin"
6159 edit_group="skin_makeup"
6160 edit_group_order="12"
6161 name="Out Shdw Opacity"
6162 label_min="Clear"
6163 label_max="Opaque"
6164 value_min=".2"
6165 value_max="1"
6166 value_default=".6"
6167 camera_distance=".3"
6168 camera_elevation=".14">
6169 <param_color
6170 operation="multiply">
6171 <value
6172 color="255,255,255,0" />
6173
6174 <value
6175 color="255,255,255,255" />
6176 </param_color>
6177 </param>
6178
6179 <param
6180 id="707"
6181 group="0"
6182 wearable="skin"
6183 edit_group="skin_makeup"
6184 edit_group_order="10"
6185 name="Outer Shadow"
6186 label_min="No Eyeshadow"
6187 label_max="More Eyeshadow"
6188 value_min="0"
6189 value_max=".7"
6190 camera_distance=".3"
6191 camera_elevation=".14">
6192 <param_alpha
6193 tga_file="eyeshadow_outer_alpha.tga"
6194 skip_if_zero="true"
6195 domain="0.05" />
6196 </param>
6197 </layer>
6198
6199 <layer
6200 name="Inner Eye Shadow">
6201 <param
6202 id="712"
6203 group="0"
6204 wearable="skin"
6205 edit_group="skin_makeup"
6206 edit_group_order="8"
6207 name="In Shdw Color"
6208 label_min="Light"
6209 label_max="Dark"
6210 value_min="0"
6211 value_max="1"
6212 camera_distance=".3"
6213 camera_elevation=".14">
6214 <param_color>
6215 <value
6216 color="252,247,246,255" />
6217
6218 <value
6219 color="255,206,206,255" />
6220
6221 <value
6222 color="233,135,149,255" />
6223
6224 <value
6225 color="220,168,192,255" />
6226
6227 <value
6228 color="228,203,232,255" />
6229
6230 <value
6231 color="255,234,195,255" />
6232
6233 <value
6234 color="230,157,101,255" />
6235
6236 <value
6237 color="255,147,86,255" />
6238
6239 <value
6240 color="228,110,89,255" />
6241
6242 <value
6243 color="228,150,120,255" />
6244
6245 <value
6246 color="223,227,213,255" />
6247
6248 <value
6249 color="96,116,87,255" />
6250
6251 <value
6252 color="88,143,107,255" />
6253
6254 <value
6255 color="194,231,223,255" />
6256
6257 <value
6258 color="207,227,234,255" />
6259
6260 <value
6261 color="41,171,212,255" />
6262
6263 <value
6264 color="180,137,130,255" />
6265
6266 <value
6267 color="173,125,105,255" />
6268
6269 <value
6270 color="144,95,98,255" />
6271
6272 <value
6273 color="115,70,77,255" />
6274
6275 <value
6276 color="155,78,47,255" />
6277
6278 <value
6279 color="239,239,239,255" />
6280
6281 <value
6282 color="194,194,194,255" />
6283
6284 <value
6285 color="120,120,120,255" />
6286
6287 <value
6288 color="10,10,10,255" />
6289 </param_color>
6290 </param>
6291
6292 <param
6293 id="713"
6294 group="0"
6295 wearable="skin"
6296 edit_group="skin_makeup"
6297 edit_group_order="9"
6298 name="In Shdw Opacity"
6299 label_min="Clear"
6300 label_max="Opaque"
6301 value_min=".2"
6302 value_max="1"
6303 value_default=".7"
6304 camera_distance=".3"
6305 camera_elevation=".14">
6306 <param_color
6307 operation="multiply">
6308 <value
6309 color="255,255,255,0" />
6310
6311 <value
6312 color="255,255,255,255" />
6313 </param_color>
6314 </param>
6315
6316 <param
6317 id="709"
6318 group="0"
6319 wearable="skin"
6320 edit_group="skin_makeup"
6321 edit_group_order="7"
6322 name="Inner Shadow"
6323 label_min="No Eyeshadow"
6324 label_max="More Eyeshadow"
6325 value_min="0"
6326 value_max="1"
6327 value_default="0"
6328 camera_distance=".3"
6329 camera_elevation=".14">
6330 <param_alpha
6331 tga_file="eyeshadow_inner_alpha.tga"
6332 skip_if_zero="true"
6333 domain="0.2" />
6334 </param>
6335 </layer>
6336
6337 <layer
6338 name="eyeliner"
6339 fixed_color="0,0,0,200">
6340 <param
6341 id="703"
6342 group="0"
6343 wearable="skin"
6344 edit_group="skin_makeup"
6345 edit_group_order="13"
6346 name="Eyeliner"
6347 label_min="No Eyeliner"
6348 label_max="Full Eyeliner"
6349 value_min="0"
6350 value_max="1"
6351 value_default="0.0"
6352 camera_distance=".3"
6353 camera_elevation=".14">
6354 <param_alpha
6355 tga_file="eyeliner_alpha.tga"
6356 skip_if_zero="true"
6357 domain="0.1" />
6358 </param>
6359
6360 <param
6361 id="714"
6362 group="0"
6363 wearable="skin"
6364 edit_group="skin_makeup"
6365 edit_group_order="14"
6366 name="Eyeliner Color"
6367 label_min="Dark Green"
6368 label_max="Black"
6369 value_min="0"
6370 value_max="1"
6371 camera_distance=".3"
6372 camera_elevation=".14">
6373 <param_color>
6374 <value
6375 color="24,98,40,250" />
6376
6377<!-- dark green -->
6378 <value
6379 color="9,100,127,250" />
6380
6381<!-- lt.aqua blue -->
6382 <value
6383 color="61,93,134,250" />
6384
6385<!-- aqua -->
6386 <value
6387 color="70,29,27,250" />
6388
6389<!-- dark brown -->
6390 <value
6391 color="115,75,65,250" />
6392
6393<!-- lt. brown blue -->
6394 <value
6395 color="100,100,100,250" />
6396
6397<!-- grey -->
6398 <value
6399 color="91,80,74,250" />
6400
6401<!-- grey/brown -->
6402 <value
6403 color="112,42,76,250" />
6404
6405<!-- plum -->
6406 <value
6407 color="14,14,14,250" />
6408
6409<!-- black -->
6410 </param_color>
6411 </param>
6412 </layer>
6413
6414 <layer
6415 name="facialhair bump"
6416 render_pass="bump">
6417 <texture
6418 tga_file="head_hair.tga"
6419 file_is_mask="false" />
6420
6421 <param
6422 id="1004"
6423 sex="male"
6424 group="1"
6425 wearable="hair"
6426 edit_group="driven"
6427 name="Sideburns bump"
6428 value_min="0"
6429 value_max="1">
6430 <param_alpha
6431 tga_file="facehair_sideburns_alpha.tga"
6432 skip_if_zero="true"
6433 domain="0.05" />
6434 </param>
6435
6436 <param
6437 id="1006"
6438 sex="male"
6439 group="1"
6440 wearable="hair"
6441 edit_group="driven"
6442 name="Moustache bump"
6443 value_min="0"
6444 value_max="1">
6445 <param_alpha
6446 tga_file="facehair_moustache_alpha.tga"
6447 skip_if_zero="true"
6448 domain="0.05" />
6449 </param>
6450
6451 <param
6452 id="1008"
6453 sex="male"
6454 group="1"
6455 wearable="hair"
6456 edit_group="driven"
6457 name="Soulpatch bump"
6458 value_min="0"
6459 value_max="1">
6460 <param_alpha
6461 tga_file="facehair_soulpatch_alpha.tga"
6462 skip_if_zero="true"
6463 domain="0.1" />
6464 </param>
6465
6466 <param
6467 id="1010"
6468 sex="male"
6469 group="1"
6470 edit_group="driven"
6471 wearable="hair"
6472 name="Chin Curtains bump"
6473 value_min="0"
6474 value_max="1">
6475 <param_alpha
6476 tga_file="facehair_chincurtains_alpha.tga"
6477 skip_if_zero="true"
6478 domain="0.03" />
6479 </param>
6480
6481 <param
6482 id="1012"
6483 group="1"
6484 sex="male"
6485 wearable="hair"
6486 edit_group="driven"
6487 name="5 O'Clock Shadow bump"
6488 value_min="0"
6489 value_max="1">
6490 <param_color>
6491 <value
6492 color="255,255,255,255" />
6493
6494 <value
6495 color="255,255,255,0" />
6496 </param_color>
6497 </param>
6498 </layer>
6499
6500 <layer
6501 name="facialhair"
6502 global_color="hair_color">
6503 <morph_mask
6504 morph_name="Displace_Hair_Facial" />
6505
6506 <texture
6507 tga_file="head_hair.tga"
6508 file_is_mask="false" />
6509
6510 <param
6511 id="1005"
6512 sex="male"
6513 group="1"
6514 edit_group="driven"
6515 name="Sideburns"
6516 value_min="0"
6517 value_max="1">
6518 <param_alpha
6519 tga_file="facehair_sideburns_alpha.tga"
6520 skip_if_zero="true"
6521 domain="0.05" />
6522 </param>
6523
6524 <param
6525 id="1007"
6526 sex="male"
6527 group="1"
6528 edit_group="driven"
6529 name="Moustache"
6530 value_min="0"
6531 value_max="1">
6532 <param_alpha
6533 tga_file="facehair_moustache_alpha.tga"
6534 skip_if_zero="true"
6535 domain="0.05" />
6536 </param>
6537
6538 <param
6539 id="1009"
6540 sex="male"
6541 group="1"
6542 edit_group="driven"
6543 name="Soulpatch"
6544 value_min="0"
6545 value_max="1">
6546 <param_alpha
6547 tga_file="facehair_soulpatch_alpha.tga"
6548 skip_if_zero="true"
6549 domain="0.1" />
6550 </param>
6551
6552 <param
6553 id="1011"
6554 sex="male"
6555 group="1"
6556 edit_group="driven"
6557 name="Chin Curtains"
6558 value_min="0"
6559 value_max="1">
6560 <param_alpha
6561 tga_file="facehair_chincurtains_alpha.tga"
6562 skip_if_zero="true"
6563 domain="0.03" />
6564 </param>
6565
6566 <param
6567 id="751"
6568 group="1"
6569 wearable="hair"
6570 sex="male"
6571 edit_group="hair_facial"
6572 name="5 O'Clock Shadow"
6573 label_min="Dense hair"
6574 label_max="Shadow hair"
6575 value_min="0"
6576 value_max="1"
6577 value_default="0.7"
6578 camera_elevation=".1"
6579 camera_distance=".3">
6580 <param_color
6581 operation="multiply">
6582 <value
6583 color="255,255,255,255" />
6584
6585 <value
6586 color="255,255,255,30" />
6587 </param_color>
6588 </param>
6589 </layer>
6590
6591 <layer
6592 name="head_bodypaint">
6593 <texture
6594 local_texture="head_bodypaint" />
6595 </layer>
6596 <layer
6597 name="eyelash alpha"
6598 visibility_mask="TRUE">
6599 <texture
6600 tga_file="head_alpha.tga"
6601 file_is_mask="TRUE" />
6602 </layer>
6603 <layer
6604 name="head alpha"
6605 visibility_mask="TRUE">
6606 <texture
6607 local_texture="head_alpha" />
6608 </layer>
6609 <layer
6610 name="head_tattoo">
6611 <texture local_texture="head_tattoo" />
6612 <param id="1062" group="1" edit_group="colorpicker_driven" wearable="tattoo"
6613 name="tattoo_head_red" value_min="0" value_max="1" value_default="1">
6614 <param_color>
6615 <value color="0, 0, 0, 255" />
6616 <value color="255, 0, 0, 255" />
6617 </param_color>
6618 </param>
6619
6620 <param id="1063" group="1" edit_group="colorpicker_driven" wearable="tattoo"
6621 name="tattoo_head_green" value_min="0" value_max="1" value_default="1">
6622 <param_color>
6623 <value color="0, 0, 0, 255" />
6624 <value color="0, 255, 0, 255" />
6625 </param_color>
6626 </param>
6627
6628 <param id="1064" group="1" edit_group="colorpicker_driven" wearable="tattoo"
6629 name="tattoo_head_blue" value_min="0" value_max="1" value_default="1">
6630 <param_color>
6631 <value color="0, 0, 0, 255" />
6632 <value color="0, 0, 255, 255" />
6633 </param_color>
6634 </param>
6635 </layer>
6636</layer_set>
6637
6638<!-- =========================================================== -->
6639 <layer_set
6640 body_region="upper_body"
6641 width="512"
6642 height="512">
6643 <layer
6644 name="base_upperbody bump"
6645 render_pass="bump"
6646 fixed_color="128,128,128,255">
6647 </layer>
6648 <layer
6649 name="upperbody bump definition"
6650 render_pass="bump">
6651 <texture
6652 tga_file="bump_upperbody_base.tga"
6653 file_is_mask="FALSE"/>
6654
6655 <param
6656 id="874"
6657 group="1"
6658 wearable="skin"
6659 edit_group="driven"
6660 edit_group_order="20"
6661 name="Bump upperdef"
6662 value_min="0"
6663 value_max="1">
6664 <param_alpha
6665 domain="0" />
6666 </param>
6667 </layer>
6668
6669 <layer
6670 name="base"
6671 global_color="skin_color">
6672 <texture
6673 tga_file="body_skingrain.tga" />
6674 </layer>
6675
6676 <layer
6677 name="nipples">
6678 <texture
6679 tga_file="upperbody_color.tga" />
6680 </layer>
6681
6682 <layer
6683 name="shadow">
6684 <texture
6685 tga_file="upperbody_shading_alpha.tga"
6686 file_is_mask="TRUE" />
6687
6688 <param
6689 id="125"
6690 group="1"
6691 name="Shading"
6692 wearable="skin"
6693 value_min="0"
6694 value_max="1">
6695 <param_color>
6696 <value
6697 color="0, 0, 0, 0" />
6698
6699 <value
6700 color="0, 0, 0, 128" />
6701 </param_color>
6702 </param>
6703 </layer>
6704
6705 <layer
6706 name="highlight">
6707 <texture
6708 tga_file="upperbody_highlights_alpha.tga"
6709 file_is_mask="TRUE" />
6710
6711 <param
6712 id="126"
6713 group="1"
6714 wearable="skin"
6715 name="Shading"
6716 value_min="0"
6717 value_max="1">
6718 <param_color>
6719 <value
6720 color="255, 255, 255, 0" />
6721
6722 <value
6723 color="255, 255, 255, 64" />
6724 </param_color>
6725 </param>
6726 </layer>
6727
6728 <layer
6729 name="upper_bodypaint">
6730 <texture
6731 local_texture="upper_bodypaint" />
6732 </layer>
6733
6734 <layer
6735 name="freckles upper"
6736 fixed_color="120,47,20,128">
6737 <param
6738 id="776"
6739 group="1"
6740 name="freckles upper"
6741 wearable="skin"
6742 value_min="0"
6743 value_max="1">
6744 <param_alpha
6745 tga_file="upperbodyfreckles_alpha.tga"
6746 skip_if_zero="true"
6747 domain="0.6" />
6748 </param>
6749 </layer>
6750
6751 <layer name="upper_tattoo">
6752 <texture local_texture="upper_tattoo" />
6753 <param id="1065" group="1" edit_group="colorpicker_driven" wearable="tattoo"
6754 name="tattoo_upper_red" value_min="0" value_max="1" value_default="1">
6755 <param_color>
6756 <value color="0, 0, 0, 255" />
6757 <value color="255, 0, 0, 255" />
6758 </param_color>
6759 </param>
6760
6761 <param id="1066" group="1" edit_group="colorpicker_driven" wearable="tattoo"
6762 name="tattoo_upper_green" value_min="0" value_max="1" value_default="1">
6763 <param_color>
6764 <value color="0, 0, 0, 255" />
6765 <value color="0, 255, 0, 255" />
6766 </param_color>
6767 </param>
6768
6769 <param id="1067" group="1" edit_group="colorpicker_driven" wearable="tattoo"
6770 name="tattoo_upper_blue" value_min="0" value_max="1" value_default="1">
6771 <param_color>
6772 <value color="0, 0, 0, 255" />
6773 <value color="0, 0, 255, 255" />
6774 </param_color>
6775 </param>
6776 </layer>
6777
6778 <layer
6779 name="upper_undershirt bump"
6780 render_pass="bump"
6781 fixed_color="128,128,128,255">
6782 <texture
6783 local_texture="upper_undershirt"
6784 local_texture_alpha_only="true" />
6785
6786 <param
6787 id="1043"
6788 group="1"
6789 wearable="undershirt"
6790 edit_group="driven"
6791 name="Sleeve Length bump"
6792 value_min=".01"
6793 value_max="1"
6794 value_default=".4">
6795 <param_alpha
6796 tga_file="shirt_sleeve_alpha.tga"
6797 multiply_blend="false"
6798 domain="0.01" />
6799 </param>
6800
6801 <param
6802 id="1045"
6803 group="1"
6804 wearable="undershirt"
6805 edit_group="undershirt"
6806 edit_group_order="2"
6807 name="Bottom bump"
6808 value_min="0"
6809 value_max="1"
6810 value_default=".8">
6811 <param_alpha
6812 tga_file="shirt_bottom_alpha.tga"
6813 multiply_blend="true"
6814 domain="0.05" />
6815 </param>
6816
6817 <param
6818 id="1047"
6819 group="1"
6820 wearable="undershirt"
6821 edit_group="driven"
6822 name="Collar Front bump"
6823 value_min="0"
6824 value_max="1"
6825 value_default=".8">
6826 <param_alpha
6827 tga_file="shirt_collar_alpha.tga"
6828 multiply_blend="true"
6829 domain="0.05" />
6830 </param>
6831
6832 <param
6833 id="1049"
6834 group="1"
6835 wearable="undershirt"
6836 edit_group="driven"
6837 name="Collar Back bump"
6838 value_min="0"
6839 value_max="1"
6840 value_default=".8">
6841 <param_alpha
6842 tga_file="shirt_collar_back_alpha.tga"
6843 multiply_blend="true"
6844 domain="0.05" />
6845 </param>
6846 </layer>
6847
6848 <layer
6849 name="upper_undershirt">
6850 <texture
6851 local_texture="upper_undershirt" />
6852
6853 <param
6854 id="821"
6855 group="0"
6856 wearable="undershirt"
6857 edit_group="colorpicker"
6858 name="undershirt_red"
6859 value_min="0"
6860 value_max="1"
6861 value_default="1">
6862 <param_color>
6863 <value
6864 color="0, 0, 0, 255" />
6865
6866 <value
6867 color="255, 0, 0, 255" />
6868 </param_color>
6869 </param>
6870
6871 <param
6872 id="822"
6873 group="0"
6874 wearable="undershirt"
6875 edit_group="colorpicker"
6876 name="undershirt_green"
6877 value_min="0"
6878 value_max="1"
6879 value_default="1">
6880 <param_color>
6881 <value
6882 color="0, 0, 0, 255" />
6883
6884 <value
6885 color="0, 255, 0, 255" />
6886 </param_color>
6887 </param>
6888
6889 <param
6890 id="823"
6891 group="0"
6892 wearable="undershirt"
6893 edit_group="colorpicker"
6894 name="undershirt_blue"
6895 value_min="0"
6896 value_max="1"
6897 value_default="1">
6898 <param_color>
6899 <value
6900 color="0, 0, 0, 255" />
6901
6902 <value
6903 color="0, 0, 255, 255" />
6904 </param_color>
6905 </param>
6906
6907 <param
6908 id="1042"
6909 group="1"
6910 wearable="undershirt"
6911 edit_group="driven"
6912 name="Sleeve Length"
6913 value_min=".01"
6914 value_max="1"
6915 value_default=".4">
6916 <param_alpha
6917 tga_file="shirt_sleeve_alpha.tga"
6918 multiply_blend="false"
6919 domain="0.01" />
6920 </param>
6921
6922 <param
6923 id="1044"
6924 group="1"
6925 wearable="undershirt"
6926 edit_group="driven"
6927 name="Bottom"
6928 value_min="0"
6929 value_max="1"
6930 value_default=".8">
6931 <param_alpha
6932 tga_file="shirt_bottom_alpha.tga"
6933 multiply_blend="true"
6934 domain="0.05" />
6935 </param>
6936
6937 <param
6938 id="1046"
6939 group="1"
6940 wearable="undershirt"
6941 edit_group="driven"
6942 name="Collar Front"
6943 value_min="0"
6944 value_max="1"
6945 value_default=".8">
6946 <param_alpha
6947 tga_file="shirt_collar_alpha.tga"
6948 multiply_blend="true"
6949 domain="0.05" />
6950 </param>
6951
6952 <param
6953 id="1048"
6954 group="1"
6955 wearable="undershirt"
6956 edit_group="driven"
6957 name="Collar Back"
6958 label_min="Low"
6959 label_max="High"
6960 value_min="0"
6961 value_max="1"
6962 value_default=".8">
6963 <param_alpha
6964 tga_file="shirt_collar_back_alpha.tga"
6965 multiply_blend="true"
6966 domain="0.05" />
6967 </param>
6968 </layer>
6969
6970 <layer
6971 name="Nail Polish">
6972 <param
6973 id="710"
6974 group="0"
6975 wearable="skin"
6976 edit_group="skin_makeup"
6977 edit_group_order="15"
6978 name="Nail Polish"
6979 label_min="No Polish"
6980 label_max="Painted Nails"
6981 value_min="0"
6982 value_max="1"
6983 value_default="0.0"
6984 camera_distance="1.6"
6985 camera_elevation="-.4"
6986 camera_angle="70">
6987 <param_alpha
6988 tga_file="nailpolish_alpha.tga"
6989 skip_if_zero="true"
6990 domain="0.1" />
6991 </param>
6992
6993 <param
6994 id="715"
6995 group="0"
6996 wearable="skin"
6997 edit_group="skin_makeup"
6998 edit_group_order="16"
6999 name="Nail Polish Color"
7000 label_min="Pink"
7001 label_max="Black"
7002 value_min="0"
7003 value_max="1"
7004 camera_distance="1.6"
7005 camera_elevation="-.4"
7006 camera_angle="70">
7007 <param_color>
7008 <value
7009 color="255,187,200,255" />
7010
7011 <value
7012 color="194,102,127,255" />
7013
7014 <value
7015 color="227,34,99,255" />
7016
7017 <value
7018 color="168,41,60,255" />
7019
7020 <value
7021 color="97,28,59,255" />
7022
7023 <value
7024 color="234,115,93,255" />
7025
7026 <value
7027 color="142,58,47,255" />
7028
7029 <value
7030 color="114,30,46,255" />
7031
7032 <value
7033 color="14,14,14,255" />
7034 </param_color>
7035 </param>
7036 </layer>
7037
7038 <layer
7039 name="upper_gloves bump"
7040 render_pass="bump"
7041 fixed_color="128,128,128,255">
7042 <texture
7043 local_texture="upper_gloves"
7044 local_texture_alpha_only="true" />
7045
7046 <param
7047 id="1059"
7048 group="1"
7049 wearable="gloves"
7050 edit_group="driven"
7051 name="Glove Length bump"
7052 value_min=".01"
7053 value_max="1"
7054 value_default=".8">
7055 <param_alpha
7056 tga_file="glove_length_alpha.tga"
7057 domain="0.01" />
7058 </param>
7059
7060 <param
7061 id="1061"
7062 group="1"
7063 wearable="gloves"
7064 edit_group="driven"
7065 name="Glove Fingers bump"
7066 value_min=".01"
7067 value_max="1"
7068 value_default="1">
7069 <param_alpha
7070 tga_file="gloves_fingers_alpha.tga"
7071 multiply_blend="true"
7072 domain="0.01" />
7073 </param>
7074 </layer>
7075
7076 <layer
7077 name="upper_gloves">
7078 <texture
7079 local_texture="upper_gloves" />
7080
7081 <param
7082 id="827"
7083 group="0"
7084 wearable="gloves"
7085 edit_group="colorpicker"
7086 name="gloves_red"
7087 value_min="0"
7088 value_max="1"
7089 value_default="1">
7090 <param_color>
7091 <value
7092 color="0, 0, 0, 255" />
7093
7094 <value
7095 color="255, 0, 0, 255" />
7096 </param_color>
7097 </param>
7098
7099 <param
7100 id="829"
7101 group="0"
7102 wearable="gloves"
7103 edit_group="colorpicker"
7104 name="gloves_green"
7105 value_min="0"
7106 value_max="1"
7107 value_default="1">
7108 <param_color>
7109 <value
7110 color="0, 0, 0, 255" />
7111
7112 <value
7113 color="0, 255, 0, 255" />
7114 </param_color>
7115 </param>
7116
7117 <param
7118 id="830"
7119 group="0"
7120 wearable="gloves"
7121 edit_group="colorpicker"
7122 name="gloves_blue"
7123 value_min="0"
7124 value_max="1"
7125 value_default="1">
7126 <param_color>
7127 <value
7128 color="0, 0, 0, 255" />
7129
7130 <value
7131 color="0, 0, 255, 255" />
7132 </param_color>
7133 </param>
7134
7135 <param
7136 id="1058"
7137 group="1"
7138 wearable="gloves"
7139 edit_group="driven"
7140 name="Glove Length"
7141 value_min=".01"
7142 value_max="1"
7143 value_default=".8">
7144 <param_alpha
7145 tga_file="glove_length_alpha.tga"
7146 domain="0.01" />
7147 </param>
7148
7149 <param
7150 id="1060"
7151 group="1"
7152 wearable="gloves"
7153 edit_group="driven"
7154 name="Glove Fingers"
7155 value_min=".01"
7156 value_max="1"
7157 value_default="1">
7158 <param_alpha
7159 tga_file="gloves_fingers_alpha.tga"
7160 multiply_blend="true"
7161 domain="0.01" />
7162 </param>
7163 </layer>
7164
7165 <layer
7166 name="upper_clothes_shadow">
7167 <texture
7168 local_texture="upper_shirt" />
7169
7170 <param
7171 id="899"
7172 group="1"
7173 edit_group="driven"
7174 wearable="shirt"
7175 name="Upper Clothes Shading"
7176 value_min="0"
7177 value_max="1"
7178 value_default="0">
7179 <param_color>
7180 <value
7181 color="0, 0, 0, 0" />
7182
7183 <value
7184 color="0, 0, 0, 80" />
7185 </param_color>
7186 </param>
7187
7188 <param
7189 id="900"
7190 group="1"
7191 wearable="shirt"
7192 edit_group="driven"
7193 name="Sleeve Length Shadow"
7194 value_min="0.02"
7195 value_max=".87"
7196 value_default="0.02">
7197 <param_alpha
7198 multiply_blend="false"
7199 tga_file="shirt_sleeve_alpha.tga"
7200 skip_if_zero="true"
7201 domain="0.03" />
7202 </param>
7203
7204 <param
7205 id="901"
7206 group="1"
7207 wearable="shirt"
7208 edit_group="driven"
7209 name="Shirt Shadow Bottom"
7210 value_min="0.02"
7211 value_max="1">
7212 <param_alpha
7213 multiply_blend="true"
7214 tga_file="shirt_bottom_alpha.tga"
7215 skip_if_zero="true"
7216 domain="0.05" />
7217 </param>
7218
7219 <param
7220 id="902"
7221 group="1"
7222 wearable="shirt"
7223 edit_group="driven"
7224 name="Collar Front Shadow Height"
7225 value_min="0.02"
7226 value_max="1">
7227 <param_alpha
7228 multiply_blend="true"
7229 tga_file="shirt_collar_alpha.tga"
7230 skip_if_zero="true"
7231 domain="0.02" />
7232 </param>
7233
7234 <param
7235 id="903"
7236 group="1"
7237 wearable="shirt"
7238 edit_group="driven"
7239 name="Collar Back Shadow Height"
7240 value_min="0.02"
7241 value_max="1">
7242 <param_alpha
7243 multiply_blend="true"
7244 tga_file="shirt_collar_back_alpha.tga"
7245 skip_if_zero="true"
7246 domain="0.02" />
7247 </param>
7248 </layer>
7249
7250 <layer
7251 name="upper_shirt base bump"
7252 render_pass="bump"
7253 fixed_color="128,128,128,255">
7254 <texture
7255 local_texture="upper_shirt"
7256 local_texture_alpha_only="true" />
7257
7258 <param
7259 id="1029"
7260 group="1"
7261 wearable="shirt"
7262 edit_group="driven"
7263 name="Sleeve Length Cloth"
7264 value_min="0"
7265 value_max="0.85">
7266 <param_alpha
7267 multiply_blend="false"
7268 tga_file="shirt_sleeve_alpha.tga"
7269 domain="0.01" />
7270 </param>
7271
7272 <param
7273 id="1030"
7274 group="1"
7275 wearable="shirt"
7276 edit_group="driven"
7277 name="Shirt Bottom Cloth"
7278 value_min="0"
7279 value_max="1">
7280 <param_alpha
7281 multiply_blend="true"
7282 tga_file="shirt_bottom_alpha.tga"
7283 domain="0.05" />
7284 </param>
7285
7286 <param
7287 id="1031"
7288 group="1"
7289 wearable="shirt"
7290 edit_group="driven"
7291 name="Collar Front Height Cloth"
7292 value_min="0"
7293 value_max="1">
7294 <param_alpha
7295 multiply_blend="true"
7296 tga_file="shirt_collar_alpha.tga"
7297 domain="0.05" />
7298 </param>
7299
7300 <param
7301 id="1032"
7302 group="1"
7303 wearable="shirt"
7304 edit_group="driven"
7305 name="Collar Back Height Cloth"
7306 value_min="0"
7307 value_max="1">
7308 <param_alpha
7309 multiply_blend="true"
7310 tga_file="shirt_collar_back_alpha.tga"
7311 domain="0.05" />
7312 </param>
7313 </layer>
7314
7315 <layer
7316 name="upper_clothes bump"
7317 render_pass="bump">
7318 <texture
7319 tga_file="bump_shirt_wrinkles.tga" />
7320
7321 <texture
7322 local_texture="upper_shirt"
7323 local_texture_alpha_only="true" />
7324
7325 <param
7326 id="868"
7327 group="0"
7328 wearable="shirt"
7329 edit_group="shirt"
7330 edit_group_order="8"
7331 name="Shirt Wrinkles"
7332 value_min="0"
7333 value_max="1"
7334 value_default="0">
7335 <param_color>
7336 <value
7337 color="255, 255, 255, 0" />
7338
7339 <value
7340 color="255, 255, 255, 255" />
7341 </param_color>
7342 </param>
7343
7344 <param
7345 id="1013"
7346 group="1"
7347 wearable="shirt"
7348 edit_group="driven"
7349 name="Sleeve Length Cloth"
7350 value_min="0"
7351 value_max="0.85">
7352 <param_alpha
7353 multiply_blend="false"
7354 tga_file="shirt_sleeve_alpha.tga"
7355 domain="0.01" />
7356 </param>
7357
7358 <param
7359 id="1014"
7360 group="1"
7361 wearable="shirt"
7362 edit_group="driven"
7363 name="Shirt Bottom Cloth"
7364 value_min="0"
7365 value_max="1">
7366 <param_alpha
7367 multiply_blend="true"
7368 tga_file="shirt_bottom_alpha.tga"
7369 domain="0.05" />
7370 </param>
7371
7372 <param
7373 id="1015"
7374 group="1"
7375 wearable="shirt"
7376 edit_group="driven"
7377 name="Collar Front Height Cloth"
7378 value_min="0"
7379 value_max="1">
7380 <param_alpha
7381 multiply_blend="true"
7382 tga_file="shirt_collar_alpha.tga"
7383 domain="0.05" />
7384 </param>
7385
7386 <param
7387 id="1016"
7388 group="1"
7389 wearable="shirt"
7390 edit_group="driven"
7391 name="Collar Back Height Cloth"
7392 value_min="0"
7393 value_max="1">
7394 <param_alpha
7395 multiply_blend="true"
7396 tga_file="shirt_collar_back_alpha.tga"
7397 domain="0.05" />
7398 </param>
7399 </layer>
7400
7401 <layer
7402 name="upper_clothes">
7403 <texture
7404 local_texture="upper_shirt" />
7405
7406 <morph_mask
7407 morph_name="Displace_Loose_Upperbody" />
7408
7409 <morph_mask
7410 morph_name="Shirtsleeve_flair" />
7411
7412 <param
7413 id="803"
7414 group="0"
7415 wearable="shirt"
7416 edit_group="colorpicker"
7417 name="shirt_red"
7418 value_min="0"
7419 value_max="1"
7420 value_default="1">
7421 <param_color>
7422 <value
7423 color="0, 0, 0, 255" />
7424
7425 <value
7426 color="255, 0, 0, 255" />
7427 </param_color>
7428 </param>
7429
7430 <param
7431 id="804"
7432 group="0"
7433 wearable="shirt"
7434 edit_group="colorpicker"
7435 name="shirt_green"
7436 value_min="0"
7437 value_max="1"
7438 value_default="1">
7439 <param_color>
7440 <value
7441 color="0, 0, 0, 255" />
7442
7443 <value
7444 color="0, 255, 0, 255" />
7445 </param_color>
7446 </param>
7447
7448 <param
7449 id="805"
7450 group="0"
7451 wearable="shirt"
7452 edit_group="colorpicker"
7453 name="shirt_blue"
7454 value_min="0"
7455 value_max="1"
7456 value_default="1">
7457 <param_color>
7458 <value
7459 color="0, 0, 0, 255" />
7460
7461 <value
7462 color="0, 0, 255, 255" />
7463 </param_color>
7464 </param>
7465
7466 <param
7467 id="600"
7468 group="1"
7469 wearable="shirt"
7470 edit_group="driven"
7471 name="Sleeve Length Cloth"
7472 value_min="0"
7473 value_max="0.85"
7474 value_default=".7">
7475 <param_alpha
7476 multiply_blend="false"
7477 tga_file="shirt_sleeve_alpha.tga"
7478 domain="0.01" />
7479 </param>
7480
7481 <param
7482 id="601"
7483 group="1"
7484 wearable="shirt"
7485 edit_group="driven"
7486 name="Shirt Bottom Cloth"
7487 value_min="0"
7488 value_max="1"
7489 value_default=".8">
7490 <param_alpha
7491 multiply_blend="true"
7492 tga_file="shirt_bottom_alpha.tga"
7493 domain="0.05" />
7494 </param>
7495
7496 <param
7497 id="602"
7498 group="1"
7499 wearable="shirt"
7500 edit_group="driven"
7501 name="Collar Front Height Cloth"
7502 value_min="0"
7503 value_max="1"
7504 value_default=".8">
7505 <param_alpha
7506 multiply_blend="true"
7507 tga_file="shirt_collar_alpha.tga"
7508 domain="0.05" />
7509 </param>
7510
7511 <param
7512 id="778"
7513 group="1"
7514 wearable="shirt"
7515 edit_group="driven"
7516 name="Collar Back Height Cloth"
7517 value_min="0"
7518 value_max="1"
7519 value_default=".8">
7520 <param_alpha
7521 multiply_blend="true"
7522 tga_file="shirt_collar_back_alpha.tga"
7523 domain="0.05" />
7524 </param>
7525 </layer>
7526
7527 <layer
7528 name="upper_jacket base bump"
7529 render_pass="bump"
7530 fixed_color="128,128,128,255">
7531 <texture
7532 local_texture="upper_jacket"
7533 local_texture_alpha_only="true" />
7534
7535 <param
7536 id="1039"
7537 group="1"
7538 wearable="jacket"
7539 edit_group="driven"
7540 edit_group_order="1"
7541 name="Jacket Sleeve Length bump"
7542 value_min="0"
7543 value_max="1">
7544 <param_alpha
7545 multiply_blend="false"
7546 tga_file="shirt_sleeve_alpha.tga"
7547 domain="0.01" />
7548 </param>
7549
7550 <param
7551 id="1040"
7552 group="1"
7553 wearable="jacket"
7554 edit_group="driven"
7555 name="Jacket Collar Front bump"
7556 value_min="0"
7557 value_max="1">
7558 <param_alpha
7559 multiply_blend="true"
7560 tga_file="shirt_collar_alpha.tga"
7561 domain="0.05" />
7562 </param>
7563
7564 <param
7565 id="1041"
7566 group="1"
7567 wearable="jacket"
7568 edit_group="driven"
7569 edit_group_order="3.5"
7570 name="Jacket Collar Back bump"
7571 value_min="0"
7572 value_max="1">
7573 <param_alpha
7574 multiply_blend="true"
7575 tga_file="shirt_collar_back_alpha.tga"
7576 domain="0.05" />
7577 </param>
7578
7579 <param
7580 id="1037"
7581 group="1"
7582 wearable="jacket"
7583 edit_group="driven"
7584 name="jacket bottom length upper bump"
7585 value_min="0"
7586 value_max="1">
7587 <param_alpha
7588 multiply_blend="true"
7589 tga_file="jacket_length_upper_alpha.tga"
7590 domain="0.01" />
7591 </param>
7592
7593 <param
7594 id="1038"
7595 group="1"
7596 wearable="jacket"
7597 edit_group="driven"
7598 name="jacket open upper bump"
7599 value_min="0"
7600 value_max="1">
7601 <param_alpha
7602 multiply_blend="true"
7603 tga_file="jacket_open_upper_alpha.tga"
7604 domain="0.01" />
7605 </param>
7606 </layer>
7607
7608 <layer
7609 name="upper_jacket bump"
7610 render_pass="bump">
7611 <texture
7612 tga_file="bump_shirt_wrinkles.tga" />
7613
7614 <texture
7615 local_texture="upper_jacket"
7616 local_texture_alpha_only="true" />
7617
7618 <param
7619 id="875"
7620 group="1"
7621 wearable="jacket"
7622 name="jacket upper Wrinkles"
7623 value_min="0"
7624 value_max="1"
7625 value_default="0">
7626 <param_color>
7627 <value
7628 color="255, 255, 255, 0" />
7629
7630 <value
7631 color="255, 255, 255, 255" />
7632 </param_color>
7633 </param>
7634
7635 <param
7636 id="1019"
7637 group="1"
7638 wearable="jacket"
7639 edit_group="driven"
7640 edit_group_order="1"
7641 name="Jacket Sleeve Length bump"
7642 value_min="0"
7643 value_max="1">
7644 <param_alpha
7645 multiply_blend="false"
7646 tga_file="shirt_sleeve_alpha.tga"
7647 domain="0.01" />
7648 </param>
7649
7650 <param
7651 id="1021"
7652 group="1"
7653 wearable="jacket"
7654 edit_group="driven"
7655 name="Jacket Collar Front bump"
7656 value_min="0"
7657 value_max="1">
7658 <param_alpha
7659 multiply_blend="true"
7660 tga_file="shirt_collar_alpha.tga"
7661 domain="0.05" />
7662 </param>
7663
7664 <param
7665 id="1023"
7666 group="1"
7667 wearable="jacket"
7668 edit_group="driven"
7669 edit_group_order="3.5"
7670 name="Jacket Collar Back bump"
7671 value_min="0"
7672 value_max="1">
7673 <param_alpha
7674 multiply_blend="true"
7675 tga_file="shirt_collar_back_alpha.tga"
7676 domain="0.05" />
7677 </param>
7678
7679 <param
7680 id="1025"
7681 group="1"
7682 wearable="jacket"
7683 edit_group="driven"
7684 name="jacket bottom length upper bump"
7685 value_min="0"
7686 value_max="1">
7687 <param_alpha
7688 multiply_blend="true"
7689 tga_file="jacket_length_upper_alpha.tga"
7690 domain="0.01" />
7691 </param>
7692
7693 <param
7694 id="1026"
7695 group="1"
7696 wearable="jacket"
7697 edit_group="driven"
7698 name="jacket open upper bump"
7699 value_min="0"
7700 value_max="1">
7701 <param_alpha
7702 multiply_blend="true"
7703 tga_file="jacket_open_upper_alpha.tga"
7704 domain="0.01" />
7705 </param>
7706 </layer>
7707
7708 <layer
7709 name="upper_jacket">
7710 <texture
7711 local_texture="upper_jacket" />
7712
7713 <param
7714 id="831"
7715 group="1"
7716 edit_group="colorpicker_driven"
7717 wearable="jacket"
7718 name="upper_jacket_red"
7719 value_min="0"
7720 value_max="1"
7721 value_default="1">
7722 <param_color>
7723 <value
7724 color="0, 0, 0, 255" />
7725
7726 <value
7727 color="255, 0, 0, 255" />
7728 </param_color>
7729 </param>
7730
7731 <param
7732 id="832"
7733 group="1"
7734 edit_group="colorpicker_driven"
7735 wearable="jacket"
7736 name="upper_jacket_green"
7737 value_min="0"
7738 value_max="1"
7739 value_default="1">
7740 <param_color>
7741 <value
7742 color="0, 0, 0, 255" />
7743
7744 <value
7745 color="0, 255, 0, 255" />
7746 </param_color>
7747 </param>
7748
7749 <param
7750 id="833"
7751 group="1"
7752 edit_group="colorpicker_driven"
7753 wearable="jacket"
7754 name="upper_jacket_blue"
7755 value_min="0"
7756 value_max="1"
7757 value_default="1">
7758 <param_color>
7759 <value
7760 color="0, 0, 0, 255" />
7761
7762 <value
7763 color="0, 0, 255, 255" />
7764 </param_color>
7765 </param>
7766
7767 <param
7768 id="1020"
7769 group="1"
7770 edit_group="driven"
7771 name="jacket Sleeve Length"
7772 value_min="0"
7773 value_max="1">
7774 <param_alpha
7775 multiply_blend="false"
7776 tga_file="shirt_sleeve_alpha.tga"
7777 domain="0.01" />
7778 </param>
7779
7780 <param
7781 id="1022"
7782 group="1"
7783 edit_group="driven"
7784 name="jacket Collar Front"
7785 value_min="0"
7786 value_max="1">
7787 <param_alpha
7788 multiply_blend="true"
7789 tga_file="shirt_collar_alpha.tga"
7790 domain="0.05" />
7791 </param>
7792
7793 <param
7794 id="1024"
7795 group="1"
7796 edit_group="driven"
7797 edit_group_order="3.5"
7798 name="jacket Collar Back"
7799 value_min="0"
7800 value_max="1">
7801 <param_alpha
7802 multiply_blend="true"
7803 tga_file="shirt_collar_back_alpha.tga"
7804 domain="0.05" />
7805 </param>
7806
7807 <param
7808 id="620"
7809 group="1"
7810 wearable="jacket"
7811 edit_group="jacket"
7812 name="bottom length upper"
7813 label_min="hi cut"
7814 label_max="low cut"
7815 value_min="0"
7816 value_max="1"
7817 value_default=".8"
7818 camera_distance="1.2"
7819 camera_angle="30"
7820 camera_elevation=".2">
7821 <param_alpha
7822 multiply_blend="true"
7823 tga_file="jacket_length_upper_alpha.tga"
7824 domain="0.01" />
7825 </param>
7826
7827 <param
7828 id="622"
7829 group="1"
7830 wearable="jacket"
7831 edit_group="jacket"
7832 name="open upper"
7833 label_min="closed"
7834 label_max="open"
7835 value_min="0"
7836 value_max="1"
7837 value_default=".8"
7838 camera_distance="1.2"
7839 camera_angle="30"
7840 camera_elevation=".2">
7841 <param_alpha
7842 multiply_blend="true"
7843 tga_file="jacket_open_upper_alpha.tga"
7844 domain="0.01" />
7845 </param>
7846 </layer>
7847
7848 <layer
7849 name="upper alpha"
7850 visibility_mask="TRUE">
7851 <texture
7852 local_texture="upper_alpha" />
7853 </layer>
7854
7855 </layer_set>
7856
7857<!-- =========================================================== -->
7858 <layer_set
7859 body_region="lower_body"
7860 width="512"
7861 height="512">
7862 <layer
7863 name="lower body bump base"
7864 fixed_color = "128,128,128,255"
7865 render_pass="bump">
7866 </layer>
7867 <layer
7868 name="base_lowerbody bump"
7869 render_pass="bump">
7870 <texture
7871 tga_file="bump_lowerbody_base.tga"
7872 file_is_mask="FALSE" />
7873
7874 <param
7875 id="878"
7876 group="1"
7877 wearable="skin"
7878 edit_group="driven"
7879 edit_group_order="20"
7880 name="Bump upperdef"
7881 value_min="0"
7882 value_max="1">
7883 <param_alpha
7884 domain="0" />
7885 </param>
7886 </layer>
7887
7888 <layer
7889 name="base"
7890 global_color="skin_color">
7891 <texture
7892 tga_file="body_skingrain.tga" />
7893 </layer>
7894
7895 <layer
7896 name="shadow">
7897 <texture
7898 tga_file="lowerbody_shading_alpha.tga"
7899 file_is_mask="TRUE" />
7900
7901 <param
7902 id="160"
7903 group="1"
7904 name="Shading"
7905 wearable="pants"
7906 value_min="0"
7907 value_max="1">
7908 <param_color>
7909 <value
7910 color="0, 0, 0, 0" />
7911
7912 <value
7913 color="0, 0, 0, 128" />
7914 </param_color>
7915 </param>
7916 </layer>
7917
7918 <layer
7919 name="highlight">
7920 <texture
7921 tga_file="lowerbody_highlights_alpha.tga"
7922 file_is_mask="TRUE" />
7923
7924 <param
7925 id="161"
7926 group="1"
7927 name="Shading"
7928 wearable="skin"
7929 value_min="0"
7930 value_max="1">
7931 <param_color>
7932 <value
7933 color="255, 255, 255, 0" />
7934
7935 <value
7936 color="255, 255, 255, 64" />
7937 </param_color>
7938 </param>
7939 </layer>
7940
7941 <layer
7942 name="toenails">
7943 <texture
7944 tga_file="lowerbody_color.tga" />
7945 </layer>
7946
7947 <layer
7948 name="lower_bodypaint">
7949 <texture
7950 local_texture="lower_bodypaint" />
7951 </layer>
7952
7953 <layer
7954 name="freckles lower"
7955 fixed_color="120,47,20,128">
7956 <param
7957 id="777"
7958 group="1"
7959 name="freckles lower"
7960 wearable="skin"
7961 value_min="0"
7962 value_max="1">
7963 <param_alpha
7964 tga_file="bodyfreckles_alpha.tga"
7965 skip_if_zero="true"
7966 domain="0.6" />
7967 </param>
7968 </layer>
7969
7970 <layer
7971 name="lower_tattoo">
7972 <texture local_texture="lower_tattoo" />
7973 <param id="1068" group="1" edit_group="colorpicker_driven" wearable="tattoo"
7974 name="tattoo_lower_red" value_min="0" value_max="1" value_default="1">
7975 <param_color>
7976 <value color="0, 0, 0, 255" />
7977 <value color="255, 0, 0, 255" />
7978 </param_color>
7979 </param>
7980
7981 <param id="1069" group="1" edit_group="colorpicker_driven" wearable="tattoo"
7982 name="tattoo_lower_green" value_min="0" value_max="1" value_default="1">
7983 <param_color>
7984 <value color="0, 0, 0, 255" />
7985 <value color="0, 255, 0, 255" />
7986 </param_color>
7987 </param>
7988
7989 <param id="1070" group="1" edit_group="colorpicker_driven" wearable="tattoo"
7990 name="tattoo_lower_blue" value_min="0" value_max="1" value_default="1">
7991 <param_color>
7992 <value color="0, 0, 0, 255" />
7993 <value color="0, 0, 255, 255" />
7994 </param_color>
7995 </param>
7996 </layer>
7997
7998 <layer
7999 name="lower_underpants bump"
8000 render_pass="bump"
8001 fixed_color="128,128,128,255">
8002 <texture
8003 local_texture="lower_underpants"
8004 local_texture_alpha_only="true" />
8005
8006 <param
8007 id="1055"
8008 group="1"
8009 wearable="underpants"
8010 edit_group="underpants"
8011 name="Pants Length"
8012 value_min="0"
8013 value_max="1"
8014 value_default=".3">
8015 <param_alpha
8016 tga_file="pants_length_alpha.tga"
8017 domain="0.01" />
8018 </param>
8019
8020 <param
8021 id="1057"
8022 group="1"
8023 wearable="underpants"
8024 edit_group="underpants"
8025 name="Pants Waist"
8026 value_min="0"
8027 value_max="1"
8028 value_default=".8">
8029 <param_alpha
8030 tga_file="pants_waist_alpha.tga"
8031 domain="0.05" />
8032 </param>
8033 </layer>
8034
8035 <layer
8036 name="lower_underpants">
8037 <texture
8038 local_texture="lower_underpants" />
8039
8040 <param
8041 id="824"
8042 group="0"
8043 wearable="underpants"
8044 edit_group="colorpicker"
8045 name="underpants_red"
8046 value_min="0"
8047 value_max="1"
8048 value_default="1">
8049 <param_color>
8050 <value
8051 color="0, 0, 0, 255" />
8052
8053 <value
8054 color="255, 0, 0, 255" />
8055 </param_color>
8056 </param>
8057
8058 <param
8059 id="825"
8060 group="0"
8061 wearable="underpants"
8062 edit_group="colorpicker"
8063 name="underpants_green"
8064 value_min="0"
8065 value_max="1"
8066 value_default="1">
8067 <param_color>
8068 <value
8069 color="0, 0, 0, 255" />
8070
8071 <value
8072 color="0, 255, 0, 255" />
8073 </param_color>
8074 </param>
8075
8076 <param
8077 id="826"
8078 group="0"
8079 wearable="underpants"
8080 edit_group="colorpicker"
8081 name="underpants_blue"
8082 value_min="0"
8083 value_max="1"
8084 value_default="1">
8085 <param_color>
8086 <value
8087 color="0, 0, 0, 255" />
8088
8089 <value
8090 color="0, 0, 255, 255" />
8091 </param_color>
8092 </param>
8093
8094 <param
8095 id="1054"
8096 group="1"
8097 wearable="underpants"
8098 edit_group="driven"
8099 name="Pants Length"
8100 value_min="0"
8101 value_max="1"
8102 value_default=".3"
8103 camera_distance="1.2"
8104 camera_angle="30"
8105 camera_elevation="-.3">
8106 <param_alpha
8107 tga_file="pants_length_alpha.tga"
8108 domain="0.01" />
8109 </param>
8110
8111 <param
8112 id="1056"
8113 group="1"
8114 wearable="underpants"
8115 edit_group="driven"
8116 name="Pants Waist"
8117 value_min="0"
8118 value_max="1"
8119 value_default=".8">
8120 <param_alpha
8121 tga_file="pants_waist_alpha.tga"
8122 domain="0.05" />
8123 </param>
8124 </layer>
8125
8126 <layer
8127 name="lower_socks bump"
8128 render_pass="bump"
8129 fixed_color="128,128,128,255">
8130 <texture
8131 local_texture="lower_socks"
8132 local_texture_alpha_only="true" />
8133
8134 <param
8135 id="1051"
8136 group="1"
8137 wearable="socks"
8138 edit_group="driven"
8139 name="Socks Length bump"
8140 value_min="0"
8141 value_max="1"
8142 value_default="0.35">
8143 <param_alpha
8144 tga_file="shoe_height_alpha.tga"
8145 domain="0.01" />
8146 </param>
8147 </layer>
8148
8149 <layer
8150 name="lower_socks">
8151 <texture
8152 local_texture="lower_socks" />
8153
8154 <param
8155 id="818"
8156 group="0"
8157 wearable="socks"
8158 edit_group="colorpicker"
8159 name="socks_red"
8160 value_min="0"
8161 value_max="1"
8162 value_default="1">
8163 <param_color>
8164 <value
8165 color="0, 0, 0, 255" />
8166
8167 <value
8168 color="255, 0, 0, 255" />
8169 </param_color>
8170 </param>
8171
8172 <param
8173 id="819"
8174 group="0"
8175 wearable="socks"
8176 edit_group="colorpicker"
8177 name="socks_green"
8178 value_min="0"
8179 value_max="1"
8180 value_default="1">
8181 <param_color>
8182 <value
8183 color="0, 0, 0, 255" />
8184
8185 <value
8186 color="0, 255, 0, 255" />
8187 </param_color>
8188 </param>
8189
8190 <param
8191 id="820"
8192 group="0"
8193 wearable="socks"
8194 edit_group="colorpicker"
8195 name="socks_blue"
8196 value_min="0"
8197 value_max="1"
8198 value_default="1">
8199 <param_color>
8200 <value
8201 color="0, 0, 0, 255" />
8202
8203 <value
8204 color="0, 0, 255, 255" />
8205 </param_color>
8206 </param>
8207
8208 <param
8209 id="1050"
8210 group="1"
8211 wearable="socks"
8212 edit_group="driven"
8213 name="Socks Length bump"
8214 value_min="0"
8215 value_max="1"
8216 value_default="0.35">
8217 <param_alpha
8218 tga_file="shoe_height_alpha.tga"
8219 domain="0.01" />
8220 </param>
8221 </layer>
8222
8223 <layer
8224 name="lower_shoes bump"
8225 render_pass="bump"
8226 fixed_color="128,128,128,255">
8227 <texture
8228 local_texture="lower_shoes"
8229 local_texture_alpha_only="true" />
8230
8231 <param
8232 id="1053"
8233 group="1"
8234 wearable="shoes"
8235 edit_group="driven"
8236 name="Shoe Height bump"
8237 value_min="0"
8238 value_max="1"
8239 value_default="0.1">
8240 <param_alpha
8241 tga_file="shoe_height_alpha.tga"
8242 domain="0.01" />
8243 </param>
8244 </layer>
8245
8246 <layer
8247 name="lower_shoes">
8248 <texture
8249 local_texture="lower_shoes" />
8250
8251 <param
8252 id="812"
8253 group="0"
8254 wearable="shoes"
8255 edit_group="colorpicker"
8256 name="shoes_red"
8257 value_min="0"
8258 value_max="1"
8259 value_default="1">
8260 <param_color>
8261 <value
8262 color="0, 0, 0, 255" />
8263
8264 <value
8265 color="255, 0, 0, 255" />
8266 </param_color>
8267 </param>
8268
8269 <param
8270 id="813"
8271 group="0"
8272 wearable="shoes"
8273 edit_group="colorpicker"
8274 name="shoes_green"
8275 value_min="0"
8276 value_max="1"
8277 value_default="1">
8278 <param_color>
8279 <value
8280 color="0, 0, 0, 255" />
8281
8282 <value
8283 color="0, 255, 0, 255" />
8284 </param_color>
8285 </param>
8286
8287 <param
8288 id="817"
8289 group="0"
8290 wearable="shoes"
8291 edit_group="colorpicker"
8292 name="shoes_blue"
8293 value_min="0"
8294 value_max="1"
8295 value_default="1">
8296 <param_color>
8297 <value
8298 color="0, 0, 0, 255" />
8299
8300 <value
8301 color="0, 0, 255, 255" />
8302 </param_color>
8303 </param>
8304
8305 <param
8306 id="1052"
8307 group="1"
8308 wearable="shoes"
8309 edit_group="driven"
8310 name="Shoe Height"
8311 value_min="0"
8312 value_max="1"
8313 value_default="0.1">
8314 <param_alpha
8315 tga_file="shoe_height_alpha.tga"
8316 domain="0.01" />
8317 </param>
8318 </layer>
8319
8320 <layer
8321 name="lower_clothes_shadow">
8322 <texture
8323 local_texture="lower_pants" />
8324
8325 <param
8326 id="913"
8327 group="1"
8328 edit_group="driven"
8329 wearable="pants"
8330 name="Lower Clothes Shading"
8331 value_min="0"
8332 value_max="1"
8333 value_default="0">
8334 <param_color>
8335 <value
8336 color="0, 0, 0, 0" />
8337
8338 <value
8339 color="0, 0, 0, 80" />
8340 </param_color>
8341 </param>
8342
8343 <param
8344 id="914"
8345 group="1"
8346 edit_group="driven"
8347 wearable="pants"
8348 name="Waist Height Shadow"
8349 value_min="0.02"
8350 value_max="1">
8351 <param_alpha
8352 tga_file="pants_waist_alpha.tga"
8353 skip_if_zero="true"
8354 domain="0.04" />
8355 </param>
8356
8357 <param
8358 id="915"
8359 group="1"
8360 edit_group="driven"
8361 wearable="pants"
8362 name="Pants Length Shadow"
8363 value_min="0.02"
8364 value_max="1">
8365 <param_alpha
8366 tga_file="pants_length_alpha.tga"
8367 skip_if_zero="true"
8368 domain="0.03" />
8369 </param>
8370 </layer>
8371
8372 <layer
8373 name="lower_pants base bump"
8374 render_pass="bump"
8375 fixed_color="128,128,128,255">
8376 <texture
8377 local_texture="lower_pants"
8378 local_texture_alpha_only="true" />
8379
8380 <param
8381 id="1035"
8382 group="1"
8383 edit_group="driven"
8384 wearable="pants"
8385 name="Waist Height Cloth"
8386 value_min="0"
8387 value_max="1">
8388 <param_alpha
8389 tga_file="pants_waist_alpha.tga"
8390 domain="0.05" />
8391 </param>
8392
8393 <param
8394 id="1036"
8395 group="1"
8396 edit_group="driven"
8397 wearable="pants"
8398 name="Pants Length Cloth"
8399 value_min="0"
8400 value_max="1">
8401 <param_alpha
8402 tga_file="pants_length_alpha.tga"
8403 domain="0.01" />
8404 </param>
8405 </layer>
8406
8407 <layer
8408 name="lower_pants bump"
8409 render_pass="bump">
8410 <texture
8411 tga_file="bump_pants_wrinkles.tga" />
8412
8413 <texture
8414 local_texture="lower_pants"
8415 local_texture_alpha_only="true" />
8416
8417 <param
8418 id="869"
8419 group="0"
8420 wearable="pants"
8421 edit_group="pants"
8422 edit_group_order="6"
8423 name="Pants Wrinkles"
8424 value_min="0"
8425 value_max="1"
8426 value_default="0">
8427 <param_color>
8428 <value
8429 color="255, 255, 255, 0" />
8430
8431 <value
8432 color="255, 255, 255, 255" />
8433 </param_color>
8434 </param>
8435
8436 <param
8437 id="1017"
8438 group="1"
8439 edit_group="driven"
8440 wearable="pants"
8441 name="Waist Height Cloth"
8442 value_min="0"
8443 value_max="1">
8444 <param_alpha
8445 tga_file="pants_waist_alpha.tga"
8446 domain="0.05" />
8447 </param>
8448
8449 <param
8450 id="1018"
8451 group="1"
8452 edit_group="driven"
8453 wearable="pants"
8454 name="Pants Length Cloth"
8455 value_min="0"
8456 value_max="1">
8457 <param_alpha
8458 tga_file="pants_length_alpha.tga"
8459 domain="0.01" />
8460 </param>
8461 </layer>
8462
8463 <layer
8464 name="lower_pants">
8465 <texture
8466 local_texture="lower_pants" />
8467
8468 <morph_mask
8469 morph_name="Displace_Loose_Lowerbody" />
8470
8471 <morph_mask
8472 morph_name="Leg_Pantflair" />
8473
8474 <morph_mask
8475 morph_name="Low_Crotch" />
8476
8477 <morph_mask
8478 morph_name="Leg_Longcuffs" />
8479
8480 <param
8481 id="806"
8482 group="0"
8483 wearable="pants"
8484 edit_group="colorpicker"
8485 name="pants_red"
8486 value_min="0"
8487 value_max="1"
8488 value_default="1">
8489 <param_color>
8490 <value
8491 color="0, 0, 0, 255" />
8492
8493 <value
8494 color="255, 0, 0, 255" />
8495 </param_color>
8496 </param>
8497
8498 <param
8499 id="807"
8500 group="0"
8501 wearable="pants"
8502 edit_group="colorpicker"
8503 name="pants_green"
8504 value_min="0"
8505 value_max="1"
8506 value_default="1">
8507 <param_color>
8508 <value
8509 color="0, 0, 0, 255" />
8510
8511 <value
8512 color="0, 255, 0, 255" />
8513 </param_color>
8514 </param>
8515
8516 <param
8517 id="808"
8518 group="0"
8519 wearable="pants"
8520 edit_group="colorpicker"
8521 name="pants_blue"
8522 value_min="0"
8523 value_max="1"
8524 value_default="1">
8525 <param_color>
8526 <value
8527 color="0, 0, 0, 255" />
8528
8529 <value
8530 color="0, 0, 255, 255" />
8531 </param_color>
8532 </param>
8533
8534 <param
8535 id="614"
8536 group="1"
8537 edit_group="driven"
8538 wearable="pants"
8539 name="Waist Height Cloth"
8540 value_min="0"
8541 value_max="1"
8542 value_default=".8">
8543 <param_alpha
8544 tga_file="pants_waist_alpha.tga"
8545 domain="0.05" />
8546 </param>
8547
8548 <param
8549 id="615"
8550 group="1"
8551 edit_group="driven"
8552 wearable="pants"
8553 name="Pants Length Cloth"
8554 value_min="0"
8555 value_max="1"
8556 value_default=".8">
8557 <param_alpha
8558 tga_file="pants_length_alpha.tga"
8559 domain="0.01" />
8560 </param>
8561 </layer>
8562
8563 <layer
8564 name="lower_jacket base bump"
8565 render_pass="bump"
8566 fixed_color="128,128,128,255">
8567 <texture
8568 local_texture="lower_jacket"
8569 local_texture_alpha_only="true" />
8570
8571 <param
8572 id="1033"
8573 group="1"
8574 wearable="jacket"
8575 edit_group="driven"
8576 name="jacket bottom length lower bump"
8577 value_min="0"
8578 value_max="1">
8579 <param_alpha
8580 multiply_blend="false"
8581 tga_file="jacket_length_lower_alpha.tga"
8582 domain="0.01" />
8583 </param>
8584
8585 <param
8586 id="1034"
8587 group="1"
8588 wearable="jacket"
8589 edit_group="driven"
8590 name="jacket open lower bump"
8591 value_min="0"
8592 value_max="1">
8593 <param_alpha
8594 multiply_blend="true"
8595 tga_file="jacket_open_lower_alpha.tga"
8596 domain="0.01" />
8597 </param>
8598 </layer>
8599
8600 <layer
8601 name="lower_jacket bump"
8602 render_pass="bump">
8603 <texture
8604 tga_file="bump_pants_wrinkles.tga" />
8605
8606 <texture
8607 local_texture="lower_jacket"
8608 local_texture_alpha_only="true" />
8609
8610 <param
8611 id="876"
8612 group="1"
8613 wearable="jacket"
8614 name="jacket upper Wrinkles"
8615 value_min="0"
8616 value_max="1"
8617 value_default="0">
8618 <param_color>
8619 <value
8620 color="255, 255, 255, 0" />
8621
8622 <value
8623 color="255, 255, 255, 255" />
8624 </param_color>
8625 </param>
8626
8627 <param
8628 id="1027"
8629 group="1"
8630 wearable="jacket"
8631 edit_group="driven"
8632 name="jacket bottom length lower bump"
8633 value_min="0"
8634 value_max="1">
8635 <param_alpha
8636 multiply_blend="false"
8637 tga_file="jacket_length_lower_alpha.tga"
8638 domain="0.01" />
8639 </param>
8640
8641 <param
8642 id="1028"
8643 group="1"
8644 wearable="jacket"
8645 edit_group="driven"
8646 name="jacket open lower bump"
8647 value_min="0"
8648 value_max="1">
8649 <param_alpha
8650 multiply_blend="true"
8651 tga_file="jacket_open_lower_alpha.tga"
8652 domain="0.01" />
8653 </param>
8654 </layer>
8655
8656 <layer
8657 name="lower_jacket">
8658 <texture
8659 local_texture="lower_jacket" />
8660
8661 <param
8662 id="809"
8663 group="1"
8664 edit_group="colorpicker_driven"
8665 wearable="jacket"
8666 name="lower_jacket_red"
8667 value_min="0"
8668 value_max="1"
8669 value_default="1">
8670 <param_color>
8671 <value
8672 color="0, 0, 0, 255" />
8673
8674 <value
8675 color="255, 0, 0, 255" />
8676 </param_color>
8677 </param>
8678
8679 <param
8680 id="810"
8681 group="1"
8682 edit_group="colorpicker_driven"
8683 wearable="jacket"
8684 name="lower_jacket_green"
8685 value_min="0"
8686 value_max="1"
8687 value_default="1">
8688 <param_color>
8689 <value
8690 color="0, 0, 0, 255" />
8691
8692 <value
8693 color="0, 255, 0, 255" />
8694 </param_color>
8695 </param>
8696
8697 <param
8698 id="811"
8699 group="1"
8700 edit_group="colorpicker_driven"
8701 wearable="jacket"
8702 name="lower_jacket_blue"
8703 value_min="0"
8704 value_max="1"
8705 value_default="1">
8706 <param_color>
8707 <value
8708 color="0, 0, 0, 255" />
8709
8710 <value
8711 color="0, 0, 255, 255" />
8712 </param_color>
8713 </param>
8714
8715 <param
8716 id="621"
8717 group="1"
8718 wearable="jacket"
8719 edit_group="jacket"
8720 name="bottom length lower"
8721 label_min="hi cut"
8722 label_max="low cut"
8723 value_min="0"
8724 value_max="1"
8725 value_default=".8"
8726 camera_distance="1.2"
8727 camera_angle="30"
8728 camera_elevation=".2">
8729 <param_alpha
8730 multiply_blend="false"
8731 tga_file="jacket_length_lower_alpha.tga"
8732 domain="0.01" />
8733 </param>
8734
8735 <param
8736 id="623"
8737 group="1"
8738 wearable="jacket"
8739 edit_group="jacket"
8740 name="open lower"
8741 label_min="open"
8742 label_max="closed"
8743 value_min="0"
8744 value_max="1"
8745 value_default=".8"
8746 camera_distance="1.2"
8747 camera_angle="30"
8748 camera_elevation=".2">
8749 <param_alpha
8750 multiply_blend="true"
8751 tga_file="jacket_open_lower_alpha.tga"
8752 domain="0.01" />
8753 </param>
8754 </layer>
8755
8756 <layer
8757 name="lower alpha"
8758 visibility_mask="TRUE">
8759 <texture
8760 local_texture="lower_alpha" />
8761 </layer>
8762
8763 </layer_set>
8764
8765<!-- =========================================================== -->
8766 <layer_set
8767 body_region="eyes"
8768 width="128"
8769 height="128">
8770 <layer
8771 name="whites">
8772 <texture
8773 tga_file="eyewhite.tga" />
8774 </layer>
8775
8776 <layer
8777 name="iris"
8778 global_color="eye_color">
8779 <texture
8780 local_texture="eyes_iris" />
8781 </layer>
8782
8783 <layer
8784 name="eyes alpha"
8785 visibility_mask="TRUE">
8786 <texture
8787 local_texture="eyes_alpha" />
8788 </layer>
8789
8790 </layer_set>
8791
8792<!-- =========================================================== -->
8793 <layer_set
8794 body_region="skirt"
8795 width="512"
8796 height="512"
8797 clear_alpha="false">
8798 <layer
8799 name="skirt_fabric"
8800 write_all_channels="true">
8801 <texture
8802 local_texture="skirt" />
8803
8804 <param
8805 id="921"
8806 group="0"
8807 wearable="skirt"
8808 edit_group="colorpicker"
8809 name="skirt_red"
8810 value_min="0"
8811 value_max="1"
8812 value_default="1">
8813 <param_color>
8814 <value
8815 color="0, 0, 0, 255" />
8816
8817 <value
8818 color="255, 0, 0, 255" />
8819 </param_color>
8820 </param>
8821
8822 <param
8823 id="922"
8824 group="0"
8825 wearable="skirt"
8826 edit_group="colorpicker"
8827 name="skirt_green"
8828 value_min="0"
8829 value_max="1"
8830 value_default="1">
8831 <param_color>
8832 <value
8833 color="0, 0, 0, 255" />
8834
8835 <value
8836 color="0, 255, 0, 255" />
8837 </param_color>
8838 </param>
8839
8840 <param
8841 id="923"
8842 group="0"
8843 wearable="skirt"
8844 edit_group="colorpicker"
8845 name="skirt_blue"
8846 value_min="0"
8847 value_max="1"
8848 value_default="1">
8849 <param_color>
8850 <value
8851 color="0, 0, 0, 255" />
8852
8853 <value
8854 color="0, 0, 255, 255" />
8855 </param_color>
8856 </param>
8857 </layer>
8858
8859 <layer
8860 name="skirt_fabric_alpha">
8861 <param
8862 id="858"
8863 group="0"
8864 wearable="skirt"
8865 edit_group="skirt"
8866 edit_group_order="1"
8867 name="Skirt Length"
8868 show_simple="true"
8869 label_min="Short"
8870 label_max="Long"
8871 value_min=".01"
8872 value_max="1"
8873 value_default=".4"
8874 simple_percent_min="40"
8875 simple_percent_max="100"
8876 camera_distance="1.3"
8877 camera_elevation="-.5"
8878 camera_angle="30">
8879 <param_alpha
8880 tga_file="skirt_length_alpha.tga"
8881 domain="0"
8882 multiply_blend="true" />
8883 </param>
8884
8885 <param
8886 id="859"
8887 group="0"
8888 wearable="skirt"
8889 edit_group="skirt"
8890 edit_group_order="4"
8891 name="Slit Front"
8892 label_min="Open Front"
8893 label_max="Closed Front"
8894 value_min="0"
8895 value_max="1"
8896 value_default="1"
8897 camera_distance="1.3"
8898 camera_elevation="-.5"
8899 camera_angle="30">
8900 <param_alpha
8901 tga_file="skirt_slit_front_alpha.tga"
8902 multiply_blend="true"
8903 domain="0" />
8904 </param>
8905
8906 <param
8907 id="860"
8908 group="0"
8909 wearable="skirt"
8910 edit_group="skirt"
8911 edit_group_order="5"
8912 name="Slit Back"
8913 label_min="Open Back"
8914 label_max="Closed Back"
8915 value_min="0"
8916 value_max="1"
8917 value_default="1"
8918 camera_distance="1.3"
8919 camera_elevation="-.5"
8920 camera_angle="160">
8921 <param_alpha
8922 tga_file="skirt_slit_back_alpha.tga"
8923 multiply_blend="true"
8924 domain="0" />
8925 </param>
8926
8927 <param
8928 id="861"
8929 group="0"
8930 wearable="skirt"
8931 edit_group="skirt"
8932 edit_group_order="6"
8933 name="Slit Left"
8934 label_min="Open Left"
8935 label_max="Closed Left"
8936 value_min="0"
8937 value_max="1"
8938 value_default="1"
8939 camera_distance="1.3"
8940 camera_elevation="-.5"
8941 camera_angle="30">
8942 <param_alpha
8943 tga_file="skirt_slit_left_alpha.tga"
8944 multiply_blend="true"
8945 domain="0" />
8946 </param>
8947
8948 <param
8949 id="862"
8950 group="0"
8951 wearable="skirt"
8952 edit_group="skirt"
8953 edit_group_order="7"
8954 name="Slit Right"
8955 label_min="Open Right"
8956 label_max="Closed Right"
8957 value_min="0"
8958 value_max="1"
8959 value_default="1"
8960 camera_distance="1.3"
8961 camera_elevation="-.5"
8962 camera_angle="-30">
8963 <param_alpha
8964 tga_file="skirt_slit_right_alpha.tga"
8965 multiply_blend="true"
8966 domain="0" />
8967 </param>
8968 </layer>
8969 </layer_set>
8970
8971<!-- =========================================================== -->
8972 <driver_parameters>
8973 <param
8974 id="828"
8975 group="0"
8976 name="Loose Upper Clothing"
8977 label="Shirt Fit"
8978 show_simple="true"
8979 wearable="shirt"
8980 edit_group="shirt"
8981 edit_group_order="4"
8982 label_min="Tight Shirt"
8983 label_max="Loose Shirt"
8984 value_min="0"
8985 value_max="1"
8986 camera_distance="1.2"
8987 camera_angle="30"
8988 camera_elevation=".2">
8989 <param_driver>
8990 <driven
8991 id="628" />
8992
8993 <driven
8994 id="899"
8995 min1="0.1"
8996 max1="0.5"
8997 max2="1"
8998 min2="1" />
8999 </param_driver>
9000 </param>
9001
9002 <param
9003 id="816"
9004 group="0"
9005 name="Loose Lower Clothing"
9006 label="Pants Fit"
9007 show_simple="true"
9008 wearable="pants"
9009 edit_group="pants"
9010 edit_group_order="2.5"
9011 label_min="Tight Pants"
9012 label_max="Loose Pants"
9013 value_min="0"
9014 value_max="1"
9015 camera_distance="1.8"
9016 camera_angle="30"
9017 camera_elevation="-.3">
9018 <param_driver>
9019 <driven
9020 id="516" />
9021
9022 <driven
9023 id="913"
9024 min1="0.1"
9025 max1="0.5"
9026 max2="1"
9027 min2="1" />
9028 </param_driver>
9029 </param>
9030
9031 <param
9032 id="814"
9033 group="0"
9034 wearable="pants"
9035 edit_group="pants"
9036 edit_group_order="2"
9037 name="Waist Height"
9038 label_min="Low"
9039 label_max="High"
9040 value_min="0"
9041 value_max="1"
9042 value_default="1"
9043 camera_distance="1.2"
9044 camera_angle="30"
9045 camera_elevation="-.3">
9046 <param_driver>
9047 <driven
9048 id="614" />
9049
9050 <driven
9051 id="1017" />
9052
9053 <driven
9054 id="1033" />
9055
9056 <driven
9057 id="914"
9058 min1="0"
9059 max1=".98"
9060 max2="1"
9061 min2="1" />
9062 </param_driver>
9063 </param>
9064
9065 <param
9066 id="815"
9067 group="0"
9068 wearable="pants"
9069 edit_group="pants"
9070 edit_group_order="1"
9071 name="Pants Length"
9072 show_simple="true"
9073 label_min="Short"
9074 label_max="Long"
9075 value_min="0"
9076 value_max="1"
9077 value_default=".8"
9078 simple_percent_min="20"
9079 simple_percent_max="100"
9080 camera_distance="1.8"
9081 camera_angle="30"
9082 camera_elevation="-.3">
9083 <param_driver>
9084 <driven
9085 id="615"
9086 min1="0"
9087 max1=".9"
9088 max2="1"
9089 min2="1" />
9090
9091 <driven
9092 id="1018"
9093 min1="0"
9094 max1=".9"
9095 max2="1"
9096 min2="1" />
9097
9098 <driven
9099 id="1036"
9100 min1="0"
9101 max1=".9"
9102 max2="1"
9103 min2="1" />
9104
9105 <driven
9106 id="793"
9107 min1=".9"
9108 max1="1"
9109 max2="1"
9110 min2="1" />
9111
9112 <driven
9113 id="915"
9114 min1="0"
9115 max1=".882"
9116 max2="1"
9117 min2="1" />
9118 </param_driver>
9119 </param>
9120
9121 <param
9122 id="800"
9123 group="0"
9124 wearable="shirt"
9125 edit_group="shirt"
9126 edit_group_order="1"
9127 name="Sleeve Length"
9128 show_simple="true"
9129 label_min="Short"
9130 label_max="Long"
9131 value_min="0"
9132 value_max="1"
9133 value_default=".89"
9134 simple_percent_min="15"
9135 simple_percent_max="100"
9136 camera_distance="1.2"
9137 camera_angle="30"
9138 camera_elevation=".2">
9139 <param_driver>
9140 <driven
9141 id="600" />
9142
9143 <driven
9144 id="1013" />
9145
9146 <driven
9147 id="1029" />
9148
9149 <driven
9150 id="900"
9151 min1="0"
9152 max1="1"
9153 max2="1"
9154 min2="1" />
9155 </param_driver>
9156 </param>
9157
9158 <param
9159 id="801"
9160 group="0"
9161 wearable="shirt"
9162 edit_group="shirt"
9163 edit_group_order="2"
9164 name="Shirt Bottom"
9165 label_min="Short"
9166 label_max="Long"
9167 value_min="0"
9168 value_max="1"
9169 value_default="1"
9170 camera_distance="1.2"
9171 camera_angle="30"
9172 camera_elevation=".2">
9173 <param_driver>
9174 <driven
9175 id="601" />
9176
9177 <driven
9178 id="1014" />
9179
9180 <driven
9181 id="1030" />
9182
9183 <driven
9184 id="901"
9185 min1="0"
9186 max1=".98"
9187 max2="1"
9188 min2="1" />
9189 </param_driver>
9190 </param>
9191
9192 <param
9193 id="802"
9194 group="0"
9195 wearable="shirt"
9196 edit_group="shirt"
9197 edit_group_order="3"
9198 name="Collar Front"
9199 show_simple="true"
9200 label_min="Low"
9201 label_max="High"
9202 value_min="0"
9203 value_max="1"
9204 value_default=".78"
9205 simple_percent_min="40"
9206 simple_percent_max="100"
9207 camera_distance="1.2"
9208 camera_angle="15"
9209 camera_elevation=".2">
9210 <param_driver>
9211 <driven
9212 id="602" />
9213
9214 <driven
9215 id="1015" />
9216
9217 <driven
9218 id="1031" />
9219
9220 <driven
9221 id="902"
9222 min1="0"
9223 max1=".98"
9224 max2="1"
9225 min2="1" />
9226 </param_driver>
9227 </param>
9228
9229 <param
9230 id="781"
9231 group="0"
9232 wearable="shirt"
9233 edit_group="shirt"
9234 edit_group_order="3.1"
9235 name="Collar Back"
9236 label_min="Low"
9237 label_max="High"
9238 value_min="0"
9239 value_max="1"
9240 value_default=".78"
9241 camera_distance="1.2"
9242 camera_angle="195"
9243 camera_elevation=".2">
9244 <param_driver>
9245 <driven
9246 id="778" />
9247
9248 <driven
9249 id="1016" />
9250
9251 <driven
9252 id="1032" />
9253
9254 <driven
9255 id="903"
9256 min1="0"
9257 max1=".98"
9258 max2="1"
9259 min2="1" />
9260 </param_driver>
9261 </param>
9262
9263 <param
9264 id="150"
9265 group="0"
9266 wearable="skin"
9267 edit_group="skin_bodydetail"
9268 name="Body Definition"
9269 label_min="Less"
9270 label_max="More"
9271 value_min="0"
9272 value_max="1"
9273 value_default="0"
9274 camera_distance="1.4"
9275 camera_elevation="-.2">
9276 <param_driver>
9277 <driven
9278 id="125" />
9279
9280 <driven
9281 id="126" />
9282
9283 <driven
9284 id="160" />
9285
9286 <driven
9287 id="161" />
9288
9289 <driven
9290 id="874" />
9291
9292 <driven
9293 id="878" />
9294
9295 </param_driver>
9296 </param>
9297
9298 <param
9299 id="775"
9300 group="0"
9301 wearable="skin"
9302 edit_group="skin_bodydetail"
9303 name="Body Freckles"
9304 label_min="Less Freckles"
9305 label_max="More Freckles"
9306 value_min="0"
9307 value_max="1"
9308 value_default="0"
9309 camera_distance="1.4"
9310 camera_elevation="-.2">
9311 <param_driver>
9312 <driven
9313 id="776" />
9314
9315 <driven
9316 id="777" />
9317 </param_driver>
9318 </param>
9319
9320 <param
9321 id="162"
9322 group="0"
9323 wearable="skin"
9324 edit_group="skin_facedetail"
9325 edit_group_order="1"
9326 name="Facial Definition"
9327 label_min="Less"
9328 label_max="More"
9329 value_min="0"
9330 value_max="1"
9331 camera_distance=".3"
9332 camera_elevation=".07"
9333 value_default="0">
9334 <param_driver>
9335 <driven
9336 id="158" />
9337
9338 <driven
9339 id="159" />
9340
9341 <driven
9342 id="873" />
9343 </param_driver>
9344 </param>
9345
9346 <param
9347 id="163"
9348 group="0"
9349 wearable="skin"
9350 edit_group="skin_facedetail"
9351 edit_group_order="3"
9352 name="wrinkles"
9353 label_min="Less"
9354 label_max="More"
9355 value_min="0"
9356 value_max="1"
9357 camera_distance=".3"
9358 camera_elevation=".07"
9359 value_default="0">
9360 <param_driver>
9361<!--<driven
9362 id="128" />-->
9363 <driven
9364 id="118" />
9365 </param_driver>
9366 </param>
9367
9368 <param
9369 id="505"
9370 group="0"
9371 wearable="shape"
9372 edit_group="shape_mouth"
9373 edit_group_order="3"
9374 name="Lip Thickness"
9375 label_min="Thin Lips"
9376 label_max="Fat Lips"
9377 value_min="0"
9378 value_max="1"
9379 value_default=".5"
9380 camera_distance=".3"
9381 camera_elevation=".04"
9382 camera_angle="20">
9383 <param_driver>
9384 <driven
9385 id="26"
9386 min1="0"
9387 max1="0"
9388 max2="0"
9389 min2=".5" />
9390
9391 <driven
9392 id="28"
9393 min1=".5"
9394 max1="1"
9395 max2="1"
9396 min2="1" />
9397 </param_driver>
9398 </param>
9399
9400 <param
9401 id="799"
9402 group="0"
9403 wearable="shape"
9404 edit_group="shape_mouth"
9405 edit_group_order="3.2"
9406 name="Lip Ratio"
9407 label="Lip Ratio"
9408 show_simple="true"
9409 label_min="More Upper Lip"
9410 label_max="More Lower Lip"
9411 value_min="0"
9412 value_max="1"
9413 value_default=".5"
9414 camera_distance=".3"
9415 camera_elevation=".04"
9416 camera_angle="20">
9417 <param_driver>
9418 <driven
9419 id="797"
9420 min1="0"
9421 max1="0"
9422 max2="0"
9423 min2=".5" />
9424
9425 <driven
9426 id="798"
9427 min1=".5"
9428 max1="1"
9429 max2="1"
9430 min2="1" />
9431 </param_driver>
9432 </param>
9433
9434 <param
9435 id="155"
9436 group="0"
9437 wearable="shape"
9438 edit_group="shape_mouth"
9439 edit_group_order="1"
9440 name="Lip Width"
9441 label="Lip Width"
9442 label_min="Narrow Lips"
9443 label_max="Wide Lips"
9444 show_simple="true"
9445 value_min="-0.9"
9446 value_max="1.3"
9447 camera_distance=".3"
9448 camera_elevation=".04"
9449 value_default="0">
9450 <param_driver>
9451 <driven
9452 id="29" />
9453
9454 <driven
9455 id="30" />
9456 </param_driver>
9457 </param>
9458
9459 <param
9460 id="196"
9461 group="0"
9462 wearable="shape"
9463 edit_group="shape_eyes"
9464 edit_group_order="2"
9465 name="Eye Spacing"
9466 label="Eye Spacing"
9467 label_min="Close Set Eyes"
9468 label_max="Far Set Eyes"
9469 show_simple="true"
9470 value_min="-2"
9471 value_max="1"
9472 value_default="0"
9473 camera_elevation=".1"
9474 camera_distance=".35"
9475 camera_angle="5">
9476 <param_driver>
9477 <driven
9478 id="194" />
9479
9480 <driven
9481 id="195" />
9482 </param_driver>
9483 </param>
9484
9485 <param
9486 id="769"
9487 group="0"
9488 wearable="shape"
9489 edit_group="shape_eyes"
9490 edit_group_order="4.5"
9491 name="Eye Depth"
9492 label_min="Sunken Eyes"
9493 label_max="Bugged Eyes"
9494 value_min="0"
9495 value_max="1"
9496 value_default=".5"
9497 camera_elevation=".1"
9498 camera_distance=".3"
9499 camera_angle="75">
9500 <param_driver>
9501 <driven
9502 id="767" />
9503
9504 <driven
9505 id="768" />
9506 </param_driver>
9507 </param>
9508
9509 <param
9510 id="198"
9511 group="0"
9512 wearable="shoes"
9513 edit_group="shoes"
9514 edit_group_order="2"
9515 name="Heel Height"
9516 label_min="Low Heels"
9517 label_max="High Heels"
9518 value_min="0"
9519 value_max="1"
9520 value_default="0"
9521 camera_angle="45"
9522 camera_distance=".8"
9523 camera_elevation="-1">
9524 <param_driver>
9525 <driven
9526 id="197" />
9527
9528 <driven
9529 id="500" />
9530 </param_driver>
9531 </param>
9532
9533 <param
9534 id="513"
9535 group="0"
9536 wearable="shoes"
9537 edit_group="shoes"
9538 edit_group_order="3"
9539 name="Heel Shape"
9540 label_min="Pointy Heels"
9541 label_max="Thick Heels"
9542 value_min="0"
9543 value_max="1"
9544 value_default=".5"
9545 camera_angle="45"
9546 camera_distance="1.5"
9547 camera_elevation="-1">
9548 <param_driver>
9549 <driven
9550 id="509"
9551 min1="0"
9552 max1="0"
9553 max2="0"
9554 min2=".5" />
9555
9556 <driven
9557 id="510"
9558 min1=".5"
9559 max1="1"
9560 max2="1"
9561 min2="1" />
9562 </param_driver>
9563 </param>
9564
9565 <param
9566 id="514"
9567 group="0"
9568 wearable="shoes"
9569 edit_group="shoes"
9570 edit_group_order="4"
9571 name="Toe Shape"
9572 label_min="Pointy"
9573 label_max="Square"
9574 value_min="0"
9575 value_max="1"
9576 value_default=".5"
9577 camera_angle="5"
9578 camera_distance=".8"
9579 camera_elevation="-.8">
9580 <param_driver>
9581 <driven
9582 id="511"
9583 min1="0"
9584 max1="0"
9585 max2="0"
9586 min2=".5" />
9587
9588 <driven
9589 id="512"
9590 min1=".5"
9591 max1="1"
9592 max2="1"
9593 min2="1" />
9594 </param_driver>
9595 </param>
9596
9597 <param
9598 id="503"
9599 group="0"
9600 wearable="shoes"
9601 edit_group="shoes"
9602 edit_group_order="6"
9603 name="Platform Height"
9604 label_min="Low Platforms"
9605 label_max="High Platforms"
9606 value_min="0"
9607 value_max="1"
9608 value_default="0"
9609 camera_angle="45"
9610 camera_distance=".5"
9611 camera_elevation="-1">
9612 <param_driver>
9613 <driven
9614 id="501" />
9615
9616 <driven
9617 id="502" />
9618 </param_driver>
9619 </param>
9620
9621 <param
9622 id="193"
9623 group="0"
9624 wearable="shape"
9625 edit_group="shape_head"
9626 edit_group_order="3"
9627 name="Head Shape"
9628 label="Head Shape"
9629 label_min="More Square"
9630 label_max="More Round"
9631 show_simple="true"
9632 value_min="0"
9633 value_max="1"
9634 value_default=".5"
9635 camera_elevation=".1"
9636 camera_distance=".5"
9637 camera_angle="20">
9638 <param_driver>
9639 <driven
9640 id="188"
9641 min1="0"
9642 max1="0"
9643 max2="0"
9644 min2=".5" />
9645
9646 <driven
9647 id="642"
9648 min1="0"
9649 max1="0"
9650 max2="0"
9651 min2=".5" />
9652
9653 <driven
9654 id="189"
9655 min1=".5"
9656 max1="1"
9657 max2="1"
9658 min2="1" />
9659
9660 <driven
9661 id="643"
9662 min1=".5"
9663 max1="1"
9664 max2="1"
9665 min2="1" />
9666 </param_driver>
9667 </param>
9668
9669 <param
9670 id="157"
9671 group="0"
9672 wearable="shape"
9673 edit_group="shape_torso"
9674 edit_group_order="13"
9675 name="Belly Size"
9676 label_min="Small"
9677 label_max="Big"
9678 value_min="0"
9679 value_max="1"
9680 value_default="0"
9681 camera_distance="1.4"
9682 camera_angle="30"
9683 camera_elevation=".2">
9684 <param_driver>
9685 <driven
9686 id="104" />
9687
9688 <driven
9689 id="156" />
9690
9691 <driven
9692 id="849" />
9693 </param_driver>
9694 </param>
9695
9696 <param
9697 id="637"
9698 group="0"
9699 wearable="shape"
9700 edit_group="shape_body"
9701 edit_group_order="3"
9702 name="Body Fat"
9703 label_min="Less Body Fat"
9704 label_max="More Body Fat"
9705 value_min="0"
9706 value_max="1"
9707 value_default="0"
9708 camera_distance="1.8">
9709 <param_driver>
9710 <driven
9711 id="633" />
9712
9713 <driven
9714 id="634" />
9715
9716 <driven
9717 id="635" />
9718
9719 <driven
9720 id="851" />
9721 </param_driver>
9722 </param>
9723
9724 <param
9725 id="130"
9726 group="0"
9727 wearable="hair"
9728 edit_group="hair_style"
9729 edit_group_order="8"
9730 name="Front Fringe"
9731 label_min="Short"
9732 label_max="Long"
9733 value_min="0"
9734 value_max="1"
9735 value_default=".45"
9736 camera_elevation=".1"
9737 camera_distance=".5"
9738 camera_angle="20">
9739 <param_driver>
9740 <driven
9741 id="144"
9742 min1="0"
9743 max1="0"
9744 max2="0"
9745 min2=".5" />
9746
9747 <driven
9748 id="145"
9749 min1=".5"
9750 max1="1"
9751 max2="1"
9752 min2="1" />
9753 </param_driver>
9754 </param>
9755
9756 <param
9757 id="131"
9758 group="0"
9759 wearable="hair"
9760 edit_group="hair_style"
9761 edit_group_order="9"
9762 name="Side Fringe"
9763 label_min="Short"
9764 label_max="Long"
9765 value_min="0"
9766 value_max="1"
9767 value_default=".5"
9768 camera_elevation=".1"
9769 camera_distance=".5"
9770 camera_angle="90">
9771 <param_driver>
9772 <driven
9773 id="146"
9774 min1="0"
9775 max1="0"
9776 max2="0"
9777 min2=".5" />
9778
9779 <driven
9780 id="147"
9781 min1=".5"
9782 max1="1"
9783 max2="1"
9784 min2="1" />
9785 </param_driver>
9786 </param>
9787
9788 <param
9789 id="132"
9790 group="0"
9791 wearable="hair"
9792 edit_group="hair_style"
9793 edit_group_order="10"
9794 name="Back Fringe"
9795 label_min="Short"
9796 label_max="Long"
9797 value_min="0"
9798 value_max="1"
9799 value_default=".39"
9800 camera_elevation=".1"
9801 camera_distance=".5"
9802 camera_angle="160">
9803 <param_driver>
9804 <driven
9805 id="148"
9806 min1="0"
9807 max1="0"
9808 max2="0"
9809 min2=".5" />
9810
9811 <driven
9812 id="149"
9813 min1=".5"
9814 max1="1"
9815 max2="1"
9816 min2="1" />
9817 </param_driver>
9818 </param>
9819
9820 <param
9821 id="133"
9822 group="0"
9823 wearable="hair"
9824 edit_group="hair_style"
9825 edit_group_order="2"
9826 name="Hair Front"
9827 label_min="Short"
9828 label_max="Long"
9829 value_min="0"
9830 value_max="1"
9831 value_default=".25"
9832 camera_elevation=".1"
9833 camera_distance=".5"
9834 camera_angle="20">
9835 <param_driver>
9836 <driven
9837 id="172"
9838 min1="0"
9839 max1="0"
9840 max2="0"
9841 min2=".5" />
9842
9843 <driven
9844 id="171"
9845 min1=".5"
9846 max1="1"
9847 max2="1"
9848 min2="1" />
9849 </param_driver>
9850 </param>
9851
9852 <param
9853 id="134"
9854 group="0"
9855 wearable="hair"
9856 edit_group="hair_style"
9857 edit_group_order="3"
9858 name="Hair Sides"
9859 label_min="Short"
9860 label_max="Long"
9861 value_min="0"
9862 value_max="1"
9863 value_default=".5"
9864 camera_elevation=".1"
9865 camera_distance=".5"
9866 camera_angle="90">
9867 <param_driver>
9868 <driven
9869 id="174"
9870 min1="0"
9871 max1="0"
9872 max2="0"
9873 min2=".5" />
9874
9875 <driven
9876 id="173"
9877 min1=".5"
9878 max1="1"
9879 max2="1"
9880 min2="1" />
9881 </param_driver>
9882 </param>
9883
9884 <param
9885 id="135"
9886 group="0"
9887 wearable="hair"
9888 edit_group="hair_style"
9889 edit_group_order="4"
9890 name="Hair Back"
9891 show_simple="true"
9892 label_min="Short"
9893 label_max="Long"
9894 value_min="0"
9895 value_max="1"
9896 value_default=".55"
9897 camera_elevation="-.1"
9898 camera_distance=".8"
9899 camera_angle="160">
9900 <param_driver>
9901 <driven
9902 id="176"
9903 min1="0"
9904 max1="0"
9905 max2="0"
9906 min2=".5" />
9907
9908 <driven
9909 id="175"
9910 min1=".5"
9911 max1="1"
9912 max2="1"
9913 min2="1" />
9914 </param_driver>
9915 </param>
9916
9917 <param
9918 id="136"
9919 group="0"
9920 wearable="hair"
9921 edit_group="hair_style"
9922 edit_group_order="11.5"
9923 name="Hair Sweep"
9924 label_min="Sweep Forward"
9925 label_max="Sweep Back"
9926 value_min="0"
9927 value_max="1"
9928 value_default=".5"
9929 camera_elevation=".1"
9930 camera_distance=".5"
9931 camera_angle="90">
9932 <param_driver>
9933 <driven
9934 id="179"
9935 min1="0"
9936 max1="0"
9937 max2="0"
9938 min2=".5" />
9939
9940 <driven
9941 id="178"
9942 min1=".5"
9943 max1="1"
9944 max2="1"
9945 min2="1" />
9946 </param_driver>
9947 </param>
9948
9949 <param
9950 id="137"
9951 group="0"
9952 wearable="hair"
9953 edit_group="hair_style"
9954 edit_group_order="16"
9955 name="Hair Tilt"
9956 label_min="Left"
9957 label_max="Right"
9958 value_min="0"
9959 value_max="1"
9960 value_default=".5"
9961 camera_elevation=".1"
9962 camera_distance=".5"
9963 camera_angle="0">
9964 <param_driver>
9965 <driven
9966 id="190"
9967 min1="0"
9968 max1="0"
9969 max2="0"
9970 min2=".5" />
9971
9972 <driven
9973 id="191"
9974 min1=".5"
9975 max1="1"
9976 max2="1"
9977 min2="1" />
9978 </param_driver>
9979 </param>
9980
9981 <param
9982 id="608"
9983 group="0"
9984 wearable="jacket"
9985 edit_group="jacket"
9986 edit_group_order="2"
9987 name="bottom length lower"
9988 label="Jacket Length"
9989 label_min="Short"
9990 label_max="Long"
9991 value_min="0"
9992 value_max="1"
9993 value_default=".8"
9994 camera_distance="1.4"
9995 camera_angle="30"
9996 camera_elevation=".2">
9997 <param_driver>
9998 <driven
9999 id="620" />
10000
10001 <driven
10002 id="1025" />
10003
10004 <driven
10005 id="1037" />
10006
10007 <driven
10008 id="621" />
10009
10010 <driven
10011 id="1027" />
10012
10013 <driven
10014 id="1033" />
10015 </param_driver>
10016 </param>
10017
10018 <param
10019 id="609"
10020 group="0"
10021 wearable="jacket"
10022 edit_group="jacket"
10023 edit_group_order="4"
10024 name="open jacket"
10025 label="Open Front"
10026 label_min="Open"
10027 label_max="Closed"
10028 value_min="0"
10029 value_max="1"
10030 value_default=".2"
10031 camera_distance="1.4"
10032 camera_angle="30"
10033 camera_elevation=".2">
10034 <param_driver>
10035 <driven
10036 id="622" />
10037
10038 <driven
10039 id="1026" />
10040
10041 <driven
10042 id="1038" />
10043
10044 <driven
10045 id="623" />
10046
10047 <driven
10048 id="1028" />
10049
10050 <driven
10051 id="1034" />
10052 </param_driver>
10053 </param>
10054
10055 <param
10056 id="105"
10057 group="0"
10058 sex="female"
10059 wearable="shape"
10060 edit_group="shape_torso"
10061 edit_group_order="6"
10062 name="Breast Size"
10063 label_min="Small"
10064 label_max="Large"
10065 value_min="0"
10066 value_max="1"
10067 value_default=".5"
10068 camera_elevation=".3"
10069 camera_distance="1.2"
10070 camera_angle="30">
10071 <param_driver>
10072 <driven
10073 id="843"
10074 min1="0"
10075 max1="0"
10076 max2="0"
10077 min2=".01" />
10078
10079 <driven
10080 id="627"
10081 min1="0"
10082 max1="0.01"
10083 max2="0.01"
10084 min2=".5" />
10085
10086 <driven
10087 id="626"
10088 min1=".5"
10089 max1="1"
10090 max2="1"
10091 min2="1" />
10092 </param_driver>
10093 </param>
10094
10095 <param
10096 id="629"
10097 group="0"
10098 wearable="shape"
10099 edit_group="shape_head"
10100 edit_group_order="6"
10101 name="Forehead Angle"
10102 label_min="More Vertical"
10103 label_max="More Sloped"
10104 value_min="0"
10105 value_max="1"
10106 value_default=".5"
10107 camera_elevation=".1"
10108 camera_distance=".5"
10109 camera_angle="70">
10110 <param_driver>
10111 <driven
10112 id="630"
10113 min1="0"
10114 max1="0"
10115 max2="0"
10116 min2=".5" />
10117
10118 <driven
10119 id="644"
10120 min1="0"
10121 max1="0"
10122 max2="0"
10123 min2=".5" />
10124
10125 <driven
10126 id="631"
10127 min1=".5"
10128 max1="1"
10129 max2="1"
10130 min2="1" />
10131
10132 <driven
10133 id="645"
10134 min1=".5"
10135 max1="1"
10136 max2="1"
10137 min2="1" />
10138 </param_driver>
10139 </param>
10140
10141 <param
10142 id="646"
10143 group="0"
10144 name="Egg_Head"
10145 label="Egg Head"
10146 wearable="shape"
10147 edit_group="shape_head"
10148 edit_group_order="4"
10149 label_min="Chin Heavy"
10150 label_max="Forehead Heavy"
10151 show_simple="true"
10152 value_min="-1.3"
10153 value_max="1"
10154 value_default="0"
10155 camera_elevation=".1"
10156 camera_distance=".5"
10157 camera_angle="20">
10158 <param_driver>
10159 <driven
10160 id="640" />
10161
10162 <driven
10163 id="186" />
10164 </param_driver>
10165 </param>
10166
10167 <param
10168 id="647"
10169 group="0"
10170 name="Squash_Stretch_Head"
10171 label="Head Stretch"
10172 wearable="shape"
10173 edit_group="shape_head"
10174 edit_group_order="2"
10175 show_simple="true"
10176 label_min="Squash Head"
10177 label_max="Stretch Head"
10178 value_min="-0.5"
10179 value_max="1"
10180 value_default="0"
10181 camera_elevation=".1"
10182 camera_distance=".5"
10183 camera_angle="20">
10184 <param_driver>
10185 <driven
10186 id="641" />
10187
10188 <driven
10189 id="187" />
10190 </param_driver>
10191 </param>
10192
10193 <param
10194 id="649"
10195 group="0"
10196 sex="female"
10197 wearable="shape"
10198 edit_group="shape_torso"
10199 edit_group_order="1.1"
10200 name="Torso Muscles"
10201 label="Torso Muscles"
10202 show_simple="true"
10203 label_min="Less Muscular"
10204 label_max="More Muscular"
10205 value_min="0"
10206 value_max="1"
10207 value_default=".5"
10208 camera_elevation=".1"
10209 camera_distance="1"
10210 camera_angle="15">
10211 <param_driver>
10212 <driven
10213 id="648"
10214 min1="0"
10215 max1="0"
10216 max2="0"
10217 min2=".5" />
10218
10219 <driven
10220 id="106"
10221 min1=".5"
10222 max1="1"
10223 max2="1"
10224 min2="1" />
10225 </param_driver>
10226 </param>
10227
10228 <param
10229 id="678"
10230 group="0"
10231 sex="male"
10232 wearable="shape"
10233 edit_group="shape_torso"
10234 edit_group_order="1"
10235 name="Torso Muscles"
10236 show_simple="true"
10237 label_min="Less Muscular"
10238 label_max="More Muscular"
10239 value_min="0"
10240 value_max="1"
10241 value_default=".5"
10242 camera_elevation=".1"
10243 camera_distance="1.2"
10244 camera_angle="0">
10245 <param_driver>
10246 <driven
10247 id="677"
10248 min1="0"
10249 max1="0"
10250 max2="0"
10251 min2=".5" />
10252
10253 <driven
10254 id="106"
10255 min1=".5"
10256 max1="1"
10257 max2="1"
10258 min2="1" />
10259 </param_driver>
10260 </param>
10261
10262 <param
10263 id="652"
10264 group="0"
10265 wearable="shape"
10266 edit_group="shape_legs"
10267 edit_group_order="1"
10268 name="Leg Muscles"
10269 label_min="Less Muscular"
10270 label_max="More Muscular"
10271 show_simple="true"
10272 value_min="0"
10273 value_max="1"
10274 value_default=".5"
10275 camera_distance="1.3"
10276 camera_elevation="-.5"
10277 camera_angle="15">
10278 <param_driver>
10279 <driven
10280 id="651"
10281 min1="0"
10282 max1="0"
10283 max2="0"
10284 min2=".5" />
10285
10286 <driven
10287 id="152"
10288 min1=".5"
10289 max1="1"
10290 max2="1"
10291 min2="1" />
10292 </param_driver>
10293 </param>
10294
10295 <param
10296 id="80"
10297 name="male"
10298 group="0"
10299 edit_group="dummy"
10300 wearable="shape"
10301 value_min="0"
10302 value_max="1">
10303 <param_driver>
10304 <driven
10305 id="32" />
10306
10307 <driven
10308 id="153" />
10309
10310 <driven
10311 id="40" />
10312
10313 <driven
10314 id="100" />
10315
10316 <driven
10317 id="857" />
10318 </param_driver>
10319 </param>
10320
10321 <param
10322 id="659"
10323 group="0"
10324 wearable="shape"
10325 edit_group="shape_mouth"
10326 edit_group_order="5"
10327 name="Mouth Corner"
10328 label_min="Corner Down"
10329 label_max="Corner Up"
10330 value_min="0"
10331 value_max="1"
10332 value_default=".5"
10333 camera_elevation="0"
10334 camera_distance=".28">
10335 <param_driver>
10336 <driven
10337 id="658"
10338 min1="0"
10339 max1="0"
10340 max2="0"
10341 min2=".5" />
10342
10343 <driven
10344 id="657"
10345 min1=".5"
10346 max1="1"
10347 max2="1"
10348 min2="1" />
10349 </param_driver>
10350 </param>
10351
10352 <param
10353 id="662"
10354 group="0"
10355 wearable="shape"
10356 edit_group="shape_head"
10357 edit_group_order="5"
10358 name="Face Shear"
10359 label_min="Shear Right Up"
10360 label_max="Shear Left Up"
10361 value_min="0"
10362 value_max="1"
10363 value_default=".5"
10364 camera_elevation=".1"
10365 camera_distance=".5">
10366 <param_driver>
10367 <driven
10368 id="660" />
10369
10370 <driven
10371 id="661" />
10372
10373 <driven
10374 id="774" />
10375 </param_driver>
10376 </param>
10377
10378 <param
10379 id="773"
10380 group="0"
10381 wearable="shape"
10382 edit_group="shape_head"
10383 edit_group_order="4.5"
10384 name="Head Length"
10385 label_min="Flat Head"
10386 label_max="Long Head"
10387 value_min="0"
10388 value_max="1"
10389 value_default=".5"
10390 camera_elevation=".1"
10391 camera_distance=".5"
10392 camera_angle="75">
10393 <param_driver>
10394 <driven
10395 id="770" />
10396
10397 <driven
10398 id="771" />
10399
10400 <driven
10401 id="772" />
10402 </param_driver>
10403 </param>
10404
10405 <param
10406 id="682"
10407 group="0"
10408 wearable="shape"
10409 edit_group="shape_head"
10410 edit_group_order="1"
10411 name="Head Size"
10412 label="Head Size"
10413 label_min="Small Head"
10414 label_max="Big Head"
10415 show_simple="true"
10416 value_min="0"
10417 value_max="1"
10418 value_default=".5"
10419 camera_elevation=".1"
10420 camera_distance=".5">
10421 <param_driver>
10422 <driven
10423 id="679" />
10424
10425 <driven
10426 id="694" />
10427
10428 <driven
10429 id="680" />
10430
10431 <driven
10432 id="681" />
10433
10434 <driven
10435 id="655" />
10436 </param_driver>
10437 </param>
10438
10439 <param
10440 id="690"
10441 group="0"
10442 wearable="shape"
10443 edit_group="shape_eyes"
10444 edit_group_order="1"
10445 name="Eye Size"
10446 label="Eye Size"
10447 label_min="Beady Eyes"
10448 label_max="Anime Eyes"
10449 value_min="0"
10450 value_max="1"
10451 value_default=".5"
10452 show_simple="true"
10453 camera_elevation=".1"
10454 camera_distance=".35">
10455 <param_driver>
10456 <driven
10457 id="686" />
10458
10459 <driven
10460 id="687" />
10461
10462 <driven
10463 id="695" />
10464
10465 <driven
10466 id="688" />
10467
10468 <driven
10469 id="691" />
10470
10471 <driven
10472 id="689" />
10473 </param_driver>
10474 </param>
10475
10476 <param
10477 id="752"
10478 group="0"
10479 sex="male"
10480 wearable="hair"
10481 edit_group="hair_facial"
10482 edit_group_order="1"
10483 name="Hair Thickness"
10484 label_min="5 O'Clock Shadow"
10485 label_max="Bushy Hair"
10486 value_min="0"
10487 value_max="1"
10488 value_default=".5"
10489 camera_elevation="0"
10490 camera_distance=".28">
10491 <param_driver>
10492 <driven
10493 id="751"
10494 min1="0"
10495 max1="0"
10496 max2="0"
10497 min2=".2" />
10498
10499 <driven
10500 id="1012"
10501 min1="0"
10502 max1="0"
10503 max2=".2"
10504 min2=".6" />
10505
10506 <driven
10507 id="400"
10508 min1=".2"
10509 max1="1"
10510 max2="1"
10511 min2="1" />
10512 </param_driver>
10513 </param>
10514
10515 <param
10516 id="763"
10517 group="0"
10518 wearable="hair"
10519 edit_group="hair_style"
10520 edit_group_order="1"
10521 name="Hair Volume"
10522 show_simple="true"
10523 label_min="Less Volume"
10524 label_max="More Volume"
10525 value_min="0"
10526 value_max="1"
10527 value_default=".55"
10528 camera_elevation=".1"
10529 camera_distance=".5"
10530 camera_angle="20">
10531 <param_driver>
10532 <driven
10533 id="761"
10534 min1="0"
10535 max1="0"
10536 max2="0"
10537 min2=".5" />
10538
10539 <driven
10540 id="180"
10541 min1=".5"
10542 max1="1"
10543 max2="1"
10544 min2="1" />
10545 </param_driver>
10546 </param>
10547
10548 <param
10549 id="834"
10550 group="0"
10551 wearable="jacket"
10552 edit_group="colorpicker"
10553 name="jacket_red"
10554 value_min="0"
10555 value_max="1"
10556 value_default="1">
10557 <param_driver>
10558 <driven
10559 id="809"
10560 min1="0"
10561 max1="1"
10562 max2="1"
10563 min2="1" />
10564
10565 <driven
10566 id="831"
10567 min1="0"
10568 max1="1"
10569 max2="1"
10570 min2="1" />
10571 </param_driver>
10572 </param>
10573
10574 <param
10575 id="835"
10576 group="0"
10577 wearable="jacket"
10578 edit_group="colorpicker"
10579 name="jacket_green"
10580 value_min="0"
10581 value_max="1"
10582 value_default="1">
10583 <param_driver>
10584 <driven
10585 id="810"
10586 min1="0"
10587 max1="1"
10588 max2="1"
10589 min2="1" />
10590
10591 <driven
10592 id="832"
10593 min1="0"
10594 max1="1"
10595 max2="1"
10596 min2="1" />
10597 </param_driver>
10598 </param>
10599
10600 <param
10601 id="836"
10602 group="0"
10603 wearable="jacket"
10604 edit_group="colorpicker"
10605 name="jacket_blue"
10606 value_min="0"
10607 value_max="1"
10608 value_default="1">
10609 <param_driver>
10610 <driven
10611 id="811"
10612 min1="0"
10613 max1="1"
10614 max2="1"
10615 min2="1" />
10616
10617 <driven
10618 id="833"
10619 min1="0"
10620 max1="1"
10621 max2="1"
10622 min2="1" />
10623 </param_driver>
10624 </param>
10625
10626 <param
10627 id="785"
10628 group="0"
10629 wearable="hair"
10630 edit_group="hair_style"
10631 edit_group_order="14.6"
10632 name="Pigtails"
10633 show_simple="true"
10634 label_min="Short Pigtails"
10635 label_max="Long Pigtails"
10636 value_min="0"
10637 value_max="1"
10638 value_default="0"
10639 camera_elevation=".1"
10640 camera_distance=".5"
10641 camera_angle="15">
10642 <param_driver>
10643 <driven
10644 id="782"
10645 min1="0"
10646 max1=".10"
10647 max2=".10"
10648 min2=".5" />
10649
10650 <driven
10651 id="783"
10652 min1=".10"
10653 max1=".5"
10654 max2=".5"
10655 min2=".75" />
10656
10657 <driven
10658 id="790"
10659 min1=".5"
10660 max1=".75"
10661 max2=".75"
10662 min2="1" />
10663
10664 <driven
10665 id="784"
10666 min1=".75"
10667 max1="1"
10668 max2="1"
10669 min2="1" />
10670 </param_driver>
10671 </param>
10672
10673 <param
10674 id="789"
10675 group="0"
10676 wearable="hair"
10677 edit_group="hair_style"
10678 edit_group_order="14.7"
10679 name="Ponytail"
10680 label_min="Short Ponytail"
10681 label_max="Long Ponytail"
10682 value_min="0"
10683 value_max="1"
10684 value_default="0"
10685 camera_elevation=".1"
10686 camera_distance=".5"
10687 camera_angle="180">
10688 <param_driver>
10689 <driven
10690 id="786"
10691 min1="0"
10692 max1=".10"
10693 max2=".10"
10694 min2=".66" />
10695
10696 <driven
10697 id="787"
10698 min1=".10"
10699 max1=".66"
10700 max2=".66"
10701 min2="1" />
10702
10703 <driven
10704 id="788"
10705 min1=".66"
10706 max1="1"
10707 max2="1"
10708 min2="1" />
10709 </param_driver>
10710 </param>
10711
10712 <param
10713 id="795"
10714 group="0"
10715 name="Butt Size"
10716 label="Butt Size"
10717 wearable="shape"
10718 edit_group="shape_legs"
10719 edit_group_order="4"
10720 label_min="Flat Butt"
10721 label_max="Big Butt"
10722 value_min="0"
10723 value_max="1"
10724 value_default=".25"
10725 camera_angle="180"
10726 camera_distance=".6">
10727 <param_driver>
10728 <driven
10729 id="867"
10730 min1="0"
10731 max1="0"
10732 max2="0"
10733 min2=".3" />
10734
10735 <driven
10736 id="794"
10737 min1="0"
10738 max1="0"
10739 max2="0"
10740 min2=".3" />
10741
10742 <driven
10743 id="151"
10744 min1=".3"
10745 max1="1"
10746 max2="1"
10747 min2="1" />
10748
10749 <driven
10750 id="852"
10751 min1=".3"
10752 max1="1"
10753 max2="1"
10754 min2="1" />
10755 </param_driver>
10756 </param>
10757
10758 <param
10759 id="841"
10760 group="0"
10761 name="Bowed_Legs"
10762 label="Knee Angle"
10763 wearable="shape"
10764 edit_group_order="5.5"
10765 edit_group="shape_legs"
10766 label_min="Knock Kneed"
10767 label_max="Bow Legged"
10768 value_min="-1"
10769 value_max="1"
10770 value_default="0"
10771 camera_distance="1.3"
10772 camera_elevation="-.5">
10773 <param_driver>
10774 <driven
10775 id="853" />
10776
10777 <driven
10778 id="847" />
10779 </param_driver>
10780 </param>
10781
10782 <param
10783 id="753"
10784 group="0"
10785 name="Saddlebags"
10786 label="Saddle Bags"
10787 wearable="shape"
10788 edit_group="shape_legs"
10789 edit_group_order="5"
10790 label_min="Less Saddle"
10791 label_max="More Saddle"
10792 value_min="-0.5"
10793 value_max="3"
10794 value_default="0"
10795 camera_angle="0"
10796 camera_distance="1.2">
10797 <param_driver>
10798 <driven
10799 id="850" />
10800
10801 <driven
10802 id="854" />
10803 </param_driver>
10804 </param>
10805
10806 <param
10807 id="676"
10808 group="0"
10809 name="Love_Handles"
10810 label="Love Handles"
10811 wearable="shape"
10812 edit_group="shape_torso"
10813 edit_group_order="12"
10814 label_min="Less Love"
10815 label_max="More Love"
10816 value_min="-1"
10817 value_max="2"
10818 value_default="0"
10819 camera_elevation=".3"
10820 camera_distance=".9">
10821 <param_driver>
10822 <driven
10823 id="855" />
10824
10825 <driven
10826 id="856" />
10827 </param_driver>
10828 </param>
10829
10830 <param
10831 id="863"
10832 group="0"
10833 name="skirt_looseness"
10834 label="Skirt Fit"
10835 show_simple="true"
10836 clothing_morph="true"
10837 wearable="skirt"
10838 edit_group_order="2"
10839 edit_group="skirt"
10840 label_min="Tight Skirt"
10841 label_max="Poofy Skirt"
10842 value_min="0"
10843 value_max="1"
10844 value_default=".333"
10845 camera_distance="1.3"
10846 camera_elevation="-.5">
10847 <param_driver>
10848 <driven
10849 id="866"
10850 min1="0"
10851 max1="0"
10852 max2="0"
10853 min2=".2" />
10854
10855 <driven
10856 id="846"
10857 min1="0"
10858 max1=".5"
10859 max2=".5"
10860 min2="1" />
10861
10862 <driven
10863 id="845"
10864 min1=".5"
10865 max1="1"
10866 max2="1"
10867 min2="1" />
10868 </param_driver>
10869 </param>
10870
10871 <param
10872 id="119"
10873 group="0"
10874 wearable="hair"
10875 edit_group="hair_eyebrows"
10876 edit_group_order="1"
10877 name="Eyebrow Size"
10878 show_simple="true"
10879 label_min="Thin Eyebrows"
10880 label_max="Bushy Eyebrows"
10881 value_min="0"
10882 value_max="1"
10883 value_default="0.5"
10884 camera_elevation=".1"
10885 camera_distance=".3">
10886 <param_driver>
10887 <driven
10888 id="1000" />
10889
10890 <driven
10891 id="1001" />
10892 </param_driver>
10893 </param>
10894
10895 <param
10896 id="750"
10897 group="0"
10898 wearable="hair"
10899 edit_group="hair_eyebrows"
10900 edit_group_order="2"
10901 name="Eyebrow Density"
10902 label_min="Sparse"
10903 label_max="Dense"
10904 value_min="0"
10905 value_max="1"
10906 value_default="0.7"
10907 camera_elevation=".1"
10908 camera_distance=".3">
10909 <param_driver>
10910 <driven
10911 id="1002" />
10912
10913 <driven
10914 id="1003" />
10915 </param_driver>
10916 </param>
10917
10918 <param
10919 id="166"
10920 sex="male"
10921 group="0"
10922 wearable="hair"
10923 edit_group="hair_facial"
10924 edit_group_order="2"
10925 name="Sideburns"
10926 show_simple="true"
10927 label_min="Short Sideburns"
10928 label_max="Mutton Chops"
10929 value_min="0"
10930 value_max="1"
10931 value_default="0.0"
10932 camera_elevation=".1"
10933 camera_distance=".3"
10934 camera_angle="30">
10935 <param_driver>
10936 <driven
10937 id="1004" />
10938
10939 <driven
10940 id="1005" />
10941 </param_driver>
10942 </param>
10943
10944 <param
10945 id="167"
10946 sex="male"
10947 group="0"
10948 wearable="hair"
10949 edit_group="hair_facial"
10950 edit_group_order="3"
10951 name="Moustache"
10952 show_simple="true"
10953 label_min="Chaplin"
10954 label_max="Handlebars"
10955 value_min="0"
10956 value_max="1"
10957 value_default="0.0"
10958 camera_elevation=".1"
10959 camera_distance=".3"
10960 camera_angle="30">
10961 <param_driver>
10962 <driven
10963 id="1006" />
10964
10965 <driven
10966 id="1007" />
10967 </param_driver>
10968 </param>
10969
10970 <param
10971 id="168"
10972 sex="male"
10973 group="0"
10974 wearable="hair"
10975 edit_group="hair_facial"
10976 edit_group_order="5"
10977 name="Soulpatch"
10978 show_simple="true"
10979 label_min="Less soul"
10980 label_max="More soul"
10981 value_min="0"
10982 value_max="1"
10983 value_default="0.0"
10984 camera_elevation="-.1"
10985 camera_distance=".3"
10986 camera_angle="0">
10987 <param_driver>
10988 <driven
10989 id="1008" />
10990
10991 <driven
10992 id="1009" />
10993 </param_driver>
10994 </param>
10995
10996 <param
10997 id="169"
10998 sex="male"
10999 group="0"
11000 wearable="hair"
11001 edit_group="hair_facial"
11002 edit_group_order="4"
11003 name="Chin Curtains"
11004 show_simple="true"
11005 label_min="Less Curtains"
11006 label_max="More Curtains"
11007 value_min="0"
11008 value_max="1"
11009 value_default="0.0"
11010 camera_elevation="-.1"
11011 camera_distance=".3"
11012 camera_angle="45">
11013 <param_driver>
11014 <driven
11015 id="1010" />
11016
11017 <driven
11018 id="1011" />
11019 </param_driver>
11020 </param>
11021
11022 <param
11023 id="606"
11024 group="0"
11025 wearable="jacket"
11026 edit_group="jacket"
11027 edit_group_order="1"
11028 name="Sleeve Length"
11029 label_min="Short"
11030 label_max="Long"
11031 value_min="0"
11032 value_max="1"
11033 value_default=".8"
11034 camera_distance="1.2"
11035 camera_angle="30"
11036 camera_elevation=".2">
11037 <param_driver>
11038 <driven
11039 id="1019" />
11040
11041 <driven
11042 id="1039" />
11043
11044 <driven
11045 id="1020" />
11046 </param_driver>
11047 </param>
11048
11049 <param
11050 id="607"
11051 group="0"
11052 wearable="jacket"
11053 edit_group="jacket"
11054 edit_group_order="3"
11055 name="Collar Front"
11056 label_min="Low"
11057 label_max="High"
11058 value_min="0"
11059 value_max="1"
11060 value_default=".8"
11061 camera_distance="1.2"
11062 camera_angle="15"
11063 camera_elevation=".2">
11064 <param_driver>
11065 <driven
11066 id="1021" />
11067
11068 <driven
11069 id="1040" />
11070
11071 <driven
11072 id="1022" />
11073 </param_driver>
11074 </param>
11075
11076 <param
11077 id="780"
11078 group="0"
11079 wearable="jacket"
11080 edit_group="jacket"
11081 edit_group_order="3.5"
11082 name="Collar Back"
11083 label_min="Low"
11084 label_max="High"
11085 value_min="0"
11086 value_max="1"
11087 value_default=".8"
11088 camera_distance="1.2"
11089 camera_angle="195"
11090 camera_elevation=".2">
11091 <param_driver>
11092 <driven
11093 id="1023" />
11094
11095 <driven
11096 id="1041" />
11097
11098 <driven
11099 id="1024" />
11100 </param_driver>
11101 </param>
11102
11103 <param
11104 id="603"
11105 group="0"
11106 wearable="undershirt"
11107 edit_group="undershirt"
11108 edit_group_order="1"
11109 name="Sleeve Length"
11110 label_min="Short"
11111 label_max="Long"
11112 value_min=".01"
11113 value_max="1"
11114 value_default=".4"
11115 camera_distance="1.2"
11116 camera_angle="30"
11117 camera_elevation=".2">
11118 <param_driver>
11119 <driven
11120 id="1042" />
11121
11122 <driven
11123 id="1043" />
11124 </param_driver>
11125 </param>
11126
11127 <param
11128 id="604"
11129 group="0"
11130 wearable="undershirt"
11131 edit_group="undershirt"
11132 edit_group_order="2"
11133 name="Bottom"
11134 label_min="Short"
11135 label_max="Long"
11136 value_min="0"
11137 value_max="1"
11138 value_default=".85"
11139 camera_distance="1.2"
11140 camera_angle="30"
11141 camera_elevation=".2">
11142 <param_driver>
11143 <driven
11144 id="1044" />
11145
11146 <driven
11147 id="1045" />
11148 </param_driver>
11149 </param>
11150
11151 <param
11152 id="605"
11153 group="0"
11154 wearable="undershirt"
11155 edit_group="undershirt"
11156 edit_group_order="3"
11157 name="Collar Front"
11158 label_min="Low"
11159 label_max="High"
11160 value_min="0"
11161 value_max="1"
11162 value_default=".84"
11163 camera_distance=".8"
11164 camera_angle="15"
11165 camera_elevation=".2">
11166 <param_driver>
11167 <driven
11168 id="1046" />
11169
11170 <driven
11171 id="1047" />
11172 </param_driver>
11173 </param>
11174
11175 <param
11176 id="779"
11177 group="0"
11178 wearable="undershirt"
11179 edit_group="undershirt"
11180 edit_group_order="4"
11181 name="Collar Back"
11182 label_min="Low"
11183 label_max="High"
11184 value_min="0"
11185 value_max="1"
11186 value_default=".84"
11187 camera_distance=".8"
11188 camera_angle="195"
11189 camera_elevation=".2">
11190 <param_driver>
11191 <driven
11192 id="1048" />
11193
11194 <driven
11195 id="1049" />
11196 </param_driver>
11197 </param>
11198
11199 <param
11200 id="617"
11201 group="0"
11202 wearable="socks"
11203 edit_group="socks"
11204 name="Socks Length"
11205 label_min="Short"
11206 label_max="Long"
11207 value_min="0"
11208 value_max="1"
11209 value_default="0.35"
11210 camera_distance=".95"
11211 camera_angle="30"
11212 camera_elevation="-.75">
11213 <param_driver>
11214 <driven
11215 id="1050" />
11216
11217 <driven
11218 id="1051" />
11219 </param_driver>
11220 </param>
11221
11222 <param
11223 id="616"
11224 group="0"
11225 wearable="shoes"
11226 edit_group="shoes"
11227 edit_group_order="1"
11228 name="Shoe Height"
11229 label_min="Short"
11230 label_max="Tall"
11231 value_min="0"
11232 value_max="1"
11233 value_default="0.1"
11234 camera_distance="1.2"
11235 camera_angle="30"
11236 camera_elevation="-.75">
11237 <param_driver>
11238 <driven
11239 id="1052" />
11240
11241 <driven
11242 id="1053" />
11243 </param_driver>
11244 </param>
11245
11246 <param
11247 id="619"
11248 group="0"
11249 wearable="underpants"
11250 edit_group="underpants"
11251 name="Pants Length"
11252 label_min="Short"
11253 label_max="Long"
11254 value_min="0"
11255 value_max="1"
11256 value_default=".3"
11257 camera_distance="1.2"
11258 camera_angle="30"
11259 camera_elevation="-.3">
11260 <param_driver>
11261 <driven
11262 id="1054" />
11263
11264 <driven
11265 id="1055" />
11266 </param_driver>
11267 </param>
11268
11269 <param
11270 id="624"
11271 group="0"
11272 wearable="underpants"
11273 edit_group="underpants"
11274 name="Pants Waist"
11275 label_min="Low"
11276 label_max="High"
11277 value_min="0"
11278 value_max="1"
11279 value_default=".8"
11280 camera_distance="1.2"
11281 camera_angle="30"
11282 camera_elevation="-.3">
11283 <param_driver>
11284 <driven
11285 id="1056" />
11286
11287 <driven
11288 id="1057" />
11289 </param_driver>
11290 </param>
11291
11292 <param
11293 id="93"
11294 group="0"
11295 wearable="gloves"
11296 edit_group="gloves"
11297 name="Glove Length"
11298 label_min="Short"
11299 label_max="Long"
11300 value_min=".01"
11301 value_max="1"
11302 value_default=".8"
11303 camera_distance="1.2"
11304 camera_angle="30"
11305 camera_elevation=".2">
11306 <param_driver>
11307 <driven
11308 id="1058" />
11309
11310 <driven
11311 id="1059" />
11312 </param_driver>
11313 </param>
11314
11315 <param
11316 id="844"
11317 group="0"
11318 wearable="gloves"
11319 edit_group="gloves"
11320 name="Glove Fingers"
11321 label_min="Fingerless"
11322 label_max="Fingers"
11323 value_min=".01"
11324 value_max="1"
11325 value_default="1"
11326 camera_distance="1.2"
11327 camera_angle="30"
11328 camera_elevation=".2">
11329 <param_driver>
11330 <driven
11331 id="1060" />
11332
11333 <driven
11334 id="1061" />
11335 </param_driver>
11336 </param>
11337
11338<!--Pointy eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
11339 <param
11340 id="16"
11341 group="0"
11342 name="Pointy_Eyebrows"
11343 label="Eyebrow Points"
11344 wearable="hair"
11345 edit_group="hair_eyebrows"
11346 edit_group_order="4"
11347 label_min="Smooth"
11348 label_max="Pointy"
11349 value_min="-.5"
11350 value_max="3"
11351 camera_elevation=".1"
11352 camera_distance=".3">
11353 <param_driver>
11354 <driven
11355 id="870" />
11356 </param_driver>
11357 </param>
11358
11359<!--Lower eyebrows became a driver/driven param with new min value for backwards compatibility between 1.0 and 1.1-->
11360 <param
11361 id="757"
11362 group="0"
11363 name="Lower_Eyebrows"
11364 label="Eyebrow Height"
11365 show_simple="true"
11366 wearable="hair"
11367 edit_group="hair_eyebrows"
11368 edit_group_order="2.5"
11369 label_min="Higher"
11370 label_max="Lower"
11371 value_min="-4"
11372 value_max="2"
11373 value_default="-1"
11374 camera_elevation=".1"
11375 camera_distance=".3">
11376 <param_driver>
11377 <driven
11378 id="871" />
11379 </param_driver>
11380 </param>
11381
11382<!--Arced eyebrows became a driver/driven param with new max value for backwards compatibility between 1.0 and 1.1-->
11383 <param
11384 id="31"
11385 group="0"
11386 name="Arced_Eyebrows"
11387 label="Eyebrow Arc"
11388 wearable="hair"
11389 edit_group="hair_eyebrows"
11390 edit_group_order="3"
11391 label_min="Flat"
11392 label_max="Arced"
11393 value_min="0"
11394 value_max="2"
11395 value_default=".5"
11396 camera_elevation=".1"
11397 camera_distance=".3">
11398 <param_driver>
11399 <driven
11400 id="872" />
11401 </param_driver>
11402 </param>
11403
11404 <param
11405 id="877"
11406 group="0"
11407 name="Jacket Wrinkles"
11408 label="Jacket Wrinkles"
11409 wearable="jacket"
11410 edit_group="jacket"
11411 edit_group_order="20"
11412 label_min="No Wrinkles"
11413 label_max="Wrinkles"
11414 value_min="0"
11415 value_max="1"
11416 value_default="0"
11417 camera_elevation=".1"
11418 camera_distance=".3">
11419 <param_driver>
11420 <driven
11421 id="875" />
11422
11423 <driven
11424 id="876" />
11425 </param_driver>
11426 </param>
11427 <param id="1071" group="2" wearable="tattoo" edit_group="colorpicker" name="tattoo_red"
11428 value_min="0" value_max="1" value_default="1">
11429 <param_driver>
11430 <driven id="1062" min1="0" max1="1" max2="1" min2="1" />
11431 <driven id="1065" min1="0" max1="1" max2="1" min2="1" />
11432 <driven id="1068" min1="0" max1="1" max2="1" min2="1" />
11433 </param_driver>
11434 </param>
11435 <param id="1072" group="2" wearable="tattoo" edit_group="colorpicker" name="tattoo_green"
11436 value_min="0" value_max="1" value_default="1">
11437 <param_driver>
11438 <driven id="1063" min1="0" max1="1" max2="1" min2="1" />
11439 <driven id="1066" min1="0" max1="1" max2="1" min2="1" />
11440 <driven id="1069" min1="0" max1="1" max2="1" min2="1" />
11441 </param_driver>
11442 </param>
11443 <param id="1073" group="2" wearable="tattoo" edit_group="colorpicker" name="tattoo_blue"
11444 value_min="0" value_max="1" value_default="1">
11445 <param_driver>
11446 <driven id="1064" min1="0" max1="1" max2="1" min2="1" />
11447 <driven id="1067" min1="0" max1="1" max2="1" min2="1" />
11448 <driven id="1070" min1="0" max1="1" max2="1" min2="1" />
11449 </param_driver>
11450 </param>
11451
11452 </driver_parameters>
11453</linden_avatar>
11454
diff --git a/linden/etc/message.xml b/linden/etc/message.xml
index 0fdf364..8d34dd8 100644
--- a/linden/etc/message.xml
+++ b/linden/etc/message.xml
@@ -386,7 +386,17 @@
386 <boolean>true</boolean> 386 <boolean>true</boolean>
387 </map> 387 </map>
388 388
389 <key>ParcelVoiceInfo</key> 389 <!-- Server to client -->
390 <key>DisplayNameUpdate</key>
391 <map>
392 <key>flavor</key>
393 <string>llsd</string>
394 <key>trusted-sender</key>
395 <boolean>true</boolean>
396 </map>
397
398
399 <key>ParcelVoiceInfo</key>
390 <map> 400 <map>
391 <key>flavor</key> 401 <key>flavor</key>
392 <string>llsd</string> 402 <string>llsd</string>
@@ -442,6 +452,14 @@
442 <boolean>true</boolean> 452 <boolean>true</boolean>
443 </map> 453 </map>
444 454
455 <key>SetDisplayNameReply</key>
456 <map>
457 <key>flavor</key>
458 <string>llsd</string>
459 <key>trusted-sender</key>
460 <boolean>true</boolean>
461 </map>
462
445 <key>DirLandReply</key> 463 <key>DirLandReply</key>
446 <map> 464 <map>
447 <key>flavor</key> 465 <key>flavor</key>
diff --git a/linden/indra/llaudio/llaudioengine.cpp b/linden/indra/llaudio/llaudioengine.cpp
index bed791a..6b0003a 100644
--- a/linden/indra/llaudio/llaudioengine.cpp
+++ b/linden/indra/llaudio/llaudioengine.cpp
@@ -36,7 +36,6 @@
36#include "linden_common.h" 36#include "linden_common.h"
37 37
38#include "llaudioengine.h" 38#include "llaudioengine.h"
39#include "llstreamingaudio.h"
40 39
41#include "llerror.h" 40#include "llerror.h"
42#include "llmath.h" 41#include "llmath.h"
@@ -48,7 +47,6 @@
48#include "llaudiodecodemgr.h" 47#include "llaudiodecodemgr.h"
49#include "llassetstorage.h" 48#include "llassetstorage.h"
50 49
51
52// necessary for grabbing sounds from sim (implemented in viewer) 50// necessary for grabbing sounds from sim (implemented in viewer)
53extern void request_sound(const LLUUID &sound_guid); 51extern void request_sound(const LLUUID &sound_guid);
54 52
@@ -70,16 +68,6 @@ LLAudioEngine::~LLAudioEngine()
70{ 68{
71} 69}
72 70
73LLStreamingAudioInterface* LLAudioEngine::getStreamingAudioImpl()
74{
75 return mStreamingAudioImpl;
76}
77
78void LLAudioEngine::setStreamingAudioImpl(LLStreamingAudioInterface *impl)
79{
80 mStreamingAudioImpl = impl;
81}
82
83void LLAudioEngine::setDefaults() 71void LLAudioEngine::setDefaults()
84{ 72{
85 mMaxWindGain = 1.f; 73 mMaxWindGain = 1.f;
@@ -108,8 +96,6 @@ void LLAudioEngine::setDefaults()
108 mInternalGain = 0.f; 96 mInternalGain = 0.f;
109 mNextWindUpdate = 0.f; 97 mNextWindUpdate = 0.f;
110 98
111 mStreamingAudioImpl = NULL;
112
113 for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++) 99 for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++)
114 mSecondaryGain[i] = 1.0f; 100 mSecondaryGain[i] = 1.0f;
115} 101}
@@ -174,62 +160,6 @@ void LLAudioEngine::shutdown()
174 } 160 }
175} 161}
176 162
177
178// virtual
179void LLAudioEngine::startInternetStream(const std::string& url)
180{
181 if (mStreamingAudioImpl)
182 mStreamingAudioImpl->start(url);
183}
184
185
186// virtual
187void LLAudioEngine::stopInternetStream()
188{
189 if (mStreamingAudioImpl)
190 mStreamingAudioImpl->stop();
191}
192
193// virtual
194void LLAudioEngine::pauseInternetStream(int pause)
195{
196 if (mStreamingAudioImpl)
197 mStreamingAudioImpl->pause(pause);
198}
199
200// virtual
201void LLAudioEngine::updateInternetStream()
202{
203 if (mStreamingAudioImpl)
204 mStreamingAudioImpl->update();
205}
206
207// virtual
208int LLAudioEngine::isInternetStreamPlaying()
209{
210 if (mStreamingAudioImpl)
211 return mStreamingAudioImpl->isPlaying();
212
213 return 0; // Stopped
214}
215
216
217// virtual
218void LLAudioEngine::setInternetStreamGain(F32 vol)
219{
220 if (mStreamingAudioImpl)
221 mStreamingAudioImpl->setGain(vol);
222}
223
224// virtual
225std::string LLAudioEngine::getInternetStreamURL()
226{
227 if (mStreamingAudioImpl)
228 return mStreamingAudioImpl->getURL();
229 else return std::string();
230}
231
232
233void LLAudioEngine::updateChannels() 163void LLAudioEngine::updateChannels()
234{ 164{
235 S32 i; 165 S32 i;
@@ -512,7 +442,6 @@ void LLAudioEngine::idle(F32 max_decode_time)
512 // or request new data. 442 // or request new data.
513 startNextTransfer(); 443 startNextTransfer();
514 444
515 updateInternetStream();
516} 445}
517 446
518 447
@@ -754,14 +683,6 @@ F32 LLAudioEngine::getSecondaryGain(S32 type)
754 return mSecondaryGain[type]; 683 return mSecondaryGain[type];
755} 684}
756 685
757F32 LLAudioEngine::getInternetStreamGain()
758{
759 if (mStreamingAudioImpl)
760 return mStreamingAudioImpl->getGain();
761 else
762 return 1.0f;
763}
764
765void LLAudioEngine::setMaxWindGain(F32 gain) 686void LLAudioEngine::setMaxWindGain(F32 gain)
766{ 687{
767 mMaxWindGain = gain; 688 mMaxWindGain = gain;
diff --git a/linden/indra/llaudio/llaudioengine.h b/linden/indra/llaudio/llaudioengine.h
index a1b240e..7237ce2 100644
--- a/linden/indra/llaudio/llaudioengine.h
+++ b/linden/indra/llaudio/llaudioengine.h
@@ -71,8 +71,6 @@ class LLAudioData;
71class LLAudioChannel; 71class LLAudioChannel;
72class LLAudioChannelOpenAL; 72class LLAudioChannelOpenAL;
73class LLAudioBuffer; 73class LLAudioBuffer;
74class LLStreamingAudioInterface;
75
76 74
77// 75//
78// LLAudioEngine definition 76// LLAudioEngine definition
@@ -119,16 +117,13 @@ public:
119 // stops playing new sounds. 117 // stops playing new sounds.
120 void setMuted(bool muted); 118 void setMuted(bool muted);
121 bool getMuted() const { return mMuted; } 119 bool getMuted() const { return mMuted; }
122#ifdef USE_PLUGIN_MEDIA 120
123 LLPluginClassMedia* initializeMedia(const std::string& media_type);
124#endif
125 F32 getMasterGain(); 121 F32 getMasterGain();
126 void setMasterGain(F32 gain); 122 void setMasterGain(F32 gain);
127 123
128 F32 getSecondaryGain(S32 type); 124 F32 getSecondaryGain(S32 type);
129 void setSecondaryGain(S32 type, F32 gain); 125 void setSecondaryGain(S32 type, F32 gain);
130 126
131 F32 getInternetStreamGain();
132 127
133 virtual void setDopplerFactor(F32 factor); 128 virtual void setDopplerFactor(F32 factor);
134 virtual F32 getDopplerFactor(); 129 virtual F32 getDopplerFactor();
@@ -150,19 +145,6 @@ public:
150 LLAudioSource *findAudioSource(const LLUUID &source_id); 145 LLAudioSource *findAudioSource(const LLUUID &source_id);
151 LLAudioData *getAudioData(const LLUUID &audio_uuid); 146 LLAudioData *getAudioData(const LLUUID &audio_uuid);
152 147
153 // Internet stream implementation manipulation
154 LLStreamingAudioInterface *getStreamingAudioImpl();
155 void setStreamingAudioImpl(LLStreamingAudioInterface *impl);
156 // Internet stream methods - these will call down into the *mStreamingAudioImpl if it exists
157 void startInternetStream(const std::string& url);
158 void stopInternetStream();
159 void pauseInternetStream(int pause);
160 void updateInternetStream(); // expected to be called often
161 int isInternetStreamPlaying();
162 // use a value from 0.0 to 1.0, inclusive
163 void setInternetStreamGain(F32 vol);
164 std::string getInternetStreamURL();
165
166 // For debugging usage 148 // For debugging usage
167 virtual LLVector3 getListenerPos(); 149 virtual LLVector3 getListenerPos();
168 150
@@ -247,7 +229,6 @@ protected:
247 229
248private: 230private:
249 void setDefaults(); 231 void setDefaults();
250 LLStreamingAudioInterface *mStreamingAudioImpl;
251}; 232};
252 233
253 234
diff --git a/linden/indra/llaudio/llstreamingaudio.h b/linden/indra/llaudio/llstreamingaudio.h
index aa89e6a..f5d5334 100644
--- a/linden/indra/llaudio/llstreamingaudio.h
+++ b/linden/indra/llaudio/llstreamingaudio.h
@@ -36,7 +36,7 @@
36 36
37#include "stdtypes.h" // from llcommon 37#include "stdtypes.h" // from llcommon
38 38
39// Entirely abstract. Based exactly on the historic API. 39// Entirely abstract. Based on the historic API.
40class LLStreamingAudioInterface 40class LLStreamingAudioInterface
41{ 41{
42 public: 42 public:
@@ -51,6 +51,7 @@ class LLStreamingAudioInterface
51 virtual void setGain(F32 vol) = 0; 51 virtual void setGain(F32 vol) = 0;
52 virtual F32 getGain() = 0; 52 virtual F32 getGain() = 0;
53 virtual std::string getURL() = 0; 53 virtual std::string getURL() = 0;
54 virtual std::string getVersion() = 0;
54}; 55};
55 56
56#endif // LL_STREAMINGAUDIO_H 57#endif // LL_STREAMINGAUDIO_H
diff --git a/linden/indra/llcharacter/llcharacter.cpp b/linden/indra/llcharacter/llcharacter.cpp
index 46ac326..72cef83 100644
--- a/linden/indra/llcharacter/llcharacter.cpp
+++ b/linden/indra/llcharacter/llcharacter.cpp
@@ -379,7 +379,7 @@ void LLCharacter::clearVisualParamWeights()
379 param; 379 param;
380 param = getNextVisualParam()) 380 param = getNextVisualParam())
381 { 381 {
382 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 382 if (param->isTweakable())
383 { 383 {
384 param->setWeight( param->getDefaultWeight(), FALSE ); 384 param->setWeight( param->getDefaultWeight(), FALSE );
385 } 385 }
@@ -395,7 +395,7 @@ BOOL LLCharacter::visualParamWeightsAreDefault()
395 param; 395 param;
396 param = getNextVisualParam()) 396 param = getNextVisualParam())
397 { 397 {
398 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 398 if (param->isTweakable())
399 { 399 {
400 if (param->getWeight() != param->getDefaultWeight()) 400 if (param->getWeight() != param->getDefaultWeight())
401 return false; 401 return false;
diff --git a/linden/indra/llcharacter/llcharacter.h b/linden/indra/llcharacter/llcharacter.h
index d91124b..7630760 100644
--- a/linden/indra/llcharacter/llcharacter.h
+++ b/linden/indra/llcharacter/llcharacter.h
@@ -231,6 +231,20 @@ public:
231 return (mCurIterator++)->second; 231 return (mCurIterator++)->second;
232 } 232 }
233 233
234 S32 getVisualParamCountInGroup(EVisualParamGroup group)
235 {
236 S32 rtn = 0;
237 VisualParamIndexMap_t::iterator iter;
238 for (iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++)
239 {
240 if (iter->second->getGroup() == group)
241 {
242 rtn++;
243 }
244 }
245 return rtn;
246 }
247
234 LLVisualParam* getVisualParam(S32 id) 248 LLVisualParam* getVisualParam(S32 id)
235 { 249 {
236 VisualParamIndexMap_t::iterator iter = mVisualParamIndexMap.find(id); 250 VisualParamIndexMap_t::iterator iter = mVisualParamIndexMap.find(id);
diff --git a/linden/indra/llcharacter/llvisualparam.cpp b/linden/indra/llcharacter/llvisualparam.cpp
index d7a144e..9579ff8 100644
--- a/linden/indra/llcharacter/llvisualparam.cpp
+++ b/linden/indra/llcharacter/llvisualparam.cpp
@@ -238,7 +238,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user)
238{ 238{
239 if (mInfo) 239 if (mInfo)
240 { 240 {
241 if (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 241 if (isTweakable())
242 { 242 {
243 mTargetWeight = llclamp(target_value, mInfo->mMinWeight, mInfo->mMaxWeight); 243 mTargetWeight = llclamp(target_value, mInfo->mMinWeight, mInfo->mMaxWeight);
244 } 244 }
@@ -282,7 +282,7 @@ void LLVisualParam::animate( F32 delta, BOOL set_by_user )
282//----------------------------------------------------------------------------- 282//-----------------------------------------------------------------------------
283void LLVisualParam::stopAnimating(BOOL set_by_user) 283void LLVisualParam::stopAnimating(BOOL set_by_user)
284{ 284{
285 if (mIsAnimating && getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 285 if (mIsAnimating && isTweakable())
286 { 286 {
287 mIsAnimating = FALSE; 287 mIsAnimating = FALSE;
288 setWeight(mTargetWeight, set_by_user); 288 setWeight(mTargetWeight, set_by_user);
diff --git a/linden/indra/llcharacter/llvisualparam.h b/linden/indra/llcharacter/llvisualparam.h
index 3a0c1bb..d8dff8c 100644
--- a/linden/indra/llcharacter/llvisualparam.h
+++ b/linden/indra/llcharacter/llvisualparam.h
@@ -51,6 +51,7 @@ enum EVisualParamGroup
51{ 51{
52 VISUAL_PARAM_GROUP_TWEAKABLE, 52 VISUAL_PARAM_GROUP_TWEAKABLE,
53 VISUAL_PARAM_GROUP_ANIMATABLE, 53 VISUAL_PARAM_GROUP_ANIMATABLE,
54 VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT,
54 NUM_VISUAL_PARAM_GROUPS 55 NUM_VISUAL_PARAM_GROUPS
55}; 56};
56 57
@@ -124,7 +125,7 @@ public:
124 void setMaxDisplayName(const std::string& s) { mInfo->mMaxName = s; } 125 void setMaxDisplayName(const std::string& s) { mInfo->mMaxName = s; }
125 void setMinDisplayName(const std::string& s) { mInfo->mMinName = s; } 126 void setMinDisplayName(const std::string& s) { mInfo->mMinName = s; }
126 127
127 EVisualParamGroup getGroup() { return mInfo->mGroup; } 128 EVisualParamGroup getGroup() const { return mInfo->mGroup; }
128 F32 getMinWeight() { return mInfo->mMinWeight; } 129 F32 getMinWeight() { return mInfo->mMinWeight; }
129 F32 getMaxWeight() { return mInfo->mMaxWeight; } 130 F32 getMaxWeight() { return mInfo->mMaxWeight; }
130 F32 getDefaultWeight() { return mInfo->mDefaultWeight; } 131 F32 getDefaultWeight() { return mInfo->mDefaultWeight; }
@@ -133,7 +134,8 @@ public:
133 F32 getWeight() { return mIsAnimating ? mTargetWeight : mCurWeight; } 134 F32 getWeight() { return mIsAnimating ? mTargetWeight : mCurWeight; }
134 F32 getCurrentWeight() { return mCurWeight; } 135 F32 getCurrentWeight() { return mCurWeight; }
135 F32 getLastWeight() { return mLastWeight; } 136 F32 getLastWeight() { return mLastWeight; }
136 BOOL isAnimating() { return mIsAnimating; } 137 BOOL isAnimating() { return mIsAnimating; }
138 BOOL isTweakable() { return (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) || (getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT); }
137 139
138 LLVisualParam* getNextParam() { return mNext; } 140 LLVisualParam* getNextParam() { return mNext; }
139 void setNextParam( LLVisualParam *next ); 141 void setNextParam( LLVisualParam *next );
@@ -141,6 +143,7 @@ public:
141 virtual void setAnimating(BOOL is_animating) { mIsAnimating = is_animating; } 143 virtual void setAnimating(BOOL is_animating) { mIsAnimating = is_animating; }
142 BOOL getAnimating() { return mIsAnimating; } 144 BOOL getAnimating() { return mIsAnimating; }
143 145
146
144protected: 147protected:
145 F32 mCurWeight; // current weight 148 F32 mCurWeight; // current weight
146 F32 mLastWeight; // last weight 149 F32 mLastWeight; // last weight
diff --git a/linden/indra/llcommon/CMakeLists.txt b/linden/indra/llcommon/CMakeLists.txt
index ff1d548..eaaccfc 100644
--- a/linden/indra/llcommon/CMakeLists.txt
+++ b/linden/indra/llcommon/CMakeLists.txt
@@ -18,6 +18,7 @@ set(llcommon_SOURCE_FILES
18 llapp.cpp 18 llapp.cpp
19 llapr.cpp 19 llapr.cpp
20 llassettype.cpp 20 llassettype.cpp
21 llavatarname.cpp
21 llbase32.cpp 22 llbase32.cpp
22 llbase64.cpp 23 llbase64.cpp
23 llcommon.cpp 24 llcommon.cpp
@@ -87,6 +88,7 @@ set(llcommon_HEADER_FILES
87 llassettype.h 88 llassettype.h
88 llassoclist.h 89 llassoclist.h
89 llavatarconstants.h 90 llavatarconstants.h
91 llavatarname.h
90 llbase32.h 92 llbase32.h
91 llbase64.h 93 llbase64.h
92 llboost.h 94 llboost.h
diff --git a/linden/indra/llcommon/llavatarname.cpp b/linden/indra/llcommon/llavatarname.cpp
new file mode 100644
index 0000000..ebe8c88
--- /dev/null
+++ b/linden/indra/llcommon/llavatarname.cpp
@@ -0,0 +1,150 @@
1/**
2 * @file llavatarname.cpp
3 * @brief Represents name-related data for an avatar, such as the
4 * username/SLID ("bobsmith123" or "james.linden") and the display
5 * name ("James Cook")
6 *
7 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
8 * Second Life Viewer Source Code
9 * Copyright (C) 2010, Linden Research, Inc.
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation;
14 * version 2.1 of the License only.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 *
25 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
26 * $/LicenseInfo$
27 */
28#include "linden_common.h"
29
30#include "llavatarname.h"
31
32#include "lldate.h"
33#include "llsd.h"
34
35bool LLAvatarName::sOmitResidentAsLastName = false;
36
37// Store these in pre-built std::strings to avoid memory allocations in
38// LLSD map lookups
39static const std::string USERNAME("username");
40static const std::string DISPLAY_NAME("display_name");
41static const std::string LEGACY_FIRST_NAME("legacy_first_name");
42static const std::string LEGACY_LAST_NAME("legacy_last_name");
43static const std::string IS_DISPLAY_NAME_DEFAULT("is_display_name_default");
44static const std::string DISPLAY_NAME_EXPIRES("display_name_expires");
45static const std::string DISPLAY_NAME_NEXT_UPDATE("display_name_next_update");
46
47LLAvatarName::LLAvatarName()
48: mUsername(),
49 mDisplayName(),
50 mLegacyFirstName(),
51 mLegacyLastName(),
52 mIsDisplayNameDefault(false),
53 mIsDummy(false),
54 mExpires(F64_MAX),
55 mNextUpdate(0.0)
56{ }
57
58bool LLAvatarName::operator<(const LLAvatarName& rhs) const
59{
60 if (mUsername == rhs.mUsername)
61 return mDisplayName < rhs.mDisplayName;
62 else
63 return mUsername < rhs.mUsername;
64}
65
66LLSD LLAvatarName::asLLSD() const
67{
68 LLSD sd;
69 sd[USERNAME] = mUsername;
70 sd[DISPLAY_NAME] = mDisplayName;
71 sd[LEGACY_FIRST_NAME] = mLegacyFirstName;
72 sd[LEGACY_LAST_NAME] = mLegacyLastName;
73 sd[IS_DISPLAY_NAME_DEFAULT] = mIsDisplayNameDefault;
74 sd[DISPLAY_NAME_EXPIRES] = LLDate(mExpires);
75 sd[DISPLAY_NAME_NEXT_UPDATE] = LLDate(mNextUpdate);
76 return sd;
77}
78
79void LLAvatarName::fromLLSD(const LLSD& sd)
80{
81 mUsername = sd[USERNAME].asString();
82 mDisplayName = sd[DISPLAY_NAME].asString();
83 mLegacyFirstName = sd[LEGACY_FIRST_NAME].asString();
84 mLegacyLastName = sd[LEGACY_LAST_NAME].asString();
85 mIsDisplayNameDefault = sd[IS_DISPLAY_NAME_DEFAULT].asBoolean();
86 LLDate expires = sd[DISPLAY_NAME_EXPIRES];
87 mExpires = expires.secondsSinceEpoch();
88 LLDate next_update = sd[DISPLAY_NAME_NEXT_UPDATE];
89 mNextUpdate = next_update.secondsSinceEpoch();
90}
91
92std::string LLAvatarName::getCompleteName() const
93{
94 std::string name;
95 if (!mUsername.empty())
96 {
97 name = mDisplayName + " (" + mUsername + ")";
98 }
99 else
100 {
101 // ...display names are off, legacy name is in mDisplayName
102 name = mDisplayName;
103 }
104 return name;
105}
106
107std::string LLAvatarName::getLegacyName() const
108{
109 std::string name;
110 name.reserve(mLegacyFirstName.size() + 1 + mLegacyLastName.size());
111 name = mLegacyFirstName;
112 if (!sOmitResidentAsLastName || mLegacyLastName != "Resident")
113 {
114 name += " ";
115 name += mLegacyLastName;
116 }
117 return name;
118}
119
120std::string LLAvatarName::getNames(bool linefeed) const
121{
122 std::string name;
123
124 if (mUsername.empty())
125 {
126 // ...display names are off, legacy name is in mDisplayName
127 name = mDisplayName;
128 if (sOmitResidentAsLastName)
129 {
130 LLStringUtil::replaceString(name, " Resident", "");
131 }
132 }
133 else
134 {
135 name = getLegacyName();
136 if (name != mDisplayName)
137 {
138 if (linefeed)
139 {
140 name = mDisplayName + "\n[" + name + "]";
141 }
142 else
143 {
144 name = mDisplayName + " [" + name + "]";
145 }
146 }
147 }
148
149 return name;
150}
diff --git a/linden/indra/llcommon/llavatarname.h b/linden/indra/llcommon/llavatarname.h
new file mode 100644
index 0000000..3b6c6ea
--- /dev/null
+++ b/linden/indra/llcommon/llavatarname.h
@@ -0,0 +1,105 @@
1/**
2 * @file llavatarname.h
3 * @brief Represents name-related data for an avatar, such as the
4 * username/SLID ("bobsmith123" or "james.linden") and the display
5 * name ("James Cook")
6 *
7 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
8 * Second Life Viewer Source Code
9 * Copyright (C) 2010, Linden Research, Inc.
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation;
14 * version 2.1 of the License only.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 *
25 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
26 * $/LicenseInfo$
27 */
28#ifndef LLAVATARNAME_H
29#define LLAVATARNAME_H
30
31#include <string>
32
33class LLSD;
34
35class LL_COMMON_API LLAvatarName
36{
37public:
38 LLAvatarName();
39
40 bool operator<(const LLAvatarName& rhs) const;
41
42 LLSD asLLSD() const;
43
44 void fromLLSD(const LLSD& sd);
45
46 // For normal names, returns "James Linden (james.linden)"
47 // When display names are disabled returns just "James Linden"
48 std::string getCompleteName() const;
49
50 // For normal names, returns "Whatever Display Name (John Doe)" when
51 // display name and legacy name are different, or just "John Doe"
52 // when they are equal or when display names are disabled.
53 // When linefeed == true, the space between the display name and
54 // the opening parenthesis for the legacy name is replaced with a
55 // line feed.
56 std::string getNames(bool linefeed = false) const;
57
58 // Returns "James Linden" or "bobsmith123 Resident" for backwards
59 // compatibility with systems like voice and muting
60 std::string getLegacyName() const;
61
62 // "bobsmith123" or "james.linden", US-ASCII only
63 std::string mUsername;
64
65 // "Jose' Sanchez" or "James Linden", UTF-8 encoded Unicode
66 // Contains data whether or not user has explicitly set
67 // a display name; may duplicate their username.
68 std::string mDisplayName;
69
70 // For "James Linden", "James"
71 // For "bobsmith123", "bobsmith123"
72 // Used to communicate with legacy systems like voice and muting which
73 // rely on old-style names.
74 std::string mLegacyFirstName;
75
76 // For "James Linden", "Linden"
77 // For "bobsmith123", "Resident"
78 // see above for rationale
79 std::string mLegacyLastName;
80
81 // If true, both display name and SLID were generated from
82 // a legacy first and last name, like "James Linden (james.linden)"
83 bool mIsDisplayNameDefault;
84
85 // Under error conditions, we may insert "dummy" records with
86 // names equal to legacy name into caches as placeholders.
87 // These can be shown in UI, but are not serialized.
88 bool mIsDummy;
89
90 // Names can change, so need to keep track of when name was
91 // last checked.
92 // Unix time-from-epoch seconds for efficiency
93 F64 mExpires;
94
95 // You can only change your name every N hours, so record
96 // when the next update is allowed
97 // Unix time-from-epoch seconds
98 F64 mNextUpdate;
99
100 // true to prevent the displaying of "Resident" as a last name
101 // in legacy names
102 static bool sOmitResidentAsLastName;
103};
104
105#endif
diff --git a/linden/indra/llmessage/CMakeLists.txt b/linden/indra/llmessage/CMakeLists.txt
index a5e4249..9965191 100644
--- a/linden/indra/llmessage/CMakeLists.txt
+++ b/linden/indra/llmessage/CMakeLists.txt
@@ -22,6 +22,7 @@ include_directories(
22set(llmessage_SOURCE_FILES 22set(llmessage_SOURCE_FILES
23 llares.cpp 23 llares.cpp
24 llassetstorage.cpp 24 llassetstorage.cpp
25 llavatarnamecache.cpp
25 llblowfishcipher.cpp 26 llblowfishcipher.cpp
26 llbuffer.cpp 27 llbuffer.cpp
27 llbufferstream.cpp 28 llbufferstream.cpp
@@ -105,6 +106,7 @@ set(llmessage_HEADER_FILES
105 106
106 llares.h 107 llares.h
107 llassetstorage.h 108 llassetstorage.h
109 llavatarnamecache.h
108 llblowfishcipher.h 110 llblowfishcipher.h
109 llbuffer.h 111 llbuffer.h
110 llbufferstream.h 112 llbufferstream.h
diff --git a/linden/indra/llmessage/llavatarnamecache.cpp b/linden/indra/llmessage/llavatarnamecache.cpp
new file mode 100644
index 0000000..180274e
--- /dev/null
+++ b/linden/indra/llmessage/llavatarnamecache.cpp
@@ -0,0 +1,859 @@
1/**
2 * @file llavatarnamecache.cpp
3 * @brief Provides lookup of avatar SLIDs ("bobsmith123") and display names
4 * ("James Cook") from avatar UUIDs.
5 *
6 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
7 * Second Life Viewer Source Code
8 * Copyright (C) 2010, Linden Research, Inc.
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation;
13 * version 2.1 of the License only.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 *
24 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
25 * $/LicenseInfo$
26 */
27#include "linden_common.h"
28
29#include "llavatarnamecache.h"
30
31#include "llcachename.h" // we wrap this system
32#include "llframetimer.h"
33#include "llhttpclient.h"
34#include "llsd.h"
35#include "llsdserialize.h"
36
37#include <boost/tokenizer.hpp>
38
39#include <map>
40#include <set>
41
42namespace LLAvatarNameCache
43{
44 use_display_name_signal_t mUseDisplayNamesSignal;
45
46 // Manual override for display names: 0 = legacy names,
47 // 1 = display name and legacy name, 2 = display name (legacy if absent)
48 U32 sUseDisplayNames = 0;
49
50 // Cache starts in a paused state until we can determine if the
51 // current region supports display names.
52 bool sRunning = false;
53
54 // Base lookup URL for name service.
55 // On simulator, loaded from indra.xml
56 // On viewer, usually a simulator capability (at People API team's request)
57 // Includes the trailing slash, like "http://pdp60.lindenlab.com:8000/agents/"
58 std::string sNameLookupURL;
59
60 // accumulated agent IDs for next query against service
61 typedef std::set<LLUUID> ask_queue_t;
62 ask_queue_t sAskQueue;
63
64 // agent IDs that have been requested, but with no reply
65 // maps agent ID to frame time request was made
66 typedef std::map<LLUUID, F64> pending_queue_t;
67 pending_queue_t sPendingQueue;
68
69 // Callbacks to fire when we received a name.
70 // May have multiple callbacks for a single ID, which are
71 // represented as multiple slots bound to the signal.
72 // Avoid copying signals via pointers.
73 typedef std::map<LLUUID, callback_signal_t*> signal_map_t;
74 signal_map_t sSignalMap;
75
76 // names we know about
77 typedef std::map<LLUUID, LLAvatarName> cache_t;
78 cache_t sCache;
79
80 // Send bulk lookup requests a few times a second at most
81 // only need per-frame timing resolution
82 LLFrameTimer sRequestTimer;
83
84 // Periodically clean out expired entries from the cache
85 //LLFrameTimer sEraseExpiredTimer;
86
87 //-----------------------------------------------------------------------
88 // Internal methods
89 //-----------------------------------------------------------------------
90
91 // Handle name response off network.
92 // Optionally skip adding to cache, used when this is a fallback to the
93 // legacy name system.
94 void processName(const LLUUID& agent_id,
95 const LLAvatarName& av_name,
96 bool add_to_cache);
97
98 void requestNamesViaCapability();
99
100 // Legacy name system callback
101 void legacyNameCallback(const LLUUID& agent_id,
102 const std::string& first, const std::string& last,
103 BOOL is_group, void* data);
104
105 void requestNamesViaLegacy();
106
107 // Fill in an LLAvatarName with the legacy name data
108 void buildLegacyName(const std::string& full_name,
109 LLAvatarName* av_name);
110
111 // Do a single callback to a given slot
112 void fireSignal(const LLUUID& agent_id,
113 const callback_slot_t& slot,
114 const LLAvatarName& av_name);
115
116 // Is a request in-flight over the network?
117 bool isRequestPending(const LLUUID& agent_id);
118
119 // Erase expired names from cache
120 void eraseExpired();
121
122 bool expirationFromCacheControl(LLSD headers, F64 *expires);
123}
124
125/* Sample response:
126<?xml version="1.0"?>
127<llsd>
128 <map>
129 <key>agents</key>
130 <array>
131 <map>
132 <key>display_name_next_update</key>
133 <date>2010-04-16T21:34:02+00:00Z</date>
134 <key>display_name_expires</key>
135 <date>2010-04-16T21:32:26.142178+00:00Z</date>
136 <key>display_name</key>
137 <string>MickBot390 LLQABot</string>
138 <key>sl_id</key>
139 <string>mickbot390.llqabot</string>
140 <key>id</key>
141 <string>0012809d-7d2d-4c24-9609-af1230a37715</string>
142 <key>is_display_name_default</key>
143 <boolean>false</boolean>
144 </map>
145 <map>
146 <key>display_name_next_update</key>
147 <date>2010-04-16T21:34:02+00:00Z</date>
148 <key>display_name_expires</key>
149 <date>2010-04-16T21:32:26.142178+00:00Z</date>
150 <key>display_name</key>
151 <string>Bjork Gudmundsdottir</string>
152 <key>sl_id</key>
153 <string>sardonyx.linden</string>
154 <key>id</key>
155 <string>3941037e-78ab-45f0-b421-bd6e77c1804d</string>
156 <key>is_display_name_default</key>
157 <boolean>true</boolean>
158 </map>
159 </array>
160 </map>
161</llsd>
162*/
163
164class LLAvatarNameResponder : public LLHTTPClient::Responder
165{
166private:
167 // need to store agent ids that are part of this request in case of
168 // an error, so we can flag them as unavailable
169 std::vector<LLUUID> mAgentIDs;
170
171 // Need the headers to look up Expires: and Retry-After:
172 LLSD mHeaders;
173
174public:
175 LLAvatarNameResponder(const std::vector<LLUUID>& agent_ids)
176 : mAgentIDs(agent_ids),
177 mHeaders()
178 { }
179
180 /*virtual*/ void completedHeader(U32 status, const std::string& reason,
181 const LLSD& headers)
182 {
183 mHeaders = headers;
184 }
185
186 /*virtual*/ void result(const LLSD& content)
187 {
188 // Pull expiration out of headers if available
189 F64 expires = LLAvatarNameCache::nameExpirationFromHeaders(mHeaders);
190
191 LLSD agents = content["agents"];
192 LLSD::array_const_iterator it;
193 for (it = agents.beginArray(); it != agents.endArray(); ++it)
194 {
195 const LLSD& row = *it;
196 LLUUID agent_id = row["id"].asUUID();
197
198 LLAvatarName av_name;
199 av_name.fromLLSD(row);
200
201 // Use expiration time from header
202 av_name.mExpires = expires;
203
204 // Some avatars don't have explicit display names set
205 if (av_name.mDisplayName.empty())
206 {
207 av_name.mDisplayName = av_name.mUsername;
208 }
209
210 // cache it and fire signals
211 LLAvatarNameCache::processName(agent_id, av_name, true);
212 }
213
214 // Same logic as error response case
215 LLSD unresolved_agents = content["bad_ids"];
216 if (unresolved_agents.size() > 0)
217 {
218 std::string first, last;
219 LLAvatarName av_name;
220 av_name.mIsDisplayNameDefault = false;
221 av_name.mIsDummy = true;
222 av_name.mExpires = expires;
223
224 for (it = unresolved_agents.beginArray(); it != unresolved_agents.endArray(); ++it)
225 {
226 const LLUUID& agent_id = *it;
227 gCacheName->getName(agent_id, first, last);
228 av_name.mLegacyFirstName = first;
229 av_name.mLegacyLastName = last;
230 av_name.mDisplayName = first;
231 if (last == "Resident")
232 {
233 av_name.mDisplayName = first;
234 av_name.mUsername = first;
235 }
236 else
237 {
238 av_name.mDisplayName = first + " " + last;
239 av_name.mUsername = first + "." + last;
240 }
241 LLStringUtil::toLower(av_name.mUsername);
242 // cache it and fire signals
243 LLAvatarNameCache::processName(agent_id, av_name, true);
244 }
245 }
246 }
247
248 /*virtual*/ void error(U32 status, const std::string& reason)
249 {
250 // We're going to construct a dummy record and cache it for a while,
251 // either briefly for a 503 Service Unavailable, or longer for other
252 // errors.
253 F64 retry_timestamp = errorRetryTimestamp(status);
254
255 std::string first, last;
256 LLAvatarName av_name;
257 av_name.mIsDisplayNameDefault = false;
258 av_name.mIsDummy = true;
259 av_name.mExpires = retry_timestamp;
260
261 // Add dummy records for all agent IDs in this request
262 std::vector<LLUUID>::const_iterator it;
263 for (it = mAgentIDs.begin(); it != mAgentIDs.end(); ++it)
264 {
265 const LLUUID& agent_id = *it;
266 gCacheName->getName(agent_id, first, last);
267 av_name.mLegacyFirstName = first;
268 av_name.mLegacyLastName = last;
269 av_name.mDisplayName = first;
270 if (last == "Resident")
271 {
272 av_name.mDisplayName = first;
273 av_name.mUsername = first;
274 }
275 else
276 {
277 av_name.mDisplayName = first + " " + last;
278 av_name.mUsername = first + "." + last;
279 }
280 LLStringUtil::toLower(av_name.mUsername);
281 // cache it and fire signals
282 LLAvatarNameCache::processName(agent_id, av_name, true);
283 }
284 }
285
286 // Return time to retry a request that generated an error, based on
287 // error type and headers. Return value is seconds-since-epoch.
288 F64 errorRetryTimestamp(S32 status)
289 {
290 F64 now = LLFrameTimer::getTotalSeconds();
291
292 // Retry-After takes priority
293 LLSD retry_after = mHeaders["retry-after"];
294 if (retry_after.isDefined())
295 {
296 // We only support the delta-seconds type
297 S32 delta_seconds = retry_after.asInteger();
298 if (delta_seconds > 0)
299 {
300 // ...valid delta-seconds
301 return now + F64(delta_seconds);
302 }
303 }
304
305 // If no Retry-After, look for Cache-Control max-age
306 F64 expires = 0.0;
307 if (LLAvatarNameCache::expirationFromCacheControl(mHeaders, &expires))
308 {
309 return expires;
310 }
311
312 // No information in header, make a guess
313 if (status == 503)
314 {
315 // ...service unavailable, retry soon
316 const F64 SERVICE_UNAVAILABLE_DELAY = 600.0; // 10 min
317 return now + SERVICE_UNAVAILABLE_DELAY;
318 }
319 else
320 {
321 // ...other unexpected error
322 const F64 DEFAULT_DELAY = 3600.0; // 1 hour
323 return now + DEFAULT_DELAY;
324 }
325 }
326};
327
328void LLAvatarNameCache::processName(const LLUUID& agent_id,
329 const LLAvatarName& av_name,
330 bool add_to_cache)
331{
332 if (add_to_cache)
333 {
334 sCache[agent_id] = av_name;
335 }
336
337 sPendingQueue.erase(agent_id);
338
339 // signal everyone waiting on this name
340 signal_map_t::iterator sig_it = sSignalMap.find(agent_id);
341 if (sig_it != sSignalMap.end())
342 {
343 callback_signal_t* signal = sig_it->second;
344 (*signal)(agent_id, av_name);
345
346 sSignalMap.erase(agent_id);
347
348 delete signal;
349 signal = NULL;
350 }
351}
352
353void LLAvatarNameCache::requestNamesViaCapability()
354{
355 F64 now = LLFrameTimer::getTotalSeconds();
356
357 // URL format is like:
358 // http://pdp60.lindenlab.com:8000/agents/?ids=3941037e-78ab-45f0-b421-bd6e77c1804d&ids=0012809d-7d2d-4c24-9609-af1230a37715&ids=0019aaba-24af-4f0a-aa72-6457953cf7f0
359 //
360 // Apache can handle URLs of 4096 chars, but let's be conservative
361 const U32 NAME_URL_MAX = 4096;
362 const U32 NAME_URL_SEND_THRESHOLD = 3000;
363 std::string url;
364 url.reserve(NAME_URL_MAX);
365
366 std::vector<LLUUID> agent_ids;
367 agent_ids.reserve(128);
368
369 ask_queue_t::const_iterator it = sAskQueue.begin();
370 for ( ; it != sAskQueue.end(); ++it)
371 {
372 const LLUUID& agent_id = *it;
373
374 if (url.empty())
375 {
376 // ...starting new request
377 url += sNameLookupURL;
378 url += "?ids=";
379 }
380 else
381 {
382 // ...continuing existing request
383 url += "&ids=";
384 }
385 url += agent_id.asString();
386 agent_ids.push_back(agent_id);
387
388 // mark request as pending
389 sPendingQueue[agent_id] = now;
390
391 if (url.size() > NAME_URL_SEND_THRESHOLD)
392 {
393 //llinfos << "requestNames " << url << llendl;
394 LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));
395 url.clear();
396 agent_ids.clear();
397 }
398 }
399
400 if (!url.empty())
401 {
402 //llinfos << "requestNames " << url << llendl;
403 LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));
404 url.clear();
405 agent_ids.clear();
406 }
407
408 // We've moved all asks to the pending request queue
409 sAskQueue.clear();
410}
411
412void LLAvatarNameCache::legacyNameCallback(const LLUUID& agent_id,
413 const std::string& first, const std::string& last,
414 BOOL is_group, void* data)
415{
416 std::string full_name = first + " " + last;
417 // Construct a dummy record for this name. By convention, SLID is blank
418 // Never expires, but not written to disk, so lasts until end of session.
419 LLAvatarName av_name;
420 buildLegacyName(full_name, &av_name);
421
422 // Don't add to cache, the data already exists in the legacy name system
423 // cache and we don't want or need duplicate storage, because keeping the
424 // two copies in sync is complex.
425 processName(agent_id, av_name, false);
426}
427
428void LLAvatarNameCache::requestNamesViaLegacy()
429{
430 F64 now = LLFrameTimer::getTotalSeconds();
431 std::string full_name;
432 ask_queue_t::const_iterator it = sAskQueue.begin();
433 for (; it != sAskQueue.end(); ++it)
434 {
435 const LLUUID& agent_id = *it;
436
437 // Mark as pending first, just in case the callback is immediately
438 // invoked below. This should never happen in practice.
439 sPendingQueue[agent_id] = now;
440
441 gCacheName->get(agent_id, false, legacyNameCallback);
442 }
443
444 // We've either answered immediately or moved all asks to the
445 // pending queue
446 sAskQueue.clear();
447}
448
449void LLAvatarNameCache::initClass(bool running)
450{
451 sRunning = running;
452}
453
454void LLAvatarNameCache::cleanupClass()
455{
456}
457
458void LLAvatarNameCache::importFile(std::istream& istr)
459{
460 LLSD data;
461 S32 parse_count = LLSDSerialize::fromXMLDocument(data, istr);
462 if (parse_count < 1) return;
463
464 // by convention LLSD storage is a map
465 // we only store one entry in the map
466 LLSD agents = data["agents"];
467
468 LLUUID agent_id;
469 LLAvatarName av_name;
470 LLSD::map_const_iterator it = agents.beginMap();
471 for ( ; it != agents.endMap(); ++it)
472 {
473 agent_id.set(it->first);
474 av_name.fromLLSD( it->second );
475 sCache[agent_id] = av_name;
476 }
477 // entries may have expired since we last ran the viewer, just
478 // clean them out now
479 eraseExpired();
480 llinfos << "loaded " << sCache.size() << llendl;
481}
482
483void LLAvatarNameCache::exportFile(std::ostream& ostr)
484{
485 LLSD agents;
486 cache_t::const_iterator it = sCache.begin();
487 for ( ; it != sCache.end(); ++it)
488 {
489 const LLUUID& agent_id = it->first;
490 const LLAvatarName& av_name = it->second;
491 if (!av_name.mIsDummy)
492 {
493 // key must be a string
494 agents[agent_id.asString()] = av_name.asLLSD();
495 }
496 }
497 LLSD data;
498 data["agents"] = agents;
499 LLSDSerialize::toPrettyXML(data, ostr);
500}
501
502void LLAvatarNameCache::setNameLookupURL(const std::string& name_lookup_url)
503{
504 sNameLookupURL = name_lookup_url;
505}
506
507bool LLAvatarNameCache::hasNameLookupURL()
508{
509 return !sNameLookupURL.empty();
510}
511
512void LLAvatarNameCache::idle()
513{
514 // By convention, start running at first idle() call
515 sRunning = true;
516
517 // *TODO: Possibly re-enabled this based on People API load measurements
518 // 100 ms is the threshold for "user speed" operations, so we can
519 // stall for about that long to batch up requests.
520 //const F32 SECS_BETWEEN_REQUESTS = 0.1f;
521 //if (!sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS))
522 //{
523 // return;
524 //}
525
526 // Must be large relative to above
527
528 // No longer deleting expired entries, just re-requesting in the get
529 // this way first synchronous get call on an expired entry won't return
530 // legacy name. LF
531
532 //const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds
533 //if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT))
534 //{
535 // eraseExpired();
536 //}
537
538 if (sAskQueue.empty())
539 {
540 return;
541 }
542
543 if (useDisplayNames())
544 {
545 requestNamesViaCapability();
546 }
547 else
548 {
549 // ...fall back to legacy name cache system
550 requestNamesViaLegacy();
551 }
552}
553
554bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id)
555{
556 const F64 PENDING_TIMEOUT_SECS = 5.0 * 60.0;
557 F64 now = LLFrameTimer::getTotalSeconds();
558 F64 expire_time = now - PENDING_TIMEOUT_SECS;
559
560 pending_queue_t::const_iterator it = sPendingQueue.find(agent_id);
561 if (it != sPendingQueue.end())
562 {
563 bool request_expired = (it->second < expire_time);
564 return !request_expired;
565 }
566 return false;
567}
568
569void LLAvatarNameCache::eraseExpired()
570{
571 F64 now = LLFrameTimer::getTotalSeconds();
572 cache_t::iterator it = sCache.begin();
573 while (it != sCache.end())
574 {
575 cache_t::iterator cur = it;
576 ++it;
577 const LLAvatarName& av_name = cur->second;
578 if (av_name.mExpires < now)
579 {
580 sCache.erase(cur);
581 }
582 }
583}
584
585void LLAvatarNameCache::buildLegacyName(const std::string& full_name,
586 LLAvatarName* av_name)
587{
588 llassert(av_name);
589 av_name->mUsername = "";
590 av_name->mDisplayName = full_name;
591 av_name->mIsDisplayNameDefault = true;
592 av_name->mIsDummy = true;
593 av_name->mExpires = F64_MAX;
594}
595
596// fills in av_name if it has it in the cache, even if expired (can check expiry time)
597// returns bool specifying if av_name was filled, false otherwise
598bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)
599{
600 if (sRunning)
601 {
602 // ...only do immediate lookups when cache is running
603 if (useDisplayNames())
604 {
605 // ...use display names cache
606 std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id);
607 if (it != sCache.end())
608 {
609 *av_name = it->second;
610
611 // re-request name if entry is expired
612 if (av_name->mExpires < LLFrameTimer::getTotalSeconds())
613 {
614 if (!isRequestPending(agent_id))
615 {
616 sAskQueue.insert(agent_id);
617 }
618 }
619
620 return true;
621 }
622 }
623 else
624 {
625 // ...use legacy names cache
626 std::string full_name;
627 if (gCacheName->getFullName(agent_id, full_name))
628 {
629 buildLegacyName(full_name, av_name);
630 return true;
631 }
632 }
633 }
634
635 if (!isRequestPending(agent_id))
636 {
637 sAskQueue.insert(agent_id);
638 }
639
640 return false;
641}
642
643void LLAvatarNameCache::fireSignal(const LLUUID& agent_id,
644 const callback_slot_t& slot,
645 const LLAvatarName& av_name)
646{
647 callback_signal_t signal;
648 signal.connect(slot);
649 signal(agent_id, av_name);
650}
651
652void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
653{
654 if (sRunning)
655 {
656 // ...only do immediate lookups when cache is running
657 if (useDisplayNames())
658 {
659 // ...use new cache
660 std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id);
661 if (it != sCache.end())
662 {
663 const LLAvatarName& av_name = it->second;
664
665 if (av_name.mExpires > LLFrameTimer::getTotalSeconds())
666 {
667 // ...name already exists in cache, fire callback now
668 fireSignal(agent_id, slot, av_name);
669
670 return;
671 }
672 }
673 }
674 else
675 {
676 // ...use old name system
677 std::string full_name;
678 if (gCacheName->getFullName(agent_id, full_name))
679 {
680 LLAvatarName av_name;
681 buildLegacyName(full_name, &av_name);
682 fireSignal(agent_id, slot, av_name);
683 return;
684 }
685 }
686 }
687
688 // schedule a request
689 if (!isRequestPending(agent_id))
690 {
691 sAskQueue.insert(agent_id);
692 }
693
694 // always store additional callback, even if request is pending
695 signal_map_t::iterator sig_it = sSignalMap.find(agent_id);
696 if (sig_it == sSignalMap.end())
697 {
698 // ...new callback for this id
699 callback_signal_t* signal = new callback_signal_t();
700 signal->connect(slot);
701 sSignalMap[agent_id] = signal;
702 }
703 else
704 {
705 // ...existing callback, bind additional slot
706 callback_signal_t* signal = sig_it->second;
707 signal->connect(slot);
708 }
709}
710
711
712void LLAvatarNameCache::setUseDisplayNames(U32 use)
713{
714 if (use != sUseDisplayNames)
715 {
716 if (use > 2)
717 {
718 sUseDisplayNames = 2;
719 }
720 else
721 {
722 sUseDisplayNames = use;
723 }
724 // flush our cache
725 sCache.clear();
726
727 mUseDisplayNamesSignal();
728 }
729}
730
731U32 LLAvatarNameCache::useDisplayNames()
732{
733 // Must be both manually set on and able to look up names.
734 if (sNameLookupURL.empty())
735 {
736 return 0;
737 }
738 else
739 {
740 return sUseDisplayNames;
741 }
742}
743
744void LLAvatarNameCache::erase(const LLUUID& agent_id)
745{
746 sCache.erase(agent_id);
747}
748
749void LLAvatarNameCache::fetch(const LLUUID& agent_id)
750{
751 // re-request, even if request is already pending
752 sAskQueue.insert(agent_id);
753}
754
755void LLAvatarNameCache::insert(const LLUUID& agent_id, const LLAvatarName& av_name)
756{
757 // *TODO: update timestamp if zero?
758 sCache[agent_id] = av_name;
759}
760
761F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers)
762{
763 F64 expires = 0.0;
764 if (expirationFromCacheControl(headers, &expires))
765 {
766 return expires;
767 }
768 else
769 {
770 // With no expiration info, default to an hour
771 const F64 DEFAULT_EXPIRES = 60.0 * 60.0;
772 F64 now = LLFrameTimer::getTotalSeconds();
773 return now + DEFAULT_EXPIRES;
774 }
775}
776
777bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires)
778{
779 // Allow the header to override the default
780 LLSD cache_control_header = headers["cache-control"];
781 if (cache_control_header.isDefined())
782 {
783 S32 max_age = 0;
784 std::string cache_control = cache_control_header.asString();
785 if (max_age_from_cache_control(cache_control, &max_age))
786 {
787 F64 now = LLFrameTimer::getTotalSeconds();
788 *expires = now + (F64)max_age;
789 return true;
790 }
791 }
792 return false;
793}
794
795
796void LLAvatarNameCache::addUseDisplayNamesCallback(const use_display_name_signal_t::slot_type& cb)
797{
798 mUseDisplayNamesSignal.connect(cb);
799}
800
801
802static const std::string MAX_AGE("max-age");
803static const boost::char_separator<char> EQUALS_SEPARATOR("=");
804static const boost::char_separator<char> COMMA_SEPARATOR(",");
805
806bool max_age_from_cache_control(const std::string& cache_control, S32 *max_age)
807{
808 // Split the string on "," to get a list of directives
809 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
810 tokenizer directives(cache_control, COMMA_SEPARATOR);
811
812 tokenizer::iterator token_it = directives.begin();
813 for ( ; token_it != directives.end(); ++token_it)
814 {
815 // Tokens may have leading or trailing whitespace
816 std::string token = *token_it;
817 LLStringUtil::trim(token);
818
819 if (token.compare(0, MAX_AGE.size(), MAX_AGE) == 0)
820 {
821 // ...this token starts with max-age, so let's chop it up by "="
822 tokenizer subtokens(token, EQUALS_SEPARATOR);
823 tokenizer::iterator subtoken_it = subtokens.begin();
824
825 // Must have a token
826 if (subtoken_it == subtokens.end()) return false;
827 std::string subtoken = *subtoken_it;
828
829 // Must exactly equal "max-age"
830 LLStringUtil::trim(subtoken);
831 if (subtoken != MAX_AGE) return false;
832
833 // Must have another token
834 ++subtoken_it;
835 if (subtoken_it == subtokens.end()) return false;
836 subtoken = *subtoken_it;
837
838 // Must be a valid integer
839 // *NOTE: atoi() returns 0 for invalid values, so we have to
840 // check the string first.
841 // *TODO: Do servers ever send "0000" for zero? We don't handle it
842 LLStringUtil::trim(subtoken);
843 if (subtoken == "0")
844 {
845 *max_age = 0;
846 return true;
847 }
848 S32 val = atoi( subtoken.c_str() );
849 if (val > 0 && val < S32_MAX)
850 {
851 *max_age = val;
852 return true;
853 }
854 return false;
855 }
856 }
857 return false;
858}
859
diff --git a/linden/indra/llmessage/llavatarnamecache.h b/linden/indra/llmessage/llavatarnamecache.h
new file mode 100644
index 0000000..a2519cd
--- /dev/null
+++ b/linden/indra/llmessage/llavatarnamecache.h
@@ -0,0 +1,105 @@
1/**
2 * @file llavatarnamecache.h
3 * @brief Provides lookup of avatar SLIDs ("bobsmith123") and display names
4 * ("James Cook") from avatar UUIDs.
5 *
6 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
7 * Second Life Viewer Source Code
8 * Copyright (C) 2010, Linden Research, Inc.
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation;
13 * version 2.1 of the License only.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 *
24 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
25 * $/LicenseInfo$
26 */
27
28#ifndef LLAVATARNAMECACHE_H
29#define LLAVATARNAMECACHE_H
30
31#include "llavatarname.h" // for convenience
32
33#include <boost/signals2.hpp>
34
35// We have display names support (this is for use by patches)
36#define LL_DISPLAY_NAMES
37
38class LLSD;
39class LLUUID;
40
41namespace LLAvatarNameCache
42{
43
44 typedef boost::signals2::signal<void (void)> use_display_name_signal_t;
45
46 // Until the cache is set running, immediate lookups will fail and
47 // async lookups will be queued. This allows us to block requests
48 // until we know if the first region supports display names.
49 void initClass(bool running);
50 void cleanupClass();
51
52 void importFile(std::istream& istr);
53 void exportFile(std::ostream& ostr);
54
55 // On the viewer, usually a simulator capabilitity
56 // If empty, name cache will fall back to using legacy name
57 // lookup system
58 void setNameLookupURL(const std::string& name_lookup_url);
59
60 // Do we have a valid lookup URL, hence are we trying to use the
61 // new display name lookup system?
62 bool hasNameLookupURL();
63
64 // Periodically makes a batch request for display names not already in
65 // cache. Call once per frame.
66 void idle();
67
68 // If name is in cache, returns true and fills in provided LLAvatarName
69 // otherwise returns false
70 bool get(const LLUUID& agent_id, LLAvatarName *av_name);
71
72 // Callback types for get() below
73 typedef boost::signals2::signal<
74 void (const LLUUID& agent_id, const LLAvatarName& av_name)>
75 callback_signal_t;
76 typedef callback_signal_t::slot_type callback_slot_t;
77
78 // Fetches name information and calls callback.
79 // If name information is in cache, callback will be called immediately.
80 void get(const LLUUID& agent_id, callback_slot_t slot);
81
82 void setUseDisplayNames(U32 use);
83 U32 useDisplayNames();
84
85 void erase(const LLUUID& agent_id);
86
87 // Force a re-fetch of the most recent data, but keep the current
88 // data in cache
89 void fetch(const LLUUID& agent_id);
90
91 void insert(const LLUUID& agent_id, const LLAvatarName& av_name);
92
93 // Compute name expiration time from HTTP Cache-Control header,
94 // or return default value, in seconds from epoch.
95 F64 nameExpirationFromHeaders(LLSD headers);
96
97 void addUseDisplayNamesCallback(const use_display_name_signal_t::slot_type& cb);
98}
99
100// Parse a cache-control header to get the max-age delta-seconds.
101// Returns true if header has max-age param and it parses correctly.
102// Exported here to ease unit testing.
103bool max_age_from_cache_control(const std::string& cache_control, S32 *max_age);
104
105#endif
diff --git a/linden/indra/llmessage/llcachename.h b/linden/indra/llmessage/llcachename.h
index 2757b86..cb3cc1f 100644
--- a/linden/indra/llmessage/llcachename.h
+++ b/linden/indra/llmessage/llcachename.h
@@ -33,6 +33,8 @@
33#ifndef LL_LLCACHENAME_H 33#ifndef LL_LLCACHENAME_H
34#define LL_LLCACHENAME_H 34#define LL_LLCACHENAME_H
35 35
36#include "llavatarnamecache.h" // for convenience
37
36class LLMessageSystem; 38class LLMessageSystem;
37class LLHost; 39class LLHost;
38class LLUUID; 40class LLUUID;
diff --git a/linden/indra/llmessage/llpartdata.cpp b/linden/indra/llmessage/llpartdata.cpp
index 485bc6a..a2811ab 100644
--- a/linden/indra/llmessage/llpartdata.cpp
+++ b/linden/indra/llmessage/llpartdata.cpp
@@ -347,3 +347,93 @@ void LLPartSysData::setPartAccel(const LLVector3 &accel)
347 mPartAccel.mV[VY] = llclamp(accel.mV[VY], -100.f, 100.f); 347 mPartAccel.mV[VY] = llclamp(accel.mV[VY], -100.f, 100.f);
348 mPartAccel.mV[VZ] = llclamp(accel.mV[VZ], -100.f, 100.f); 348 mPartAccel.mV[VZ] = llclamp(accel.mV[VZ], -100.f, 100.f);
349} 349}
350
351LLSD LLPartSysData::asLLSD() const
352{
353 LLSD sd = LLSD();
354
355 sd["LL_PART_INTERP_COLOR_MASK"] = (LLPartData::LL_PART_INTERP_COLOR_MASK & mPartData.mFlags) ? 1 : 0;
356 sd["LL_PART_INTERP_SCALE_MASK"] = (LLPartData::LL_PART_INTERP_SCALE_MASK & mPartData.mFlags) ? 1 : 0;
357 sd["LL_PART_BOUNCE_MASK"] = (LLPartData::LL_PART_BOUNCE_MASK & mPartData.mFlags) ? 1 : 0;
358 sd["LL_PART_WIND_MASK"] = (LLPartData::LL_PART_WIND_MASK & mPartData.mFlags) ? 1 : 0;
359 sd["LL_PART_FOLLOW_SRC_MASK"] = (LLPartData::LL_PART_FOLLOW_SRC_MASK & mPartData.mFlags) ? 1 : 0;
360 sd["LL_PART_FOLLOW_VELOCITY_MASK"] = (LLPartData::LL_PART_FOLLOW_VELOCITY_MASK & mPartData.mFlags) ? 1 : 0;
361 sd["LL_PART_TARGET_POS_MASK"] = (LLPartData::LL_PART_TARGET_POS_MASK & mPartData.mFlags) ? 1 : 0;
362 sd["LL_PART_TARGET_LINEAR_MASK"] = (LLPartData::LL_PART_TARGET_LINEAR_MASK & mPartData.mFlags) ? 1 : 0;
363 sd["LL_PART_EMISSIVE_MASK"] = (LLPartData::LL_PART_EMISSIVE_MASK & mPartData.mFlags) ? 1 : 0;
364 sd["LL_PART_BEAM_MASK"] = (LLPartData::LL_PART_BEAM_MASK & mPartData.mFlags) ? 1 : 0;
365
366 sd["SourceMaxage"] = mPartData.mMaxAge;
367 sd["Startcolor"] = ll_sd_from_color4(mPartData.mStartColor);
368 sd["Endcolor"] = ll_sd_from_color4(mPartData.mEndColor);
369 sd["Startscale"] = ll_sd_from_vector2(mPartData.mStartScale);
370 sd["Endscale"] = ll_sd_from_vector2(mPartData.mEndScale);
371
372 sd["ParticleMaxAge"] = mMaxAge;
373 sd["ParticleStartAge"] = mStartAge;
374
375
376 sd["LL_PART_SRC_PATTERN_DROP"] = ( mPattern & LL_PART_SRC_PATTERN_DROP) ? 1 : 0;
377 sd["LL_PART_SRC_PATTERN_EXPLODE"] = ( mPattern & LL_PART_SRC_PATTERN_EXPLODE) ? 1 : 0;
378 sd["LL_PART_SRC_PATTERN_ANGLE"] = ( mPattern & LL_PART_SRC_PATTERN_ANGLE) ? 1 : 0;
379 sd["LL_PART_SRC_PATTERN_ANGLE_CONE"] = ( mPattern & LL_PART_SRC_PATTERN_ANGLE_CONE) ? 1 : 0 ;
380 sd["LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY"] = ( mPattern & LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY) ? 1 : 0;
381
382 sd["InnerAngle"] = mInnerAngle;
383 sd["OuterAngle"] = mOuterAngle;
384 sd["AngularVelocity"] = ll_sd_from_vector3(mAngularVelocity);
385 sd["BurstRate"] = mBurstRate;
386 sd["BurstPartCount"] = mBurstPartCount;
387 sd["BurstSpeedMin"] = mBurstSpeedMin;
388 sd["BurstSpeedMax"] = mBurstSpeedMax;
389 sd["BurstRadius"] = mBurstRadius;
390 sd["PartImageID"] = mPartImageID.asString();
391 sd["TargetId"] = mTargetUUID.asString();
392 return sd;
393}
394
395bool LLPartSysData::fromLLSD(LLSD& sd)
396{
397 mPartData.mFlags = 0;
398 if (sd["LL_PART_INTERP_COLOR_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_INTERP_COLOR_MASK;
399 if (sd["LL_PART_INTERP_SCALE_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_INTERP_SCALE_MASK;
400 if (sd["LL_PART_BOUNCE_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_BOUNCE_MASK;
401 if (sd["LL_PART_WIND_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_WIND_MASK;
402 if (sd["LL_PART_FOLLOW_SRC_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_FOLLOW_SRC_MASK;
403 if (sd["LL_PART_FOLLOW_VELOCITY_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_FOLLOW_VELOCITY_MASK;
404 if (sd["LL_PART_TARGET_POS_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_TARGET_POS_MASK;
405 if (sd["LL_PART_TARGET_LINEAR_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_TARGET_LINEAR_MASK;
406 if (sd["LL_PART_EMISSIVE_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_EMISSIVE_MASK;
407 if (sd["LL_PART_BEAM_MASK"]) mPartData.mFlags |= LLPartData::LL_PART_BEAM_MASK;
408
409 mPartData.mMaxAge = (F32)sd["SourceMaxage"].asReal();
410 mPartData.mStartColor = ll_color4_from_sd(sd["Startcolor"]);
411 mPartData.mEndColor = ll_color4_from_sd(sd["Endcolor"]);
412 mPartData.mStartScale = ll_vector2_from_sd(sd["Startscale"]);
413 mPartData.mEndScale = ll_vector2_from_sd(sd["Endscale"]);
414
415 mMaxAge = (F32)sd["ParticleMaxAge"].asReal();
416 mStartAge = (F32)sd["ParticleStartAge"].asReal();
417
418 mPattern = 0;
419 if (sd["LL_PART_SRC_PATTERN_DROP"]) mPattern |= LL_PART_SRC_PATTERN_DROP;
420 if (sd["LL_PART_SRC_PATTERN_EXPLODE"]) mPattern |= LL_PART_SRC_PATTERN_EXPLODE;
421 if (sd["LL_PART_SRC_PATTERN_ANGLE"]) mPattern |= LL_PART_SRC_PATTERN_ANGLE;
422 if (sd["LL_PART_SRC_PATTERN_ANGLE_CONE"]) mPattern |= LL_PART_SRC_PATTERN_ANGLE_CONE;
423 if (sd["LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY"]) mPattern |= LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY;
424
425 mInnerAngle = (F32)sd["InnerAngle"].asReal();
426 mOuterAngle = (F32)sd["OuterAngle"].asReal();
427 mAngularVelocity = ll_vector3_from_sd(sd["AngularVelocity"]);
428 mBurstRate = (F32)sd["BurstRate"].asReal();
429 int burst_part_count = sd["BurstPartCount"];
430 mBurstPartCount = (U8)burst_part_count;
431 mBurstSpeedMin = (F32)sd["BurstSpeedMin"].asReal();
432 mBurstSpeedMax = (F32)sd["BurstSpeedMax"].asReal();
433 mBurstRadius = (F32)sd["BurstRadius"].asReal();
434
435 mPartImageID = LLUUID(sd[("PartImageID")].asString());
436 mTargetUUID = LLUUID(sd["TargetId"].asString());
437
438 return true;
439} \ No newline at end of file
diff --git a/linden/indra/llmessage/llpartdata.h b/linden/indra/llmessage/llpartdata.h
index 6dcb311..b7efa95 100644
--- a/linden/indra/llmessage/llpartdata.h
+++ b/linden/indra/llmessage/llpartdata.h
@@ -158,6 +158,9 @@ public:
158 BOOL unpackBlock(const S32 block_num); 158 BOOL unpackBlock(const S32 block_num);
159 BOOL packBlock(); 159 BOOL packBlock();
160 160
161 LLSD asLLSD() const;
162 bool fromLLSD(LLSD& sd);
163
161 static BOOL packNull(); 164 static BOOL packNull();
162 static BOOL isNullPS(const S32 block_num); // Returns FALSE if this is a "NULL" particle system (i.e. no system) 165 static BOOL isNullPS(const S32 block_num); // Returns FALSE if this is a "NULL" particle system (i.e. no system)
163 166
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index e6c1767..0eb5b41 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -88,6 +88,7 @@ set(viewer_SOURCE_FILES
88 impprefsfonts.cpp 88 impprefsfonts.cpp
89 jcfloater_animation_list.cpp 89 jcfloater_animation_list.cpp
90 jcfloaterareasearch.cpp 90 jcfloaterareasearch.cpp
91 kokuastreamingaudio.cpp
91 kowopenregionsettings.cpp 92 kowopenregionsettings.cpp
92 lightshare.cpp 93 lightshare.cpp
93 llagent.cpp 94 llagent.cpp
@@ -172,6 +173,7 @@ set(viewer_SOURCE_FILES
172 llfloatercustomize.cpp 173 llfloatercustomize.cpp
173 llfloaterdaycycle.cpp 174 llfloaterdaycycle.cpp
174 llfloaterdirectory.cpp 175 llfloaterdirectory.cpp
176 llfloaterdisplayname.cpp
175 llfloatereditui.cpp 177 llfloatereditui.cpp
176 llfloaterenvsettings.cpp 178 llfloaterenvsettings.cpp
177 llfloaterevent.cpp 179 llfloaterevent.cpp
@@ -409,6 +411,7 @@ set(viewer_SOURCE_FILES
409 llviewercamera.cpp 411 llviewercamera.cpp
410 llviewercontrol.cpp 412 llviewercontrol.cpp
411 llviewerdisplay.cpp 413 llviewerdisplay.cpp
414 llviewerdisplayname.cpp
412 llviewergenericmessage.cpp 415 llviewergenericmessage.cpp
413 llviewergesture.cpp 416 llviewergesture.cpp
414 llviewerimage.cpp 417 llviewerimage.cpp
@@ -541,6 +544,7 @@ set(viewer_HEADER_FILES
541 impprefsfonts.h 544 impprefsfonts.h
542 jcfloater_animation_list.h 545 jcfloater_animation_list.h
543 jcfloaterareasearch.h 546 jcfloaterareasearch.h
547 kokuastreamingaudio.h
544 lightshare.h 548 lightshare.h
545 lggautocorrectfloater.h 549 lggautocorrectfloater.h
546 lggautocorrect.h 550 lggautocorrect.h
@@ -630,6 +634,7 @@ set(viewer_HEADER_FILES
630 llfloatercustomize.h 634 llfloatercustomize.h
631 llfloaterdaycycle.h 635 llfloaterdaycycle.h
632 llfloaterdirectory.h 636 llfloaterdirectory.h
637 llfloaterdisplayname.h
633 llfloatereditui.h 638 llfloatereditui.h
634 llfloaterenvsettings.h 639 llfloaterenvsettings.h
635 llfloaterevent.h 640 llfloaterevent.h
@@ -871,6 +876,7 @@ set(viewer_HEADER_FILES
871 llviewercamera.h 876 llviewercamera.h
872 llviewercontrol.h 877 llviewercontrol.h
873 llviewerdisplay.h 878 llviewerdisplay.h
879 llviewerdisplayname.h
874 llviewergenericmessage.h 880 llviewergenericmessage.h
875 llviewergesture.h 881 llviewergesture.h
876 llviewerimage.h 882 llviewerimage.h
diff --git a/linden/indra/newview/app_settings/cloud.xml b/linden/indra/newview/app_settings/cloud.xml
new file mode 100644
index 0000000..ff9492b
--- /dev/null
+++ b/linden/indra/newview/app_settings/cloud.xml
@@ -0,0 +1,88 @@
1<llsd>
2 <map>
3 <key>AngularVelocity</key>
4 <array>
5 <real>0</real>
6 <real>0</real>
7 <real>0</real>
8 </array>
9 <key>BurstPartCount</key>
10 <integer>1</integer>
11 <key>BurstRadius</key>
12 <real>0.3</real>
13 <key>BurstRate</key>
14 <real>0.02</real>
15 <key>BurstSpeedMax</key>
16 <real>1</real>
17 <key>Endcolor</key>
18 <array>
19 <real>0.75</real>
20 <real>0.47</real>
21 <real>0.81</real>
22 <real>0</real>
23 </array>
24 <key>Endscale</key>
25 <array>
26 <real>0.02</real>
27 <real>0.02</real>
28 </array>
29 <key>InnerAngle</key>
30 <real>3.1415927410125732421875</real>
31 <key>LL_PART_BEAM_MASK</key>
32 <integer>0</integer>
33 <key>LL_PART_BOUNCE_MASK</key>
34 <integer>0</integer>
35 <key>LL_PART_EMISSIVE_MASK</key>
36 <integer>1</integer>
37 <key>LL_PART_FOLLOW_SRC_MASK</key>
38 <integer>0</integer>
39 <key>LL_PART_FOLLOW_VELOCITY_MASK</key>
40 <integer>0</integer>
41 <key>LL_PART_INTERP_COLOR_MASK</key>
42 <integer>1</integer>
43 <key>LL_PART_INTERP_SCALE_MASK</key>
44 <integer>1</integer>
45 <key>LL_PART_SRC_PATTERN_ANGLE</key>
46 <integer>0</integer>
47 <key>LL_PART_SRC_PATTERN_ANGLE_CONE</key>
48 <integer>1</integer>
49 <key>LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY</key>
50 <integer>0</integer>
51 <key>LL_PART_SRC_PATTERN_DROP</key>
52 <integer>0</integer>
53 <key>LL_PART_SRC_PATTERN_EXPLODE</key>
54 <integer>0</integer>
55 <key>LL_PART_TARGET_LINEAR_MASK</key>
56 <integer>0</integer>
57 <key>LL_PART_TARGET_POS_MASK</key>
58 <integer>1</integer>
59 <key>LL_PART_WIND_MASK</key>
60 <integer>0</integer>
61 <key>OuterAngle</key>
62 <real>0</real>
63 <key>PartImageID</key>
64 <string>0000000000000-0000-0000-000000000000</string>
65 <key>ParticleMaxAge</key>
66 <real>0</real>
67 <key>ParticleStartAge</key>
68 <real>0</real>
69 <key>SourceMaxage</key>
70 <real>4</real>
71 <key>Startcolor</key>
72 <array>
73 <real>0.9</real>
74 <real>0.0</real>
75 <real>0.8</real>
76 <real>0.7</real>
77 </array>
78 <key>Startscale</key>
79 <array>
80 <real>0.8</real>
81 <real>0.8</real>
82 </array>
83 <key>TargetId</key>
84 <string>00000000-0000-0000-0000-000000000000</string>
85 <key>BurstSpeedMin</key>
86 <real>0.1</real>
87 </map>
88</llsd>
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index c946f40..7ab3612 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -419,6 +419,42 @@
419 <key>Value</key> 419 <key>Value</key>
420 <integer>0</integer> 420 <integer>0</integer>
421 </map> 421 </map>
422
423 <!-- Display Names -->
424 <key>DisplayNamesUsage</key>
425 <map>
426 <key>Comment</key>
427 <string>Usage type for display names: 0 = Legacy name only, 1 = display name only (legacy name when absent), 2 = Display name with legacy name</string>
428 <key>Persist</key>
429 <integer>1</integer>
430 <key>Type</key>
431 <string>U32</string>
432 <key>Value</key>
433 <integer>2</integer>
434 </map>
435 <key>OmitResidentAsLastName</key>
436 <map>
437 <key>Comment</key>
438 <string>Do not display "Resident" as the last name for new residents in their legacy name</string>
439 <key>Persist</key>
440 <integer>1</integer>
441 <key>Type</key>
442 <string>Boolean</string>
443 <key>Value</key>
444 <integer>1</integer>
445 </map>
446 <key>LegacyNamesForFriends</key>
447 <map>
448 <key>Comment</key>
449 <string>When TRUE, forces the use of the legacy names for the friends list and online notifications</string>
450 <key>Persist</key>
451 <integer>1</integer>
452 <key>Type</key>
453 <string>Boolean</string>
454 <key>Value</key>
455 <integer>1</integer>
456 </map>
457
422 <key>EmeraldTemporaryUpload</key> 458 <key>EmeraldTemporaryUpload</key>
423 <map> 459 <map>
424 <key>Comment</key> 460 <key>Comment</key>
@@ -1330,6 +1366,17 @@
1330 <key>Value</key> 1366 <key>Value</key>
1331 <integer>1</integer> 1367 <integer>1</integer>
1332 </map> 1368 </map>
1369 <key>WarnFirstPrivacy</key>
1370 <map>
1371 <key>Comment</key>
1372 <string>Enables FirstPrivacy warning on login</string>
1373 <key>Persist</key>
1374 <integer>1</integer>
1375 <key>Type</key>
1376 <string>Boolean</string>
1377 <key>Value</key>
1378 <integer>1</integer>
1379 </map>
1333 <key>WarnFirstVoiceLicense</key> 1380 <key>WarnFirstVoiceLicense</key>
1334 <map> 1381 <map>
1335 <key>Comment</key> 1382 <key>Comment</key>
diff --git a/linden/indra/newview/chatbar_as_cmdline.cpp b/linden/indra/newview/chatbar_as_cmdline.cpp
index 0593091..b5a7e8c 100644
--- a/linden/indra/newview/chatbar_as_cmdline.cpp
+++ b/linden/indra/newview/chatbar_as_cmdline.cpp
@@ -69,7 +69,7 @@
69#include "llviewerparcelmgr.h" 69#include "llviewerparcelmgr.h"
70#include "llviewerparcelmedia.h" 70#include "llviewerparcelmedia.h"
71#include "llparcel.h" 71#include "llparcel.h"
72#include "llaudioengine.h" 72#include "kokuastreamingaudio.h"
73#include "llviewerparcelmediaautoplay.h" 73#include "llviewerparcelmediaautoplay.h"
74#include "lloverlaybar.h" 74#include "lloverlaybar.h"
75#include "lggautocorrectfloater.h" 75#include "lggautocorrectfloater.h"
@@ -367,7 +367,7 @@ bool cmd_line_chat(std::string revised_text, EChatType type)
367 { 367 {
368 gOverlayBar->toggleMusicPlay(gOverlayBar); 368 gOverlayBar->toggleMusicPlay(gOverlayBar);
369 } 369 }
370 gAudiop->startInternetStream(status); 370 gAudioStream->startInternetStream(status);
371 return false; 371 return false;
372 } 372 }
373 } 373 }
diff --git a/linden/indra/newview/kokuastreamingaudio.cpp b/linden/indra/newview/kokuastreamingaudio.cpp
new file mode 100644
index 0000000..ed606db
--- /dev/null
+++ b/linden/indra/newview/kokuastreamingaudio.cpp
@@ -0,0 +1,129 @@
1 /**
2 * @file kokuastreamingaudio.cpp
3 * @brief Definition of KOKUAStreamingAudio base class for streaming audio support
4 *
5 * $LicenseInfo:firstyear=2011&license=viewergpl$
6 * Kokua Viewer Source Code
7 * Copyright (C) 2011, Armin.Weatherwax (at) googlemail.com
8 * for the Kokua Viewer Team, in special for our Imprudence Viewer.
9 *
10 * The source code in this file ("Source Code") is provided by the author
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in this
13 * distribution, or online at
14 * http://secondlifegrid.net/programs/open_source/licensing/gplv2
15 *
16 * There are special exceptions to the terms and conditions of the GPL as
17 * it is applied to this Source Code. View the full text of the exception
18 * in the file doc/FLOSS-exception.txt in this software distribution, or
19 * online at
20 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * THIS SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 *
30 * $/LicenseInfo$
31 */
32
33#include "kokuastreamingaudio.h"
34#include "llstreamingaudio.h"
35
36
37KOKUAStreamingAudio* gAudioStream = NULL;
38
39KOKUAStreamingAudio::KOKUAStreamingAudio(LLStreamingAudioInterface *impl) :
40mStreamingAudioImpl (impl)
41{
42
43}
44
45KOKUAStreamingAudio::~KOKUAStreamingAudio()
46{
47 if (mStreamingAudioImpl)
48 {
49 delete mStreamingAudioImpl;
50 mStreamingAudioImpl = NULL;
51 }
52}
53
54LLStreamingAudioInterface* KOKUAStreamingAudio::getStreamingAudioImpl()
55{
56 return mStreamingAudioImpl;
57}
58
59// void KOKUAStreamingAudio::setStreamingAudioImpl(LLStreamingAudioInterface *impl)
60// {
61// mStreamingAudioImpl = impl;
62// }
63
64// virtual
65void KOKUAStreamingAudio::startInternetStream(const std::string& url)
66{
67 if (mStreamingAudioImpl)
68 mStreamingAudioImpl->start(url);
69}
70
71// virtual
72void KOKUAStreamingAudio::stopInternetStream()
73{
74 if (mStreamingAudioImpl)
75 mStreamingAudioImpl->stop();
76}
77
78// virtual
79void KOKUAStreamingAudio::pauseInternetStream(int pause)
80{
81 if (mStreamingAudioImpl)
82 mStreamingAudioImpl->pause(pause);
83}
84
85// virtual
86void KOKUAStreamingAudio::updateInternetStream()
87{
88 if (mStreamingAudioImpl)
89 mStreamingAudioImpl->update();
90}
91
92// virtual
93KOKUAStreamingAudio::KOKUAAudioPlayState KOKUAStreamingAudio::isInternetStreamPlaying()
94{
95 if (mStreamingAudioImpl)
96 return (KOKUAStreamingAudio::KOKUAAudioPlayState) mStreamingAudioImpl->isPlaying();
97
98 return KOKUAStreamingAudio::AUDIO_STOPPED; // Stopped
99}
100
101// virtual
102void KOKUAStreamingAudio::setInternetStreamGain(F32 vol)
103{
104 if (mStreamingAudioImpl)
105 mStreamingAudioImpl->setGain(vol);
106}
107
108F32 KOKUAStreamingAudio::getInternetStreamGain()
109{
110 if (mStreamingAudioImpl)
111 return mStreamingAudioImpl->getGain();
112 else
113 return 1.0f;
114}
115
116// virtual
117std::string KOKUAStreamingAudio::getInternetStreamURL()
118{
119 if (mStreamingAudioImpl)
120 return mStreamingAudioImpl->getURL();
121 else return std::string();
122}
123
124std::string KOKUAStreamingAudio::getVersion()
125{
126 if (mStreamingAudioImpl)
127 return mStreamingAudioImpl->getVersion();
128 else return std::string();
129} \ No newline at end of file
diff --git a/linden/indra/newview/kokuastreamingaudio.h b/linden/indra/newview/kokuastreamingaudio.h
new file mode 100644
index 0000000..eb49f25
--- /dev/null
+++ b/linden/indra/newview/kokuastreamingaudio.h
@@ -0,0 +1,71 @@
1/**
2 * @file kokuastreamingaudio.h
3 * @brief Definition of KOKUAStreamingAudio base class for streaming audio support
4 *
5 * $LicenseInfo:firstyear=2011&license=viewergpl$
6 * Kokua Viewer Source Code
7 * Copyright (C) 2011, Armin.Weatherwax (at) googlemail.com
8 * for the Kokua Viewer Team.
9 *
10 * The source code in this file ("Source Code") is provided by the author
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in this
13 * distribution, or online at
14 * http://secondlifegrid.net/programs/open_source/licensing/gplv2
15 *
16 * There are special exceptions to the terms and conditions of the GPL as
17 * it is applied to this Source Code. View the full text of the exception
18 * in the file doc/FLOSS-exception.txt in this software distribution, or
19 * online at
20 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * THIS SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 *
30 * $/LicenseInfo$
31 */
32#ifndef KOKUA_STREAMINGAUDIO_H
33#define KOKUA_STREAMINGAUDIO_H
34
35#include "linden_common.h"
36
37class LLStreamingAudioInterface;
38
39class KOKUAStreamingAudio
40{
41public:
42 enum KOKUAAudioPlayState
43 {
44 // isInternetStreamPlaying() returns an *int*, with
45 // 0 = stopped, 1 = playing, 2 = paused.
46 AUDIO_STOPPED = 0,
47 AUDIO_PLAYING = 1,
48 AUDIO_PAUSED = 2
49 };
50
51 KOKUAStreamingAudio(LLStreamingAudioInterface *impl);
52 virtual ~KOKUAStreamingAudio();
53
54 LLStreamingAudioInterface *getStreamingAudioImpl();
55// void setStreamingAudioImpl(LLStreamingAudioInterface *impl);
56 void startInternetStream(const std::string& url);
57 void stopInternetStream();
58 void pauseInternetStream(int pause);
59 void updateInternetStream();
60 KOKUAAudioPlayState isInternetStreamPlaying();
61 void setInternetStreamGain(F32 vol);
62 F32 getInternetStreamGain();
63 std::string getInternetStreamURL();
64 std::string getVersion();
65private:
66 LLStreamingAudioInterface *mStreamingAudioImpl;
67};
68
69extern KOKUAStreamingAudio* gAudioStream;
70
71#endif
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index 5a1700a..515d588 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -7488,7 +7488,7 @@ void LLAgent::sendAgentSetAppearance()
7488 param; 7488 param;
7489 param = (LLViewerVisualParam*)mAvatarObject->getNextVisualParam()) 7489 param = (LLViewerVisualParam*)mAvatarObject->getNextVisualParam())
7490 { 7490 {
7491 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 7491 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) // do not transmit params of group VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT
7492 { 7492 {
7493 msg->nextBlockFast(_PREHASH_VisualParam ); 7493 msg->nextBlockFast(_PREHASH_VisualParam );
7494 7494
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index 8aea221..9a0295e 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -104,6 +104,7 @@
104#include "llassetstorage.h" 104#include "llassetstorage.h"
105#include "llpolymesh.h" 105#include "llpolymesh.h"
106#include "llcachename.h" 106#include "llcachename.h"
107#include "kokuastreamingaudio.h"
107#include "llaudioengine.h" 108#include "llaudioengine.h"
108#include "llstreamingaudio.h" 109#include "llstreamingaudio.h"
109#include "llviewermenu.h" 110#include "llviewermenu.h"
@@ -1258,6 +1259,7 @@ bool LLAppViewer::cleanup()
1258 1259
1259 LLPolyMesh::freeAllMeshes(); 1260 LLPolyMesh::freeAllMeshes();
1260 1261
1262 LLAvatarNameCache::cleanupClass();
1261 delete gCacheName; 1263 delete gCacheName;
1262 gCacheName = NULL; 1264 gCacheName = NULL;
1263 1265
@@ -1278,14 +1280,16 @@ bool LLAppViewer::cleanup()
1278 1280
1279 llinfos << "Global stuff deleted" << llendflush; 1281 llinfos << "Global stuff deleted" << llendflush;
1280 1282
1281 if (gAudiop) 1283 if (gAudioStream)
1282 { 1284 {
1283 // shut down the streaming audio sub-subsystem first, in case it relies on not outliving the general audio subsystem. 1285 // shut down the streaming audio sub-subsystem first, in case it relies on not outliving the general audio subsystem.
1284 1286
1285 LLStreamingAudioInterface *sai = gAudiop->getStreamingAudioImpl(); 1287 delete gAudioStream;
1286 delete sai; 1288 gAudioStream = NULL;
1287 gAudiop->setStreamingAudioImpl(NULL); 1289 }
1288 1290
1291 if (gAudiop)
1292 {
1289 // shut down the audio subsystem 1293 // shut down the audio subsystem
1290 1294
1291 bool want_longname = false; 1295 bool want_longname = false;
@@ -1642,19 +1646,38 @@ bool LLAppViewer::initLogging()
1642 LLError::initForApplication( 1646 LLError::initForApplication(
1643 gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); 1647 gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
1644 LLError::setFatalFunction(errorCallback); 1648 LLError::setFatalFunction(errorCallback);
1645
1646 // Remove the last ".old" log file.
1647 std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
1648 "Imprudence.old");
1649 LLFile::remove(old_log_file);
1650 1649
1651 // Rename current log file to ".old" 1650 std::string log_name = "Imprudence.log";
1652 std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
1653 "Imprudence.log");
1654 LLFile::rename(log_file, old_log_file);
1655 1651
1656 // Set the log file to Imprudence.log 1652 const int MAX_ROTATION = 5;
1653 for(int i = MAX_ROTATION; 0 < i; i--)
1654 {
1655 std::ostringstream current;
1656 current << ".";
1657 current << i;
1658
1659 std::ostringstream previous;
1660 if( 1 < i )
1661 {
1662 previous << ".";
1663 previous << i-1;
1664 }
1665
1666 std::string current_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
1667 log_name + current.str());
1668 std::string previous_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
1669 log_name + previous.str());
1657 1670
1671 if (MAX_ROTATION == i)
1672 {
1673 LLFile::remove(current_log_file);
1674 }
1675
1676 LLFile::rename(previous_log_file, current_log_file);
1677 }
1678
1679 // Set the log file to Imprudence.log
1680 std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, log_name);
1658 LLError::logToFile(log_file); 1681 LLError::logToFile(log_file);
1659 1682
1660 // *FIX:Mani no error handling here! 1683 // *FIX:Mani no error handling here!
@@ -1861,6 +1884,7 @@ bool LLAppViewer::initConfiguration()
1861 LLFirstUse::addConfigVariable("FirstVoice"); 1884 LLFirstUse::addConfigVariable("FirstVoice");
1862 LLFirstUse::addConfigVariable("FirstMedia"); 1885 LLFirstUse::addConfigVariable("FirstMedia");
1863 LLFirstUse::addConfigVariable("FirstLoginScreen"); 1886 LLFirstUse::addConfigVariable("FirstLoginScreen");
1887 LLFirstUse::addConfigVariable("FirstPrivacy");
1864 1888
1865// [RLVa:KB] - Checked: RLVa-1.0.3a (2009-09-10) | Added: RLVa-1.0.3a 1889// [RLVa:KB] - Checked: RLVa-1.0.3a (2009-09-10) | Added: RLVa-1.0.3a
1866 //LLFirstUse::addConfigVariable(RLV_SETTING_FIRSTUSE_DETACH); 1890 //LLFirstUse::addConfigVariable(RLV_SETTING_FIRSTUSE_DETACH);
@@ -3296,6 +3320,14 @@ void LLAppViewer::saveFinalSnapshot()
3296 3320
3297void LLAppViewer::loadNameCache() 3321void LLAppViewer::loadNameCache()
3298{ 3322{
3323 // display names cache
3324 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml");
3325 llifstream name_cache_stream(filename);
3326 if (name_cache_stream.is_open())
3327 {
3328 LLAvatarNameCache::importFile(name_cache_stream);
3329 }
3330
3299 if (!gCacheName) return; 3331 if (!gCacheName) return;
3300 3332
3301 std::string name_cache; 3333 std::string name_cache;
@@ -3318,6 +3350,14 @@ void LLAppViewer::loadNameCache()
3318 3350
3319void LLAppViewer::saveNameCache() 3351void LLAppViewer::saveNameCache()
3320{ 3352{
3353 // display names cache
3354 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml");
3355 llofstream name_cache_stream(filename);
3356 if (name_cache_stream.is_open())
3357 {
3358 LLAvatarNameCache::exportFile(name_cache_stream);
3359 }
3360
3321 if (!gCacheName) return; 3361 if (!gCacheName) return;
3322 3362
3323 std::string name_cache; 3363 std::string name_cache;
@@ -3469,18 +3509,22 @@ void LLAppViewer::idle()
3469 // Initialize the viewer_stats_timer with an already elapsed time 3509 // Initialize the viewer_stats_timer with an already elapsed time
3470 // of SEND_STATS_PERIOD so that the initial stats report will 3510 // of SEND_STATS_PERIOD so that the initial stats report will
3471 // be sent immediately. 3511 // be sent immediately.
3472 static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD); 3512 if(!gDisconnected && gHippoGridManager->getConnectedGrid()->isSecondLife())
3473 reset_statistics();
3474
3475 // Update session stats every large chunk of time
3476 // *FIX: (???) SAMANTHA
3477 /* or don't! part of a larger effort to waste less CPU cycles. -Patrick Sapinski (Sunday, November 29, 2009)
3478 if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD && !gDisconnected)
3479 { 3513 {
3480 llinfos << "Transmitting sessions stats" << llendl; 3514 static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD);
3481 send_stats(); 3515 reset_statistics();
3482 viewer_stats_timer.reset(); 3516
3483 } */ 3517 // Update session stats every large chunk of time
3518 // *FIX: (???) SAMANTHA
3519
3520 /* or don't! part of a larger effort to waste less CPU cycles. -Patrick Sapinski (Sunday, November 29, 2009)*/
3521 if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD )
3522 {
3523 llinfos << "Transmitting sessions stats" << llendl;
3524 send_stats();
3525 viewer_stats_timer.reset();
3526 }
3527 }
3484 3528
3485 // Print the object debugging stats 3529 // Print the object debugging stats
3486 static LLFrameTimer object_debug_timer; 3530 static LLFrameTimer object_debug_timer;
@@ -3518,6 +3562,8 @@ void LLAppViewer::idle()
3518 // floating throughout the various object lists. 3562 // floating throughout the various object lists.
3519 // 3563 //
3520 3564
3565 idleNameCache();
3566
3521 gFrameStats.start(LLFrameStats::IDLE_NETWORK); 3567 gFrameStats.start(LLFrameStats::IDLE_NETWORK);
3522 stop_glerror(); 3568 stop_glerror();
3523 idleNetwork(); 3569 idleNetwork();
@@ -3732,6 +3778,10 @@ void LLAppViewer::idle()
3732 const F32 max_audio_decode_time = 0.002f; // 2 ms decode time 3778 const F32 max_audio_decode_time = 0.002f; // 2 ms decode time
3733 gAudiop->idle(max_audio_decode_time); 3779 gAudiop->idle(max_audio_decode_time);
3734 } 3780 }
3781
3782 // update streaming audio
3783 if (gAudioStream)
3784 gAudioStream->updateInternetStream();
3735 } 3785 }
3736 3786
3737 3787
@@ -3895,6 +3945,60 @@ void LLAppViewer::sendLogoutRequest()
3895 } 3945 }
3896} 3946}
3897 3947
3948void LLAppViewer::idleNameCache()
3949{
3950 // Neither old nor new name cache can function before agent has a region
3951 LLViewerRegion* region = gAgent.getRegion();
3952 if (!region) return;
3953
3954 // deal with any queued name requests and replies.
3955 gCacheName->processPending();
3956
3957 // Can't run the new cache until we have the list of capabilities
3958 // for the agent region, and can therefore decide whether to use
3959 // display names or fall back to the old name system.
3960 if (!region->capabilitiesReceived()) return;
3961
3962 // Agent may have moved to a different region, so need to update cap URL
3963 // for name lookups. Can't do this in the cap grant code, as caps are
3964 // granted to neighbor regions before the main agent gets there. Can't
3965 // do it in the move-into-region code because cap not guaranteed to be
3966 // granted yet, for example on teleport.
3967 bool had_capability = LLAvatarNameCache::hasNameLookupURL();
3968 std::string name_lookup_url;
3969 name_lookup_url.reserve(128); // avoid a memory allocation below
3970 name_lookup_url = region->getCapability("GetDisplayNames");
3971 bool have_capability = !name_lookup_url.empty();
3972 if (have_capability)
3973 {
3974 // we have support for display names, use it
3975 U32 url_size = name_lookup_url.size();
3976 // capabilities require URLs with slashes before query params:
3977 // https://<host>:<port>/cap/<uuid>/?ids=<blah>
3978 // but the caps are granted like:
3979 // https://<host>:<port>/cap/<uuid>
3980 if (url_size > 0 && name_lookup_url[url_size-1] != '/')
3981 {
3982 name_lookup_url += '/';
3983 }
3984 LLAvatarNameCache::setNameLookupURL(name_lookup_url);
3985 }
3986 else
3987 {
3988 // Display names not available on this region
3989 LLAvatarNameCache::setNameLookupURL( std::string() );
3990 }
3991
3992 // Error recovery - did we change state?
3993 if (had_capability != have_capability)
3994 {
3995 // name tags are persistant on screen, so make sure they refresh
3996 LLVOAvatar::invalidateNameTags();
3997 }
3998
3999 LLAvatarNameCache::idle();
4000}
4001
3898// 4002//
3899// Handle messages, and all message related stuff 4003// Handle messages, and all message related stuff
3900// 4004//
diff --git a/linden/indra/newview/llappviewer.h b/linden/indra/newview/llappviewer.h
index 7b3230a..42c49de 100644
--- a/linden/indra/newview/llappviewer.h
+++ b/linden/indra/newview/llappviewer.h
@@ -192,6 +192,7 @@ private:
192 192
193 void idle(); 193 void idle();
194 void idleShutdown(); 194 void idleShutdown();
195 void idleNameCache();
195 void idleNetwork(); 196 void idleNetwork();
196 197
197 void sendLogoutRequest(); 198 void sendLogoutRequest();
diff --git a/linden/indra/newview/llcallingcard.cpp b/linden/indra/newview/llcallingcard.cpp
index 15be0eb..f1328be 100644
--- a/linden/indra/newview/llcallingcard.cpp
+++ b/linden/indra/newview/llcallingcard.cpp
@@ -613,6 +613,25 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
613 LLSD args; 613 LLSD args;
614 if(gCacheName->getName(agent_id, first, last)) 614 if(gCacheName->getName(agent_id, first, last))
615 { 615 {
616 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
617 {
618 LLAvatarName avatar_name;
619 if (LLAvatarNameCache::get(agent_id, &avatar_name))
620 {
621 // Always show "Display Name [Legacy Name]" for security reasons
622 first = avatar_name.getNames();
623 size_t i = first.find(" ");
624 if (i != std::string::npos)
625 {
626 last = first.substr(i + 1);
627 first = first.substr(0, i);
628 }
629 else
630 {
631 last = "";
632 }
633 }
634 }
616 args["FIRST_NAME"] = first; 635 args["FIRST_NAME"] = first;
617 args["LAST_NAME"] = last; 636 args["LAST_NAME"] = last;
618 } 637 }
@@ -669,6 +688,31 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
669 std::string first, last; 688 std::string first, last;
670 if(gCacheName->getName(agent_id, first, last)) 689 if(gCacheName->getName(agent_id, first, last))
671 { 690 {
691 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
692 {
693 LLAvatarName avatar_name;
694 if (LLAvatarNameCache::get(agent_id, &avatar_name))
695 {
696 if (LLAvatarNameCache::useDisplayNames() == 1)
697 {
698 first = avatar_name.mDisplayName;
699 }
700 else
701 {
702 first = avatar_name.getNames();
703 }
704 size_t i = first.find(" ");
705 if (i != std::string::npos)
706 {
707 last = first.substr(i + 1);
708 first = first.substr(0, i);
709 }
710 else
711 {
712 last = "";
713 }
714 }
715 }
672 notify = TRUE; 716 notify = TRUE;
673 args["FIRST"] = first; 717 args["FIRST"] = first;
674 args["LAST"] = last; 718 args["LAST"] = last;
@@ -745,6 +789,12 @@ void LLAvatarTracker::processTerminateFriendship(LLMessageSystem* msg, void**)
745 } 789 }
746} 790}
747 791
792void LLAvatarTracker::dirtyBuddies()
793{
794 mModifyMask |= LLFriendObserver::REMOVE | LLFriendObserver::ADD;
795 notifyObservers();
796}
797
748///---------------------------------------------------------------------------- 798///----------------------------------------------------------------------------
749/// Tracking Data 799/// Tracking Data
750///---------------------------------------------------------------------------- 800///----------------------------------------------------------------------------
diff --git a/linden/indra/newview/llcallingcard.h b/linden/indra/newview/llcallingcard.h
index d3f53c6..d5496ae 100644
--- a/linden/indra/newview/llcallingcard.h
+++ b/linden/indra/newview/llcallingcard.h
@@ -122,6 +122,9 @@ public:
122 // deal with termination of friendhsip 122 // deal with termination of friendhsip
123 void terminateBuddy(const LLUUID& id); 123 void terminateBuddy(const LLUUID& id);
124 124
125 // flag the buddy list dirty to force an update
126 void dirtyBuddies();
127
125 // get full info 128 // get full info
126 const LLRelationship* getBuddyInfo(const LLUUID& id) const; 129 const LLRelationship* getBuddyInfo(const LLUUID& id) const;
127 130
diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp
index 18efa9e..f482d1c 100644
--- a/linden/indra/newview/llfirstuse.cpp
+++ b/linden/indra/newview/llfirstuse.cpp
@@ -390,3 +390,31 @@ void LLFirstUse::voiceLicenseAgreement()
390 LLStartUp::setStartupState(STATE_LOGIN_AUTH_INIT); 390 LLStartUp::setStartupState(STATE_LOGIN_AUTH_INIT);
391 } 391 }
392} 392}
393
394void LLFirstUse::callbackPrivacy(const LLSD& notification, const LLSD& response)
395{
396
397 S32 option = LLNotification::getSelectedOption(notification, response);
398 if ( 0 == option )
399 {
400 gSavedSettings.setWarning("FirstPrivacy", FALSE);
401 LLStartUp::setStartupState(STATE_PRIVACY_LECTURED);
402 }
403 if ( 1 == option )
404 {
405 LLStartUp::resetLogin();
406 }
407}
408
409// static
410void LLFirstUse::Privacy()
411{
412 if (gSavedSettings.getWarning("FirstPrivacy"))
413 {
414 LLNotifications::instance().add("FirstPrivacy", LLSD(), LLSD(), callbackPrivacy);
415 }
416 else
417 {
418 LLStartUp::setStartupState(STATE_PRIVACY_LECTURED);
419 }
420} \ No newline at end of file
diff --git a/linden/indra/newview/llfirstuse.h b/linden/indra/newview/llfirstuse.h
index 42443ff..8c2ca35 100644
--- a/linden/indra/newview/llfirstuse.h
+++ b/linden/indra/newview/llfirstuse.h
@@ -116,7 +116,8 @@ public:
116 static void callbackClientTags(const LLSD& notification, const LLSD& response); 116 static void callbackClientTags(const LLSD& notification, const LLSD& response);
117 static void ClientTags(); 117 static void ClientTags();
118 static void voiceLicenseAgreement(); 118 static void voiceLicenseAgreement();
119 119 static void callbackPrivacy(const LLSD& notification, const LLSD& response);
120 static void Privacy();
120protected: 121protected:
121 static std::set<std::string> sConfigVariables; 122 static std::set<std::string> sConfigVariables;
122 123
diff --git a/linden/indra/newview/llfloateractivespeakers.cpp b/linden/indra/newview/llfloateractivespeakers.cpp
index 59de717..75cf176 100644
--- a/linden/indra/newview/llfloateractivespeakers.cpp
+++ b/linden/indra/newview/llfloateractivespeakers.cpp
@@ -92,18 +92,19 @@ LLSpeaker::LLSpeaker(const LLUUID& id, const std::string& name, const ESpeakerTy
92 92
93void LLSpeaker::lookupName() 93void LLSpeaker::lookupName()
94{ 94{
95 gCacheName->getName(mID, onAvatarNameLookup, new LLHandle<LLSpeaker>(getHandle())); 95 LLAvatarNameCache::get(mID, boost::bind(&LLSpeaker::onAvatarNameLookup, _1, _2, new LLHandle<LLSpeaker>(getHandle())));
96} 96}
97 97
98//static 98//static
99void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* user_data) 99void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const LLAvatarName& avatar_name, void* user_data)
100{ 100{
101 LLSpeaker* speaker_ptr = ((LLHandle<LLSpeaker>*)user_data)->get(); 101 LLSpeaker* speaker_ptr = ((LLHandle<LLSpeaker>*)user_data)->get();
102 delete (LLHandle<LLSpeaker>*)user_data; 102 delete (LLHandle<LLSpeaker>*)user_data;
103 103
104 if (speaker_ptr) 104 if (speaker_ptr)
105 { 105 {
106 speaker_ptr->mDisplayName = first + " " + last; 106 // Always show "Display Name [Legacy Name]" for security reasons
107 speaker_ptr->mDisplayName = avatar_name.getNames();
107// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-1.0.0g 108// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-1.0.0g
108 // TODO-RLVa: this seems to get called per frame which is very likely an LL bug that will eventuall get fixed 109 // TODO-RLVa: this seems to get called per frame which is very likely an LL bug that will eventuall get fixed
109 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) 110 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
diff --git a/linden/indra/newview/llfloateractivespeakers.h b/linden/indra/newview/llfloateractivespeakers.h
index b2c44e2..dc3dd73 100644
--- a/linden/indra/newview/llfloateractivespeakers.h
+++ b/linden/indra/newview/llfloateractivespeakers.h
@@ -33,6 +33,7 @@
33#ifndef LL_LLFLOATERACTIVESPEAKERS_H 33#ifndef LL_LLFLOATERACTIVESPEAKERS_H
34#define LL_LLFLOATERACTIVESPEAKERS_H 34#define LL_LLFLOATERACTIVESPEAKERS_H
35 35
36#include "llavatarnamecache.h"
36#include "llfloater.h" 37#include "llfloater.h"
37#include "llmemory.h" 38#include "llmemory.h"
38#include "llvoiceclient.h" 39#include "llvoiceclient.h"
@@ -73,7 +74,7 @@ public:
73 ~LLSpeaker() {}; 74 ~LLSpeaker() {};
74 void lookupName(); 75 void lookupName();
75 76
76 static void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* user_data); 77 static void onAvatarNameLookup(const LLUUID& id, const LLAvatarName& avatar_name, void* user_data);
77 78
78 ESpeakerStatus mStatus; // current activity status in speech group 79 ESpeakerStatus mStatus; // current activity status in speech group
79 F32 mLastSpokeTime; // timestamp when this speaker last spoke 80 F32 mLastSpokeTime; // timestamp when this speaker last spoke
diff --git a/linden/indra/newview/llfloateravatarinfo.cpp b/linden/indra/newview/llfloateravatarinfo.cpp
index 0618875..13805fb 100644
--- a/linden/indra/newview/llfloateravatarinfo.cpp
+++ b/linden/indra/newview/llfloateravatarinfo.cpp
@@ -122,7 +122,7 @@ LLFloaterAvatarInfo::LLFloaterAvatarInfo(const std::string& name, const LLRect &
122 } 122 }
123 123
124 gAvatarInfoInstances.addData(avatar_id, this); // must be done before callback below is called. 124 gAvatarInfoInstances.addData(avatar_id, this); // must be done before callback below is called.
125 gCacheName->get(avatar_id, FALSE, callbackLoadAvatarName); 125 LLAvatarNameCache::get(avatar_id, boost::bind(&LLFloaterAvatarInfo::callbackLoadAvatarName, _1, _2));
126} 126}
127 127
128// virtual 128// virtual
@@ -242,18 +242,16 @@ void LLFloaterAvatarInfo::showProfileCallback(S32 option, void *userdata)
242 242
243// static 243// static
244void LLFloaterAvatarInfo::callbackLoadAvatarName(const LLUUID& id, 244void LLFloaterAvatarInfo::callbackLoadAvatarName(const LLUUID& id,
245 const std::string& first, 245 const LLAvatarName& avatar_name)
246 const std::string& last,
247 BOOL is_group,
248 void* data)
249{ 246{
250 LLFloaterAvatarInfo *floater = gAvatarInfoInstances.getIfThere(id); 247 LLFloaterAvatarInfo *floater = gAvatarInfoInstances.getIfThere(id);
251 248
252 if (floater) 249 if (floater)
253 { 250 {
254 // Build a new title including the avatar name. 251 // Build a new title including the avatar name.
252 // Always show "Display Name [Legacy Name]" for security reasons
255 std::ostringstream title; 253 std::ostringstream title;
256 title << first << " " << last << " - " << floater->getTitle(); 254 title << avatar_name.getNames() << " - " << floater->getTitle();
257 floater->setTitle(title.str()); 255 floater->setTitle(title.str());
258 } 256 }
259} 257}
diff --git a/linden/indra/newview/llfloateravatarinfo.h b/linden/indra/newview/llfloateravatarinfo.h
index 1cc17d1..f65e1f4 100644
--- a/linden/indra/newview/llfloateravatarinfo.h
+++ b/linden/indra/newview/llfloateravatarinfo.h
@@ -39,6 +39,7 @@
39#ifndef LL_LLFLOATERAVATARINFO_H 39#ifndef LL_LLFLOATERAVATARINFO_H
40#define LL_LLFLOATERAVATARINFO_H 40#define LL_LLFLOATERAVATARINFO_H
41 41
42#include "llavatarnamecache.h"
42#include "llfloater.h" 43#include "llfloater.h"
43#include "llpreview.h" 44#include "llpreview.h"
44#include "lluuid.h" 45#include "lluuid.h"
@@ -91,8 +92,7 @@ public:
91 92
92 static LLFloaterAvatarInfo* getInstance(const LLUUID &id); 93 static LLFloaterAvatarInfo* getInstance(const LLUUID &id);
93 static void showProfileCallback(S32 option, void *userdata); 94 static void showProfileCallback(S32 option, void *userdata);
94 static void callbackLoadAvatarName(const LLUUID& id, 95 static void callbackLoadAvatarName(const LLUUID& agent_id, const LLAvatarName& avatar_name);
95 const std::string& first, const std::string& last, BOOL is_group, void* data);
96 void resetGroupList(); 96 void resetGroupList();
97 97
98private: 98private:
diff --git a/linden/indra/newview/llfloaterchatterbox.cpp b/linden/indra/newview/llfloaterchatterbox.cpp
index 1ef75d1..ba1c83c 100644
--- a/linden/indra/newview/llfloaterchatterbox.cpp
+++ b/linden/indra/newview/llfloaterchatterbox.cpp
@@ -43,6 +43,7 @@
43#include "llviewercontrol.h" 43#include "llviewercontrol.h"
44#include "llimview.h" 44#include "llimview.h"
45#include "llimpanel.h" 45#include "llimpanel.h"
46#include "llcallingcard.h"
46 47
47// 48//
48// LLFloaterMyFriends 49// LLFloaterMyFriends
@@ -218,6 +219,8 @@ void LLFloaterChatterBox::draw()
218void LLFloaterChatterBox::onOpen() 219void LLFloaterChatterBox::onOpen()
219{ 220{
220 gSavedSettings.setBOOL("ShowCommunicate", TRUE); 221 gSavedSettings.setBOOL("ShowCommunicate", TRUE);
222 // Force a refresh to get latest display names in the new IM panel.
223 LLAvatarTracker::instance().dirtyBuddies();
221} 224}
222 225
223void LLFloaterChatterBox::onClose(bool app_quitting) 226void LLFloaterChatterBox::onClose(bool app_quitting)
diff --git a/linden/indra/newview/llfloatercustomize.cpp b/linden/indra/newview/llfloatercustomize.cpp
index db51556..21dfc36 100644
--- a/linden/indra/newview/llfloatercustomize.cpp
+++ b/linden/indra/newview/llfloatercustomize.cpp
@@ -448,9 +448,7 @@ LLPanelEditWearable::LLPanelEditWearable( EWearableType type )
448BOOL LLPanelEditWearable::postBuild() 448BOOL LLPanelEditWearable::postBuild()
449{ 449{
450 LLAssetType::EType asset_type = LLWearable::typeToAssetType( mType ); 450 LLAssetType::EType asset_type = LLWearable::typeToAssetType( mType );
451 std::string icon_name = (asset_type == LLAssetType::AT_CLOTHING ? 451 std::string icon_name = get_item_icon_name(asset_type, LLInventoryType::IT_WEARABLE, mType, FALSE);
452 "inv_item_clothing.tga" :
453 "inv_item_skin.tga" );
454 childSetValue("icon", icon_name); 452 childSetValue("icon", icon_name);
455 453
456 childSetAction("Create New", LLPanelEditWearable::onBtnCreateNew, this ); 454 childSetAction("Create New", LLPanelEditWearable::onBtnCreateNew, this );
@@ -553,7 +551,7 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart )
553 param = (LLViewerVisualParam *)avatar->getNextVisualParam()) 551 param = (LLViewerVisualParam *)avatar->getNextVisualParam())
554 { 552 {
555 if (param->getID() == -1 553 if (param->getID() == -1
556 || param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE 554 || !param->isTweakable()
557 || param->getEditGroup() != part->mEditGroup 555 || param->getEditGroup() != part->mEditGroup
558 || !(param->getSex() & avatar_sex)) 556 || !(param->getSex() & avatar_sex))
559 { 557 {
@@ -763,7 +761,6 @@ void LLPanelEditWearable::onColorCommit( LLUICtrl* ctrl, void* userdata )
763 } 761 }
764} 762}
765 763
766
767void LLPanelEditWearable::initPreviousTextureList() 764void LLPanelEditWearable::initPreviousTextureList()
768{ 765{
769 initPreviousTextureListEntry(TEX_LOWER_ALPHA); 766 initPreviousTextureListEntry(TEX_LOWER_ALPHA);
@@ -2338,6 +2335,7 @@ void LLFloaterCustomize::initWearablePanels()
2338 panel->addTextureDropTarget(TEX_HEAD_TATTOO, "Head Tattoo", 2335 panel->addTextureDropTarget(TEX_HEAD_TATTOO, "Head Tattoo",
2339 LLUUID::null, 2336 LLUUID::null,
2340 TRUE); 2337 TRUE);
2338 panel->addColorSwatch(TEX_LOWER_TATTOO, "Color/Tint");
2341 } 2339 }
2342} 2340}
2343 2341
diff --git a/linden/indra/newview/llfloaterdirectory.cpp b/linden/indra/newview/llfloaterdirectory.cpp
index 8018c31..7c8ddf1 100644
--- a/linden/indra/newview/llfloaterdirectory.cpp
+++ b/linden/indra/newview/llfloaterdirectory.cpp
@@ -466,7 +466,9 @@ void LLFloaterDirectory::setVisible(BOOL visible)
466 466
467void LLFloaterDirectory::onClose(bool app_quitting) 467void LLFloaterDirectory::onClose(bool app_quitting)
468{ 468{
469 setVisible(FALSE); 469 LLFloater::onClose(app_quitting);
470
471 //setVisible(FALSE); //meaning you hide 3 web browsers - one SLPlugin each
470} 472}
471 473
472// static 474// static
diff --git a/linden/indra/newview/llfloaterdisplayname.cpp b/linden/indra/newview/llfloaterdisplayname.cpp
new file mode 100644
index 0000000..31ceda9
--- /dev/null
+++ b/linden/indra/newview/llfloaterdisplayname.cpp
@@ -0,0 +1,224 @@
1/**
2 * @file llfloaterdisplayname.cpp
3 * @author Leyla Farazha
4 * @brief Implementation of the LLFloaterDisplayName class.
5 *
6 * $LicenseInfo:firstyear=2002&license=viewerlgpl$
7 * Second Life Viewer Source Code
8 * Copyright (C) 2010, Linden Research, Inc.
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation;
13 * version 2.1 of the License only.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 *
24 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
25 * $/LicenseInfo$
26 */
27
28
29#include "llviewerprecompiledheaders.h"
30#include "llfloater.h"
31
32#include "llnotifications.h"
33#include "llviewerdisplayname.h"
34
35#include "llnotify.h"
36#include "llfloaterdisplayname.h"
37#include "llavatarnamecache.h"
38#include "lluictrlfactory.h"
39#include "llviewercontrol.h"
40
41#include "llagent.h"
42
43
44LLFloaterDisplayName* LLFloaterDisplayName::sInstance = NULL;
45
46LLFloaterDisplayName::LLFloaterDisplayName() : LLFloater(std::string("Display Name"))
47{
48 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_display_name.xml");
49 LLFloaterDisplayName::sInstance = this;
50}
51
52LLFloaterDisplayName::~LLFloaterDisplayName()
53{
54 LLFloaterDisplayName::sInstance = NULL;
55}
56
57void LLFloaterDisplayName::show()
58{
59 if (!LLFloaterDisplayName::sInstance)
60 {
61 LLFloaterDisplayName::sInstance = new LLFloaterDisplayName();
62 }
63 LLFloaterDisplayName::sInstance->open();
64}
65
66void LLFloaterDisplayName::onOpen()
67{
68 getChild<LLUICtrl>("display_name_editor")->clear();
69 getChild<LLUICtrl>("display_name_confirm")->clear();
70
71 LLAvatarName av_name;
72 LLAvatarNameCache::get(gAgent.getID(), &av_name);
73
74 F64 now_secs = LLDate::now().secondsSinceEpoch();
75
76 if (now_secs < av_name.mNextUpdate)
77 {
78 // ...can't update until some time in the future
79 F64 next_update_local_secs = av_name.mNextUpdate;
80 std::string next_update_string;
81#ifdef LOCALIZED_TIME
82 timeToFormattedString((time_t)next_update_local_secs,
83 gSavedSettings.getString("LongDateFormat"),
84 next_update_string);
85#else
86 LLDate next_update_local(next_update_local_secs);
87 next_update_string = next_update_local.asString();
88#endif
89 getChild<LLUICtrl>("lockout_text")->setTextArg("[TIME]", next_update_string);
90 getChild<LLUICtrl>("lockout_text")->setVisible(true);
91 getChild<LLUICtrl>("now_ok_text")->setVisible(false);
92 getChild<LLUICtrl>("save_btn")->setEnabled(false);
93 getChild<LLUICtrl>("display_name_editor")->setEnabled(false);
94 getChild<LLUICtrl>("display_name_confirm")->setEnabled(false);
95 getChild<LLUICtrl>("cancel_btn")->setFocus(TRUE);
96
97 }
98 else
99 {
100 getChild<LLUICtrl>("lockout_text")->setVisible(false);
101 getChild<LLUICtrl>("now_ok_text")->setVisible(true);
102 getChild<LLUICtrl>("save_btn")->setEnabled(true);
103 getChild<LLUICtrl>("display_name_editor")->setEnabled(true);
104 getChild<LLUICtrl>("display_name_confirm")->setEnabled(true);
105
106 }
107}
108
109BOOL LLFloaterDisplayName::postBuild()
110{
111 childSetAction("reset_btn", onReset, this);
112 childSetAction("cancel_btn", onCancel, this);
113 childSetAction("save_btn", onSave, this);
114
115 center();
116
117 return TRUE;
118}
119
120void LLFloaterDisplayName::onCacheSetName(bool success,
121 const std::string& reason,
122 const LLSD& content)
123{
124 if (success)
125 {
126 // Inform the user that the change took place, but will take a while
127 // to percolate.
128 LLSD args;
129 args["DISPLAY_NAME"] = content["display_name"];
130 LLNotifications::instance().add("SetDisplayNameSuccess", args);
131
132 // Re-fetch my name, as it may have been sanitized by the service
133 //LLAvatarNameCache::get(getAvatarId(),
134 // boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2));
135 return;
136 }
137
138 // Request failed, notify the user
139 std::string error_tag = content["error_tag"].asString();
140 llinfos << "set name failure error_tag " << error_tag << llendl;
141
142 // We might have a localized string for this message
143 // error_args will usually be empty from the server.
144 if (!error_tag.empty()
145 && LLNotifications::getInstance()->templateExists(error_tag))
146 {
147 LLNotifications::instance().add(error_tag);
148 return;
149 }
150
151 // The server error might have a localized message for us
152 std::string lang_code = LLUI::getLanguage();
153 LLSD error_desc = content["error_description"];
154 if (error_desc.has( lang_code ))
155 {
156 LLSD args;
157 args["MESSAGE"] = error_desc[lang_code].asString();
158 LLNotifications::instance().add("GenericAlert", args);
159 return;
160 }
161
162 // No specific error, throw a generic one
163 LLNotifications::instance().add("SetDisplayNameFailedGeneric");
164}
165
166void LLFloaterDisplayName::onCancel(void* data)
167{
168 LLFloaterDisplayName* self = (LLFloaterDisplayName*)data;
169 self->setVisible(false);
170}
171
172void LLFloaterDisplayName::onReset(void* data)
173{
174 LLFloaterDisplayName* self = (LLFloaterDisplayName*)data;
175
176 if (LLAvatarNameCache::useDisplayNames())
177 {
178 LLViewerDisplayName::set("",
179 boost::bind(&LLFloaterDisplayName::onCacheSetName, self, _1, _2, _3));
180 }
181 else
182 {
183 LLNotifications::instance().add("SetDisplayNameFailedGeneric");
184 }
185
186 self->setVisible(false);
187}
188
189
190void LLFloaterDisplayName::onSave(void* data)
191{
192 LLFloaterDisplayName* self = (LLFloaterDisplayName*)data;
193
194 std::string display_name_utf8 = self->getChild<LLUICtrl>("display_name_editor")->getValue().asString();
195 std::string display_name_confirm = self->getChild<LLUICtrl>("display_name_confirm")->getValue().asString();
196
197 if (display_name_utf8.compare(display_name_confirm))
198 {
199 LLNotifications::instance().add("SetDisplayNameMismatch");
200 return;
201 }
202
203 const U32 DISPLAY_NAME_MAX_LENGTH = 31; // characters, not bytes
204 LLWString display_name_wstr = utf8string_to_wstring(display_name_utf8);
205 if (display_name_wstr.size() > DISPLAY_NAME_MAX_LENGTH)
206 {
207 LLSD args;
208 args["LENGTH"] = llformat("%d", DISPLAY_NAME_MAX_LENGTH);
209 LLNotifications::instance().add("SetDisplayNameFailedLength", args);
210 return;
211 }
212
213 if (LLAvatarNameCache::useDisplayNames())
214 {
215 LLViewerDisplayName::set(display_name_utf8,
216 boost::bind(&LLFloaterDisplayName::onCacheSetName, self, _1, _2, _3));
217 }
218 else
219 {
220 LLNotifications::instance().add("SetDisplayNameFailedGeneric");
221 }
222
223 self->setVisible(false);
224}
diff --git a/linden/indra/newview/llfloaterdisplayname.h b/linden/indra/newview/llfloaterdisplayname.h
new file mode 100644
index 0000000..4b25670
--- /dev/null
+++ b/linden/indra/newview/llfloaterdisplayname.h
@@ -0,0 +1,48 @@
1/**
2 * @file llfloaterdisplayname.h
3 *
4 * $LicenseInfo:firstyear=2009&license=viewerlgpl$
5 * Second Life Viewer Source Code
6 * Copyright (C) 2010, Linden Research, Inc.
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation;
11 * version 2.1 of the License only.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 *
22 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
23 * $/LicenseInfo$
24 */
25
26#ifndef LLFLOATERDISPLAYNAME_H
27#define LLFLOATERDISPLAYNAME_H
28
29
30class LLFloaterDisplayName : public LLFloater
31{
32public:
33 LLFloaterDisplayName();
34 virtual ~LLFloaterDisplayName();
35 /* virtual */ BOOL postBuild();
36 /* virtual */ void onOpen();
37 static void show();
38 static void onSave(void* data);
39 static void onReset(void* data);
40 static void onCancel(void* data);
41
42private:
43 static LLFloaterDisplayName* sInstance;
44 void onCacheSetName(bool success, const std::string& reason, const LLSD& content);
45};
46
47
48#endif
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp
index c33deae..84ba81e 100644
--- a/linden/indra/newview/llfloaterfriends.cpp
+++ b/linden/indra/newview/llfloaterfriends.cpp
@@ -39,6 +39,7 @@
39 39
40#include <sstream> 40#include <sstream>
41 41
42#include "llavatarnamecache.h"
42#include "lldir.h" 43#include "lldir.h"
43 44
44#include "llagent.h" 45#include "llagent.h"
@@ -254,6 +255,24 @@ BOOL LLPanelFriends::addFriend(const LLUUID& agent_id)
254 255
255 std::string fullname; 256 std::string fullname;
256 BOOL have_name = gCacheName->getFullName(agent_id, fullname); 257 BOOL have_name = gCacheName->getFullName(agent_id, fullname);
258 if (have_name)
259 {
260 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
261 {
262 LLAvatarName avatar_name;
263 if (LLAvatarNameCache::get(agent_id, &avatar_name))
264 {
265 if (LLAvatarNameCache::useDisplayNames() == 1)
266 {
267 fullname = avatar_name.mDisplayName;
268 }
269 else
270 {
271 fullname = avatar_name.getNames();
272 }
273 }
274 }
275 }
257 276
258 LLSD element; 277 LLSD element;
259 element["id"] = agent_id; 278 element["id"] = agent_id;
@@ -332,6 +351,24 @@ BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationsh
332 351
333 std::string fullname; 352 std::string fullname;
334 BOOL have_name = gCacheName->getFullName(agent_id, fullname); 353 BOOL have_name = gCacheName->getFullName(agent_id, fullname);
354 if (have_name)
355 {
356 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
357 {
358 LLAvatarName avatar_name;
359 if (LLAvatarNameCache::get(agent_id, &avatar_name))
360 {
361 if (LLAvatarNameCache::useDisplayNames() == 1)
362 {
363 fullname = avatar_name.mDisplayName;
364 }
365 else
366 {
367 fullname = avatar_name.getNames();
368 }
369 }
370 }
371 }
335 372
336 // Name of the status icon to use 373 // Name of the status icon to use
337 std::string statusIcon; 374 std::string statusIcon;
@@ -790,6 +827,25 @@ void LLPanelFriends::onClickRemove(void* user_data)
790 std::string first, last; 827 std::string first, last;
791 if(gCacheName->getName(agent_id, first, last)) 828 if(gCacheName->getName(agent_id, first, last))
792 { 829 {
830 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
831 {
832 LLAvatarName avatar_name;
833 if (LLAvatarNameCache::get(agent_id, &avatar_name))
834 {
835 // Always show "Display Name [Legacy Name]" for security reasons
836 first = avatar_name.getNames();
837 size_t i = first.find(" ");
838 if (i != std::string::npos)
839 {
840 last = first.substr(i + 1);
841 first = first.substr(0, i);
842 }
843 else
844 {
845 last = "";
846 }
847 }
848 }
793 args["FIRST_NAME"] = first; 849 args["FIRST_NAME"] = first;
794 args["LAST_NAME"] = last; 850 args["LAST_NAME"] = last;
795 } 851 }
@@ -854,6 +910,25 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command
854 std::string first, last; 910 std::string first, last;
855 if(gCacheName->getName(agent_id, first, last)) 911 if(gCacheName->getName(agent_id, first, last))
856 { 912 {
913 if (LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
914 {
915 LLAvatarName avatar_name;
916 if (LLAvatarNameCache::get(agent_id, &avatar_name))
917 {
918 // Always show "Display Name [Legacy Name]" for security reasons
919 first = avatar_name.getNames();
920 size_t i = first.find(" ");
921 if (i != std::string::npos)
922 {
923 last = first.substr(i + 1);
924 first = first.substr(0, i);
925 }
926 else
927 {
928 last = "";
929 }
930 }
931 }
857 args["FIRST_NAME"] = first; 932 args["FIRST_NAME"] = first;
858 args["LAST_NAME"] = last; 933 args["LAST_NAME"] = last;
859 } 934 }
diff --git a/linden/indra/newview/llfloaternewim.cpp b/linden/indra/newview/llfloaternewim.cpp
index 48920c1..272cb53 100644
--- a/linden/indra/newview/llfloaternewim.cpp
+++ b/linden/indra/newview/llfloaternewim.cpp
@@ -38,10 +38,9 @@
38#include "lltabcontainer.h" 38#include "lltabcontainer.h"
39#include "llimview.h" 39#include "llimview.h"
40 40
41S32 COL_1_WIDTH = 200; 41S32 COL_1_WIDTH = 400;
42 42
43static std::string sOnlineDescriptor = "*"; 43static std::string sOnlineDescriptor = "*";
44static std::string sNameFormat = "[FIRST] [LAST]";
45 44
46LLFloaterNewIM::LLFloaterNewIM() 45LLFloaterNewIM::LLFloaterNewIM()
47{ 46{
@@ -69,7 +68,6 @@ BOOL LLFloaterNewIM::postBuild()
69 llwarns << "LLUICtrlFactory::getNameListByName() returned NULL for 'user_list'" << llendl; 68 llwarns << "LLUICtrlFactory::getNameListByName() returned NULL for 'user_list'" << llendl;
70 } 69 }
71 sOnlineDescriptor = getString("online_descriptor"); 70 sOnlineDescriptor = getString("online_descriptor");
72 sNameFormat = getString("name_format");
73 setDefaultBtn("start_btn"); 71 setDefaultBtn("start_btn");
74 return TRUE; 72 return TRUE;
75 } 73 }
@@ -135,11 +133,8 @@ void LLFloaterNewIM::addGroup(const LLUUID& uuid, void* data, BOOL bold, BOOL on
135 133
136void LLFloaterNewIM::addAgent(const LLUUID& uuid, void* data, BOOL online) 134void LLFloaterNewIM::addAgent(const LLUUID& uuid, void* data, BOOL online)
137{ 135{
138 std::string first, last; 136 std::string fullname;
139 gCacheName->getName(uuid, first, last); 137 gCacheName->getFullName(uuid, fullname);
140 LLUIString fullname = sNameFormat;
141 fullname.setArg("[FIRST]", first);
142 fullname.setArg("[LAST]", last);
143 138
144 LLSD row; 139 LLSD row;
145 row["id"] = uuid; 140 row["id"] = uuid;
@@ -184,13 +179,20 @@ void LLFloaterNewIM::onStart(void* userdata)
184 const LLScrollListCell* cell = item->getColumn(0); 179 const LLScrollListCell* cell = item->getColumn(0);
185 std::string name(cell->getValue()); 180 std::string name(cell->getValue());
186 181
187 // *NOTE: Do a live detrmination of what type of session it 182 // *NOTE: Do a live determination of what type of session it
188 // should be. If we restrict the new im panel to online users, 183 // should be. If we restrict the new im panel to online users,
189 // then we can remove some of this code. 184 // then we can remove some of this code.
190 EInstantMessage type; 185 EInstantMessage type;
191 EInstantMessage* t = (EInstantMessage*)item->getUserdata(); 186 EInstantMessage* t = (EInstantMessage*)item->getUserdata();
192 if(t) type = (*t); 187 if(t) type = (*t);
193 else type = LLIMMgr::defaultIMTypeForAgent(item->getUUID()); 188 else type = LLIMMgr::defaultIMTypeForAgent(item->getUUID());
189 if (type != IM_SESSION_GROUP_START)
190 {
191 // Needed to avoid catching a display name, which would
192 // make us use a wrong IM log file...
193 gCacheName->getFullName(item->getUUID(), name);
194 }
195
194 gIMMgr->addSession(name, type, item->getUUID()); 196 gIMMgr->addSession(name, type, item->getUUID());
195 197
196 make_ui_sound("UISndStartIM"); 198 make_ui_sound("UISndStartIM");
diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp
index 0cb35e3..2aed361 100644
--- a/linden/indra/newview/llfloatertools.cpp
+++ b/linden/indra/newview/llfloatertools.cpp
@@ -1259,7 +1259,9 @@ void LLFloaterTools::onClickLink(void* data)
1259 } 1259 }
1260 1260
1261 S32 max_linked_prims = 0; 1261 S32 max_linked_prims = 0;
1262 if(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()->usePhysics()) 1262
1263 LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
1264 if(object && object->usePhysics())
1263 { 1265 {
1264 //Physical - use phys prim limit 1266 //Physical - use phys prim limit
1265 max_linked_prims = gHippoLimits->getMaxPhysLinkedPrims(); 1267 max_linked_prims = gHippoLimits->getMaxPhysLinkedPrims();
diff --git a/linden/indra/newview/llhoverview.cpp b/linden/indra/newview/llhoverview.cpp
index 10d27cd..4f248e4 100644
--- a/linden/indra/newview/llhoverview.cpp
+++ b/linden/indra/newview/llhoverview.cpp
@@ -253,10 +253,29 @@ void LLHoverView::updateText()
253 LLNameValue* lastname = hit_object->getNVPair("LastName"); 253 LLNameValue* lastname = hit_object->getNVPair("LastName");
254 if (firstname && lastname) 254 if (firstname && lastname)
255 { 255 {
256 std::string complete_name = firstname->getString();
257 complete_name += " ";
258 complete_name += lastname->getString();
259
260 if (LLAvatarNameCache::useDisplayNames())
261 {
262 LLAvatarName avatar_name;
263 if (LLAvatarNameCache::get(hit_object->getID(), &avatar_name))
264 {
265 if (LLAvatarNameCache::useDisplayNames() == 1)
266 {
267 complete_name = avatar_name.mDisplayName;
268 }
269 else
270 {
271 complete_name = avatar_name.getNames();
272 }
273 }
274 }
256// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) 275// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
257 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) 276 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
258 { 277 {
259 line = RlvStrings::getAnonym(line.append(firstname->getString()).append(1, ' ').append(lastname->getString())); 278 line = RlvStrings::getAnonym(complete_name);
260 } 279 }
261 else 280 else
262 { 281 {
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp
index 41727f2..a3e917f 100644
--- a/linden/indra/newview/llimpanel.cpp
+++ b/linden/indra/newview/llimpanel.cpp
@@ -106,6 +106,8 @@ LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = NULL;
106 106
107BOOL LLVoiceChannel::sSuspended = FALSE; 107BOOL LLVoiceChannel::sSuspended = FALSE;
108 108
109std::set<LLFloaterIMPanel*> LLFloaterIMPanel::sFloaterIMPanels;
110
109void session_starter_helper( 111void session_starter_helper(
110 const LLUUID& temp_session_id, 112 const LLUUID& temp_session_id,
111 const LLUUID& other_participant_id, 113 const LLUUID& other_participant_id,
@@ -1108,6 +1110,7 @@ LLFloaterIMPanel::LLFloaterIMPanel(
1108 mFirstKeystrokeTimer(), 1110 mFirstKeystrokeTimer(),
1109 mLastKeystrokeTimer() 1111 mLastKeystrokeTimer()
1110{ 1112{
1113 sFloaterIMPanels.insert(this);
1111 init(session_label); 1114 init(session_label);
1112} 1115}
1113 1116
@@ -1149,6 +1152,7 @@ LLFloaterIMPanel::LLFloaterIMPanel(
1149void LLFloaterIMPanel::init(const std::string& session_label) 1152void LLFloaterIMPanel::init(const std::string& session_label)
1150{ 1153{
1151 mSessionLabel = session_label; 1154 mSessionLabel = session_label;
1155 mProfileButtonEnabled = FALSE;
1152 1156
1153 std::string xml_filename; 1157 std::string xml_filename;
1154 switch(mDialog) 1158 switch(mDialog)
@@ -1211,6 +1215,10 @@ void LLFloaterIMPanel::init(const std::string& session_label)
1211 FALSE); 1215 FALSE);
1212 1216
1213 setTitle(mSessionLabel); 1217 setTitle(mSessionLabel);
1218 if (mProfileButtonEnabled)
1219 {
1220 lookupName();
1221 }
1214 1222
1215 mInputEditor->setMaxTextLength(DB_IM_MSG_STR_LEN); 1223 mInputEditor->setMaxTextLength(DB_IM_MSG_STR_LEN);
1216 // enable line history support for instant message bar 1224 // enable line history support for instant message bar
@@ -1253,9 +1261,32 @@ void LLFloaterIMPanel::init(const std::string& session_label)
1253 } 1261 }
1254} 1262}
1255 1263
1264void LLFloaterIMPanel::lookupName()
1265{
1266 LLAvatarNameCache::get(mOtherParticipantUUID, boost::bind(&LLFloaterIMPanel::onAvatarNameLookup, _1, _2, this));
1267}
1268
1269//static
1270void LLFloaterIMPanel::onAvatarNameLookup(const LLUUID& id, const LLAvatarName& avatar_name, void* user_data)
1271{
1272 LLFloaterIMPanel* self = (LLFloaterIMPanel*)user_data;
1273
1274 if (self && sFloaterIMPanels.count(self) != 0)
1275 {
1276 // Always show "Display Name [Legacy Name]" for security reasons
1277 std::string title = avatar_name.getNames();
1278 if (!title.empty())
1279 {
1280 self->setTitle(title);
1281 }
1282 }
1283}
1284
1256 1285
1257LLFloaterIMPanel::~LLFloaterIMPanel() 1286LLFloaterIMPanel::~LLFloaterIMPanel()
1258{ 1287{
1288 sFloaterIMPanels.erase(this);
1289
1259 delete mSpeakers; 1290 delete mSpeakers;
1260 mSpeakers = NULL; 1291 mSpeakers = NULL;
1261 1292
@@ -1550,8 +1581,9 @@ BOOL LLFloaterIMPanel::inviteToSession(const LLDynamicArray<LLUUID>& ids)
1550 return TRUE; 1581 return TRUE;
1551} 1582}
1552 1583
1553void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4& color, bool log_to_file, const LLUUID& source, const std::string& name) 1584void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4& color, bool log_to_file, const LLUUID& source, const std::string& const_name)
1554{ 1585{
1586 std::string name = const_name;
1555 // start tab flashing when receiving im for background session from user 1587 // start tab flashing when receiving im for background session from user
1556 if (source != LLUUID::null) 1588 if (source != LLUUID::null)
1557 { 1589 {
@@ -1602,6 +1634,21 @@ void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4
1602 } 1634 }
1603 else 1635 else
1604 { 1636 {
1637 if (LLAvatarNameCache::useDisplayNames() && source != LLUUID::null)
1638 {
1639 LLAvatarName avatar_name;
1640 if (LLAvatarNameCache::get(source, &avatar_name))
1641 {
1642 if (LLAvatarNameCache::useDisplayNames() == 1)
1643 {
1644 name = avatar_name.mDisplayName;
1645 }
1646 else
1647 {
1648 name = avatar_name.getNames();
1649 }
1650 }
1651 }
1605 // Convert the name to a hotlink and add to message. 1652 // Convert the name to a hotlink and add to message.
1606 const LLStyleSP &source_style = LLStyleMap::instance().lookupAgent(source); 1653 const LLStyleSP &source_style = LLStyleMap::instance().lookupAgent(source);
1607 mHistoryEditor->appendStyledText(name,false,prepend_newline,source_style); 1654 mHistoryEditor->appendStyledText(name,false,prepend_newline,source_style);
@@ -1619,7 +1666,7 @@ void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4
1619 else 1666 else
1620 histstr = name + utf8msg; 1667 histstr = name + utf8msg;
1621 1668
1622 LLLogChat::saveHistory(getTitle(),histstr); 1669 LLLogChat::saveHistory(mSessionLabel, histstr);
1623 } 1670 }
1624 1671
1625 if (!isInVisibleChain()) 1672 if (!isInVisibleChain())
@@ -2168,6 +2215,21 @@ void LLFloaterIMPanel::sendMsg()
2168 { 2215 {
2169 std::string history_echo; 2216 std::string history_echo;
2170 gAgent.buildFullname(history_echo); 2217 gAgent.buildFullname(history_echo);
2218 if (LLAvatarNameCache::useDisplayNames())
2219 {
2220 LLAvatarName avatar_name;
2221 if (LLAvatarNameCache::get(gAgent.getID(), &avatar_name))
2222 {
2223 if (LLAvatarNameCache::useDisplayNames() == 1)
2224 {
2225 history_echo = avatar_name.mDisplayName;
2226 }
2227 else
2228 {
2229 history_echo = avatar_name.getNames();
2230 }
2231 }
2232 }
2171 2233
2172 // Look for IRC-style emotes here. 2234 // Look for IRC-style emotes here.
2173 std::string prefix = utf8_text.substr(0, 4); 2235 std::string prefix = utf8_text.substr(0, 4);
diff --git a/linden/indra/newview/llimpanel.h b/linden/indra/newview/llimpanel.h
index ddcbdc7..b5a0165 100644
--- a/linden/indra/newview/llimpanel.h
+++ b/linden/indra/newview/llimpanel.h
@@ -33,6 +33,7 @@
33#ifndef LL_IMPANEL_H 33#ifndef LL_IMPANEL_H
34#define LL_IMPANEL_H 34#define LL_IMPANEL_H
35 35
36#include "llavatarnamecache.h"
36#include "llfloater.h" 37#include "llfloater.h"
37#include "lllogchat.h" 38#include "lllogchat.h"
38#include "lluuid.h" 39#include "lluuid.h"
@@ -194,6 +195,9 @@ public:
194 EInstantMessage dialog); 195 EInstantMessage dialog);
195 virtual ~LLFloaterIMPanel(); 196 virtual ~LLFloaterIMPanel();
196 197
198 void lookupName();
199 static void onAvatarNameLookup(const LLUUID& id, const LLAvatarName& avatar_name, void* user_data);
200
197 /*virtual*/ BOOL postBuild(); 201 /*virtual*/ BOOL postBuild();
198 202
199 // Check typing timeout timer. 203 // Check typing timeout timer.
@@ -365,6 +369,8 @@ private:
365 typedef std::map<LLUUID, LLStyleSP> styleMap; 369 typedef std::map<LLUUID, LLStyleSP> styleMap;
366 static styleMap mStyleMap; 370 static styleMap mStyleMap;
367 371
372 static std::set<LLFloaterIMPanel*> sFloaterIMPanels;
373
368 typedef enum e_im_format 374 typedef enum e_im_format
369 { 375 {
370 IM_PANEL_PLAIN, 376 IM_PANEL_PLAIN,
diff --git a/linden/indra/newview/llnamelistctrl.cpp b/linden/indra/newview/llnamelistctrl.cpp
index e445df5..e30c129 100644
--- a/linden/indra/newview/llnamelistctrl.cpp
+++ b/linden/indra/newview/llnamelistctrl.cpp
@@ -39,6 +39,7 @@
39#include "llcachename.h" 39#include "llcachename.h"
40#include "llagent.h" 40#include "llagent.h"
41#include "llinventory.h" 41#include "llinventory.h"
42#include "llviewercontrol.h"
42 43
43static LLRegisterWidget<LLNameListCtrl> r("name_list"); 44static LLRegisterWidget<LLNameListCtrl> r("name_list");
44 45
@@ -56,7 +57,8 @@ LLNameListCtrl::LLNameListCtrl(const std::string& name,
56: LLScrollListCtrl(name, rect, cb, userdata, allow_multiple_selection, 57: LLScrollListCtrl(name, rect, cb, userdata, allow_multiple_selection,
57 draw_border), 58 draw_border),
58 mNameColumnIndex(name_column_index), 59 mNameColumnIndex(name_column_index),
59 mAllowCallingCardDrop(FALSE) 60 mAllowCallingCardDrop(FALSE),
61 mUseDisplayNames(FALSE)
60{ 62{
61 setToolTip(tooltip); 63 setToolTip(tooltip);
62 LLNameListCtrl::sInstances.insert(this); 64 LLNameListCtrl::sInstances.insert(this);
@@ -77,7 +79,7 @@ BOOL LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
77 //llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl; 79 //llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl;
78 80
79 std::string fullname; 81 std::string fullname;
80 BOOL result = gCacheName->getFullName(agent_id, fullname); 82 BOOL result = getResidentName(agent_id, fullname);
81 83
82 fullname.append(suffix); 84 fullname.append(suffix);
83 85
@@ -164,7 +166,7 @@ BOOL LLNameListCtrl::addNameItem(LLScrollListItem* item, EAddPosition pos)
164 //llinfos << "LLNameListCtrl::addNameItem " << item->getUUID() << llendl; 166 //llinfos << "LLNameListCtrl::addNameItem " << item->getUUID() << llendl;
165 167
166 std::string fullname; 168 std::string fullname;
167 BOOL result = gCacheName->getFullName(item->getUUID(), fullname); 169 BOOL result = getResidentName(item->getUUID(), fullname);
168 170
169 LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex); 171 LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex);
170 ((LLScrollListText*)cell)->setText( fullname ); 172 ((LLScrollListText*)cell)->setText( fullname );
@@ -199,7 +201,7 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& value, EAddPosition pos
199 else // normal resident 201 else // normal resident
200 { 202 {
201 std::string name; 203 std::string name;
202 if (gCacheName->getFullName(item->getUUID(), name)) 204 if (getResidentName(item->getUUID(), name))
203 { 205 {
204 fullname = name; 206 fullname = name;
205 } 207 }
@@ -346,6 +348,12 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
346 name_list->setAllowCallingCardDrop(allow_calling_card_drop); 348 name_list->setAllowCallingCardDrop(allow_calling_card_drop);
347 } 349 }
348 350
351 BOOL use_display_names;
352 if (node->getAttributeBOOL("use_display_names", use_display_names))
353 {
354 name_list->setUseDisplayNames(use_display_names);
355 }
356
349 name_list->setScrollListParameters(node); 357 name_list->setScrollListParameters(node);
350 358
351 name_list->initFromXML(node, parent); 359 name_list->initFromXML(node, parent);
@@ -456,5 +464,31 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
456 return name_list; 464 return name_list;
457} 465}
458 466
459 467bool LLNameListCtrl::getResidentName(const LLUUID& agent_id, std::string& fullname)
460 468{
469 std::string name;
470 if (gCacheName->getFullName(agent_id, name))
471 {
472 fullname = name;
473 if (mUseDisplayNames && LLAvatarNameCache::useDisplayNames() && !gSavedSettings.getBOOL("LegacyNamesForFriends"))
474 {
475 LLAvatarName avatar_name;
476 if (LLAvatarNameCache::get(agent_id, &avatar_name))
477 {
478 if (LLAvatarNameCache::useDisplayNames() == 1)
479 {
480 fullname = avatar_name.mDisplayName;
481 }
482 else
483 {
484 fullname = avatar_name.getNames();
485 }
486 }
487 }
488 return true;
489 }
490 else
491 {
492 return false;
493 }
494}
diff --git a/linden/indra/newview/llnamelistctrl.h b/linden/indra/newview/llnamelistctrl.h
index beb4ede..d6cf578 100644
--- a/linden/indra/newview/llnamelistctrl.h
+++ b/linden/indra/newview/llnamelistctrl.h
@@ -84,7 +84,12 @@ public:
84 84
85 void setAllowCallingCardDrop(BOOL b) { mAllowCallingCardDrop = b; } 85 void setAllowCallingCardDrop(BOOL b) { mAllowCallingCardDrop = b; }
86 86
87 void setUseDisplayNames(BOOL b) { mUseDisplayNames = b; }
88
87private: 89private:
90 bool getResidentName(const LLUUID& agent_id, std::string& fullname);
91 BOOL mUseDisplayNames;
92
88 static std::set<LLNameListCtrl*> sInstances; 93 static std::set<LLNameListCtrl*> sInstances;
89 S32 mNameColumnIndex; 94 S32 mNameColumnIndex;
90 BOOL mAllowCallingCardDrop; 95 BOOL mAllowCallingCardDrop;
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp
index b9dc482..06257f0 100644
--- a/linden/indra/newview/llnetmap.cpp
+++ b/linden/indra/newview/llnetmap.cpp
@@ -36,6 +36,7 @@
36#include "llnetmap.h" 36#include "llnetmap.h"
37 37
38#include "indra_constants.h" 38#include "indra_constants.h"
39#include "llavatarnamecache.h"
39#include "llui.h" 40#include "llui.h"
40#include "llmath.h" // clampf() 41#include "llmath.h" // clampf()
41#include "llfocusmgr.h" 42#include "llfocusmgr.h"
@@ -640,7 +641,29 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rec
640 { 641 {
641 msg.assign(""); 642 msg.assign("");
642 std::string fullname; 643 std::string fullname;
643 if(mClosestAgentToCursor.notNull() && gCacheName->getFullName(mClosestAgentToCursor, fullname)) 644 BOOL result = FALSE;
645 if (!LLAvatarNameCache::useDisplayNames())
646 {
647 result = gCacheName->getFullName(mClosestAgentToCursor, fullname);
648 }
649 else
650 {
651 LLAvatarName avatar_name;
652 if (LLAvatarNameCache::get(mClosestAgentToCursor, &avatar_name))
653 {
654 result = TRUE;
655 if (LLAvatarNameCache::useDisplayNames() == 1)
656 {
657 fullname = avatar_name.mDisplayName;
658 }
659 else
660 {
661 fullname = avatar_name.getNames(true);
662 }
663 }
664 }
665
666 if(mClosestAgentToCursor.notNull() && result)
644 { 667 {
645// msg.append(fullname); 668// msg.append(fullname);
646// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b 669// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.0b
diff --git a/linden/indra/newview/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp
index ed406e8..4e1d03e 100644
--- a/linden/indra/newview/lloverlaybar.cpp
+++ b/linden/indra/newview/lloverlaybar.cpp
@@ -38,7 +38,7 @@
38#include "lloverlaybar.h" 38#include "lloverlaybar.h"
39 39
40#include "aoremotectrl.h" 40#include "aoremotectrl.h"
41#include "llaudioengine.h" 41#include "kokuastreamingaudio.h"
42#include "llrender.h" 42#include "llrender.h"
43#include "llagent.h" 43#include "llagent.h"
44#include "llbutton.h" 44#include "llbutton.h"
@@ -438,17 +438,16 @@ void LLOverlayBar::toggleMusicPlay(void*)
438 if (gOverlayBar->mMusicState != PLAYING) 438 if (gOverlayBar->mMusicState != PLAYING)
439 { 439 {
440 gOverlayBar->mMusicState = PLAYING; // desired state 440 gOverlayBar->mMusicState = PLAYING; // desired state
441 if (gAudiop) 441 if (gAudioStream)
442 { 442 {
443 LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); 443 LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
444 if ( parcel ) 444 if ( parcel )
445 { 445 {
446 // this doesn't work properly when crossing parcel boundaries - even when the 446 // this doesn't work properly when crossing parcel boundaries - even when the
447 // stream is stopped, it doesn't return the right thing - commenting out for now. 447 // stream is stopped, it doesn't return the right thing - commenting out for now.
448 // if ( gAudiop->isInternetStreamPlaying() == 0 ) 448 // if ( gAudioStream->isInternetStreamPlaying() == 0 )
449 { 449 {
450 gAudiop->startInternetStream(parcel->getMusicURL()); 450 gAudioStream->startInternetStream(parcel->getMusicURL());
451//awfixme sTitleObserver.init(parcel->getMusicURL());
452 } 451 }
453 } 452 }
454 } 453 }
@@ -456,9 +455,9 @@ void LLOverlayBar::toggleMusicPlay(void*)
456 else 455 else
457 { 456 {
458 gOverlayBar->mMusicState = STOPPED; // desired state 457 gOverlayBar->mMusicState = STOPPED; // desired state
459 if (gAudiop) 458 if (gAudioStream)
460 { 459 {
461 gAudiop->stopInternetStream(); 460 gAudioStream->stopInternetStream();
462 } 461 }
463 } 462 }
464} 463}
diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp
index e47ae2a..6b3be29 100644
--- a/linden/indra/newview/llpanelavatar.cpp
+++ b/linden/indra/newview/llpanelavatar.cpp
@@ -416,6 +416,7 @@ BOOL LLPanelAvatarWeb::postBuild(void)
416 childSetControlName("auto_load","AutoLoadWebProfiles"); 416 childSetControlName("auto_load","AutoLoadWebProfiles");
417 417
418 mWebBrowser = getChild<LLMediaCtrl>("profile_html"); 418 mWebBrowser = getChild<LLMediaCtrl>("profile_html");
419
419 mWebBrowser->addObserver(this); 420 mWebBrowser->addObserver(this);
420 421
421 // links open in internally 422 // links open in internally
@@ -490,7 +491,17 @@ void LLPanelAvatarWeb::refresh()
490 mNavigateTo = ""; 491 mNavigateTo = "";
491 } 492 }
492} 493}
494void LLPanelAvatarWeb::onVisibilityChange(BOOL new_visibility)
495{
496 LLPluginClassMedia::EPriority new_priority;
493 497
498 if (new_visibility)
499 new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
500 else
501 new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
502
503 mWebBrowser->getMediaPlugin()->setPriority(new_priority);
504}
494 505
495void LLPanelAvatarWeb::enableControls(BOOL self) 506void LLPanelAvatarWeb::enableControls(BOOL self)
496{ 507{
@@ -1346,7 +1357,33 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name
1346 { 1357 {
1347 name_edit->setText(name); 1358 name_edit->setText(name);
1348 } 1359 }
1360 childSetVisible("name", TRUE);
1361 }
1362 LLNameEditor* complete_name_edit = getChild<LLNameEditor>("complete_name");
1363 if (complete_name_edit)
1364 {
1365 if (LLAvatarNameCache::useDisplayNames())
1366 {
1367 LLAvatarName avatar_name;
1368 if (LLAvatarNameCache::get(avatar_id, &avatar_name))
1369 {
1370 // Always show "Display Name [Legacy Name]" for security reasons
1371 complete_name_edit->setText(avatar_name.getNames());
1372 }
1373 else
1374 {
1375 complete_name_edit->setText(name_edit->getText());
1376 LLAvatarNameCache::get(avatar_id, boost::bind(&LLPanelAvatar::completeNameCallback, _1, _2, this));
1377 }
1378 childSetVisible("name", FALSE);
1379 childSetVisible("complete_name", TRUE);
1380 }
1381 else
1382 {
1383 childSetVisible("complete_name", FALSE);
1384 }
1349 } 1385 }
1386
1350// if (avatar_changed) 1387// if (avatar_changed)
1351 { 1388 {
1352 // While we're waiting for data off the network, clear out the 1389 // While we're waiting for data off the network, clear out the
@@ -1469,6 +1506,22 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name
1469 } 1506 }
1470} 1507}
1471 1508
1509void LLPanelAvatar::completeNameCallback(const LLUUID& agent_id,
1510 const LLAvatarName& avatar_name,
1511 void *userdata)
1512{
1513 LLPanelAvatar* self = (LLPanelAvatar*)userdata;
1514 if (!LLAvatarNameCache::useDisplayNames() || agent_id != self->mAvatarID)
1515 {
1516 return;
1517 }
1518 LLLineEditor* complete_name_edit = self->getChild<LLLineEditor>("complete_name");
1519 if (complete_name_edit)
1520 {
1521 // Always show "Display Name [Legacy Name]" for security reasons
1522 complete_name_edit->setText(avatar_name.getNames());
1523 }
1524}
1472 1525
1473void LLPanelAvatar::resetGroupList() 1526void LLPanelAvatar::resetGroupList()
1474{ 1527{
diff --git a/linden/indra/newview/llpanelavatar.h b/linden/indra/newview/llpanelavatar.h
index b687cd8..3a90196 100644
--- a/linden/indra/newview/llpanelavatar.h
+++ b/linden/indra/newview/llpanelavatar.h
@@ -33,6 +33,7 @@
33#ifndef LL_LLPANELAVATAR_H 33#ifndef LL_LLPANELAVATAR_H
34#define LL_LLPANELAVATAR_H 34#define LL_LLPANELAVATAR_H
35 35
36#include "llavatarnamecache.h"
36#include "llpanel.h" 37#include "llpanel.h"
37#include "v3dmath.h" 38#include "v3dmath.h"
38#include "lluuid.h" 39#include "lluuid.h"
@@ -76,7 +77,6 @@ public:
76 /*virtual*/ void draw(); 77 /*virtual*/ void draw();
77 78
78 LLPanelAvatar* getPanelAvatar() const { return mPanelAvatar; } 79 LLPanelAvatar* getPanelAvatar() const { return mPanelAvatar; }
79
80 void setDataRequested(bool requested) { mDataRequested = requested; } 80 void setDataRequested(bool requested) { mDataRequested = requested; }
81 bool isDataRequested() const { return mDataRequested; } 81 bool isDataRequested() const { return mDataRequested; }
82 82
@@ -143,14 +143,15 @@ public:
143 LLPanelAvatarWeb(const std::string& name, const LLRect& rect, LLPanelAvatar* panel_avatar); 143 LLPanelAvatarWeb(const std::string& name, const LLRect& rect, LLPanelAvatar* panel_avatar);
144 /*virtual*/ ~LLPanelAvatarWeb(); 144 /*virtual*/ ~LLPanelAvatarWeb();
145 /*virtual*/ BOOL postBuild(void); 145 /*virtual*/ BOOL postBuild(void);
146
147 /*virtual*/ void refresh(); 146 /*virtual*/ void refresh();
147 /*virtual*/ void onVisibilityChange(BOOL new_visibility);
148 148
149 void enableControls(BOOL own_avatar); 149 void enableControls(BOOL own_avatar);
150 150
151 void setWebURL(std::string url); 151 void setWebURL(std::string url);
152 152
153 void load(std::string url); 153 void load(std::string url);
154
154 static void onURLKeystroke(LLLineEditor* editor, void* data); 155 static void onURLKeystroke(LLLineEditor* editor, void* data);
155 static void onCommitLoad(LLUICtrl* ctrl, void* data); 156 static void onCommitLoad(LLUICtrl* ctrl, void* data);
156 static void onCommitURL(LLUICtrl* ctrl, void* data); 157 static void onCommitURL(LLUICtrl* ctrl, void* data);
@@ -335,6 +336,9 @@ private:
335 static bool finishUnfreeze(const LLSD& notification, const LLSD& response); 336 static bool finishUnfreeze(const LLSD& notification, const LLSD& response);
336 337
337 static void showProfileCallback(S32 option, void *userdata); 338 static void showProfileCallback(S32 option, void *userdata);
339 static void completeNameCallback(const LLUUID& agent_id,
340 const LLAvatarName& avatar_name,
341 void *userdata);
338 342
339 static void* createPanelAvatar(void* data); 343 static void* createPanelAvatar(void* data);
340 static void* createFloaterAvatarInfo(void* data); 344 static void* createFloaterAvatarInfo(void* data);
diff --git a/linden/indra/newview/llpaneldirfind.cpp b/linden/indra/newview/llpaneldirfind.cpp
index 342ffec..719a7a0 100644
--- a/linden/indra/newview/llpaneldirfind.cpp
+++ b/linden/indra/newview/llpaneldirfind.cpp
@@ -62,6 +62,7 @@
62#include "lluictrlfactory.h" 62#include "lluictrlfactory.h"
63#include "llfloaterdirectory.h" 63#include "llfloaterdirectory.h"
64#include "llpaneldirbrowser.h" 64#include "llpaneldirbrowser.h"
65#include "llpluginclassmedia.h"
65 66
66#include <boost/tokenizer.hpp> 67#include <boost/tokenizer.hpp>
67#if LL_WINDOWS 68#if LL_WINDOWS
@@ -196,10 +197,17 @@ void LLPanelDirFind::draw()
196// virtual 197// virtual
197void LLPanelDirFind::onVisibilityChange(BOOL new_visibility) 198void LLPanelDirFind::onVisibilityChange(BOOL new_visibility)
198{ 199{
200 LLPluginClassMedia::EPriority new_priority;
199 if (new_visibility) 201 if (new_visibility)
200 { 202 {
201 mFloaterDirectory->hideAllDetailPanels(); 203 mFloaterDirectory->hideAllDetailPanels();
204 new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
202 } 205 }
206 else
207 new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
208
209 mWebBrowser->getMediaPlugin()->setPriority(new_priority);
210
203 LLPanel::onVisibilityChange(new_visibility); 211 LLPanel::onVisibilityChange(new_visibility);
204} 212}
205 213
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp
index fc6073a..70146ce 100644
--- a/linden/indra/newview/llpanelgeneral.cpp
+++ b/linden/indra/newview/llpanelgeneral.cpp
@@ -98,6 +98,9 @@ BOOL LLPanelGeneral::postBuild()
98 childSetValue("mini_map_notify_chat", gSavedSettings.getBOOL("MiniMapNotifyChatRange")); 98 childSetValue("mini_map_notify_chat", gSavedSettings.getBOOL("MiniMapNotifyChatRange"));
99 childSetValue("mini_map_notify_sim", gSavedSettings.getBOOL("MiniMapNotifySimRange")); 99 childSetValue("mini_map_notify_sim", gSavedSettings.getBOOL("MiniMapNotifySimRange"));
100 100
101// mDisplayNamesUsage = gSavedSettings.getU32("DisplayNamesUsage");
102// mLegacyNamesForFriends = gSavedSettings.getBOOL("LegacyNamesForFriends");
103
101 getChild<LLColorSwatchCtrl>("effect_color_swatch")->set(gSavedSettings.getColor4("EffectColor")); 104 getChild<LLColorSwatchCtrl>("effect_color_swatch")->set(gSavedSettings.getColor4("EffectColor"));
102 105
103 childSetValue("ui_scale_slider", gSavedSettings.getF32("UIScaleFactor")); 106 childSetValue("ui_scale_slider", gSavedSettings.getF32("UIScaleFactor"));
@@ -210,6 +213,8 @@ void LLPanelGeneral::apply()
210 213
211void LLPanelGeneral::cancel() 214void LLPanelGeneral::cancel()
212{ 215{
216// gSavedSettings.setU32("DisplayNamesUsage", mDisplayNamesUsage);
217// gSavedSettings.setBOOL("LegacyNamesForFriends", mDisplayNamesUsage);
213} 218}
214 219
215// static 220// static
diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h
index e85fdf8..56cc3de 100644
--- a/linden/indra/newview/llpanelgeneral.h
+++ b/linden/indra/newview/llpanelgeneral.h
@@ -51,6 +51,9 @@ private:
51 static void onClickResetUISize(void*); 51 static void onClickResetUISize(void*);
52 static void onClickGrid(void*); 52 static void onClickGrid(void*);
53 static void onLocationChanged(LLUICtrl* ctrl, void* data); 53 static void onLocationChanged(LLUICtrl* ctrl, void* data);
54
55 U32 mDisplayNamesUsage;
56 bool mLegacyNamesForFriends;
54}; 57};
55 58
56#endif 59#endif
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index b744961..4bfcf52 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -41,6 +41,7 @@
41#endif 41#endif
42#include "llpluginclassmediaowner.h" 42#include "llpluginclassmediaowner.h"
43#include "llviewermedia_streamingaudio.h" 43#include "llviewermedia_streamingaudio.h"
44#include "kokuastreamingaudio.h"
44#include "llaudioengine.h" 45#include "llaudioengine.h"
45 46
46#ifdef LL_FMOD 47#ifdef LL_FMOD
@@ -681,19 +682,13 @@ bool idle_startup()
681 delete gAudiop; 682 delete gAudiop;
682 gAudiop = NULL; 683 gAudiop = NULL;
683 } 684 }
684
685 if (gAudiop)
686 {
687 // if the audio engine hasn't set up its own preferred handler for streaming audio then set up the generic streaming audio implementation which uses media plugins
688 if (NULL == gAudiop->getStreamingAudioImpl())
689 {
690 LL_INFOS("AppInit") << "Using media plugins to render streaming audio" << LL_ENDL;
691 gAudiop->setStreamingAudioImpl(new LLStreamingAudio_MediaPlugins());
692 } 685 }
693 } 686 }
694 } 687
695 } 688
696 689 if (!gAudioStream)
690 gAudioStream = new KOKUAStreamingAudio(new LLStreamingAudio_MediaPlugins());
691
697 LL_INFOS("AppInit") << "Audio Engine Initialized." << LL_ENDL; 692 LL_INFOS("AppInit") << "Audio Engine Initialized." << LL_ENDL;
698 693
699 694
@@ -877,7 +872,47 @@ bool idle_startup()
877 872
878 if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState()) 873 if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())
879 { 874 {
875
880 LL_DEBUGS("AppInitStartupState") << "STATE_LOGIN_CLEANUP" << LL_ENDL; 876 LL_DEBUGS("AppInitStartupState") << "STATE_LOGIN_CLEANUP" << LL_ENDL;
877
878 gDisconnected = TRUE;
879
880 std::string cmd_line_grid_choice = gSavedSettings.getString("CmdLineGridChoice");
881 std::string cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI").asString();
882 if(!cmd_line_grid_choice.empty() && cmd_line_login_uri.empty())
883 {
884 gHippoGridManager->setCurrentGrid(cmd_line_grid_choice);
885 }
886
887 gHippoGridManager->setCurrentGridAsConnected();
888 gHippoLimits->setLimits();
889
890 if (gHippoGridManager->getConnectedGrid()->isSecondLife())
891 {
892 LLStartUp::setStartupState( STATE_LECTURE_PRIVACY );
893 LLFirstUse::Privacy();
894 }
895 else
896 {
897 LLStartUp::setStartupState( STATE_PRIVACY_LECTURED );
898 }
899
900 return FALSE;
901
902 }
903
904 if (STATE_LECTURE_PRIVACY == LLStartUp::getStartupState())
905 {
906 LL_DEBUGS("AppInitStartupState") << "STATE_LECTURE_PRIVACY" << LL_ENDL;
907
908 //wait for the user to decide
909 ms_sleep(1);
910 return FALSE;
911 }
912
913 if (STATE_PRIVACY_LECTURED == LLStartUp::getStartupState())
914 {
915 LL_DEBUGS("AppInitStartupState") << "STATE_PRIVACY_LECTURED" << LL_ENDL;
881 //reset the values that could have come in from a slurl 916 //reset the values that could have come in from a slurl
882 if (!gLoginHandler.getWebLoginKey().isNull()) 917 if (!gLoginHandler.getWebLoginKey().isNull())
883 { 918 {
@@ -919,15 +954,9 @@ bool idle_startup()
919 gDebugInfo["LoginName"] = firstname + " " + lastname; 954 gDebugInfo["LoginName"] = firstname + " " + lastname;
920 } 955 }
921 956
922 std::string cmd_line_grid_choice = gSavedSettings.getString("CmdLineGridChoice");
923 std::string cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI").asString();
924 if(!cmd_line_grid_choice.empty() && cmd_line_login_uri.empty())
925 {
926 gHippoGridManager->setCurrentGrid(cmd_line_grid_choice);
927 }
928 957
929 gHippoGridManager->setCurrentGridAsConnected(); 958
930 gHippoLimits->setLimits(); 959
931 // create necessary directories 960 // create necessary directories
932 // *FIX: these mkdir's should error check 961 // *FIX: these mkdir's should error check
933 gDirUtilp->setLindenUserDir(gHippoGridManager->getCurrentGridNick(), firstname, lastname); 962 gDirUtilp->setLindenUserDir(gHippoGridManager->getCurrentGridNick(), firstname, lastname);
@@ -2005,6 +2034,12 @@ bool idle_startup()
2005 2034
2006 // Load stored cache if possible 2035 // Load stored cache if possible
2007 LLAppViewer::instance()->loadNameCache(); 2036 LLAppViewer::instance()->loadNameCache();
2037
2038 // Start cache in not-running state until we figure out if we have
2039 // capabilities for display name lookup
2040 LLAvatarNameCache::initClass(false);
2041 LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getU32("DisplayNamesUsage"));
2042 LLAvatarName::sOmitResidentAsLastName = (bool)gSavedSettings.getBOOL("OmitResidentAsLastName");
2008 } 2043 }
2009 2044
2010 // *Note: this is where gWorldMap used to be initialized. 2045 // *Note: this is where gWorldMap used to be initialized.
@@ -3772,6 +3807,8 @@ std::string LLStartUp::startupStateToString(EStartupState state)
3772 RTNENUM( STATE_LOGIN_SHOW ); 3807 RTNENUM( STATE_LOGIN_SHOW );
3773 RTNENUM( STATE_LOGIN_WAIT ); 3808 RTNENUM( STATE_LOGIN_WAIT );
3774 RTNENUM( STATE_LOGIN_CLEANUP ); 3809 RTNENUM( STATE_LOGIN_CLEANUP );
3810 RTNENUM( STATE_LECTURE_PRIVACY );
3811 RTNENUM( STATE_PRIVACY_LECTURED );
3775 RTNENUM( STATE_LOGIN_VOICE_LICENSE ); 3812 RTNENUM( STATE_LOGIN_VOICE_LICENSE );
3776 RTNENUM( STATE_UPDATE_CHECK ); 3813 RTNENUM( STATE_UPDATE_CHECK );
3777 RTNENUM( STATE_LOGIN_AUTH_INIT ); 3814 RTNENUM( STATE_LOGIN_AUTH_INIT );
diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h
index 08862e6..3fe8daa 100644
--- a/linden/indra/newview/llstartup.h
+++ b/linden/indra/newview/llstartup.h
@@ -49,7 +49,9 @@ typedef enum {
49 STATE_BROWSER_INIT, // Initialize web browser for login screen 49 STATE_BROWSER_INIT, // Initialize web browser for login screen
50 STATE_LOGIN_SHOW, // Show login screen 50 STATE_LOGIN_SHOW, // Show login screen
51 STATE_LOGIN_WAIT, // Wait for user input at login screen 51 STATE_LOGIN_WAIT, // Wait for user input at login screen
52 STATE_LOGIN_CLEANUP, // Get rid of login screen and start login 52 STATE_LOGIN_CLEANUP, // lecture about privacy
53 STATE_LECTURE_PRIVACY, // wait until the lecture was read
54 STATE_PRIVACY_LECTURED, // Get rid of login screen and start login
53 STATE_LOGIN_VOICE_LICENSE, // Show license agreement for using voice 55 STATE_LOGIN_VOICE_LICENSE, // Show license agreement for using voice
54 STATE_UPDATE_CHECK, // Wait for user at a dialog box (updates, term-of-service, etc) 56 STATE_UPDATE_CHECK, // Wait for user at a dialog box (updates, term-of-service, etc)
55 STATE_LOGIN_AUTH_INIT, // Start login to SL servers 57 STATE_LOGIN_AUTH_INIT, // Start login to SL servers
diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp
index c8e1298..ceef28b 100644
--- a/linden/indra/newview/lltexlayer.cpp
+++ b/linden/indra/newview/lltexlayer.cpp
@@ -213,6 +213,7 @@ BOOL LLTexLayerSetBuffer::needsRender()
213 LLVOAvatar* avatar = mTexLayerSet->getAvatar(); 213 LLVOAvatar* avatar = mTexLayerSet->getAvatar();
214 BOOL upload_now = needsUploadNow(); 214 BOOL upload_now = needsUploadNow();
215 BOOL needs_update = (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating; 215 BOOL needs_update = (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating;
216
216 if (needs_update) 217 if (needs_update)
217 { 218 {
218 BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT); 219 BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT);
@@ -275,16 +276,16 @@ BOOL LLTexLayerSetBuffer::render()
275 } 276 }
276 else 277 else
277 { 278 {
278 // mUploadPending = FALSE;//see... 279 //mUploadPending = FALSE;//see...
279 // mNeedsUpload = FALSE;// ...below... 280 //mNeedsUpload = FALSE;// ...below...
280 LLVOAvatar* avatar = mTexLayerSet->getAvatar(); 281 LLVOAvatar* avatar = mTexLayerSet->getAvatar();
281 if (avatar) 282 if (avatar)
282 { 283 {
283 avatar->setNewBakedTexture(avatar->getBakedTE(mTexLayerSet), IMG_INVISIBLE); 284 avatar->setNewBakedTexture(avatar->getBakedTE(mTexLayerSet), IMG_INVISIBLE);
284 llinfos << "Invisible baked texture set for " << mTexLayerSet->getBodyRegion() << llendl; 285 llinfos << "Invisible baked texture set for " << mTexLayerSet->getBodyRegion() << llendl;
285 } 286 }
286 readBackAndUpload(); //... here: Opensim is not happy if we don't 287 readBackAndUpload(); //... here: Opensim is not happy if we don't
287 //TODO: find out if SL is happy if we do 288 //TODO: find out if SL is happy if we do
288 } 289 }
289 } 290 }
290 } 291 }
@@ -350,12 +351,11 @@ void LLTexLayerSetBuffer::readBackAndUpload()
350 // writes into baked_color_data 351 // writes into baked_color_data
351 const char* comment_text = NULL; 352 const char* comment_text = NULL;
352 353
353 S32 baked_image_components = 5; // red green blue bump clothing 354 S32 baked_image_components = 5; // red green blue bump clothing
354 LLPointer<LLImageRaw> baked_image = new LLImageRaw( mWidth, mHeight, baked_image_components ); 355 LLPointer<LLImageRaw> baked_image = new LLImageRaw( mWidth, mHeight, baked_image_components );
355 U8* baked_image_data = baked_image->getData(); 356 U8* baked_image_data = baked_image->getData();
356 357
357 comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask 358 comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask
358
359 S32 i = 0; 359 S32 i = 0;
360 for (S32 u = 0; u < mWidth; u++) 360 for (S32 u = 0; u < mWidth; u++)
361 { 361 {
@@ -492,7 +492,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user
492 avatar->setNewBakedTexture(baked_te, uuid); 492 avatar->setNewBakedTexture(baked_te, uuid);
493 } 493 }
494 else 494 else
495 { 495 {
496 ++failures; 496 ++failures;
497 llinfos << "Baked upload failed (attempt " << failures << "/" << MAX_BAKE_UPLOAD_ATTEMPTS << "), "; 497 llinfos << "Baked upload failed (attempt " << failures << "/" << MAX_BAKE_UPLOAD_ATTEMPTS << "), ";
498 if (failures >= MAX_BAKE_UPLOAD_ATTEMPTS) 498 if (failures >= MAX_BAKE_UPLOAD_ATTEMPTS)
@@ -1412,7 +1412,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
1412 1412
1413 LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode(); 1413 LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode();
1414 1414
1415 gGL.getTexUnit(0)->bind(image_gl); 1415 gGL.getTexUnit(0)->bind(image_gl, TRUE);
1416 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); 1416 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
1417 1417
1418 gl_rect_2d_simple_tex( width, height ); 1418 gl_rect_2d_simple_tex( width, height );
@@ -1430,7 +1430,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
1430 LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask ); 1430 LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );
1431 if( image_gl ) 1431 if( image_gl )
1432 { 1432 {
1433 gGL.getTexUnit(0)->bind(image_gl); 1433 gGL.getTexUnit(0)->bind(image_gl, TRUE);
1434 gl_rect_2d_simple_tex( width, height ); 1434 gl_rect_2d_simple_tex( width, height );
1435 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); 1435 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1436 } 1436 }
@@ -1656,7 +1656,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
1656 1656
1657 LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode(); 1657 LLTexUnit::eTextureAddressMode old_mode = image_gl->getAddressMode();
1658 1658
1659 gGL.getTexUnit(0)->bind(image_gl); 1659 gGL.getTexUnit(0)->bind(image_gl, TRUE);
1660 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); 1660 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
1661 1661
1662 gl_rect_2d_simple_tex( width, height ); 1662 gl_rect_2d_simple_tex( width, height );
@@ -1678,7 +1678,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
1678 ( (image_gl->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) 1678 ( (image_gl->getComponents() == 1) && getInfo()->mStaticImageIsMask ) )
1679 { 1679 {
1680 LLGLSNoAlphaTest gls_no_alpha_test; 1680 LLGLSNoAlphaTest gls_no_alpha_test;
1681 gGL.getTexUnit(0)->bind(image_gl); 1681 gGL.getTexUnit(0)->bind(image_gl, TRUE);
1682 gl_rect_2d_simple_tex( width, height ); 1682 gl_rect_2d_simple_tex( width, height );
1683 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); 1683 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1684 } 1684 }
@@ -2146,7 +2146,7 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height )
2146 } 2146 }
2147 2147
2148 LLGLSNoAlphaTest gls_no_alpha_test; 2148 LLGLSNoAlphaTest gls_no_alpha_test;
2149 gGL.getTexUnit(0)->bind(mCachedProcessedImageGL); 2149 gGL.getTexUnit(0)->bind(mCachedProcessedImageGL, TRUE);
2150 gl_rect_2d_simple_tex( width, height ); 2150 gl_rect_2d_simple_tex( width, height );
2151 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); 2151 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2152 stop_glerror(); 2152 stop_glerror();
diff --git a/linden/indra/newview/llvieweraudio.cpp b/linden/indra/newview/llvieweraudio.cpp
index 91e7ce5..d465177 100644
--- a/linden/indra/newview/llvieweraudio.cpp
+++ b/linden/indra/newview/llvieweraudio.cpp
@@ -33,6 +33,7 @@
33#include "llviewerprecompiledheaders.h" 33#include "llviewerprecompiledheaders.h"
34 34
35#include "llaudioengine.h" 35#include "llaudioengine.h"
36#include "kokuastreamingaudio.h"
36#include "llagent.h" 37#include "llagent.h"
37#include "llappviewer.h" 38#include "llappviewer.h"
38#include "llvieweraudio.h" 39#include "llvieweraudio.h"
@@ -46,69 +47,71 @@
46 47
47void init_audio() 48void init_audio()
48{ 49{
49 if (!gAudiop) 50 if (gAudiop)
50 { 51 {
51 llwarns << "Failed to create an appropriate Audio Engine" << llendl; 52 LLVector3d lpos_global = gAgent.getCameraPositionGlobal();
52 return; 53 LLVector3 lpos_global_f;
54
55 lpos_global_f.setVec(lpos_global);
56
57 gAudiop->setListener(lpos_global_f,
58 LLVector3::zero, // LLViewerCamera::getInstance()->getVelocity(), // !!! BUG need to replace this with smoothed velocity!
59 LLViewerCamera::getInstance()->getUpAxis(),
60 LLViewerCamera::getInstance()->getAtAxis());
61
62 // load up our initial set of sounds we'll want so they're in memory and ready to be played
63
64 bool mute_audio = gSavedSettings.getBOOL("MuteAudio");
65
66 if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload"))
67 {
68 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert")));
69 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke")));
70 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject")));
71 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick")));
72 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease")));
73 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF")));
74 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM")));
75 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat")));
76 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM")));
77 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject")));
78 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp")));
79 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv")));
80 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown")));
81 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp")));
82 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv")));
83 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate")));
84 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete")));
85 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn")));
86 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut")));
87 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear")));
88 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide")));
89 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0")));
90 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1")));
91 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2")));
92 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3")));
93 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4")));
94 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5")));
95 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6")));
96 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7")));
97 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot")));
98 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot")));
99 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot")));
100 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM")));
101 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot")));
102 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut")));
103 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject")));
104 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv")));
105 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping")));
106 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose")));
107 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen")));
108 }
53 } 109 }
54 LLVector3d lpos_global = gAgent.getCameraPositionGlobal(); 110 else
55 LLVector3 lpos_global_f;
56
57 lpos_global_f.setVec(lpos_global);
58
59 gAudiop->setListener(lpos_global_f,
60 LLVector3::zero, // LLViewerCamera::getInstance()->getVelocity(), // !!! BUG need to replace this with smoothed velocity!
61 LLViewerCamera::getInstance()->getUpAxis(),
62 LLViewerCamera::getInstance()->getAtAxis());
63
64// load up our initial set of sounds we'll want so they're in memory and ready to be played
65
66 bool mute_audio = gSavedSettings.getBOOL("MuteAudio");
67
68 if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload"))
69 { 111 {
70 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert"))); 112 llwarns << "Failed to create an appropriate Audio Engine" << llendl;
71 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); 113 return;
72 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject")));
73 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick")));
74 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease")));
75 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF")));
76 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM")));
77 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat")));
78 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM")));
79 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject")));
80 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp")));
81 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv")));
82 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown")));
83 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp")));
84 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv")));
85 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate")));
86 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete")));
87 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn")));
88 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut")));
89 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear")));
90 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide")));
91 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0")));
92 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1")));
93 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2")));
94 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3")));
95 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4")));
96 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5")));
97 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6")));
98 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7")));
99 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot")));
100 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot")));
101 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot")));
102 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM")));
103 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot")));
104 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut")));
105 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject")));
106 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv")));
107 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping")));
108 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose")));
109 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen")));
110 } 114 }
111
112 audio_update_volume(true); 115 audio_update_volume(true);
113} 116}
114 117
@@ -158,12 +161,12 @@ void audio_update_volume(bool force_update)
158 } 161 }
159 162
160 // Streaming Music 163 // Streaming Music
161 if (gAudiop) 164 if (gAudioStream)
162 { 165 {
163 F32 music_volume = gSavedSettings.getF32("AudioLevelMusic"); 166 F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");
164 BOOL music_muted = gSavedSettings.getBOOL("MuteMusic"); 167 BOOL music_muted = gSavedSettings.getBOOL("MuteMusic");
165 music_volume = mute_volume * master_volume * (music_volume*music_volume); 168 music_volume = mute_volume * master_volume * (music_volume*music_volume);
166 gAudiop->setInternetStreamGain ( music_muted ? 0.f : music_volume ); 169 gAudioStream->setInternetStreamGain ( music_muted ? 0.f : music_volume );
167 170
168 } 171 }
169 172
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp
index 3675072..572f64a 100644
--- a/linden/indra/newview/llviewercontrol.cpp
+++ b/linden/indra/newview/llviewercontrol.cpp
@@ -38,8 +38,11 @@
38#include "indra_constants.h" 38#include "indra_constants.h"
39 39
40// For Listeners 40// For Listeners
41#include "llaudioengine.h" 41// #include "llaudioengine.h"
42#include "kokuastreamingaudio.h"
42#include "llagent.h" 43#include "llagent.h"
44#include "llavatarnamecache.h"
45#include "llcallingcard.h"
43#include "llconsole.h" 46#include "llconsole.h"
44#include "lldrawpoolterrain.h" 47#include "lldrawpoolterrain.h"
45#include "llflexibleobject.h" 48#include "llflexibleobject.h"
@@ -310,7 +313,7 @@ static bool handleJoystickChanged(const LLSD& newvalue)
310 313
311static bool handleAudioStreamMusicChanged(const LLSD& newvalue) 314static bool handleAudioStreamMusicChanged(const LLSD& newvalue)
312{ 315{
313 if (gAudiop) 316 if (gAudioStream)
314 { 317 {
315 if ( newvalue.asBoolean() ) 318 if ( newvalue.asBoolean() )
316 { 319 {
@@ -319,15 +322,15 @@ static bool handleAudioStreamMusicChanged(const LLSD& newvalue)
319 { 322 {
320 // if stream is already playing, don't call this 323 // if stream is already playing, don't call this
321 // otherwise music will briefly stop 324 // otherwise music will briefly stop
322 if ( !gAudiop->isInternetStreamPlaying() ) 325 if ( !gAudioStream->isInternetStreamPlaying() )
323 { 326 {
324 gAudiop->startInternetStream(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL()); 327 gAudioStream->startInternetStream(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL());
325 } 328 }
326 } 329 }
327 } 330 }
328 else 331 else
329 { 332 {
330 gAudiop->stopInternetStream(); 333 gAudioStream->stopInternetStream();
331 } 334 }
332 } 335 }
333 return true; 336 return true;
@@ -425,6 +428,28 @@ static bool handleAuditTextureChanged(const LLSD& newvalue)
425 return true; 428 return true;
426} 429}
427 430
431static bool handleDisplayNamesUsageChanged(const LLSD& newvalue)
432{
433 LLAvatarNameCache::setUseDisplayNames((U32)newvalue.asInteger());
434 LLVOAvatar::invalidateNameTags();
435 LLAvatarTracker::instance().dirtyBuddies();
436 return true;
437}
438
439static bool handleOmitResidentAsLastNameChanged(const LLSD& newvalue)
440{
441 LLAvatarName::sOmitResidentAsLastName =(bool)newvalue.asBoolean();
442 LLVOAvatar::invalidateNameTags();
443 LLAvatarTracker::instance().dirtyBuddies();
444 return true;
445}
446
447static bool handleLegacyNamesForFriendsChanged(const LLSD& newvalue)
448{
449 LLAvatarTracker::instance().dirtyBuddies();
450 return true;
451}
452
428static bool handleRenderDebugGLChanged(const LLSD& newvalue) 453static bool handleRenderDebugGLChanged(const LLSD& newvalue)
429{ 454{
430 gDebugGL = newvalue.asBoolean(); 455 gDebugGL = newvalue.asBoolean();
@@ -572,6 +597,9 @@ void settings_setup_listeners()
572 gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); 597 gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
573 gSavedSettings.getControl("AudioStreamingMusic")->getSignal()->connect(boost::bind(&handleAudioStreamMusicChanged, _1)); 598 gSavedSettings.getControl("AudioStreamingMusic")->getSignal()->connect(boost::bind(&handleAudioStreamMusicChanged, _1));
574 gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _1)); 599 gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _1));
600 gSavedSettings.getControl("DisplayNamesUsage")->getSignal()->connect(boost::bind(&handleDisplayNamesUsageChanged, _1));
601 gSavedSettings.getControl("OmitResidentAsLastName")->getSignal()->connect(boost::bind(&handleOmitResidentAsLastNameChanged, _1));
602 gSavedSettings.getControl("LegacyNamesForFriends")->getSignal()->connect(boost::bind(&handleLegacyNamesForFriendsChanged, _1));
575 gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); 603 gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
576 gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); 604 gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
577 gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); 605 gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
diff --git a/linden/indra/newview/llviewerdisplayname.cpp b/linden/indra/newview/llviewerdisplayname.cpp
new file mode 100644
index 0000000..6a7cab3
--- /dev/null
+++ b/linden/indra/newview/llviewerdisplayname.cpp
@@ -0,0 +1,208 @@
1/**
2 * @file llviewerdisplayname.cpp
3 * @brief Wrapper for display name functionality
4 *
5 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
6 * Second Life Viewer Source Code
7 * Copyright (C) 2010, Linden Research, Inc.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation;
12 * version 2.1 of the License only.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 *
23 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
24 * $/LicenseInfo$
25 */
26
27#include "llviewerprecompiledheaders.h"
28
29#include "llviewerdisplayname.h"
30
31// viewer includes
32#include "llagent.h"
33#include "llviewerregion.h"
34#include "llvoavatar.h"
35
36// library includes
37#include "llavatarnamecache.h"
38#include "llhttpclient.h"
39#include "llhttpnode.h"
40#include "llnotifications.h"
41#include "llui.h" // getLanguage()
42
43namespace LLViewerDisplayName
44{
45 // Fired when viewer receives server response to display name change
46 set_name_signal_t sSetDisplayNameSignal;
47
48 // Fired when there is a change in the agent's name
49 name_changed_signal_t sNameChangedSignal;
50
51 void addNameChangedCallback(const name_changed_signal_t::slot_type& cb)
52 {
53 sNameChangedSignal.connect(cb);
54 }
55
56}
57
58class LLSetDisplayNameResponder : public LLHTTPClient::Responder
59{
60public:
61 // only care about errors
62 /*virtual*/ void error(U32 status, const std::string& reason)
63 {
64 LLViewerDisplayName::sSetDisplayNameSignal(false, "", LLSD());
65 LLViewerDisplayName::sSetDisplayNameSignal.disconnect_all_slots();
66 }
67};
68
69void LLViewerDisplayName::set(const std::string& display_name, const set_name_slot_t& slot)
70{
71 // TODO: simple validation here
72
73 LLViewerRegion* region = gAgent.getRegion();
74 llassert(region);
75 std::string cap_url = region->getCapability("SetDisplayName");
76 if (cap_url.empty())
77 {
78 // this server does not support display names, report error
79 slot(false, "unsupported", LLSD());
80 return;
81 }
82
83 // People API can return localized error messages. Indicate our
84 // language preference via header.
85 LLSD headers;
86 headers["Accept-Language"] = LLUI::getLanguage();
87
88 // People API requires both the old and new value to change a variable.
89 // Our display name will be in cache before the viewer's UI is available
90 // to request a change, so we can use direct lookup without callback.
91 LLAvatarName av_name;
92 if (!LLAvatarNameCache::get( gAgent.getID(), &av_name))
93 {
94 slot(false, "name unavailable", LLSD());
95 return;
96 }
97
98 // People API expects array of [ "old value", "new value" ]
99 LLSD change_array = LLSD::emptyArray();
100 change_array.append(av_name.mDisplayName);
101 change_array.append(display_name);
102
103 llinfos << "Set name POST to " << cap_url << llendl;
104
105 // Record our caller for when the server sends back a reply
106 sSetDisplayNameSignal.connect(slot);
107
108 // POST the requested change. The sim will not send a response back to
109 // this request directly, rather it will send a separate message after it
110 // communicates with the back-end.
111 LLSD body;
112 body["display_name"] = change_array;
113 LLHTTPClient::post(cap_url, body, new LLSetDisplayNameResponder, headers);
114}
115
116class LLSetDisplayNameReply : public LLHTTPNode
117{
118 LOG_CLASS(LLSetDisplayNameReply);
119public:
120 /*virtual*/ void post(
121 LLHTTPNode::ResponsePtr response,
122 const LLSD& context,
123 const LLSD& input) const
124 {
125 LLSD body = input["body"];
126
127 S32 status = body["status"].asInteger();
128 bool success = (status == 200);
129 std::string reason = body["reason"].asString();
130 LLSD content = body["content"];
131
132 llinfos << "status " << status << " reason " << reason << llendl;
133
134 // If viewer's concept of display name is out-of-date, the set request
135 // will fail with 409 Conflict. If that happens, fetch up-to-date
136 // name information.
137 if (status == 409)
138 {
139 LLUUID agent_id = gAgent.getID();
140 // Flush stale data
141 LLAvatarNameCache::erase( agent_id );
142 // Queue request for new data
143 LLAvatarName ignored;
144 LLAvatarNameCache::get( agent_id, &ignored );
145 // Kill name tag, as it is wrong
146 LLVOAvatar::invalidateNameTag( agent_id );
147 }
148
149 // inform caller of result
150 LLViewerDisplayName::sSetDisplayNameSignal(success, reason, content);
151 LLViewerDisplayName::sSetDisplayNameSignal.disconnect_all_slots();
152 }
153};
154
155
156class LLDisplayNameUpdate : public LLHTTPNode
157{
158 /*virtual*/ void post(
159 LLHTTPNode::ResponsePtr response,
160 const LLSD& context,
161 const LLSD& input) const
162 {
163 LLSD body = input["body"];
164 LLUUID agent_id = body["agent_id"];
165 std::string old_display_name = body["old_display_name"];
166 // By convention this record is called "agent" in the People API
167 LLSD name_data = body["agent"];
168
169 // Inject the new name data into cache
170 LLAvatarName av_name;
171 av_name.fromLLSD( name_data );
172
173 llinfos << "name-update now " << LLDate::now()
174 << " next_update " << LLDate(av_name.mNextUpdate)
175 << llendl;
176
177 // Name expiration time may be provided in headers, or we may use a
178 // default value
179 // *TODO: get actual headers out of ResponsePtr
180 //LLSD headers = response->mHeaders;
181 LLSD headers;
182 av_name.mExpires =
183 LLAvatarNameCache::nameExpirationFromHeaders(headers);
184
185 LLAvatarNameCache::insert(agent_id, av_name);
186
187 // force name tag to update
188 LLVOAvatar::invalidateNameTag(agent_id);
189
190 LLSD args;
191 args["OLD_NAME"] = old_display_name;
192 args["SLID"] = av_name.mUsername;
193 args["NEW_NAME"] = av_name.mDisplayName;
194 LLNotifications::instance().add("DisplayNameUpdate", args);
195 if (agent_id == gAgent.getID())
196 {
197 LLViewerDisplayName::sNameChangedSignal();
198 }
199 }
200};
201
202LLHTTPRegistration<LLSetDisplayNameReply>
203 gHTTPRegistrationMessageSetDisplayNameReply(
204 "/message/SetDisplayNameReply");
205
206LLHTTPRegistration<LLDisplayNameUpdate>
207 gHTTPRegistrationMessageDisplayNameUpdate(
208 "/message/DisplayNameUpdate");
diff --git a/linden/indra/newview/llviewerdisplayname.h b/linden/indra/newview/llviewerdisplayname.h
new file mode 100644
index 0000000..16d59ae
--- /dev/null
+++ b/linden/indra/newview/llviewerdisplayname.h
@@ -0,0 +1,53 @@
1/**
2 * @file llviewerdisplayname.h
3 * @brief Wrapper for display name functionality
4 *
5 * $LicenseInfo:firstyear=2010&license=viewerlgpl$
6 * Second Life Viewer Source Code
7 * Copyright (C) 2010, Linden Research, Inc.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation;
12 * version 2.1 of the License only.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 *
23 * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
24 * $/LicenseInfo$
25 */
26
27#ifndef LLVIEWERDISPLAYNAME_H
28#define LLVIEWERDISPLAYNAME_H
29
30#include <boost/signals2.hpp>
31
32class LLSD;
33class LLUUID;
34
35namespace LLViewerDisplayName
36{
37 typedef boost::signals2::signal<
38 void (bool success, const std::string& reason, const LLSD& content)>
39 set_name_signal_t;
40 typedef set_name_signal_t::slot_type set_name_slot_t;
41
42 typedef boost::signals2::signal<void (void)> name_changed_signal_t;
43 typedef name_changed_signal_t::slot_type name_changed_slot_t;
44
45 // Sends an update to the server to change a display name
46 // and call back when done. May not succeed due to service
47 // unavailable or name not available.
48 void set(const std::string& display_name, const set_name_slot_t& slot);
49
50 void addNameChangedCallback(const name_changed_signal_t::slot_type& cb);
51}
52
53#endif // LLVIEWERDISPLAYNAME_H
diff --git a/linden/indra/newview/llviewermedia_streamingaudio.cpp b/linden/indra/newview/llviewermedia_streamingaudio.cpp
index 575dbc8..4bbc519 100644
--- a/linden/indra/newview/llviewermedia_streamingaudio.cpp
+++ b/linden/indra/newview/llviewermedia_streamingaudio.cpp
@@ -69,6 +69,8 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url)
69 llinfos << "mMediaPlugin is now " << mMediaPlugin << llendl; 69 llinfos << "mMediaPlugin is now " << mMediaPlugin << llendl;
70 } 70 }
71 71
72 mVersion = mMediaPlugin ? mMediaPlugin->getPluginVersion() : std::string();
73
72 if(!mMediaPlugin) 74 if(!mMediaPlugin)
73 return; 75 return;
74 76
@@ -156,6 +158,11 @@ std::string LLStreamingAudio_MediaPlugins::getURL()
156 return mURL; 158 return mURL;
157} 159}
158 160
161std::string LLStreamingAudio_MediaPlugins::getVersion()
162{
163 return mVersion;
164}
165
159void LLStreamingAudio_MediaPlugins::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) 166void LLStreamingAudio_MediaPlugins::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
160{ 167{
161 if (event == MEDIA_EVENT_NAME_CHANGED) 168 if (event == MEDIA_EVENT_NAME_CHANGED)
diff --git a/linden/indra/newview/llviewermedia_streamingaudio.h b/linden/indra/newview/llviewermedia_streamingaudio.h
index 816e213..5802a31 100644
--- a/linden/indra/newview/llviewermedia_streamingaudio.h
+++ b/linden/indra/newview/llviewermedia_streamingaudio.h
@@ -56,6 +56,7 @@ class LLStreamingAudio_MediaPlugins :
56 /*virtual*/ void setGain(F32 vol); 56 /*virtual*/ void setGain(F32 vol);
57 /*virtual*/ F32 getGain(); 57 /*virtual*/ F32 getGain();
58 /*virtual*/ std::string getURL(); 58 /*virtual*/ std::string getURL();
59 /*virtual*/ std::string getVersion();
59 60
60 // inherited from LLPluginClassMediaOwner 61 // inherited from LLPluginClassMediaOwner
61 /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); 62 /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
@@ -66,6 +67,7 @@ private:
66 LLPluginClassMedia *mMediaPlugin; 67 LLPluginClassMedia *mMediaPlugin;
67 std::string mURL; 68 std::string mURL;
68 F32 mGain; 69 F32 mGain;
70 std::string mVersion;
69}; 71};
70 72
71 73
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index 7f00382..777a871 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -41,6 +41,7 @@
41 41
42// linden library includes 42// linden library includes
43#include "llaudioengine.h" 43#include "llaudioengine.h"
44#include "llavatarnamecache.h"
44#include "indra_constants.h" 45#include "indra_constants.h"
45#include "llassetstorage.h" 46#include "llassetstorage.h"
46#include "llchat.h" 47#include "llchat.h"
@@ -102,6 +103,7 @@
102#include "llfloatercustomize.h" 103#include "llfloatercustomize.h"
103#include "llfloaterdaycycle.h" 104#include "llfloaterdaycycle.h"
104#include "llfloaterdirectory.h" 105#include "llfloaterdirectory.h"
106#include "llfloaterdisplayname.h"
105#include "llfloatereditui.h" 107#include "llfloatereditui.h"
106#include "llfloaterchatterbox.h" 108#include "llfloaterchatterbox.h"
107#include "llfloaterfriends.h" 109#include "llfloaterfriends.h"
@@ -3434,6 +3436,16 @@ class LLEditEnableCustomizeAvatar : public view_listener_t
3434 } 3436 }
3435}; 3437};
3436 3438
3439class LLEditEnableDisplayName : public view_listener_t
3440{
3441 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
3442 {
3443 bool new_value = (LLAvatarNameCache::useDisplayNames() != 0);
3444 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
3445 return true;
3446 }
3447};
3448
3437// only works on pie menu 3449// only works on pie menu
3438bool handle_sit_or_stand() 3450bool handle_sit_or_stand()
3439{ 3451{
@@ -5959,6 +5971,10 @@ class LLShowFloater : public view_listener_t
5959 { 5971 {
5960 LLToolBar::toggle(NULL); 5972 LLToolBar::toggle(NULL);
5961 } 5973 }
5974 else if (floater_name == "displayname")
5975 {
5976 LLFloaterDisplayName::show();
5977 }
5962 else if (floater_name == "chat history") 5978 else if (floater_name == "chat history")
5963 { 5979 {
5964 LLFloaterChat::toggleInstance(LLSD()); 5980 LLFloaterChat::toggleInstance(LLSD());
@@ -10666,6 +10682,20 @@ class LLAdvancedDumpAvatarLocalTextures : public view_listener_t
10666 } 10682 }
10667}; 10683};
10668 10684
10685///////////////////////////////////
10686// Reload Avatar Cloud Particles //
10687///////////////////////////////////
10688
10689
10690class LLAdvancedReloadAvatarCloudParticle : public view_listener_t
10691{
10692 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
10693 {
10694 LLVOAvatar::initCloud();
10695 return true;
10696 }
10697};
10698
10669/////////// 10699///////////
10670// Crash // 10700// Crash //
10671/////////// 10701///////////
@@ -11118,6 +11148,7 @@ void initialize_menus()
11118 addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate"); 11148 addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate");
11119 addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff"); 11149 addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
11120 addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar"); 11150 addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
11151 addMenu(new LLEditEnableDisplayName(), "Edit.EnableDisplayName");
11121 addMenu(new LLAdvancedRebakeTextures(), "Advanced.RebakeTextures"); 11152 addMenu(new LLAdvancedRebakeTextures(), "Advanced.RebakeTextures");
11122 11153
11123 // View menu 11154 // View menu
@@ -11453,6 +11484,7 @@ void initialize_menus()
11453 addMenu(new LLAdvancedDumpAttachments(), "Advanced.DumpAttachments"); 11484 addMenu(new LLAdvancedDumpAttachments(), "Advanced.DumpAttachments");
11454 addMenu(new LLAdvancedDebugAvatarTextures(), "Advanced.DebugAvatarTextures"); 11485 addMenu(new LLAdvancedDebugAvatarTextures(), "Advanced.DebugAvatarTextures");
11455 addMenu(new LLAdvancedDumpAvatarLocalTextures(), "Advanced.DumpAvatarLocalTextures"); 11486 addMenu(new LLAdvancedDumpAvatarLocalTextures(), "Advanced.DumpAvatarLocalTextures");
11487 addMenu(new LLAdvancedReloadAvatarCloudParticle(), "Advanced.ReloadAvatarCloudParticle");
11456 11488
11457 // Advanced > Crash 11489 // Advanced > Crash
11458 addMenu(new LLAdvancedCrash(), "Advanced.Crash"); 11490 addMenu(new LLAdvancedCrash(), "Advanced.Crash");
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 5f333e9..9ebfd04 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -2998,6 +2998,33 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
2998 2998
2999 if (is_audible) 2999 if (is_audible)
3000 { 3000 {
3001 if (chatter && chatter->isAvatar())
3002 {
3003#ifdef LL_RRINTERFACE_H //MK
3004 if (!gRRenabled || !gAgent.mRRInterface.mContainsShownames)
3005 {
3006#endif //mk
3007 if (LLAvatarNameCache::useDisplayNames())
3008 {
3009 LLAvatarName avatar_name;
3010 if (LLAvatarNameCache::get(from_id, &avatar_name))
3011 {
3012 if (LLAvatarNameCache::useDisplayNames() == 1)
3013 {
3014 from_name = avatar_name.mDisplayName;
3015 }
3016 else
3017 {
3018 from_name = avatar_name.getNames();
3019 }
3020 }
3021 chat.mFromName = from_name;
3022 }
3023#ifdef LL_RRINTERFACE_H //MK
3024 }
3025#endif //mk
3026 }
3027
3001 BOOL visible_in_chat_bubble = FALSE; 3028 BOOL visible_in_chat_bubble = FALSE;
3002 std::string verb; 3029 std::string verb;
3003 3030
diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp
index a2be26a..65c1d11 100644
--- a/linden/indra/newview/llviewerobject.cpp
+++ b/linden/indra/newview/llviewerobject.cpp
@@ -4206,7 +4206,7 @@ void LLViewerObject::setParticleSource(const LLPartSysData& particle_parameters,
4206 LLViewerImage* image; 4206 LLViewerImage* image;
4207 if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null) 4207 if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
4208 { 4208 {
4209 image = gImageList.getImageFromFile("pixiesmall.tga"); 4209 image = gImageList.getImageFromFile("pixiesmall.j2c");
4210 } 4210 }
4211 else 4211 else
4212 { 4212 {
diff --git a/linden/indra/newview/llviewerparcelmgr.cpp b/linden/indra/newview/llviewerparcelmgr.cpp
index b589f2e..630da54 100644
--- a/linden/indra/newview/llviewerparcelmgr.cpp
+++ b/linden/indra/newview/llviewerparcelmgr.cpp
@@ -35,7 +35,7 @@
35#include "llviewerparcelmgr.h" 35#include "llviewerparcelmgr.h"
36 36
37// Library includes 37// Library includes
38#include "llaudioengine.h" 38#include "kokuastreamingaudio.h"
39#include "indra_constants.h" 39#include "indra_constants.h"
40#include "llcachename.h" 40#include "llcachename.h"
41#include "llgl.h" 41#include "llgl.h"
@@ -1672,7 +1672,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
1672 else 1672 else
1673 { 1673 {
1674 // look for music. 1674 // look for music.
1675 if (gAudiop) 1675 if (gAudioStream)
1676 { 1676 {
1677 if (parcel) 1677 if (parcel)
1678 { 1678 {
@@ -1685,12 +1685,12 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
1685 // On entering a new parcel, stop the last stream if the 1685 // On entering a new parcel, stop the last stream if the
1686 // new parcel has a different music url. (Empty URL counts 1686 // new parcel has a different music url. (Empty URL counts
1687 // as different.) 1687 // as different.)
1688 const std::string& stream_url = gAudiop->getInternetStreamURL(); 1688 const std::string& stream_url = gAudioStream->getInternetStreamURL();
1689 1689
1690 if (music_url.empty() || music_url != stream_url) 1690 if (music_url.empty() || music_url != stream_url)
1691 { 1691 {
1692 // URL is different from one currently playing. 1692 // URL is different from one currently playing.
1693 gAudiop->stopInternetStream(); 1693 gAudioStream->stopInternetStream();
1694 1694
1695 // If there is a new music URL and it's valid, play it. 1695 // If there is a new music URL and it's valid, play it.
1696 if (music_url.size() > 12) 1696 if (music_url.size() > 12)
@@ -1700,19 +1700,19 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
1700 optionally_start_music(music_url); 1700 optionally_start_music(music_url);
1701 } 1701 }
1702 } 1702 }
1703 else if (!gAudiop->getInternetStreamURL().empty()) 1703 else if (!gAudioStream->getInternetStreamURL().empty())
1704 { 1704 {
1705 llinfos << "Stopping parcel music" << llendl; 1705 llinfos << "Stopping parcel music" << llendl;
1706 gAudiop->startInternetStream(LLStringUtil::null); 1706 gAudioStream->startInternetStream(LLStringUtil::null);
1707 } 1707 }
1708 } 1708 }
1709 } 1709 }
1710 else 1710 else
1711 { 1711 {
1712 // Public land has no music 1712 // Public land has no music
1713 gAudiop->stopInternetStream(); 1713 gAudioStream->stopInternetStream();
1714 } 1714 }
1715 }//if gAudiop 1715 }//if gAudioStream
1716 1716
1717 // now check for video 1717 // now check for video
1718 LLViewerParcelMedia::update( parcel ); 1718 LLViewerParcelMedia::update( parcel );
@@ -1730,7 +1730,7 @@ void optionally_start_music(const std::string& music_url)
1730 // changed as part of SL-4878 1730 // changed as part of SL-4878
1731 if ( gOverlayBar && gOverlayBar->musicPlaying()) 1731 if ( gOverlayBar && gOverlayBar->musicPlaying())
1732 { 1732 {
1733 gAudiop->startInternetStream(music_url); 1733 gAudioStream->startInternetStream(music_url);
1734 } 1734 }
1735 } 1735 }
1736} 1736}
diff --git a/linden/indra/newview/llviewerregion.cpp b/linden/indra/newview/llviewerregion.cpp
index d93c425..a8047b8 100644
--- a/linden/indra/newview/llviewerregion.cpp
+++ b/linden/indra/newview/llviewerregion.cpp
@@ -127,6 +127,8 @@ public:
127 } 127 }
128 } 128 }
129 129
130 mRegion->setCapabilitiesReceived(true);
131
130 if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) 132 if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
131 { 133 {
132 LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); 134 LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
@@ -172,7 +174,8 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
172 mCacheEntriesCount(0), 174 mCacheEntriesCount(0),
173 mCacheID(), 175 mCacheID(),
174 mEventPoll(NULL), 176 mEventPoll(NULL),
175 mReleaseNotesRequested(FALSE) 177 mReleaseNotesRequested(FALSE),
178 mCapabilitiesReceived(false)
176{ 179{
177 mWidth = region_width_meters; 180 mWidth = region_width_meters;
178 mOriginGlobal = from_region_handle(handle); 181 mOriginGlobal = from_region_handle(handle);
@@ -1431,6 +1434,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
1431 capabilityNames.append("FetchInventory"); 1434 capabilityNames.append("FetchInventory");
1432 capabilityNames.append("FetchLib"); 1435 capabilityNames.append("FetchLib");
1433 capabilityNames.append("FetchLibDescendents"); 1436 capabilityNames.append("FetchLibDescendents");
1437 capabilityNames.append("GetDisplayNames");
1438 capabilityNames.append("SetDisplayName");
1434 capabilityNames.append("GetTexture"); 1439 capabilityNames.append("GetTexture");
1435 capabilityNames.append("GroupProposalBallot"); 1440 capabilityNames.append("GroupProposalBallot");
1436 capabilityNames.append("HomeLocation"); 1441 capabilityNames.append("HomeLocation");
@@ -1509,6 +1514,16 @@ std::string LLViewerRegion::getCapability(const std::string& name) const
1509 return iter->second; 1514 return iter->second;
1510} 1515}
1511 1516
1517bool LLViewerRegion::capabilitiesReceived() const
1518{
1519 return mCapabilitiesReceived;
1520}
1521
1522void LLViewerRegion::setCapabilitiesReceived(bool received)
1523{
1524 mCapabilitiesReceived = received;
1525}
1526
1512void LLViewerRegion::logActiveCapabilities() const 1527void LLViewerRegion::logActiveCapabilities() const
1513{ 1528{
1514 int count = 0; 1529 int count = 0;
diff --git a/linden/indra/newview/llviewerregion.h b/linden/indra/newview/llviewerregion.h
index 8cc80e3..5ce8b2e 100644
--- a/linden/indra/newview/llviewerregion.h
+++ b/linden/indra/newview/llviewerregion.h
@@ -229,6 +229,11 @@ public:
229 void setSeedCapability(const std::string& url); 229 void setSeedCapability(const std::string& url);
230 void setCapability(const std::string& name, const std::string& url); 230 void setCapability(const std::string& name, const std::string& url);
231 std::string getCapability(const std::string& name) const; 231 std::string getCapability(const std::string& name) const;
232
233 // has region received its final (not seed) capability list?
234 bool capabilitiesReceived() const;
235 void setCapabilitiesReceived(bool received);
236
232 static bool isSpecialCapabilityName(const std::string &name); 237 static bool isSpecialCapabilityName(const std::string &name);
233 void logActiveCapabilities() const; 238 void logActiveCapabilities() const;
234 239
@@ -399,6 +404,7 @@ private:
399 404
400private: 405private:
401 bool mAlive; // can become false if circuit disconnects 406 bool mAlive; // can become false if circuit disconnects
407 bool mCapabilitiesReceived;
402 408
403 //spatial partitions for objects in this region 409 //spatial partitions for objects in this region
404 std::vector<LLSpatialPartition*> mObjectPartition; 410 std::vector<LLSpatialPartition*> mObjectPartition;
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp
index 6904bb2..27a848f 100644
--- a/linden/indra/newview/llvoavatar.cpp
+++ b/linden/indra/newview/llvoavatar.cpp
@@ -38,6 +38,7 @@
38#include <ctype.h> 38#include <ctype.h>
39 39
40#include "llaudioengine.h" 40#include "llaudioengine.h"
41#include "llavatarnamecache.h"
41#include "noise.h" 42#include "noise.h"
42 43
43#include "llagent.h" // Get state values from here 44#include "llagent.h" // Get state values from here
@@ -748,6 +749,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
748 mAppearanceAnimating(FALSE), 749 mAppearanceAnimating(FALSE),
749 mNameString(), 750 mNameString(),
750 mTitle(), 751 mTitle(),
752 mCompleteName(),
751 mNameAway(FALSE), 753 mNameAway(FALSE),
752 mNameBusy(FALSE), 754 mNameBusy(FALSE),
753 mNameMute(FALSE), 755 mNameMute(FALSE),
@@ -1474,6 +1476,7 @@ void LLVOAvatar::initClass()
1474 { 1476 {
1475 loadClientTags(); 1477 loadClientTags();
1476 } 1478 }
1479 initCloud();
1477} 1480}
1478 1481
1479 1482
@@ -1489,6 +1492,21 @@ void LLVOAvatar::cleanupClass()
1489 sXMLTree.cleanup(); 1492 sXMLTree.cleanup();
1490} 1493}
1491 1494
1495LLPartSysData LLVOAvatar::sCloud;
1496void LLVOAvatar::initCloud()
1497{
1498 // fancy particle cloud designed by Brent
1499
1500 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "cloud.xml");
1501 LLSD cloud;
1502 llifstream in_file(filename);
1503 LLSDSerialize::fromXMLDocument(cloud, in_file);
1504 sCloud.fromLLSD(cloud);
1505 LLViewerImage* cloud_image = gImageList.getImageFromFile("cloud-particle.j2c");
1506 sCloud.mPartImageID = cloud_image->getID();
1507
1508}
1509
1492const LLVector3 LLVOAvatar::getRenderPosition() const 1510const LLVector3 LLVOAvatar::getRenderPosition() const
1493{ 1511{
1494 if (mDrawable.isNull() || mDrawable->getGeneration() < 0) 1512 if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
@@ -2872,7 +2890,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
2872 param; 2890 param;
2873 param = getNextVisualParam()) 2891 param = getNextVisualParam())
2874 { 2892 {
2875 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 2893 if (param->isTweakable())
2876 { 2894 {
2877 param->stopAnimating(mAppearanceAnimSetByUser); 2895 param->stopAnimating(mAppearanceAnimSetByUser);
2878 } 2896 }
@@ -2904,7 +2922,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
2904 param; 2922 param;
2905 param = getNextVisualParam()) 2923 param = getNextVisualParam())
2906 { 2924 {
2907 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) 2925 if (param->isTweakable())
2908 { 2926 {
2909 // so boobs don't go spastic when a shape's changed, but still seems buggy 2927 // so boobs don't go spastic when a shape's changed, but still seems buggy
2910 //if(param->getID() != 507) 2928 //if(param->getID() != 507)
@@ -3070,34 +3088,7 @@ void LLVOAvatar::idleUpdateLoadingEffect()
3070 } 3088 }
3071 else 3089 else
3072 { 3090 {
3073 LLPartSysData particle_parameters; 3091 setParticleSource(sCloud, getID());
3074
3075 // fancy particle cloud designed by Brent
3076 particle_parameters.mPartData.mMaxAge = 4.f;
3077 particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
3078 particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
3079 particle_parameters.mPartData.mStartScale.mV[VY] = 1.0f;
3080 particle_parameters.mPartData.mEndScale.mV[VX] = 0.02f;
3081 particle_parameters.mPartData.mEndScale.mV[VY] = 0.02f;
3082 particle_parameters.mPartData.mStartColor = LLColor4(1, 1, 1, 0.5f);
3083 particle_parameters.mPartData.mEndColor = LLColor4(1, 1, 1, 0.0f);
3084 particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
3085 LLViewerImage* cloud = gImageList.getImageFromFile("cloud-particle.j2c");
3086 particle_parameters.mPartImageID = cloud->getID();
3087 particle_parameters.mMaxAge = 0.f;
3088 particle_parameters.mPattern = LLPartSysData::LL_PART_SRC_PATTERN_ANGLE_CONE;
3089 particle_parameters.mInnerAngle = 3.14159f;
3090 particle_parameters.mOuterAngle = 0.f;
3091 particle_parameters.mBurstRate = 0.02f;
3092 particle_parameters.mBurstRadius = 0.0f;
3093 particle_parameters.mBurstPartCount = 1;
3094 particle_parameters.mBurstSpeedMin = 0.1f;
3095 particle_parameters.mBurstSpeedMax = 1.f;
3096 particle_parameters.mPartData.mFlags = ( LLPartData::LL_PART_INTERP_COLOR_MASK | LLPartData::LL_PART_INTERP_SCALE_MASK |
3097 LLPartData::LL_PART_EMISSIVE_MASK | // LLPartData::LL_PART_FOLLOW_SRC_MASK |
3098 LLPartData::LL_PART_TARGET_POS_MASK );
3099
3100 setParticleSource(particle_parameters, getID());
3101 } 3092 }
3102 } 3093 }
3103} 3094}
@@ -3620,6 +3611,35 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3620 3611
3621 if (mNameText.notNull() && firstname && lastname) 3612 if (mNameText.notNull() && firstname && lastname)
3622 { 3613 {
3614 std::string complete_name = firstname->getString();
3615 if (sRenderGroupTitles)
3616 {
3617 complete_name += " ";
3618 }
3619 else
3620 {
3621 // If all group titles are turned off, stack first name
3622 // on a line above last name
3623 complete_name += "\n";
3624 }
3625 complete_name += lastname->getString();
3626
3627 if (LLAvatarNameCache::useDisplayNames())
3628 {
3629 LLAvatarName avatar_name;
3630 if (LLAvatarNameCache::get(getID(), &avatar_name))
3631 {
3632 if (LLAvatarNameCache::useDisplayNames() == 1)
3633 {
3634 complete_name = avatar_name.mDisplayName;
3635 }
3636 else
3637 {
3638 complete_name = avatar_name.getNames(true);
3639 }
3640 }
3641 }
3642
3623 BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end(); 3643 BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end();
3624 BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end(); 3644 BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end();
3625 BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end(); 3645 BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end();
@@ -3634,7 +3654,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3634 } 3654 }
3635 3655
3636 if (mNameString.empty() || 3656 if (mNameString.empty() ||
3637 new_name || 3657 new_name || complete_name != mCompleteName ||
3638 (!title && !mTitle.empty()) || 3658 (!title && !mTitle.empty()) ||
3639 (title && mTitle != title->getString()) || 3659 (title && mTitle != title->getString()) ||
3640 (is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute) 3660 (is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute)
@@ -3650,20 +3670,19 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3650 line += title->getString(); 3670 line += title->getString();
3651 //LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); IMP-136 -- McCabe 3671 //LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); IMP-136 -- McCabe
3652 line += "\n"; 3672 line += "\n";
3653 line += firstname->getString(); 3673 line += complete_name;
3654 } 3674 }
3655 else 3675 else
3656 { 3676 {
3657 line += firstname->getString(); 3677 line += complete_name;
3658 } 3678 }
3659 3679
3660 line += " "; 3680
3661 line += lastname->getString();
3662// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b 3681// [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
3663 } 3682 }
3664 else 3683 else
3665 { 3684 {
3666 line = RlvStrings::getAnonym(line.assign(firstname->getString()).append(" ").append(lastname->getString())); 3685 line = RlvStrings::getAnonym(complete_name);
3667 } 3686 }
3668// [/RLVa:KB] 3687// [/RLVa:KB]
3669 3688
@@ -3673,7 +3692,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3673 bool show_client = client.length() != 0 && (*sShowClientNameTag); 3692 bool show_client = client.length() != 0 && (*sShowClientNameTag);
3674 if (is_away || is_muted || is_busy || show_client) 3693 if (is_away || is_muted || is_busy || show_client)
3675 { 3694 {
3676 line += " ("; 3695 line += "\n(";
3677 if (is_away) 3696 if (is_away)
3678 { 3697 {
3679 line += "Away"; 3698 line += "Away";
@@ -3718,6 +3737,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3718 mNameMute = is_muted; 3737 mNameMute = is_muted;
3719 mNameAppearance = is_appearance; 3738 mNameAppearance = is_appearance;
3720 mTitle = title ? title->getString() : ""; 3739 mTitle = title ? title->getString() : "";
3740 mCompleteName = complete_name;
3721 //LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); IMP-136 -- McCabe 3741 //LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); IMP-136 -- McCabe
3722 mNameString = utf8str_to_wstring(line); 3742 mNameString = utf8str_to_wstring(line);
3723 new_name = TRUE; 3743 new_name = TRUE;
@@ -3834,6 +3854,41 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3834 } 3854 }
3835} 3855}
3836 3856
3857void LLVOAvatar::clearNameTag()
3858{
3859 mNameString.clear();
3860 if (mNameText)
3861 {
3862 mNameText->setLabel("");
3863 mNameText->setString(mNameString);
3864 }
3865}
3866
3867//static
3868void LLVOAvatar::invalidateNameTag(const LLUUID& agent_id)
3869{
3870 LLViewerObject* obj = gObjectList.findObject(agent_id);
3871 if (!obj) return;
3872
3873 LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(obj);
3874 if (!avatar) return;
3875
3876 avatar->clearNameTag();
3877}
3878
3879//static
3880void LLVOAvatar::invalidateNameTags()
3881{
3882 std::vector<LLCharacter*>::iterator it;
3883 for (it = LLCharacter::sInstances.begin(); it != LLCharacter::sInstances.end(); ++it)
3884 {
3885 LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*it);
3886 if (!avatar) continue;
3887 if (avatar->isDead()) continue;
3888
3889 avatar->clearNameTag();
3890 }
3891}
3837 3892
3838void LLVOAvatar::idleUpdateTractorBeam() 3893void LLVOAvatar::idleUpdateTractorBeam()
3839{ 3894{
@@ -4820,6 +4875,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
4820 && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked 4875 && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked
4821 && !LLDrawPoolAvatar::sSkipTransparent; 4876 && !LLDrawPoolAvatar::sSkipTransparent;
4822 4877
4878
4823 LLGLState test(GL_ALPHA_TEST, should_alpha_mask); 4879 LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
4824 4880
4825 if (should_alpha_mask) 4881 if (should_alpha_mask)
@@ -4935,7 +4991,6 @@ U32 LLVOAvatar::renderRigid()
4935 && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked 4991 && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked
4936 && !LLDrawPoolAvatar::sSkipTransparent; 4992 && !LLDrawPoolAvatar::sSkipTransparent;
4937 4993
4938
4939 LLGLState test(GL_ALPHA_TEST, should_alpha_mask); 4994 LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
4940 4995
4941 if (should_alpha_mask) 4996 if (should_alpha_mask)
@@ -5918,6 +5973,7 @@ BOOL LLVOAvatar::loadAvatar()
5918 if (sAvatarXmlInfo->mLayerInfoList.empty()) 5973 if (sAvatarXmlInfo->mLayerInfoList.empty())
5919 { 5974 {
5920 llwarns << "avatar file: missing <layer_set> node" << llendl; 5975 llwarns << "avatar file: missing <layer_set> node" << llendl;
5976 return FALSE;
5921 } 5977 }
5922 else 5978 else
5923 { 5979 {
@@ -5958,23 +6014,22 @@ BOOL LLVOAvatar::loadAvatar()
5958 } 6014 }
5959 6015
5960 // avatar_lad.xml : <driver_parameters> 6016 // avatar_lad.xml : <driver_parameters>
6017 LLVOAvatarXmlInfo::driver_info_list_t::iterator iter;
6018 for (iter = sAvatarXmlInfo->mDriverInfoList.begin();
6019 iter != sAvatarXmlInfo->mDriverInfoList.end(); iter++)
5961 { 6020 {
5962 LLVOAvatarXmlInfo::driver_info_list_t::iterator iter; 6021 LLDriverParamInfo *info = *iter;
5963 for (iter = sAvatarXmlInfo->mDriverInfoList.begin(); 6022 LLDriverParam* driver_param = new LLDriverParam( this );
5964 iter != sAvatarXmlInfo->mDriverInfoList.end(); iter++) 6023 if (driver_param->setInfo(info))
5965 { 6024 {
5966 LLDriverParamInfo *info = *iter; 6025 addVisualParam( driver_param );
5967 LLDriverParam* driver_param = new LLDriverParam( this ); 6026 }
5968 if (driver_param->setInfo(info)) 6027 else
5969 { 6028 {
5970 addVisualParam( driver_param ); 6029 delete driver_param;
5971 } 6030 llwarns << "avatar file: driver_param->parseData() failed" << llendl;
5972 else 6031 return FALSE;
5973 { 6032
5974 delete driver_param;
5975 llwarns << "avatar file: driver_param->parseData() failed" << llendl;
5976 return FALSE;
5977 }
5978 } 6033 }
5979 } 6034 }
5980 6035
@@ -8147,6 +8202,14 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, const char* param_name[3] )
8147 param_name[2] = "skirt_blue"; 8202 param_name[2] = "skirt_blue";
8148 break; 8203 break;
8149 8204
8205 case TEX_HEAD_TATTOO:
8206 case TEX_LOWER_TATTOO:
8207 case TEX_UPPER_TATTOO:
8208 param_name[0] = "tattoo_red";
8209 param_name[1] = "tattoo_green";
8210 param_name[2] = "tattoo_blue";
8211 break;
8212
8150 default: 8213 default:
8151 llassert(0); 8214 llassert(0);
8152 return FALSE; 8215 return FALSE;
@@ -8606,7 +8669,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
8606 { 8669 {
8607 for( S32 i = 0; i < num_blocks; i++ ) 8670 for( S32 i = 0; i < num_blocks; i++ )
8608 { 8671 {
8609 while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) 8672 while( param && (!param->isTweakable()) )
8610 { 8673 {
8611 param = getNextVisualParam(); 8674 param = getNextVisualParam();
8612 } 8675 }
@@ -8614,7 +8677,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
8614 if( !param ) 8677 if( !param )
8615 { 8678 {
8616 llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl; 8679 llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
8617 return; 8680 break;
8618 } 8681 }
8619 8682
8620 U8 value; 8683 U8 value;
@@ -8655,14 +8718,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
8655 } 8718 }
8656 } 8719 }
8657 8720
8658 while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) 8721 S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); // don't worry about VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT
8722 if (num_blocks != expected_tweakable_count)
8659 { 8723 {
8660 param = getNextVisualParam(); 8724 llinfos << "Number of params in AvatarAppearance msg (" << num_blocks << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. Object: " << getID() << llendl;
8661 }
8662 if( param )
8663 {
8664 llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
8665 return;
8666 } 8725 }
8667 8726
8668 if (params_changed) 8727 if (params_changed)
@@ -8933,8 +8992,7 @@ void LLVOAvatar::dumpArchetypeXML( void* )
8933 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 8992 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
8934 { 8993 {
8935 LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; 8994 LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param;
8936 if( (viewer_param->getWearableType() == type) && 8995 if (viewer_param->getWearableType() == type && viewer_param->isTweakable())
8937 (viewer_param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) )
8938 { 8996 {
8939 apr_file_printf( file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\"/>\n", 8997 apr_file_printf( file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\"/>\n",
8940 viewer_param->getID(), viewer_param->getName().c_str(), viewer_param->getWeight() ); 8998 viewer_param->getID(), viewer_param->getName().c_str(), viewer_param->getWeight() );
diff --git a/linden/indra/newview/llvoavatar.h b/linden/indra/newview/llvoavatar.h
index 548818d..e585a6a 100644
--- a/linden/indra/newview/llvoavatar.h
+++ b/linden/indra/newview/llvoavatar.h
@@ -97,6 +97,7 @@ public:
97 static void initClass(); // Initialize data that's only init'd once per class. 97 static void initClass(); // Initialize data that's only init'd once per class.
98 static void cleanupClass(); // Cleanup data that's only init'd once per class. 98 static void cleanupClass(); // Cleanup data that's only init'd once per class.
99 static BOOL parseSkeletonFile(const std::string& filename); 99 static BOOL parseSkeletonFile(const std::string& filename);
100 static void initCloud();
100 virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, 101 virtual U32 processUpdateMessage(LLMessageSystem *mesgsys,
101 void **user_data, 102 void **user_data,
102 U32 block_num, 103 U32 block_num,
@@ -111,6 +112,10 @@ public:
111 void idleUpdateWindEffect(); 112 void idleUpdateWindEffect();
112 void idleUpdateBoobEffect(); 113 void idleUpdateBoobEffect();
113 void idleUpdateNameTag(const LLVector3& root_pos_last); 114 void idleUpdateNameTag(const LLVector3& root_pos_last);
115 void clearNameTag();
116 static void invalidateNameTag(const LLUUID& agent_id);
117 // force all name tags to rebuild, useful when display names turned on/off
118 static void invalidateNameTags();
114 void idleUpdateRenderCost(); 119 void idleUpdateRenderCost();
115 void idleUpdateTractorBeam(); 120 void idleUpdateTractorBeam();
116 void idleUpdateBelowWater(); 121 void idleUpdateBelowWater();
@@ -582,6 +587,7 @@ public:
582 static F32 sLODFactor; // user-settable LOD factor 587 static F32 sLODFactor; // user-settable LOD factor
583 static BOOL sJointDebug; // output total number of joints being touched for each avatar 588 static BOOL sJointDebug; // output total number of joints being touched for each avatar
584 static BOOL sDebugAvatarRotation; 589 static BOOL sDebugAvatarRotation;
590 static LLPartSysData sCloud;
585 591
586 static S32 sNumVisibleAvatars; // Number of instances of this class 592 static S32 sNumVisibleAvatars; // Number of instances of this class
587 593
@@ -675,6 +681,7 @@ protected:
675 681
676 LLWString mNameString; 682 LLWString mNameString;
677 std::string mTitle; 683 std::string mTitle;
684 std::string mCompleteName;
678 BOOL mNameAway; 685 BOOL mNameAway;
679 BOOL mNameBusy; 686 BOOL mNameBusy;
680 BOOL mNameMute; 687 BOOL mNameMute;
diff --git a/linden/indra/newview/llwearable.cpp b/linden/indra/newview/llwearable.cpp
index b74ef02..f8123bb 100644
--- a/linden/indra/newview/llwearable.cpp
+++ b/linden/indra/newview/llwearable.cpp
@@ -535,7 +535,7 @@ BOOL LLWearable::isOldVersion()
535 param; 535 param;
536 param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) 536 param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
537 { 537 {
538 if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 538 if (param->getWearableType() == mType && param->isTweakable())
539 { 539 {
540 param_count++; 540 param_count++;
541 if( !is_in_map(mVisualParamMap, param->getID() ) ) 541 if( !is_in_map(mVisualParamMap, param->getID() ) )
@@ -591,7 +591,7 @@ BOOL LLWearable::isDirty()
591 param; 591 param;
592 param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) 592 param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
593 { 593 {
594 if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 594 if (param->getWearableType() == mType && param->isTweakable())
595 { 595 {
596 F32 weight = get_if_there(mVisualParamMap, param->getID(), param->getDefaultWeight()); 596 F32 weight = get_if_there(mVisualParamMap, param->getID(), param->getDefaultWeight());
597 weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() ); 597 weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() );
@@ -690,7 +690,7 @@ void LLWearable::setParamsToDefaults()
690 mVisualParamMap.clear(); 690 mVisualParamMap.clear();
691 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 691 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
692 { 692 {
693 if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 693 if (((LLViewerVisualParam*)param)->getWearableType() == mType && param->isTweakable())
694 { 694 {
695 mVisualParamMap[param->getID()] = param->getDefaultWeight(); 695 mVisualParamMap[param->getID()] = param->getDefaultWeight();
696 } 696 }
@@ -724,7 +724,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user )
724 // Pull params 724 // Pull params
725 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 725 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
726 { 726 {
727 if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 727 if (((LLViewerVisualParam*)param)->getWearableType() == mType && param->isTweakable())
728 { 728 {
729 S32 param_id = param->getID(); 729 S32 param_id = param->getID();
730 F32 weight = get_if_there(mVisualParamMap, param_id, param->getDefaultWeight()); 730 F32 weight = get_if_there(mVisualParamMap, param_id, param->getDefaultWeight());
@@ -825,7 +825,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
825 // Pull params 825 // Pull params
826 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 826 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
827 { 827 {
828 if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 828 if (((LLViewerVisualParam*)param)->getWearableType() == type && param->isTweakable())
829 { 829 {
830 S32 param_id = param->getID(); 830 S32 param_id = param->getID();
831 avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user ); 831 avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user );
@@ -873,7 +873,7 @@ void LLWearable::readFromAvatar()
873 mVisualParamMap.clear(); 873 mVisualParamMap.clear();
874 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) 874 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
875 { 875 {
876 if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 876 if (((LLViewerVisualParam*)param)->getWearableType() == mType && param->isTweakable())
877 { 877 {
878 878
879 //pretty sure is right 879 //pretty sure is right
@@ -938,7 +938,7 @@ void LLWearable::copyDataFrom( LLWearable* src )
938 param; 938 param;
939 param = (LLViewerVisualParam*) avatar->getNextVisualParam() ) 939 param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
940 { 940 {
941 if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) 941 if (param->getWearableType() == mType && param->isTweakable())
942 { 942 {
943 S32 id = param->getID(); 943 S32 id = param->getID();
944 F32 weight = get_if_there(src->mVisualParamMap, id, param->getDefaultWeight() ); 944 F32 weight = get_if_there(src->mVisualParamMap, id, param->getDefaultWeight() );
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml b/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
index a0dd938..d5b61a7 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
@@ -1172,11 +1172,15 @@ scratch and wear it.
1172 <texture_picker name="Lower Tattoo" label="Lower Tattoo" tool_tip="Click to choose a picture" 1172 <texture_picker name="Lower Tattoo" label="Lower Tattoo" tool_tip="Click to choose a picture"
1173 can_apply_immediately="true" default_image_name="Default" allow_no_texture="true" 1173 can_apply_immediately="true" default_image_name="Default" allow_no_texture="true"
1174 follows="left|top" width="70" height="80" left="14" bottom="-325"/> 1174 follows="left|top" width="70" height="80" left="14" bottom="-325"/>
1175 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-415"
1176 can_apply_immediately="true" color="1 1 1 1" follows="left|top" height="80"
1177 label="Color/Tint" left="14" mouse_opaque="true" name="Color/Tint"
1178 tool_tip="Click to open Color Picker" width="70" />
1175 <button name="Create New" label="Create New Tattoo" label_selected="Create New Tattoo" 1179 <button name="Create New" label="Create New Tattoo" label_selected="Create New Tattoo"
1176 follows="left|top" halign="center" width="170" height="24" left="8" bottom="-128" 1180 follows="left|top" halign="center" width="170" height="24" left="8" bottom="-128"
1177 mouse_opaque="true" scale_image="true"/> 1181 mouse_opaque="true" scale_image="true"/>
1178 <button name="Take Off" label="Take Off" label_selected="Take Off" 1182 <button name="Take Off" label="Take Off" label_selected="Take Off"
1179 follows="left|top" width="82" height="20" left="8" bottom="-365"/> 1183 follows="left|top" width="82" height="20" left="8" bottom="-440"/>
1180 <button name="Save" label="Save" label_selected="Save" 1184 <button name="Save" label="Save" label_selected="Save"
1181 follows="right|bottom" width="82" height="20" left="123" bottom="-478"/> 1185 follows="right|bottom" width="82" height="20" left="123" bottom="-478"/>
1182 <button name="Save As" label="Save As..." label_selected="Save As..." 1186 <button name="Save As" label="Save As..." label_selected="Save As..."
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_display_name.xml b/linden/indra/newview/skins/default/xui/en-us/floater_display_name.xml
new file mode 100644
index 0000000..5875efb
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_display_name.xml
@@ -0,0 +1,42 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="Display Name" title="CHANGE DISPLAY NAME"
3 can_minimize="true" can_close="true" can_resize="false"
4 enabled="true" mouse_opaque="true"
5 height="235" width="440">
6 <text name="info_text1" font="SansSerif" wrap="true"
7 height="18" width="380" left="42" bottom_delta="-48" follows="left|top">
8 The name you give to your avatar is called your Display Name.
9 </text>
10 <text name="info_text2" font="SansSerif" wrap="true"
11 height="18" width="300" left="120" bottom_delta="-18" follows="left|top">
12 You can change it once a week.
13 </text>
14 <text name="now_ok_text" font="SansSerif"
15 height="18" width="320" left="105" bottom_delta="-25" follows="left|top">
16 You can change it now if you so wish.
17 </text>
18 <text name="lockout_text" font="SansSerif" visible="false"
19 height="18" width="380" left="20" bottom_delta="0" follows="left|top">
20 You cannot change it before: [TIME].
21 </text>
22 <text name="set_name_label" font="SansSerif"
23 height="20" width="380" left="20" bottom_delta="-25" follows="left|top">
24 New Display Name:
25 </text>
26 <line_editor name="display_name_editor" max_length="31"
27 height="20" width="360" left="40" bottom_delta="-20" follows="left|top" />
28 <text name="name_confirm_label" font="SansSerif"
29 height="20" width="380" left="20" bottom_delta="-32" follows="left|top">
30 Type your new name again to confirm:
31 </text>
32 <line_editor name="display_name_confirm" max_length="31"
33 height="20" width="360" left="40" bottom_delta="-20" follows="left|top" />
34 <button name="save_btn" label="Save" font="SansSerif"
35 tool_tip="Save your new Display Name"
36 height="20" width="120" left="30" bottom_delta="-32"/>
37 <button name="reset_btn" label="Reset" font="SansSerif"
38 tool_tip="Make Display Name the same as Username"
39 height="20" width="120" left_delta="130" bottom_delta="0"/>
40 <button name="cancel_btn" label="Cancel" font="SansSerif"
41 height="20" width="120" left_delta="130" bottom_delta="0"/>
42</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml b/linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml
index c93b890..5d766be 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_new_im.xml
@@ -8,7 +8,7 @@
8 column_padding="5" draw_border="true" draw_heading="false" 8 column_padding="5" draw_border="true" draw_heading="false"
9 draw_stripes="true" enabled="true" follows="left|top|right|bottom" 9 draw_stripes="true" enabled="true" follows="left|top|right|bottom"
10 height="290" left="6" mouse_opaque="true" multi_select="false" 10 height="290" left="6" mouse_opaque="true" multi_select="false"
11 name="user_list" width="421" /> 11 name="user_list" use_display_names="true" width="421" />
12 <button bottom="-271" enabled="true" follows="right|bottom" font="SansSerif" 12 <button bottom="-271" enabled="true" follows="right|bottom" font="SansSerif"
13 halign="center" height="20" label="Start" label_selected="Start" left="435" 13 halign="center" height="20" label="Start" label_selected="Start" left="435"
14 mouse_opaque="true" name="start_btn" scale_image="true" sound_flags="0" 14 mouse_opaque="true" name="start_btn" scale_image="true" sound_flags="0"
@@ -17,9 +17,6 @@
17 halign="center" height="20" label="Close" label_selected="Close" left="435" 17 halign="center" height="20" label="Close" label_selected="Close" left="435"
18 mouse_opaque="true" name="close_btn" scale_image="true" sound_flags="0" 18 mouse_opaque="true" name="close_btn" scale_image="true" sound_flags="0"
19 width="60" /> 19 width="60" />
20 <string name="name_format">
21 [FIRST] [LAST]
22 </string>
23 <string name="online_descriptor"> 20 <string name="online_descriptor">
24 (online) 21 (online)
25 </string> 22 </string>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml b/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
index 81dd05a..69e62f8 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
@@ -21,7 +21,7 @@
21 <check_box bottom="-276" enabled="true" follows="left|top" font="SansSerifSmall" 21 <check_box bottom="-276" enabled="true" follows="left|top" font="SansSerifSmall"
22 height="16" initial_value="false" label="Eyes" left="13" 22 height="16" initial_value="false" label="Eyes" left="13"
23 mouse_opaque="true" name="checkbox_Eyes" radio_style="false" width="100" /> 23 mouse_opaque="true" name="checkbox_Eyes" radio_style="false" width="100" />
24 <check_box bottom="-456" enabled="true" follows="left|top" font="SansSerifSmall" 24 <check_box bottom="-434" enabled="true" follows="left|top" font="SansSerifSmall"
25 height="16" initial_value="false" label="Rename Clothing To Folder Name" 25 height="16" initial_value="false" label="Rename Clothing To Folder Name"
26 left="13" mouse_opaque="true" name="rename" radio_style="false" width="210" /> 26 left="13" mouse_opaque="true" name="rename" radio_style="false" width="210" />
27 <check_box bottom="-216" enabled="true" follows="left|top" font="SansSerifSmall" 27 <check_box bottom="-216" enabled="true" follows="left|top" font="SansSerifSmall"
@@ -256,7 +256,7 @@ now wearing into it.
256 Attachments: 256 Attachments:
257 </text> 257 </text>
258 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 258 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
259 bottom="-436" drop_shadow_visible="true" enabled="true" follows="left|top" 259 bottom="-414" drop_shadow_visible="true" enabled="true" follows="left|top"
260 font="SansSerifSmall" h_pad="0" halign="left" height="14" left="13" 260 font="SansSerifSmall" h_pad="0" halign="left" height="14" left="13"
261 mouse_opaque="true" name="Options:" v_pad="0" width="100"> 261 mouse_opaque="true" name="Options:" v_pad="0" width="100">
262 Options: 262 Options:
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index 31e730a..f737a7e 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -259,6 +259,11 @@
259 userdata="appearance" /> 259 userdata="appearance" />
260 <on_enable function="Edit.EnableCustomizeAvatar" /> 260 <on_enable function="Edit.EnableCustomizeAvatar" />
261 </menu_item_call> 261 </menu_item_call>
262 <menu_item_call bottom="-362" enabled="true" height="19" label="Display Name..." left="0"
263 mouse_opaque="true" name="Display Name..." width="153">
264 <on_click function="ShowFloater" userdata="displayname" />
265 <on_enable function="Edit.EnableDisplayName" />
266 </menu_item_call>
262 <menu_item_separator /> 267 <menu_item_separator />
263 <menu_item_check name="Friends" label="Friends" 268 <menu_item_check name="Friends" label="Friends"
264 shortcut="control|shift|F"> 269 shortcut="control|shift|F">
@@ -1965,6 +1970,13 @@
1965 <on_click function="Advanced.DumpAttachments" 1970 <on_click function="Advanced.DumpAttachments"
1966 userdata="" /> 1971 userdata="" />
1967 </menu_item_call> 1972 </menu_item_call>
1973 <menu_item_call
1974 label="Reload Avatar Cloud Particle"
1975 name="Reload Avatar Cloud Particle">
1976 <on_click
1977 function="Advanced.ReloadAvatarCloudParticle"
1978 userdata="" />
1979 </menu_item_call>
1968 </menu> 1980 </menu>
1969 1981
1970 <!-- CRASH --> 1982 <!-- CRASH -->
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index b8f3fcb..d02f1b3 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -5237,6 +5237,88 @@ The string [STRING_NAME] is missing from strings.xml
5237</notification> 5237</notification>
5238 5238
5239<notification 5239<notification
5240 icon="alertmodal.tga"
5241 name="SetDisplayNameSuccess"
5242 type="alert">
5243Hi [DISPLAY_NAME]!
5244
5245Just like in real life, it takes a while for everyone to learn about a new name. Please allow several days for your name to update in objects, scripts, search, etc.
5246 </notification>
5247
5248 <notification
5249 icon="alertmodal.tga"
5250 name="SetDisplayNameBlocked"
5251 type="alert">
5252Sorry, you cannot change your display name. If you feel this is in error, please contact support.
5253 </notification>
5254
5255 <notification
5256 icon="alertmodal.tga"
5257 name="SetDisplayNameFailedLength"
5258 type="alertmodal">
5259Sorry, that name is too long. Display names can have a maximum of [LENGTH] characters.
5260
5261Please try a shorter name.
5262 </notification>
5263
5264 <notification
5265 icon="alertmodal.tga"
5266 name="SetDisplayNameFailedGeneric"
5267 type="alertmodal">
5268 Sorry, we could not set your display name. Please try again later.
5269 </notification>
5270
5271 <notification
5272 icon="alertmodal.tga"
5273 name="SetDisplayNameMismatch"
5274 type="alertmodal">
5275 The display names you entered do not match. Please re-enter.
5276 </notification>
5277
5278 <!-- *NOTE: This should never happen -->
5279 <notification
5280 icon="alertmodal.tga"
5281 name="AgentDisplayNameUpdateThresholdExceeded"
5282 type="alertmodal">
5283Sorry, you have to wait longer before you can change your display name.
5284
5285See http://wiki.secondlife.com/wiki/Setting_your_display_name
5286
5287Please try again later.
5288 </notification>
5289
5290 <notification
5291 icon="alertmodal.tga"
5292 name="AgentDisplayNameSetBlocked"
5293 type="alertmodal">
5294 Sorry, we could not set your requested name because it contains a banned word.
5295
5296 Please try a different name.
5297 </notification>
5298
5299 <notification
5300 icon="alertmodal.tga"
5301 name="AgentDisplayNameSetInvalidUnicode"
5302 type="alertmodal">
5303 The display name you wish to set contains invalid characters.
5304 </notification>
5305
5306 <notification
5307 icon="alertmodal.tga"
5308 name="AgentDisplayNameSetOnlyPunctuation"
5309 type="alertmodal">
5310 Your display name must contain letters other than punctuation.
5311 </notification>
5312
5313
5314 <notification
5315 icon="notifytip.tga"
5316 name="DisplayNameUpdate"
5317 type="notifytip">
5318 [OLD_NAME] ([SLID]) is now known as [NEW_NAME].
5319 </notification>
5320
5321<notification
5240 icon="notifytip.tga" 5322 icon="notifytip.tga"
5241 name="Cancelled" 5323 name="Cancelled"
5242 type="notifytip"> 5324 type="notifytip">
@@ -6874,7 +6956,7 @@ GRAVITY -- -9.8
6874 6956
6875* -- Multiplication 6957* -- Multiplication
6876\ -- Division 6958\ -- Division
6877+ -- Addition 6959 -- Addition
6878- -- Subtraction 6960- -- Subtraction
6879 6961
6880For information about this feature, click "More Info". 6962For information about this feature, click "More Info".
@@ -6903,7 +6985,7 @@ GLOW -- Glow
6903 6985
6904* -- Multiplication 6986* -- Multiplication
6905\ -- Division 6987\ -- Division
6906+ -- Addition 6988 -- Addition
6907- -- Subtraction 6989- -- Subtraction
6908 6990
6909For information about this feature, click "More Info". 6991For information about this feature, click "More Info".
@@ -7221,6 +7303,24 @@ Apply this region's settings? (&quot;Ignore&quot; will ignore all region setting
7221The new font will appear after you restart [VIEWER_NAME]. 7303The new font will appear after you restart [VIEWER_NAME].
7222</notification> 7304</notification>
7223 7305
7306<notification
7307 icon="alertmodal.tga"
7308 name="FirstPrivacy"
7309 type="alertmodal">
7310Terms of service of the grid you are connecting to require sending a "statistics packet" every 5 minutes.
7311That is for example: Data about your hardware (CPU, RAM), number of avatars around, number of sims visited.
7312Please check *the grids* privacy policy about usage of that data.
7313 <form name="form">
7314 <button
7315 index="0"
7316 name="ok"
7317 text="Login anyway"/>
7318 <button
7319 index="1"
7320 name="notok"
7321 text="Do not log in"/>
7322 </form>
7323</notification>
7224 7324
7225<!--End Imprudence notifications--> 7325<!--End Imprudence notifications-->
7226 <!-- [KITTY VIEWER] --> 7326 <!-- [KITTY VIEWER] -->
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
index 0df65e7..f459e6a 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
@@ -127,6 +127,11 @@
127 font="SansSerifSmall" height="16" is_unicode="false" left="12" 127 font="SansSerifSmall" height="16" is_unicode="false" left="12"
128 max_length="254" mouse_opaque="false" name="name" 128 max_length="254" mouse_opaque="false" name="name"
129 width="155" /> 129 width="155" />
130 <name_editor bevel_style="in" border_style="line" visible="false"
131 border_thickness="1" bottom="-24" enabled="false" follows="left|top"
132 font="SansSerifSmall" height="16" is_unicode="false" left_delta="0"
133 max_length="254" mouse_opaque="false" name="complete_name"
134 width="155" />
130 <button bottom_delta="0" font="SansSerif" halign="center" height="20" 135 <button bottom_delta="0" font="SansSerif" halign="center" height="20"
131 label="Copy Key" label_selected="Copy Key" 136 label="Copy Key" label_selected="Copy Key"
132 left_delta="157" mouse_opaque="true" name="btn_copy_uuid" width="80" /> 137 left_delta="157" mouse_opaque="true" name="btn_copy_uuid" width="80" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
index 4b0b292..6ced7d6 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
@@ -2,6 +2,15 @@
2<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom" 2<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
3 height="408" label="General" left="102" mouse_opaque="true" 3 height="408" label="General" left="102" mouse_opaque="true"
4 name="general_panel" width="517"> 4 name="general_panel" width="517">
5 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
6 bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
7 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
8 mouse_opaque="true" name="start_location_textbox" v_pad="0" width="394">
9 Start Location:
10 </text>
11 <string name="region_name_prompt">
12 &lt;Type region name&gt;
13 </string>
5 <combo_box name="default_location_combo" 14 <combo_box name="default_location_combo"
6 bottom="-22" left="155" height="16" width="150" 15 bottom="-22" left="155" height="16" width="150"
7 follows="left|top" font="SansSerifSmall" 16 follows="left|top" font="SansSerifSmall"
@@ -24,7 +33,13 @@
24 font="SansSerifSmall" height="16" initial_value="true" 33 font="SansSerifSmall" height="16" initial_value="true"
25 label="Show start location at login screen" left="151" mouse_opaque="true" 34 label="Show start location at login screen" left="151" mouse_opaque="true"
26 name="show_location_checkbox" radio_style="false" width="256" /> 35 name="show_location_checkbox" radio_style="false" width="256" />
27 <combo_box bottom_delta="-25" follows="left|top" height="18" left="155" 36 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
37 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
38 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
39 mouse_opaque="true" name="show_names_textbox" v_pad="0" width="394">
40 Nametags:
41 </text>
42 <combo_box bottom_delta="0" follows="left|top" height="18" left="155"
28 mouse_opaque="true" name="fade_out_combobox" width="146"> 43 mouse_opaque="true" name="fade_out_combobox" width="146">
29 <combo_item name="Never" value="Never"> 44 <combo_item name="Never" value="Never">
30 Never show 45 Never show
@@ -44,11 +59,35 @@
44 font="SansSerifSmall" height="16" initial_value="false" 59 font="SansSerifSmall" height="16" initial_value="false"
45 label="Hide my name on my screen" left="151" name="show_my_name_checkbox" 60 label="Hide my name on my screen" left="151" name="show_my_name_checkbox"
46 width="200" /> 61 width="200" />
62
47 <check_box bottom_delta="-20" follows="left|top" 63 <check_box bottom_delta="-20" follows="left|top"
48 font="SansSerifSmall" height="16" initial_value="false" 64 font="SansSerifSmall" height="16" initial_value="false"
49 label="Highlight friends tags" left="151" name="highlight_friends_checkbox" 65 label="Highlight friends tags" left="151" name="highlight_friends_checkbox"
50 width="200" /> 66 width="200" />
51 <text type="string" length="1" bottom_delta="-24" follows="left|top" font="SansSerifSmall" h_pad="0" 67 <text type="string" length="1" bottom_delta="-24" follows="left|top" font="SansSerifSmall" h_pad="0"
68 halign="left" height="16" left="10" name="Display_Names_textbox" v_pad="0"
69 width="394">
70 Display Names:
71 </text>
72 <radio_group name="displaynames" draw_border="false"
73 bottom_delta="0" left_delta="60" height="18"
74 follows="top|left"
75 control_name="DisplayNamesUsage">
76 <radio_item name="0" bottom_delta="-8" left_delta="40" height="18">
77 Legacy Names
78 </radio_item>
79 <radio_item name="1" bottom_delta="0" left_delta="50" height="18">
80 Display Names
81 </radio_item>
82 <radio_item name="2" bottom_delta="0" left_delta="50" height="18">
83 Show Both
84 </radio_item>
85 </radio_group>
86 <check_box bottom_delta="-20" follows="left|top" control_name="LegacyNamesForFriends"
87 font="SansSerifSmall" height="16" initial_value="false"
88 label="Show legacy names for friends" left="151" name="legacy_friends_checkbox"
89 width="200" />
90 <text type="string" length="1" bottom_delta="-24" follows="left|top" font="SansSerifSmall" h_pad="0"
52 halign="left" height="16" left="10" name="group_titles_textbox" v_pad="0" 91 halign="left" height="16" left="10" name="group_titles_textbox" v_pad="0"
53 width="394"> 92 width="394">
54 Group Titles: 93 Group Titles:
@@ -61,37 +100,49 @@
61 font="SansSerifSmall" height="16" initial_value="false" 100 font="SansSerifSmall" height="16" initial_value="false"
62 label="Hide my group title" left="330" name="show_my_title_checkbox" 101 label="Hide my group title" left="330" name="show_my_title_checkbox"
63 radio_style="false" width="256" /> 102 radio_style="false" width="256" />
64 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-210" 103 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
104 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
105 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
106 mouse_opaque="true" name="effects_color_textbox" v_pad="0" width="394">
107 Selection Beam Color:
108 </text>
109 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="-44"
65 can_apply_immediately="false" color="1 1 1 1" 110 can_apply_immediately="false" color="1 1 1 1"
66 enabled="true" follows="left|top" height="65" label="" left="153" 111 enabled="true" follows="left|top" height="55" label="" left="153"
67 mouse_opaque="true" name="effect_color_swatch" 112 mouse_opaque="true" name="effect_color_swatch"
68 tool_tip="Click to open Color Picker" width="55" /> 113 tool_tip="Click to open Color Picker" width="45" />
69 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 114 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
70 bottom="-215" drop_shadow_visible="true" enabled="true" follows="left|top" 115 bottom_delta="-18" drop_shadow_visible="true" enabled="true" follows="left|top"
71 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10" 116 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
72 mouse_opaque="true" name="UI Size:" v_pad="0" width="128"> 117 mouse_opaque="true" name="UI Size:" v_pad="0" width="128">
73 UI Size: 118 UI Size:
74 </text> 119 </text>
75 <slider bottom="-217" can_edit_text="true" 120 <slider bottom_delta="42" can_edit_text="true"
76 decimal_digits="3" enabled="true" height="16" increment="0.001" 121 decimal_digits="3" enabled="true" height="16" increment="0.001"
77 initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true" 122 initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true"
78 name="ui_scale_slider" show_text="true" value="1" width="220" /> 123 name="ui_scale_slider" show_text="true" value="1" width="220" />
79 <button bottom="-221" enabled="true" follows="left|top" 124 <button bottom_delta="-48" enabled="true" follows="left|top"
80 font="SansSerif" halign="center" height="22" label="Reset" 125 font="SansSerif" halign="center" height="22" label="Reset"
81 label_selected="Reset" left_delta="226" mouse_opaque="true" 126 label_selected="Reset" left_delta="226" mouse_opaque="true"
82 name="reset_ui_size" scale_image="true" width="80" /> 127 name="reset_ui_size" scale_image="true" width="80" />
83 <check_box bottom="-236" enabled="true" follows="left|top" 128 <check_box bottom_delta="-14" enabled="true" follows="left|top"
84 font="SansSerifSmall" height="16" initial_value="false" 129 font="SansSerifSmall" height="16" initial_value="false"
85 label="Use resolution independent scale" left="151" mouse_opaque="true" 130 label="Use resolution independent scale" left="151" mouse_opaque="true"
86 name="ui_auto_scale" radio_style="false" width="256" /> 131 name="ui_auto_scale" radio_style="false" width="256" />
87 <check_box bottom="-260" enabled="true" follows="left|top" 132 <spinner bottom_delta="-24" decimal_digits="0" enabled="true"
88 font="SansSerifSmall" height="16" initial_value="false"
89 label="Go Away/AFK when idle" left="330" mouse_opaque="true"
90 name="afk_timeout_checkbox" radio_style="false" width="256" />
91 <spinner bottom="-260" decimal_digits="0" enabled="true"
92 follows="left|top" height="16" increment="1" initial_val="300" 133 follows="left|top" height="16" increment="1" initial_val="300"
93 label="Away Timeout:" label_width="141" left="10" max_val="600" 134 label="Away Timeout:" label_width="141" left="10" max_val="600"
94 min_val="30" mouse_opaque="true" name="afk_timeout_spinner" width="202" /> 135 min_val="30" mouse_opaque="true" name="afk_timeout_spinner" width="202" />
136 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
137 bottom_delta="6" drop_shadow_visible="true" enabled="true" follows="left|top"
138 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="220"
139 mouse_opaque="true" name="seconds_textbox" v_pad="0" width="128">
140 seconds
141 </text>
142 <check_box bottom_delta="-5" enabled="true" follows="left|top"
143 font="SansSerifSmall" height="16" initial_value="false"
144 label="Go Away/AFK when idle" left="330" mouse_opaque="true"
145 name="afk_timeout_checkbox" radio_style="false" width="256" />
95 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 146 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
96 bottom_delta="-27" drop_shadow_visible="true" enabled="true" follows="left|top" 147 bottom_delta="-27" drop_shadow_visible="true" enabled="true" follows="left|top"
97 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10" 148 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
@@ -109,18 +160,18 @@
109 mouse_opaque="true" name="mini_map_notify_sim" radio_style="false" 160 mouse_opaque="true" name="mini_map_notify_sim" radio_style="false"
110 width="256" /> 161 width="256" />
111 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 162 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
112 bottom="-312" drop_shadow_visible="true" enabled="true" follows="left|top" 163 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
113 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10" 164 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
114 mouse_opaque="true" name="maturity_desired_label" v_pad="0" width="394"> 165 mouse_opaque="true" name="maturity_desired_label" v_pad="0" width="394">
115 Rating: 166 Rating:
116 </text> 167 </text>
117 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 168 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
118 bottom="-312" drop_shadow_visible="true" enabled="true" follows="left|top" 169 bottom_delta="0" drop_shadow_visible="true" enabled="true" follows="left|top"
119 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="151" 170 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="151"
120 mouse_opaque="true" name="maturity_desired_prompt" v_pad="0" width="394"> 171 mouse_opaque="true" name="maturity_desired_prompt" v_pad="0" width="394">
121 I want to access content rated: 172 I want to access content rated:
122 </text> 173 </text>
123 <combo_box bottom="-318" follows="left|top" height="18" left="315" 174 <combo_box bottom_delta="-6" follows="left|top" height="18" left="315"
124 mouse_opaque="true" name="maturity_desired_combobox" width="150"> 175 mouse_opaque="true" name="maturity_desired_combobox" width="150">
125 <combo_item name="Desired_Adult" value="42"> 176 <combo_item name="Desired_Adult" value="42">
126 PG, Mature and Adult 177 PG, Mature and Adult
@@ -133,58 +184,20 @@
133 </combo_item> 184 </combo_item>
134 </combo_box> 185 </combo_box>
135 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 186 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
136 bottom="-312" drop_shadow_visible="true" enabled="true" follows="left|top" 187 bottom_delta="0" drop_shadow_visible="true" enabled="true" follows="left|top"
137 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="315" 188 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="315"
138 mouse_opaque="true" name="maturity_desired_textbox" v_pad="0" width="150"> 189 mouse_opaque="true" name="maturity_desired_textbox" v_pad="0" width="150">
139 PG only 190 PG only
140 </text> 191 </text>
192
193
141 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 194 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
142 bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top" 195 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
143 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
144 mouse_opaque="true" name="start_location_textbox" v_pad="0" width="394">
145 Start Location:
146 </text>
147 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
148 bottom="-64" drop_shadow_visible="true" enabled="true" follows="left|top"
149 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
150 mouse_opaque="true" name="show_names_textbox" v_pad="0" width="394">
151 Nametags:
152 </text>
153 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
154 bottom="-155" drop_shadow_visible="true" enabled="true" follows="left|top"
155 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
156 mouse_opaque="true" name="effects_color_textbox" v_pad="0" width="394">
157 Selection Beam Color:
158 </text>
159 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
160 bottom="-254" drop_shadow_visible="true" enabled="true" follows="left|top"
161 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="220"
162 mouse_opaque="true" name="seconds_textbox" v_pad="0" width="128">
163 seconds
164 </text>
165 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
166 bottom="-352" drop_shadow_visible="true" enabled="true" follows="left|top"
167 font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10" 196 font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10"
168 mouse_opaque="true" name="time_textbox" v_pad="0" width="394"> 197 mouse_opaque="true" name="time_textbox" v_pad="0" width="394">
169 Clock: 198 Clock:
170 </text> 199 </text>
171 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 200 <combo_box allow_text_entry="false" bottom_delta="0" enabled="true" follows="left|top"
172 bottom="-384" drop_shadow_visible="true" enabled="true" follows="left|top"
173 font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10"
174 mouse_opaque="true" name="language_textbox" v_pad="0" width="394">
175 Language:
176 </text>
177 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
178 bottom_delta="-1" drop_shadow_visible="true" enabled="true"
179 follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
180 height="18" left_delta="293" mouse_opaque="true" name="language_textbox2"
181 v_pad="0" width="400">
182 (requires restart for full effect)
183 </text>
184 <string name="region_name_prompt">
185 &lt;Type region name&gt;
186 </string>
187 <combo_box allow_text_entry="false" bottom="-352" enabled="true" follows="left|top"
188 height="18" left="153" max_chars="20" mouse_opaque="true" 201 height="18" left="153" max_chars="20" mouse_opaque="true"
189 name="time_combobox" width="146"> 202 name="time_combobox" width="146">
190 <combo_item type="string" name="12HourTime" value="PST 12"> 203 <combo_item type="string" name="12HourTime" value="PST 12">
@@ -197,7 +210,13 @@
197 UTC 210 UTC
198 </combo_item> 211 </combo_item>
199 </combo_box> 212 </combo_box>
200 <combo_box allow_text_entry="true" bottom="-382" enabled="true" 213 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
214 bottom_delta="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
215 font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10"
216 mouse_opaque="true" name="language_textbox" v_pad="0" width="394">
217 Language:
218 </text>
219 <combo_box allow_text_entry="true" bottom_delta="0" enabled="true"
201 follows="left|top" height="16" left="153" max_chars="135" 220 follows="left|top" height="16" left="153" max_chars="135"
202 mouse_opaque="true" name="language_combobox" width="146"> 221 mouse_opaque="true" name="language_combobox" width="146">
203 <combo_item type="string" length="1" enabled="true" name="System Default Language" value="default"> 222 <combo_item type="string" length="1" enabled="true" name="System Default Language" value="default">
@@ -255,5 +274,11 @@
255 한국어 (Korean) - Beta 274 한국어 (Korean) - Beta
256 </combo_item> 275 </combo_item>
257 </combo_box> 276 </combo_box>
258 277 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
278 bottom_delta="0" drop_shadow_visible="true" enabled="true"
279 follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
280 height="18" left_delta="150" mouse_opaque="true" name="language_textbox2"
281 v_pad="0" width="400">
282 (requires restart for full effect)
283 </text>
259</panel> 284</panel>
diff --git a/linden/install.xml b/linden/install.xml
index e8c8b54..7fda398 100755
--- a/linden/install.xml
+++ b/linden/install.xml
@@ -1343,6 +1343,13 @@ Copyright (C) 2004-2005 Vladimir Berezniker @ http://public.xdi.org/=vmpn
1343 <key>url</key> 1343 <key>url</key>
1344 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri> 1344 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri>
1345 </map> 1345 </map>
1346 <key>linux64</key>
1347 <map>
1348 <key>md5sum</key>
1349 <string>30cb00069fe2a545fbf7be1070386236</string>
1350 <key>url</key>
1351 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri>
1352 </map>
1346 </map> 1353 </map>
1347 </map> 1354 </map>
1348 <key>quicktime</key> 1355 <key>quicktime</key>